1
### This file is part of KoFooBot and is licensed under BSD-license according to the   ###
2
### LICENSE file in the base directory.                                                ###
3
### Code in this file is contributed by:                                               ###
4
###    Krister Svanlund <krister.svanlund gmail.com>                                   ###
5
6
####
7
# Command description goes here:
8
##
9
        
10
do_set_command = {'description': "Set a configuration option",
11
                  'long help': """\
12
Set values for configurations such as user access level.""",
13
                  'arguments':
14
                      [("access <user> <newlevel>", "Set the new accesslevel for <user>.")],
15
                  'public': False,
16
                  'level': 50}
17
18
do_configure_command = {'description': "Set a configuration option",
19
                        'long help': """\
20
Set values for configurations.""",
21
                        'arguments':
22
                            [("<key> add|set|del <value>", "Change the value of keys.")],
23
                        'public': False,
24
                        'level': 101}
25
26
##
27
# Ending here
28
####
29
            
30
def do_set(self, server, sender, target, args):
31
    if not args:
32
        self.respond(server, sender, target, "Not enough arguments.")
33
        return
34
    key = args[0]
35
    if key == "access":
36
        do_set_access(self, server, sender, target, args[1:])
37
38
def do_configure(bot, server, sender, target, args):
39
    """Change the value of a setting in bot."""
40
    if not args:
41
        ### Return the current configuration in whole. ###
42
        bot.respond(server, sender, target, "The current settings are:")
43
        for key in dir(bot.settings):
44
            config_string = ""
45
            if key not in bot.settings._unsaved_settings and not key[0] == '_':
46
                value = getattr(bot.settings, key, None)
47
                if value:
48
                    if type(value) is str:
49
                        config_string = " %s = \"%s\"" % (key, value)
50
                    else:
51
                        config_string = " %s = %s" % (key, str(value))
52
                    bot.respond(server, sender, target, config_string)
53
        bot.respond(server, sender, target, "End of settings.")
54
    elif len(args) == 1:
55
        ### Return one specific line of the configuration. ###
56
        key = args[0]
57
        if hasattr(bot.settings, key):
58
            try:
59
                value = getattr(bot.settings, key, None)
60
                config_string = ""
61
                if type(value) is str:
62
                    config_string = "The current value of %s is '%s'" % (key, str(value))
63
                else:
64
                    config_string = "The current value of %s is %s" % (key, str(value))
65
                bot.respond(server, sender, target, config_string)
66
            except Exception, e:
67
                bot.respond(server, sender, target, "Failed to get value for '%s'." % key)
68
                print " - Failed to get value for '%s'." % key
69
        else:
70
            bot.respond(server, sender, target, "That key is unused.")
71
    elif len(args) == 2:
72
        operator = args[0]
73
        key = args[1]
74
        if operator == 'del' or 'remove':
75
            ### Delete a key in the settings, should be used with extreme care. ###
76
            if hasattr(bot.settings, key):
77
                print " + Remove the key '%s'." % key
78
                try:
79
                    delattr(bot.settings, key)
80
                    bot.respond(server, sender, target, "The key '%s' has been removed." % key)
81
                except Exception, e:
82
                    bot.respond(server, sender, target, "Failed to remove the key '%s'." % key)
83
                    print " - Failed to remove the key '%s'." % key
84
            else:
85
                bot.respond(server, sender, target, "No such key '%s'." % key)
86
        else:
87
            bot.respond(server, sender, target, "No such operator '%s'." % operator)
88
    else:
89
        ### Check if arguments conform to "configure <key> add|set|remove <value>" ###
90
        if len(args) >= 3:
91
            key = args[0]
92
            operator = args[1]
93
            value = ' '.join(args[2:])
94
            print " + Configure called with\n    Key: %s\n    Operator: %s\n    Value: %s" % (key, operator, str(eval(value)))
95
            if operator == 'set':
96
                ### Set the setting to a specific value, full python syntax is supported. ###
97
                print " + Set %s to %s" % (key, value)
98
                try:
99
                    setattr(bot.settings, key, eval(value))
100
                    bot.respond(server, sender, target, "The key '%s' has been changed to the value '%s'." % (key, value))
101
                except Exception, e:
102
                    bot.respond(server, sender, target, "Failed to set '%s' to '%s': %s" % (key, value, str(e)))
103
                    print " - Failed to set '%s' to '%s': %s" % (key, value, str(e))
104
            elif operator == 'add':
105
                ### Add a value to a list, dict or string (making strings into lists) ###
106
                print " + Add %s to %s" % (value, key)
107
                try:
108
                    oldvalue = getattr(bot.settings, key, None)
109
                    if type(oldvalue) is list:
110
                        oldvalue.append(eval(value))
111
                        setattr(bot.settings, key, oldvalue)
112
                        bot.respond(server, sender, target, "The value '%s' has been added to the key '%s'." % (value, key))
113
                    elif type(oldvalue) is dict:
114
                        newvalue = eval(value)
115
                        if type(newvalue) is tuple:
116
                            newvalue = [newvalue]
117
                        oldvalue.update(newvalue)
118
                        setattr(bot.settings, key, oldvalue)
119
                        bot.respond(server, sender, target, "The value '%s' has been added to the key '%s'." % (value, key))
120
                    elif type(oldvalue) is str:
121
                        newvalue = eval(value)
122
                        oldvalue = [oldvalue, newvalue]
123
                        setattr(bot.settings, key, oldvalue)
124
                        bot.respond(server, sender, target, "The value '%s' has been added to the key '%s'." % (value, key))
125
                    else:
126
                        bot.respond(server, sender, target, "This option is not of the correct type for adding values.")
127
                        print " - Could not add '%s' to '%s'." % (value, key)
128
                except Exception, e:
129
                    bot.respond(server, sender, target, "Failed to add '%s' to '%s': %s" % (value, key, str(e)))
130
                    print " - Failed to add '%s' to '%s': %s" % (value, key, str(e))
131
            elif operator == 'del' or 'remove':
132
                ### Delete a value from a list or dictionary. ###
133
                print " + Delete %s from %s" % (value, key)
134
                try:
135
                    oldvalue = getattr(bot.settings, key, None)
136
                    if type(oldvalue) is list:
137
                        oldvalue.remove(eval(value))
138
                        bot.respond(server, sender, target, "The value '%s' has been removed from the key '%s'." % (value, key))
139
                    elif type(oldvalue) is dict:
140
                        del oldvalue[eval(value)]
141
                        bot.respond(server, sender, target, "The subkey '%s' has been removed from '%s'." % (value, key))
142
                    else:
143
                        bot.respond(server, sender, target, "'%s' is of wrong type for deleting items.")
144
                        print " - Failed to delete '%s' from '%s'." % (value, key)
145
                    setattr(bot.settings, key, oldvalue)
146
                except Exception, e:
147
                    bot.respond(server, sender, target, "Failed to delete '%s' from '%s': %s" % (value, key, str(e)))
148
                    print " - Failed to delete '%s' from '%s': %s" % (value, key, str(e))
149
            else:
150
                bot.respond(server, sender, target, "Unknown operator '%s'." % operator)
151
                print " - Unknown operator '%s'." % operator
152
        else:
153
            bot.respond(server, sender, target, "Not enough arguments.")
154
            print " - Not enough arguments."
155
156
def do_set_access(self, server, sender, target, args):
157
    if len(args) == 2:
158
        user = args[0]
159
        sender_level = self.get_level(sender)  # The one trying to set a new level for:
160
        user_level = self.get_level(user)      # <-- this user
161
        new_level = int(args[1], 0)            # The new level, default to 0
162
        if user_level > 100:
163
            self.respond(server, sender, target, "\x02%s\x02 is admin on this bot and can't be lowered." % user)
164
            return
165
        if sender_level > user_level or user.lower() == irclib.nm_to_n(sender).lower():
166
            if sender_level > new_level:
167
                if new_level > 100:
168
                    new_level = 100
169
                self.settings.bot_user_list[user] = new_level
170
                print "User '%s' has been given access level %d." % (user, new_level)
171
                self.respond(server, sender, target, "User '%s' now has access level %d." % (user, new_level))
172
                self.tell_users(server, "User '%s' has been given access level %d." % (user, new_level), level=100, notice=True)
173
            else:
174
                self.respond(server, sender, target, "Your level is not sufficiant for this.")
175
        else:
176
            self.respond(server, sender, target, "You can not change this users level.")
177
    else:
178
        self.respond(server, sender, target, "Incorrect number of arguments.")