]>
jfr.im git - erebus.git/blob - erebus.py
2 # -*- coding: latin-1 -*-
4 # Erebus IRC bot - Author: John Runyon
9 import os
, sys
, select
, MySQLdb
, MySQLdb
.cursors
10 import bot
, config
, ctlmod
22 def __init__(self
, nick
, auth
=None):
30 return self
.auth
is not None
32 def authed(self
, auth
):
33 if auth
== '0': auth
= None
42 c
.execute("SELECT level FROM users WHERE auth = %s", (self
.auth
,))
45 self
.glevel
= row
['level']
51 self
.chans
.append(chan
)
53 self
.chans
.remove(chan
)
55 def __str__(self
): return self
.nick
56 def __repr__(self
): return "<User %r (%d)>" % (self
.nick
,self
.glevel
)
58 class Channel(object):
59 def __init__(self
, name
, bot
, levels
={}):
68 def userjoin(self
, user
, level
=None):
69 if user
not in self
.users
: self
.users
.append(user
)
70 if level
== 'op' and user
not in self
.ops
: self
.ops
.append(user
)
71 if level
== 'voice' and user
not in self
.voices
: self
.voices
.append(user
)
72 def userpart(self
, user
):
73 if user
in self
.ops
: self
.ops
.remove(user
)
74 if user
in self
.voices
: self
.voices
.remove(user
)
75 if user
in self
.users
: self
.users
.remove(user
)
77 def userop(self
, user
):
78 if user
in self
.users
and user
not in self
.ops
: self
.ops
.append(user
)
79 def uservoice(self
, user
):
80 if user
in self
.users
and user
not in self
.voices
: self
.voices
.append(user
)
81 def userdeop(self
, user
):
82 if user
in self
.ops
: self
.ops
.remove(user
)
83 def userdevoice(self
, user
):
84 if user
in self
.voices
: self
.voices
.remove(user
)
86 def __str__(self
): return self
.name
87 def __repr__(self
): return "<Channel %r>" % (self
.name
)
89 def __init__(self
, trigger
):
90 self
.trigger
= trigger
91 if os
.name
== "posix":
93 self
.po
= select
.poll()
94 else: # f.e. os.name == "nt" (Windows)
95 self
.potype
= "select"
98 def newbot(self
, nick
, user
, bind
, server
, port
, realname
):
99 if bind
is None: bind
= ''
100 obj
= bot
.Bot(self
, nick
, user
, bind
, server
, port
, realname
)
101 self
.bots
[nick
.lower()] = obj
103 def newfd(self
, obj
, fileno
):
104 self
.fds
[fileno
] = obj
105 if self
.potype
== "poll":
106 self
.po
.register(fileno
, select
.POLLIN
)
107 elif self
.potype
== "select":
108 self
.fdlist
.append(fileno
)
110 def bot(self
, name
): #get Bot() by name (nick)
111 return self
.bots
[name
.lower()]
112 def fd(self
, fileno
): #get Bot() by fd/fileno
113 return self
.fds
[fileno
]
114 def randbot(self
): #get Bot() randomly
115 for b
in self
.bots
.itervalues(): return b
#TODO
117 def user(self
, nick
, justjoined
=False):
119 if nick
in self
.users
:
120 return self
.users
[nick
]
122 user
= self
.User(nick
)
123 self
.users
[nick
] = user
126 self
.randbot().conn
.send("WHO %s %%ant,2" % (nick
))
129 def channel(self
, name
): #get Channel() by name
130 if name
.lower() in self
.chans
:
131 return self
.chans
[name
.lower()]
135 def newchannel(self
, bot
, name
, levels
={}):
136 chan
= self
.Channel(name
.lower(), bot
, levels
)
137 self
.chans
[name
.lower()] = chan
141 if self
.potype
== "poll":
142 return [fd
for (fd
, ev
) in self
.po
.poll()]
143 elif self
.potype
== "select":
144 return select
.select(self
.fdlist
, [], [])[0]
146 def connectall(self
):
147 for bot
in self
.bots
.itervalues():
148 if bot
.conn
.state
== 0:
152 def hook(self
, word
, handler
):
154 self
.msghandlers
[word
].append(handler
)
156 self
.msghandlers
[word
] = [handler
]
157 def unhook(self
, word
, handler
):
158 if word
in self
.msghandlers
and handler
in self
.msghandlers
[word
]:
159 self
.msghandlers
[word
].remove(handler
)
160 def hashook(self
, word
):
161 return word
in self
.msghandlers
and len(self
.msghandlers
[word
]) != 0
162 def gethook(self
, word
):
163 return self
.msghandlers
[word
]
165 def hooknum(self
, word
, handler
):
167 self
.numhandlers
[word
].append(handler
)
169 self
.numhandlers
[word
] = [handler
]
170 def unhooknum(self
, word
, handler
):
171 if word
in self
.numhandlers
and handler
in self
.numhandlers
[word
]:
172 self
.numhandlers
[word
].remove(handler
)
173 def hasnumhook(self
, word
):
174 return word
in self
.numhandlers
and len(self
.numhandlers
[word
]) != 0
175 def getnumhook(self
, word
):
176 return self
.numhandlers
[word
]
181 cfg
= config
.Config('bot.config')
182 main
= Erebus(cfg
.trigger
)
184 autoloads
= [mod
for mod
, yes
in cfg
.items('autoloads') if int(yes
) == 1]
185 for mod
in autoloads
:
186 print "Loading %s" % (mod
)
187 ctlmod
.load(main
, mod
)
189 main
.db
= MySQLdb
.connect(host
=cfg
.dbhost
, user
=cfg
.dbuser
, passwd
=cfg
.dbpass
, db
=cfg
.dbname
, cursorclass
=MySQLdb
.cursors
.DictCursor
)
191 c
.execute("SELECT nick, user, bind FROM bots WHERE active = 1")
195 main
.newbot(row
['nick'], row
['user'], row
['bind'], cfg
.host
, cfg
.port
, cfg
.realname
)
199 poready
= main
.poll()
200 for fileno
in poready
:
201 for line
in main
.fd(fileno
).getdata():
202 main
.fd(fileno
).parse(line
)
204 if __name__
== '__main__':