73 def call_command (bot, message, cmdname, **kvargs): |
74 def call_command (bot, message, cmdname, **kvargs): |
74 try: |
75 try: |
75 cmd = Commands[cmdname] |
76 cmd = Commands[cmdname] |
76 except KeyError: |
77 except KeyError: |
77 return False |
78 return False |
78 |
79 |
79 if cmd['level'] == 'admin' and not bot.is_admin (kvargs['ident'], kvargs['host']): |
80 if cmd['level'] == 'admin' \ |
80 command_error ("%s requires admin access" % cmdname) |
81 and not "%s@%s" % (kvargs['ident'], kvargs['host']) in Config.get_value ('admins', default=[]): |
81 |
82 command_error ("you may not use %s" % cmdname) |
|
83 |
82 match = re.compile (cmd['regex']).match (message) |
84 match = re.compile (cmd['regex']).match (message) |
83 |
85 |
84 if match == None: |
86 if match == None: |
85 # didn't match |
87 # didn't match |
|
88 print "regex: %s" % cmd['regex'] |
86 command_error ('invalid arguments\nusage: %s %s' % (cmd['name'], cmd['args'])) |
89 command_error ('invalid arguments\nusage: %s %s' % (cmd['name'], cmd['args'])) |
87 #fi |
90 |
88 |
|
89 i = 1 |
91 i = 1 |
90 args = {} |
92 args = {} |
91 |
93 |
92 for argname in cmd['argnames']: |
94 for argname in cmd['argnames']: |
93 args[argname] = match.group (i) |
95 args[argname] = match.group (i) |
94 i += 1 |
96 i += 1 |
95 #done |
97 |
96 |
|
97 getattr (cmd['module'], "cmd_%s" % cmdname) (bot=bot, cmdname=cmdname, args=args, **kvargs) |
98 getattr (cmd['module'], "cmd_%s" % cmdname) (bot=bot, cmdname=cmdname, args=args, **kvargs) |
98 return True |
99 return True |
99 |
100 |
100 # |
101 # |
101 # make_regex |
102 # make_regex |
114 if gotvariadic: |
115 if gotvariadic: |
115 raise CommandError ('variadic argument is not last') |
116 raise CommandError ('variadic argument is not last') |
116 |
117 |
117 if arg == '': |
118 if arg == '': |
118 continue |
119 continue |
|
120 |
|
121 gotliteral = False |
119 |
122 |
120 if arg[0] == '[' and arg[-1] == ']': |
123 if arg[0] == '[' and arg[-1] == ']': |
121 arg = arg[1:-1] |
124 arg = arg[1:-1] |
122 gotoptional = True |
125 gotoptional = True |
123 elif arg[0] == '<' and arg[-1] == '>': |
126 elif arg[0] == '<' and arg[-1] == '>': |
124 if gotoptional: |
127 if gotoptional: |
125 raise CommandError ('mandatory argument after optional one') |
128 raise CommandError ('mandatory argument after optional one') |
126 |
129 |
127 arg = arg[1:-1] |
130 arg = arg[1:-1] |
128 else: |
131 else: |
129 raise CommandError ('badly formed argument list') |
132 gotliteral = True |
130 #fi |
|
131 |
133 |
132 if arg[-3:] == '...': |
134 if arg[-3:] == '...': |
133 gotvariadic = True |
135 gotvariadic = True |
134 arg = arg[0:-3] |
136 arg = arg[0:-3] |
135 #fi |
|
136 |
137 |
137 if gotoptional == False: |
138 if gotoptional == False: |
138 regex += '\s+' |
139 regex += '\s+' |
139 else: |
140 else: |
140 regex += '\s*' |
141 regex += '\s*' |
141 |
142 |
142 if gotoptional: |
143 if gotliteral: |
|
144 regex += arg |
|
145 elif gotoptional: |
143 if gotvariadic: |
146 if gotvariadic: |
144 regex += r'(.*)' |
147 regex += r'(.*)' |
145 else: |
148 else: |
146 regex += r'([^ ]*)' |
149 regex += r'([^ ]*)' |
147 else: |
150 else: |