~ubuntu-branches/ubuntu/utopic/gozerbot/utopic

« back to all changes in this revision

Viewing changes to build/lib/gozerbot/persist/persistconfig.py

  • Committer: Package Import Robot
  • Author(s): Jeremy Malcolm
  • Date: 2012-04-03 21:58:28 UTC
  • mfrom: (3.1.11 sid)
  • Revision ID: package-import@ubuntu.com-20120403215828-6mik0tzug5na93la
Tags: 0.99.1-2
* Removes logfiles on purge (Closes: #668767)
* Reverted location of installed files back to /usr/lib/gozerbot.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# gozerbot/persistconfig.py
 
2
#
 
3
#
 
4
 
 
5
""" allow data to be pickled to disk .. creating the persisted object
 
6
    restores data.
 
7
    
 
8
usage:
 
9
    !plug-cfg                   ->      shows list of all config
 
10
    !plug-cfg key value         ->      sets value to key
 
11
    !plug-cfg key               ->      shows list of key
 
12
    !plug-cfg key add value     ->      adds value to list
 
13
    !plug-cfg key remove value  ->      removes value from list
 
14
    !plug-cfg key clear         ->      clears entire list
 
15
    !plug-cfgsave               ->      force save configuration to disk
 
16
    
 
17
todo:
 
18
    - plugin api (more work needed?)
 
19
    
 
20
"""
 
21
 
 
22
__copyright__ = 'this file is in the public domain'
 
23
__author__ = 'Bas van Oostveen'
 
24
 
 
25
# gozerbot imports
 
26
from gozerbot.utils.log import rlog
 
27
from gozerbot.utils.trace import calledfrom
 
28
from gozerbot.commands import cmnds, Command
 
29
from gozerbot.examples import examples
 
30
from gozerbot.datadir import datadir
 
31
from gozerbot.persist.persist import Persist
 
32
from gozerbot.config import Config, config
 
33
 
 
34
# basic imports
 
35
import sys, os, types, time
 
36
 
 
37
class PersistConfigError(Exception): pass
 
38
 
 
39
class PersistConfig(Config):
 
40
 
 
41
    """ persist plugin configuration and create default handlers. """
 
42
 
 
43
    def __init__(self):
 
44
        self.hide = []
 
45
        self.plugname = calledfrom(sys._getframe())
 
46
        Config.__init__(self, datadir + os.sep + 'plugs' + os.sep + self.plugname, "config")
 
47
 
 
48
        if self.plugname not in config['loadlist']:
 
49
             return
 
50
 
 
51
        cmndname = "%s-cfg" % self.plugname
 
52
        rlog(-3, 'persistconfig', 'added command %s (%s)' % (cmndname, \
 
53
self.plugname))
 
54
        cmnds[cmndname] = Command(self.cmnd_cfg, 'OPER', self.plugname, \
 
55
threaded=True)  
 
56
        examples.add(cmndname, "plugin configuration", cmndname)
 
57
        cmndnamesave = cmndname + "save"
 
58
        cmnds[cmndnamesave] = Command(self.cmnd_cfgsave, 'OPER', \
 
59
self.plugname, threaded=True)   
 
60
        examples.add(cmndnamesave, "save plugin configuration", cmndnamesave)
 
61
 
 
62
    ### cmnds
 
63
 
 
64
    def show_cfg(self, bot, ievent):
 
65
 
 
66
        """ show config options. """
 
67
 
 
68
        s = []
 
69
 
 
70
        for key, optionvalue in sorted(self.iteritems()):
 
71
            if key in self.hide:
 
72
                continue
 
73
            v = optionvalue
 
74
            if type(v) in [str, unicode]:
 
75
                v = '"'+v+'"'
 
76
            v = str(v)
 
77
            s.append("%s=%s" % (key, v))
 
78
 
 
79
        ievent.reply("options: " + ' .. '.join(s))
 
80
 
 
81
    def cmnd_cfgsave(self, bot, ievent):
 
82
 
 
83
        """ save config. """
 
84
 
 
85
        self.save()
 
86
        ievent.reply("config saved")
 
87
        
 
88
    def cmnd_cfg_edit(self, bot, ievent, args, key, optionvalue):
 
89
 
 
90
        """ edit config values. """
 
91
 
 
92
        if not self.has_key(key):
 
93
            ievent.reply('option %s is not defined' % key)
 
94
            return
 
95
 
 
96
        if key in self.hide:
 
97
            return
 
98
 
 
99
        if type(optionvalue) == types.ListType:
 
100
 
 
101
            if args[0].startswith("[") and args[-1].endswith("]"):
 
102
                values = []
 
103
 
 
104
                for v in ' '.join(args)[1:-1].replace(", ", ",").split(","):
 
105
                    if v[0]=='"' and v[-1]=='"':
 
106
                        # string
 
107
                        v = v.replace('"', '')
 
108
                    elif v[0]=="'" and v[-1]=="'":
 
109
                        # string
 
110
                        v = v.replace("'", "")
 
111
                    elif '.' in v:
 
112
                        # float
 
113
                        try:
 
114
                            v = float(v)
 
115
                        except ValueError:
 
116
                            ievent.reply("invalid long literal: %s" % v)
 
117
                            return
 
118
                    else:
 
119
                        # int
 
120
                        try:
 
121
                            v = int(v)
 
122
                        except ValueError:
 
123
                            ievent.reply("invalid int literal: %s" % v)
 
124
                            return
 
125
                    values.append(v)
 
126
 
 
127
                self.set(key, values)
 
128
                self.save()
 
129
                ievent.reply("%s set %s" % (key, values))
 
130
                return
 
131
 
 
132
            command = args[0]
 
133
            value = ' '.join(args[1:])
 
134
 
 
135
            if command == "clear":
 
136
                self.clear(key)
 
137
                self.save()
 
138
                ievent.reply("list empty")
 
139
            elif command == "add":
 
140
                self.append(key, value)
 
141
                self.save()
 
142
                ievent.reply("%s added %s" % (key, value))
 
143
            elif command == "remove" or command == "del":
 
144
                try:
 
145
                    self.remove(key, value)
 
146
                    self.save()
 
147
                    ievent.reply("%s removed" % str(value))
 
148
                except ValueError:
 
149
                    ievent.reply("%s is not in list" % str(value))
 
150
            else:
 
151
                ievent.reply("invalid command")
 
152
            return
 
153
 
 
154
        else:
 
155
            value = ' '.join(args)
 
156
 
 
157
            try:
 
158
                value = type(optionvalue)(value)
 
159
            except:
 
160
                pass
 
161
 
 
162
            if type(value) == type(optionvalue):
 
163
                self.set(key, value)
 
164
                self.save()
 
165
                ievent.reply("%s set" % key)
 
166
            elif type(value) == types.LongType and \
 
167
type(option.value) == types.IntType:
 
168
                # allow upscaling from int to long
 
169
                self.set(key, value)
 
170
                self.save()
 
171
                ievent.reply("%s set" % key)
 
172
            else:
 
173
                ievent.reply("value %s (%s) is not of the same type as %s \
 
174
(%s)" % (value, type(value), optionvalue, type(optionvalue)))
 
175
    
 
176
    def cmnd_cfg(self, bot, ievent):
 
177
 
 
178
        """ the config (cfg) command. """
 
179
 
 
180
        if not ievent.args:
 
181
            self.show_cfg(bot, ievent)
 
182
            return
 
183
 
 
184
        argc = len(ievent.args)
 
185
        key = ievent.args[0]
 
186
 
 
187
        try:
 
188
            optionvalue = self[key]
 
189
        except KeyError:
 
190
            ievent.reply("%s option %s not found" % (self.plugname, key))
 
191
            return
 
192
 
 
193
        if key in self.hide:
 
194
            return
 
195
 
 
196
        if argc == 1:
 
197
            ievent.reply(str(optionvalue))
 
198
            return
 
199
 
 
200
        self.cmnd_cfg_edit(bot, ievent, ievent.args[1:], key, optionvalue)
 
201
 
 
202
    def generic_cmnd(self, key):
 
203
 
 
204
        """ command for editing config values. """
 
205
 
 
206
        def func(bot, ievent):
 
207
 
 
208
            try:
 
209
                optionvalue = self[key]
 
210
            except KeyError:
 
211
                ievent.reply("%s not found" % key)
 
212
                # need return ?
 
213
 
 
214
            if not isinstance(option, Option):
 
215
                rlog(5, 'persistconfig', 'Option %s is not a valid option' % \
 
216
key)
 
217
                return
 
218
 
 
219
            if ievent.args:
 
220
                value = ' '.join(ievent.args)
 
221
                try:
 
222
                    value = type(optionvalue)(value)
 
223
                except:
 
224
                    pass
 
225
                self.cmnd_cfg_edit(bot, ievent, ievent.args, key, optionvalue)
 
226
            else:
 
227
                ievent.reply(str(optionvalue))
 
228
 
 
229
        return func
 
230
 
 
231
    ### plugin api
 
232
 
 
233
    def define(self, key, value=None, desc="plugin option", perm='OPER', \
 
234
example="", name=None, exposed=True):
 
235
 
 
236
        """ define initial value. """
 
237
 
 
238
        if name:
 
239
            name = name.lower()
 
240
 
 
241
        if not exposed:
 
242
            self.hide.append(key)
 
243
 
 
244
        if not self.has_key(key):
 
245
            if name == None:
 
246
                name = "%s-cfg-%s" % (self.plugname, str(key))
 
247
            self[key] = value
 
248
        
 
249
    def undefine(self, key, throw=False):
 
250
 
 
251
        """ remove a key. """
 
252
 
 
253
        try:
 
254
            del self[key]
 
255
            return True
 
256
        except KeyError, e:
 
257
            if throw:
 
258
                raise
 
259
 
 
260
        self.save()
 
261
        return False
 
262
 
 
263
    def set(self, key, value, throw=False):
 
264
 
 
265
        """ set a key's value. """
 
266
 
 
267
        self[key] = value
 
268
 
 
269
    def append(self, key, value):
 
270
 
 
271
        """ append a value. """
 
272
 
 
273
        self[key].append(value)
 
274
 
 
275
    def remove(self, key, value):
 
276
 
 
277
        """ remove a value. """
 
278
 
 
279
        self[key].remove(value)
 
280
 
 
281
    def clear(self, key):
 
282
 
 
283
        """ clear a value. """
 
284
 
 
285
        self[key] = []
 
286
 
 
287
    def get(self, key, default=None):
 
288
 
 
289
        """ get value of key. """
 
290
 
 
291
        try:
 
292
            return self[key]
 
293
        except KeyError:
 
294
            return default