]>
jfr.im git - erebus.git/blob - erebus.py
5 import os
, sys
, select
, MySQLdb
, MySQLdb
.cursors
6 import bot
, config
, ctlmod
17 def __init__(self
, nick
, auth
=None):
19 self
.auth
= nick
#TEMP
22 def authed(self
, auth
):
31 c
.execute("SELECT level FROM users WHERE auth = %s", (self
.auth
,))
34 self
.level
= row
['level']
39 def __str__(self
): return self
.nick
40 def __repr__(self
): return "<User %r (%d)>" % (self
.nick
,self
.level
)
42 class Channel(object):
47 def __init__(self
, name
):
50 def userjoin(self
, user
, level
=None):
51 if user
not in self
.users
: self
.users
.append(user
)
52 if level
== 'op' and user
not in self
.ops
: self
.ops
.append(user
)
53 if level
== 'voice' and user
not in self
.voices
: self
.voices
.append(user
)
54 def userpart(self
, user
):
55 if user
in self
.ops
: self
.ops
.remove(user
)
56 if user
in self
.voices
: self
.voices
.remove(user
)
57 if user
in self
.users
: self
.users
.remove(user
)
59 def userop(self
, user
):
60 if user
in self
.users
and user
not in self
.ops
: self
.ops
.append(user
)
61 def uservoice(self
, user
):
62 if user
in self
.users
and user
not in self
.voices
: self
.voices
.append(user
)
63 def userdeop(self
, user
):
64 if user
in self
.ops
: self
.ops
.remove(user
)
65 def userdevoice(self
, user
):
66 if user
in self
.voices
: self
.voices
.remove(user
)
68 def __str__(self
): return self
.name
69 def __repr__(self
): return "<Channel %r>" % (self
.name
)
72 if os
.name
== "posix":
74 self
.po
= select
.poll()
75 else: # f.e. os.name == "nt" (Windows)
76 self
.potype
= "select"
79 def newbot(self
, nick
, user
, bind
, server
, port
, realname
, chans
):
80 if bind
is None: bind
= ''
81 obj
= bot
.Bot(self
, nick
, user
, bind
, server
, port
, realname
, chans
)
82 self
.bots
[nick
.lower()] = obj
84 def newfd(self
, obj
, fileno
):
85 self
.fds
[fileno
] = obj
86 if self
.potype
== "poll":
87 self
.po
.register(fileno
, select
.POLLIN
)
88 elif self
.potype
== "select":
89 self
.fdlist
.append(fileno
)
91 def bot(self
, name
): #get Bot() by name (nick)
92 return self
.bots
[name
.lower()]
93 def fd(self
, fileno
): #get Bot() by fd/fileno
94 return self
.fds
[fileno
]
96 def user(self
, nick
): #TODO #get User() by nick
97 return self
.User(nick
.lower())
98 def channel(self
, name
): #TODO #get Channel() by name
99 return self
.Channel(name
.lower())
102 if self
.potype
== "poll":
103 return [fd
for (fd
, ev
) in self
.po
.poll()]
104 elif self
.potype
== "select":
105 return select
.select(self
.fdlist
, [], [])[0]
107 def connectall(self
):
108 for bot
in self
.bots
.itervalues():
109 if bot
.conn
.state
== 0:
113 def hook(self
, word
, handler
):
114 self
.msghandlers
[word
] = handler
115 def unhook(self
, word
):
116 del self
.msghandlers
[word
]
117 def hashook(self
, word
):
118 return word
in self
.msghandlers
119 def gethook(self
, word
):
120 return self
.msghandlers
[word
]
125 cfg
= config
.Config('bot.config')
128 autoloads
= [mod
for mod
, yes
in cfg
.items('autoloads') if int(yes
) == 1]
129 for mod
in autoloads
:
130 ctlmod
.load(main
, mod
)
132 main
.db
= MySQLdb
.connect(host
=cfg
.dbhost
, user
=cfg
.dbuser
, passwd
=cfg
.dbpass
, db
=cfg
.dbname
, cursorclass
=MySQLdb
.cursors
.DictCursor
)
134 c
.execute("SELECT nick, user, bind FROM bots WHERE active = 1")
138 c2
= main
.db
.cursor()
139 c2
.execute("SELECT chname FROM chans WHERE bot = %s AND active = 1", (row
['nick'],))
140 chans
= [chdic
['chname'] for chdic
in c2
.fetchall()]
142 main
.newbot(row
['nick'], row
['user'], row
['bind'], cfg
.host
, cfg
.port
, cfg
.realname
, chans
)
146 poready
= main
.poll()
147 for fileno
in poready
:
148 main
.fd(fileno
).getdata()
150 if __name__
== '__main__':