]>
Commit | Line | Data |
---|---|---|
685e346e A |
1 | import time\r |
2 | from sys_base import *\r | |
3 | from core import anope_major\r | |
4 | \r | |
5 | class Request(object):\r | |
6 | def __init__(self, user, channel, action):\r | |
7 | self.user = user\r | |
8 | self.channel = channel\r | |
9 | self.action = action\r | |
10 | self.time = int(time.time())\r | |
11 | \r | |
12 | class AuthManager(Subsystem):\r | |
13 | def __init__(self, module):\r | |
14 | Subsystem.__init__(self, module, module.options, 'auth')\r | |
15 | self.requests = {}\r | |
16 | \r | |
17 | def request(self, user, channel, action):\r | |
18 | if user in self.requests:\r | |
19 | self.module.notice(user, 'Sorry, you already have a pending request. Please retry later.')\r | |
20 | return\r | |
21 | \r | |
22 | self.requests[user] = Request(user, channel, action)\r | |
23 | \r | |
24 | if anope_major == 1:\r | |
25 | self.module.msg('ChanServ', 'WHY %s %s' % (channel, user))\r | |
26 | elif anope_major == 2:\r | |
27 | self.module.msg('ChanServ', 'STATUS %s %s' % (channel, user))\r | |
28 | \r | |
29 | def accept(self, user):\r | |
30 | if not user in self.requests:\r | |
31 | return\r | |
32 | \r | |
33 | request = self.requests[user]\r | |
34 | action = request.action\r | |
35 | channel = request.channel\r | |
36 | \r | |
37 | if self.onAccept(user, request, action, channel):\r | |
38 | pass\r | |
39 | elif action == 'request':\r | |
40 | if not channel in self.module.channels:\r | |
41 | self.module.channels.add(channel)\r | |
42 | self.module.notice(user, 'Joined @b%s@b.' % channel)\r | |
43 | elif action == 'remove':\r | |
44 | if self.module.channels.is_valid(channel):\r | |
45 | self.module.channels.remove(channel)\r | |
46 | self.module.notice(user, 'Parted @b%s@b.' % channel)\r | |
47 | else:\r | |
48 | self.module.elog.request('Invalid request. Action: @b%s@b. Channel: @b%s@b. User: @b%s@b.' % (action, channel, user))\r | |
49 | self.module.notice(user, 'Invalid request: @b%s@b.' % action)\r | |
50 | del self.requests[user]\r | |
51 | return\r | |
52 | \r | |
53 | self.module.elog.request('Request accepted. Action: @b%s@b. Channel: @b%s@b. User: @b%s@b.' % (action, channel, user))\r | |
54 | del self.requests[user]\r | |
55 | \r | |
56 | def onAccept(self, user, request, action, channel):\r | |
57 | return False\r | |
58 | \r | |
59 | def reject_not_founder(self, user, channel):\r | |
60 | self.reject(user, 'You are not the channel founder of @b%s@b.' % channel)\r | |
61 | \r | |
62 | def reject_not_registered(self, channel):\r | |
63 | for user in self.requests:\r | |
64 | if self.requests[user].channel == channel:\r | |
65 | self.reject(user, 'Channel @b%s@b is unregistered.' % channel)\r | |
66 | break\r | |
67 | \r | |
68 | def reject(self, user, reason = ''):\r | |
69 | if not user in self.requests:\r | |
70 | return\r | |
71 | \r | |
72 | request = self.requests[user]\r | |
73 | action = request.action\r | |
74 | channel = request.channel\r | |
75 | self.module.elog.request('Request rejected. Action: @b%s@b. Channel: @b%s@b. User: @b%s@b. Reason: @b%s@b.' % (action, channel, user, reason))\r | |
76 | self.module.notice(user, reason)\r | |
77 | del self.requests[user]\r | |
78 | \r | |
79 | def commit(self):\r | |
80 | timeout_time = int(time.time()) - 20\r | |
81 | expired_requests = []\r | |
82 | \r | |
83 | for user in self.requests:\r | |
84 | request = self.requests[user]\r | |
85 | \r | |
86 | if request.time < timeout_time:\r | |
87 | expired_requests.append(user)\r | |
88 | action = request.action\r | |
89 | channel = request.channel\r | |
90 | \r | |
91 | try:\r | |
92 | self.module.elog.request('Request expired. Action: @b%s@b. Channel: @b%s@b. User: @b%s@b.' % (action, channel, user))\r | |
93 | self.module.notice(user, 'Request @b%s@b expired. Please retry later.' % action)\r | |
94 | except Exception, err:\r | |
95 | pass\r | |
96 | \r | |
97 | for user in expired_requests:\r | |
98 | del self.requests[user]\r |