]>
jfr.im git - irc/rizon/acid.git/blob - pyva/src/main/python/moo/moo.py
1 #!/usr/bin/python pseudoserver.py
3 # module for pypseudoserver
4 # written by ElChE <elche@rizon.net>, martin <martin@rizon.net>
13 from utils
import format_ascii_irc
14 from pseudoclient
import sys_log
15 from datetime
import datetime
21 import cmd_user
, requests
23 class moo(AcidPlugin
):
24 # Regexes for HostServ messages because 1.8/2.0 duality.
25 req_regexes
= {'req18': re
.compile('^New vHost (.+?) requested by (.+?) \((.+)\)$'),
26 'req19': re
.compile('^COMMAND: (.+?)!.+?@.+? (.+?) used REQUEST to request new vhost (.+)$'),
27 'rejacc18': re
.compile('^Host Request for (.+?) (.+?) by (.+)$'),
28 'acc19': re
.compile('^COMMAND: (.+?)!.+?@.+? .+? used ACTIVATE for (.+?) for vhost .+$'),
29 'rej19': re
.compile('^COMMAND: (.+?)!.+?@.+? .+? used REJECT to reject vhost for (.+?) \(.*\)$'),
30 'wait18': re
.compile("^#\d+ Nick:\002(.+?)\002, vhost:\002(.+?)\002 \(.+\)$"),
31 'wait19': re
.compile('^\d+ +([^ ]+) +([^ ]+) +([^ ]+) +.+$')
36 AcidPlugin
.__init
__(self
)
39 self
.log
= logging
.getLogger(__name__
)
42 self
.client
= istring(self
.config
.get('vhost', 'nick'))
43 self
.chan
= istring(self
.config
.get('vhost', 'channel'))
44 self
.logchan
= istring(self
.config
.get('vhost', 'logchan'))
45 except Exception, err
:
46 self
.log
.exception("Error reading vhost configuration options: %s" % err
)
51 self
.elog
= sys_log
.LogManager(self
)
52 self
.commands_user
= cmd_user
.UserCommandManager()
53 self
.requests
= requests
.RequestManager(self
)
54 except Exception, err
:
55 self
.log
.exception('Error initializing core subsystems for vhost module (%s)' % err
)
58 self
.elog
.debug('Started core subsystems.')
59 self
.initialized
= True
61 self
.msg('HostServ', 'WAITING') # Check if we missed requests while down
65 def msg(self
, target
, message
):
67 self
.inter
.privmsg(self
.client
, target
, format_ascii_irc(message
))
69 def notice(self
, target
, message
):
71 self
.inter
.notice(self
.client
, target
, format_ascii_irc(message
))
73 def execute(self
, manager
, command
, argument
, channel
, sender
):
74 full_command
= '%s%s' % (command
, ' %s' % argument
if len(argument
) else '')
75 cmd
= manager
.get_command(command
)
81 cmd
[0](self
, manager
, channel
, sender
, argument
)
83 tb
= traceback
.extract_tb(sys
.exc_info()[2])
87 length
= len(entry
[2])
92 self
.elog
.exception(e
)
93 self
.log
.exception("moo error!")
96 self
.elog
.traceback('@b%-*s@b : %d %s' % (longest
, entry
[2], entry
[1], entry
[3]))
100 self
.msg('HostServ', 'WAITING') # Check if we missed requests while down
102 def onNotice(self
, source
, target
, message
):
103 msg
= message
.strip()
105 if msg
.startswith('[#'): #It's a channel welcome message. Let's ignore it.
108 user
= self
.inter
.findUser(target
)
109 userinfo
= self
.inter
.findUser(source
)
111 if not user
or user
.getNick() != self
.client
:
114 if userinfo
.getNick() != 'HostServ':
117 # Check for 1.8 or 1.9 requests.
118 # 1.8:waiting: #$num Nick:\002$nick\002, vhost:\002$vhost\002 ($display - $date)
119 # 1.9:waiting: $num $nick $display $vhost $date
122 # Regex. Because it solves the problem in the easiest way.
123 match
= self
.req_regexes
['wait18'].match(msg
)
125 match
= self
.req_regexes
['wait19'].match(msg
)
126 if match
== None or match
.groups(0) == 'Number':
129 if len(match
.groups()) == 3:
130 (nick
, vhost
, display
) = match
.groups()
131 elif len(match
.groups()) == 2:
132 (nick
, vhost
) = match
.groups()
133 display
= None # self.requests.add can handle None for display nick
137 if not nick
or not vhost
:
141 self
.requests
.add(vhost
, nick
, display
)
143 tb
= traceback
.extract_tb(sys
.exc_info()[2])
147 length
= len(entry
[2])
152 self
.elog
.exception(e
)
153 self
.log
.exception("moo error!")
156 self
.elog
.traceback('@b%-*s@b : %d %s' % (longest
, entry
[2], entry
[1], entry
[3]))
158 def onPrivmsg(self
, source
, target
, message
):
159 userinfo
= self
.inter
.findUser(source
)
161 sender
= userinfo
.getNick()
163 msg
= message
.strip()
164 index
= msg
.find(' ')
170 command
= msg
[:index
]
171 argument
= msg
[index
+ 1:]
173 if channel
== self
.client
: # XXX uid
174 pass #private message
175 elif channel
== self
.chan
and command
.startswith('!'):
176 self
.execute(self
.commands_user
, command
, argument
, channel
, sender
)
177 elif channel
== self
.logchan
and (sender
== 'Global' or sender
== 'HostServ'):
178 match
= self
.req_regexes
['req18'].match(msg
)
181 self
.requests
.add(match
.group(1), match
.group(2), match
.group(3))
183 self
.print_traceback(e
)
186 match
= self
.req_regexes
['req19'].match(msg
)
189 self
.requests
.add(match
.group(3), match
.group(1), match
.group(2))
191 self
.print_traceback(e
)
194 match
= self
.req_regexes
['rejacc18'].match(msg
)
196 (nick
, action
, by
) = match
.groups()
197 by
= by
.split(' ')[0] # In case there's a reject reason
198 if by
== self
.client
:
202 if action
== 'rejected':
203 self
.requests
.delete(nick
)
204 self
.msg(self
.chan
, 'vHost for @b%s@b was manually %s by @b%s@b' % (nick
, action
, by
))
205 elif action
== 'activated':
206 self
.requests
.approve(nick
, by
, silent
=True)
207 self
.msg(self
.chan
, 'vHost for @b%s@b was manually %s by @b%s@b' % (nick
, action
, by
))
209 self
.print_traceback(e
)
212 match
= self
.req_regexes
['acc19'].match(msg
)
214 (by
, nick
) = match
.groups()
215 if by
== self
.client
:
219 self
.requests
.delete(nick
)
220 self
.msg(self
.chan
, 'vHost for @b%s@b was manually activated by @b%s@b' % (nick
, by
))
222 self
.print_traceback(e
)
225 match
= self
.req_regexes
['rej19'].match(msg
)
227 (by
, nick
) = match
.groups()
228 if by
== self
.client
:
232 self
.requests
.delete(nick
)
233 self
.msg(self
.chan
, 'vHost for @b%s@b was manually rejected by @b%s@b' % (nick
, by
))
235 self
.print_traceback(e
)
238 def print_traceback(self
, e
):
239 tb
= traceback
.extract_tb(sys
.exc_info()[2])
243 length
= len(entry
[2])
248 self
.elog
.exception(e
)
249 self
.log
.exception("moo error!")
252 self
.elog
.traceback('@b%-*s@b : %d %s' % (longest
, entry
[2], entry
[1], entry
[3]))