]> jfr.im git - irc/rizon/acid.git/blob - pyva/src/main/python/control/control.py
.gitignore: Ignore all pyva logs
[irc/rizon/acid.git] / pyva / src / main / python / control / control.py
1 from plugin import AcidPlugin
2 from plugin import modules
3 from core import *
4 import time
5 from istring import istring
6 import os
7
8 class control(AcidPlugin):
9 def __init__(self):
10 AcidPlugin.__init__(self)
11 self.name = "control"
12 self.control = config.get('control', 'nick')
13 self.controlchannel = config.get('control', 'channel')
14
15 def cmd_status(self, source, target, pieces):
16
17 try:
18 las = [str(x)[:4] for x in os.getloadavg()]
19 except:
20 las = ["unk", "unk", "unk"]
21
22 self.inter.privmsg(self.control, target, "Load: [%s %s %s]" % (las[0], las[1], las[2]))
23 self.inter.privmsg(self.control, target, "Modules loaded: %s" % (", ".join(self.get_module_list())))
24 return True
25
26 def cmd_help(self, source, target, pieces):
27 """
28 Prints a list of commands and syntax a user is allowed to use
29 TODO: change output to be more segregated:
30 `help` should list modules
31 `help <module>` should list help for that module
32 `help all` should list all commands
33 """
34
35 if len(pieces) == 0 or len(pieces) > 1:
36 self.inter.notice(self.control, source, "Help is available for the following modules:")
37 self.inter.notice(self.control, source, "help all")
38 for k,v in modules.iteritems():
39 self.inter.notice(self.control, source, "help %s" % v.name)
40 elif len(pieces) == 1:
41 if pieces[0] == "all":
42 filter = None
43 else:
44 filter = pieces[0]
45
46 cmds = []
47 for modname in modules:
48 mod = modules[modname]
49 if mod.getCommands():
50 for name,info in mod.getCommands():
51 cmds.append([mod.name + '.' + name, info])
52
53 user = self.inter.findUser(source)
54 for cmdname,cmdinfo in cmds:
55 perm = cmdinfo['permission']
56 if not perm or user.hasFlags(perm):
57 if not perm:
58 perm = " "
59 if not filter or filter == cmdname.split('.')[0]:
60 self.inter.notice(self.control, source, "[%s] %s%s %s" % (perm, self.prefix, cmdname, cmdinfo['usage']))
61
62 self.inter.notice(self.control, source, "End of Help")
63 return True
64
65 def cmd_reload(self, source, target, pieces):
66
67 try:
68 config.read("config.ini")
69 self.inter.notice(self.control, source, "Reloaded configuration")
70 return True
71 except Exception, err:
72 self.log.error("Error reloading config.ini (%s)" % err)
73 return False
74
75 def getCommands(self):
76 return (
77 ('status', {
78 'permission':'',
79 'callback':self.cmd_status,
80 'usage':"- display technical information"}),
81
82 ('help', {
83 'permission':'',
84 'callback':self.cmd_help,
85 'usage':"- shows help for all commands available *to you*"}),
86
87 ('reload', {
88 'permission':'r',
89 'callback':self.cmd_reload,
90 'usage':"- reloads certain configuration parameters"}),
91 )
92
93 def onPrivmsg(self, creator, recipient, message):
94 params = message.split(' ')
95 user = self.inter.findUser(creator)
96
97 if not user or len(params) == 0 or len(params[0]) == 0 or params[0][0] != self.prefix or recipient != self.controlchannel:
98 return
99
100 cmd = params[0][1:]
101
102 for modname in modules:
103 mod = modules[modname]
104 if not mod.getCommands():
105 continue
106 for cmdname, info in mod.getCommands():
107 if mod.name + '.' + cmdname == cmd and (not info['permission'] or user.hasFlags(info['permission'])):
108 try:
109 try:
110 msg = params[1:]
111 except:
112 msg = None
113
114 if not info['callback'](creator, recipient, msg):
115 self.inter.notice(self.control, creator, "Usage: %s%s %s" % (self.prefix, cmd, info['usage']))
116 except Exception, err:
117 self.log.error('COMMAND: Error executing %s (%s)' % (cmd, err))
118 import traceback
119 traceback.print_exc()
120 raise