modulecore.py

changeset 117
6c0609395889
parent 115
2bb5c4578ee1
child 118
dbf49689af0d
equal deleted inserted replaced
116:9e483447654b 117:6c0609395889
1 import os 1 import os
2 import re 2 import re
3 import time
3 from configfile import Config 4 from configfile import Config
4 5
5 Modules = {} 6 Modules = {}
6 Commands = {} 7 Commands = {}
7 8
77 # 78 #
78 # response_function 79 # response_function
79 # 80 #
80 g_responsePages = [[]] 81 g_responsePages = [[]]
81 g_responsePageNum = 0 82 g_responsePageNum = 0
83 g_lastConfirm = 0
84 g_confirmCommand = None
85
86 class Confirmxeption (Exception):
87 def __init__ (self, id, value):
88 self.id = id
89 self.message = value
90 def __str__ (self):
91 return self.message
82 92
83 def response_function (message): 93 def response_function (message):
84 global g_responsePages 94 global g_responsePages
85 95
86 if len (g_responsePages[-1]) > 4: 96 if len (g_responsePages[-1]) > 4:
87 g_responsePages.append ([message]) 97 g_responsePages.append ([message])
88 else: 98 else:
89 g_responsePages[-1].append (message) 99 g_responsePages[-1].append (message)
90 100
91 def print_responses (bot, replyto): 101 def confirm_function (id, message):
102 raise Confirmxeption (id, message)
103
104 def print_responses (commandObject):
92 global g_responsePages 105 global g_responsePages
93 global g_responsePageNum 106 global g_responsePageNum
107 bot = commandObject['bot']
108 replyto = commandObject['replyto']
94 109
95 # Check bounds 110 # Check bounds
96 if g_responsePageNum >= len (g_responsePages): 111 if g_responsePageNum >= len (g_responsePages):
97 bot.privmsg (replyto, "No more messages.") 112 bot.privmsg (replyto, "No more messages.")
98 return 113 return
109 num = (len (g_responsePages) - g_responsePageNum) 124 num = (len (g_responsePages) - g_responsePageNum)
110 bot.privmsg (replyto, "%d more page%s, use .more to continue output" \ 125 bot.privmsg (replyto, "%d more page%s, use .more to continue output" \
111 % (num, 's' if num != 1 else '')) 126 % (num, 's' if num != 1 else ''))
112 127
113 # 128 #
129 # check_same_caller (comm1, comm2)
130 #
131 # Are the two commands called by the same person?
132 #
133 def check_same_caller (comm1, comm2):
134 return comm1['bot'].name == comm2['bot'].name \
135 and comm1['sender'] == comm2['sender'] \
136 and comm1['ident'] == comm2['ident'] \
137 and comm1['host'] == comm2['host']
138
139 def exec_command (commandObject):
140 global g_lastConfirm
141 global g_confirmCommand
142 cmdname = commandObject['cmdname']
143
144 try:
145 func = getattr (commandObject['module'], 'cmd_' + cmdname)
146 except AttributeError:
147 command_error ('command "%s" is not defined!' % cmdname)
148
149 try:
150 func (**commandObject)
151 except Confirmxeption as e:
152 if time.time() - g_lastConfirm < 15 and g_confirmCommand != None:
153 command_error ('another confirm is underway')
154
155 g_lastConfirm = time.time()
156 response_function (str (e) + ' (.yes/.no)')
157 commandObject['confirmed'] = e.id
158 g_confirmCommand = commandObject
159
160 #
114 # call_command (bot, message, cmdname, **kvargs) 161 # call_command (bot, message, cmdname, **kvargs)
115 # 162 #
116 # Calls a cobalt command 163 # Calls a cobalt command
117 # 164 #
118 def call_command (bot, message, cmdname, **kvargs): 165 def call_command (bot, message, cmdname, **kvargs):
120 global g_responsePageNum 167 global g_responsePageNum
121 168
122 try: 169 try:
123 cmd = Commands[cmdname] 170 cmd = Commands[cmdname]
124 except KeyError: 171 except KeyError:
125 return False 172 return
126 173
127 if not is_available (cmd, kvargs['ident'], kvargs['host']): 174 if not is_available (cmd, kvargs['ident'], kvargs['host']):
128 command_error ("you may not use %s" % cmdname) 175 command_error ("you may not use %s" % cmdname)
129 176
130 match = re.compile (cmd['regex']).match (message) 177 match = re.compile (cmd['regex']).match (message)
131 178
132 if match == None: 179 if match == None:
133 # didn't match 180 # didn't match
134 print "regex: %s" % cmd['regex'] 181 print "regex: %s" % cmd['regex']
135 command_error ('invalid arguments\nusage: %s %s' % (cmd['name'], cmd['args'])) 182 command_error ('invalid arguments\nusage: %s %s' % (cmd['name'], cmd['args']))
136 183
146 for argname in cmd['argnames']: 193 for argname in cmd['argnames']:
147 args[argname] = match.group (i) 194 args[argname] = match.group (i)
148 i += 1 195 i += 1
149 196
150 print "ModuleCore: %s called by %s" % (cmdname, kvargs['sender']) 197 print "ModuleCore: %s called by %s" % (cmdname, kvargs['sender'])
151 getattr (cmd['module'], "cmd_%s" % cmdname) (bot=bot, cmdname=cmdname, args=args, reply=response_function, **kvargs) 198 commandObject = kvargs
199 commandObject['bot'] = bot
200 commandObject['cmdname'] = cmdname
201 commandObject['args'] = args
202 commandObject['reply'] = response_function
203 commandObject['confirm'] = confirm_function
204 commandObject['confirmed'] = 0
205 commandObject['commandObject'] = commandObject
206 commandObject['info'] = cmd
207 commandObject['module'] = cmd['module']
208 exec_command (commandObject)
152 209
153 # Print the first page of responses. 210 # Print the first page of responses.
154 if cmdname != 'more': 211 if cmdname != 'more':
155 print_responses (bot, kvargs['replyto']) 212 print_responses (commandObject)
156 213
157 return True 214 def confirm (cmd, yes):
215 global g_confirmCommand
216
217 if g_confirmCommand == None:
218 cmd['reply'] ('%s to what?' % cmd['cmdname'])
219 return
220
221 if not check_same_caller (cmd, g_confirmCommand):
222 return
223
224 if yes:
225 exec_command (g_confirmCommand)
226 else:
227 cmd['reply'] ('okay then')
228
229 g_confirmCommand = None
158 230
159 # 231 #
160 # get_available_commands 232 # get_available_commands
161 # 233 #
162 # Gets a list of commands available to the given user 234 # Gets a list of commands available to the given user

mercurial