From 7f76b9bb94aaf03de6810963c7dd02322cefd7f3 Mon Sep 17 00:00:00 2001 From: Stephen Dranger Date: Fri, 21 Jan 2011 04:18:22 -0600 Subject: [PATCH] first commit --- Pesterchum.png | Bin 0 -> 7937 bytes oyoyo/__init__.py | 22 +++ oyoyo/__init__.pyc | Bin 0 -> 333 bytes oyoyo/client.py | 268 +++++++++++++++++++++++++++++++ oyoyo/client.pyc | Bin 0 -> 9728 bytes oyoyo/cmdhandler.py | 212 ++++++++++++++++++++++++ oyoyo/cmdhandler.pyc | Bin 0 -> 8312 bytes oyoyo/examplebot.py | 45 ++++++ oyoyo/helpers.py | 87 ++++++++++ oyoyo/helpers.pyc | Bin 0 -> 3869 bytes oyoyo/ircevents.py | 209 ++++++++++++++++++++++++ oyoyo/ircevents.pyc | Bin 0 -> 5693 bytes oyoyo/parse.py | 97 +++++++++++ oyoyo/parse.pyc | Bin 0 -> 2869 bytes pesterchum.js | 6 + pesterchum.py | 117 ++++++++++++++ themes/pesterchum/Thumbs.db | Bin 0 -> 53248 bytes themes/pesterchum/abouticon.png | Bin 0 -> 3774 bytes themes/pesterchum/alarm.wav | Bin 0 -> 25388 bytes themes/pesterchum/chummy.gif | Bin 0 -> 106 bytes themes/pesterchum/detestful.gif | Bin 0 -> 164 bytes themes/pesterchum/devious.gif | Bin 0 -> 127 bytes themes/pesterchum/discontent.gif | Bin 0 -> 127 bytes themes/pesterchum/distraught.gif | Bin 0 -> 93 bytes themes/pesterchum/estatic.gif | Bin 0 -> 137 bytes themes/pesterchum/h.gif | Bin 0 -> 101 bytes themes/pesterchum/m.gif | Bin 0 -> 79 bytes themes/pesterchum/offline.gif | Bin 0 -> 71 bytes themes/pesterchum/pcbg.png | Bin 0 -> 4572 bytes themes/pesterchum/pleasant.gif | Bin 0 -> 94 bytes themes/pesterchum/rancorous.gif | Bin 0 -> 138 bytes themes/pesterchum/relaxed.gif | Bin 0 -> 125 bytes themes/pesterchum/sleek.gif | Bin 0 -> 134 bytes themes/pesterchum/smooth.gif | Bin 0 -> 86 bytes themes/pesterchum/style.pcs | 162 +++++++++++++++++++ themes/pesterchum/trayicon.gif | Bin 0 -> 116 bytes themes/pesterchum/trayicon2.png | Bin 0 -> 3708 bytes themes/pesterchum/unruly.gif | Bin 0 -> 99 bytes themes/pesterchum/x.gif | Bin 0 -> 105 bytes 39 files changed, 1225 insertions(+) create mode 100644 Pesterchum.png create mode 100644 oyoyo/__init__.py create mode 100644 oyoyo/__init__.pyc create mode 100644 oyoyo/client.py create mode 100644 oyoyo/client.pyc create mode 100644 oyoyo/cmdhandler.py create mode 100644 oyoyo/cmdhandler.pyc create mode 100644 oyoyo/examplebot.py create mode 100644 oyoyo/helpers.py create mode 100644 oyoyo/helpers.pyc create mode 100644 oyoyo/ircevents.py create mode 100644 oyoyo/ircevents.pyc create mode 100644 oyoyo/parse.py create mode 100644 oyoyo/parse.pyc create mode 100644 pesterchum.js create mode 100644 pesterchum.py create mode 100644 themes/pesterchum/Thumbs.db create mode 100644 themes/pesterchum/abouticon.png create mode 100644 themes/pesterchum/alarm.wav create mode 100644 themes/pesterchum/chummy.gif create mode 100644 themes/pesterchum/detestful.gif create mode 100644 themes/pesterchum/devious.gif create mode 100644 themes/pesterchum/discontent.gif create mode 100644 themes/pesterchum/distraught.gif create mode 100644 themes/pesterchum/estatic.gif create mode 100644 themes/pesterchum/h.gif create mode 100644 themes/pesterchum/m.gif create mode 100644 themes/pesterchum/offline.gif create mode 100644 themes/pesterchum/pcbg.png create mode 100644 themes/pesterchum/pleasant.gif create mode 100644 themes/pesterchum/rancorous.gif create mode 100644 themes/pesterchum/relaxed.gif create mode 100644 themes/pesterchum/sleek.gif create mode 100644 themes/pesterchum/smooth.gif create mode 100644 themes/pesterchum/style.pcs create mode 100644 themes/pesterchum/trayicon.gif create mode 100644 themes/pesterchum/trayicon2.png create mode 100644 themes/pesterchum/unruly.gif create mode 100644 themes/pesterchum/x.gif diff --git a/Pesterchum.png b/Pesterchum.png new file mode 100644 index 0000000000000000000000000000000000000000..4e76f524dd5d896d7ff402ef0167e8ee9052f4d2 GIT binary patch literal 7937 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 literal 0 HcmV?d00001 diff --git a/oyoyo/__init__.py b/oyoyo/__init__.py new file mode 100644 index 0000000..16018de --- /dev/null +++ b/oyoyo/__init__.py @@ -0,0 +1,22 @@ +# Copyright (c) 2008 Duncan Fordyce +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +"""A small, simple irc lib for python suitable for bots, clients and anything else. + +For more information and documentation about this package: + http://code.google.com/p/oyoyo/ +""" diff --git a/oyoyo/__init__.pyc b/oyoyo/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c381bcca700e83526c4c201f55372662f9d8c997 GIT binary patch literal 333 zcmYLEu}TCn5Y5>r0b9Xt$}Nsf?IEI#oi=thA)Ac5;gU?qWRd$DKfzz|SNsBJ;lPA> znY?-L!TkJQ>#y6p7q8A|C-0*aYk{EDyWmc}4Hp~tE${@KT}pf4m}^3a%|nV4d{BdW z>I)U%HFh`2Y~v>Cya%5mmd@ZxkP=xeGhkvIwSE>=rY2EE4B7Q48JjSWU$fZG%tUJk zaWYirk8Z|;27smadN9UQz;Py;6ONv;sfJE+jeZ@rmHMTCwUTJ>> class My_Handler(DefaultCommandHandler): + ... def privmsg(self, prefix, command, args): + ... print "%s said %s" % (prefix, args[1]) + ... + >>> def connect_callback(c): + ... helpers.join(c, '#myroom') + ... + >>> cli = IRCClient(My_Handler, + ... host="irc.freenode.net", + ... port=6667, + ... nick="myname", + ... connect_cb=connect_callback) + ... + >>> cli_con = cli.connect() + >>> while 1: + ... cli_con.next() + ... + """ + self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.nick = None + self.real_name = None + self.host = None + self.port = None + self.connect_cb = None + self.blocking = False + + self.__dict__.update(kwargs) + self.command_handler = cmd_handler(self) + + self._end = 0 + + def send(self, *args, **kwargs): + """ send a message to the connected server. all arguments are joined + with a space for convenience, for example the following are identical + + >>> cli.send("JOIN %s" % some_room) + >>> cli.send("JOIN", some_room) + + In python 2, all args must be of type str or unicode, *BUT* if they are + unicode they will be converted to str with the encoding specified by + the 'encoding' keyword argument (default 'utf8'). + In python 3, all args must be of type str or bytes, *BUT* if they are + str they will be converted to bytes with the encoding specified by the + 'encoding' keyword argument (default 'utf8'). + """ + # Convert all args to bytes if not already + encoding = kwargs.get('encoding') or 'utf8' + bargs = [] + for arg in args: + if isinstance(arg, str): + bargs.append(bytes(arg, encoding)) + elif isinstance(arg, bytes): + bargs.append(arg) + elif type(arg).__name__ == 'unicode': + bargs.append(arg.encode(encoding)) + else: + raise IRCClientError('Refusing to send one of the args from provided: %s' + % repr([(type(arg), arg) for arg in args])) + + msg = bytes(" ", "ascii").join(bargs) + logging.info('---> send "%s"' % msg) + self.socket.send(msg + bytes("\r\n", "ascii")) + + def connect(self): + """ initiates the connection to the server set in self.host:self.port + and returns a generator object. + + >>> cli = IRCClient(my_handler, host="irc.freenode.net", port=6667) + >>> g = cli.connect() + >>> while 1: + ... g.next() + + """ + try: + logging.info('connecting to %s:%s' % (self.host, self.port)) + self.socket.connect(("%s" % self.host, self.port)) + if not self.blocking: + self.socket.setblocking(0) + + helpers.nick(self, self.nick) + helpers.user(self, self.nick, self.real_name) + + if self.connect_cb: + self.connect_cb(self) + + buffer = bytes() + while not self._end: + try: + buffer += self.socket.recv(1024) + except socket.error, e: + try: # a little dance of compatibility to get the errno + errno = e.errno + except AttributeError: + errno = e[0] + if not self.blocking and errno == 11: + pass + else: + raise e + else: + data = buffer.split(bytes("\n", "ascii")) + buffer = data.pop() + + for el in data: + prefix, command, args = parse_raw_irc_command(el) + try: + self.command_handler.run(command, prefix, *args) + except CommandError: + # error will of already been loggingged by the handler + pass + + yield True + finally: + if self.socket: + logging.info('closing socket') + self.socket.close() + + +class IRCApp: + """ This class manages several IRCClient instances without the use of threads. + (Non-threaded) Timer functionality is also included. + """ + + class _ClientDesc: + def __init__(self, **kwargs): + self.con = None + self.autoreconnect = False + self.__dict__.update(kwargs) + + def __init__(self): + self._clients = {} + self._timers = [] + self.running = False + self.sleep_time = 0.5 + + def addClient(self, client, autoreconnect=False): + """ add a client object to the application. setting autoreconnect + to true will mean the application will attempt to reconnect the client + after every disconnect. you can also set autoreconnect to a number + to specify how many reconnects should happen. + + warning: if you add a client that has blocking set to true, + timers will no longer function properly """ + logging.info('added client %s (ar=%s)' % (client, autoreconnect)) + self._clients[client] = self._ClientDesc(autoreconnect=autoreconnect) + + def addTimer(self, seconds, cb): + """ add a timed callback. accuracy is not specified, you can only + garuntee the callback will be called after seconds has passed. + ( the only advantage to these timers is they dont use threads ) + """ + assert callable(cb) + logging.info('added timer to call %s in %ss' % (cb, seconds)) + self._timers.append((time.time() + seconds, cb)) + + def run(self): + """ run the application. this will block until stop() is called """ + # TODO: convert this to use generators too? + self.running = True + while self.running: + found_one_alive = False + + for client, clientdesc in self._clients.iteritems(): + if clientdesc.con is None: + clientdesc.con = client.connect() + + try: + clientdesc.con.next() + except Exception, e: + logging.error('client error %s' % e) + logging.error(traceback.format_exc()) + if clientdesc.autoreconnect: + clientdesc.con = None + if isinstance(clientdesc.autoreconnect, (int, float)): + clientdesc.autoreconnect -= 1 + found_one_alive = True + else: + clientdesc.con = False + else: + found_one_alive = True + + if not found_one_alive: + logging.info('nothing left alive... quiting') + self.stop() + + now = time.time() + timers = self._timers[:] + self._timers = [] + for target_time, cb in timers: + if now > target_time: + logging.info('calling timer cb %s' % cb) + cb() + else: + self._timers.append((target_time, cb)) + + time.sleep(self.sleep_time) + + def stop(self): + """ stop the application """ + self.running = False + + + + diff --git a/oyoyo/client.pyc b/oyoyo/client.pyc new file mode 100644 index 0000000000000000000000000000000000000000..efc0bc5334644863481046cd0c319afa6b4e7595 GIT binary patch literal 9728 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 S8juJsr+71dy*}&L7ybi2d*tx| literal 0 HcmV?d00001 diff --git a/oyoyo/ircevents.py b/oyoyo/ircevents.py new file mode 100644 index 0000000..623530f --- /dev/null +++ b/oyoyo/ircevents.py @@ -0,0 +1,209 @@ +# Copyright (c) 2008 Duncan Fordyce +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +# taken from python irclib.. who took it from... +# Numeric table mostly stolen from the Perl IRC module (Net::IRC). +numeric_events = { + "001": "welcome", + "002": "yourhost", + "003": "created", + "004": "myinfo", + "005": "featurelist", # XXX + "200": "tracelink", + "201": "traceconnecting", + "202": "tracehandshake", + "203": "traceunknown", + "204": "traceoperator", + "205": "traceuser", + "206": "traceserver", + "207": "traceservice", + "208": "tracenewtype", + "209": "traceclass", + "210": "tracereconnect", + "211": "statslinkinfo", + "212": "statscommands", + "213": "statscline", + "214": "statsnline", + "215": "statsiline", + "216": "statskline", + "217": "statsqline", + "218": "statsyline", + "219": "endofstats", + "221": "umodeis", + "231": "serviceinfo", + "232": "endofservices", + "233": "service", + "234": "servlist", + "235": "servlistend", + "241": "statslline", + "242": "statsuptime", + "243": "statsoline", + "244": "statshline", + "250": "luserconns", + "251": "luserclient", + "252": "luserop", + "253": "luserunknown", + "254": "luserchannels", + "255": "luserme", + "256": "adminme", + "257": "adminloc1", + "258": "adminloc2", + "259": "adminemail", + "261": "tracelog", + "262": "endoftrace", + "263": "tryagain", + "265": "n_local", + "266": "n_global", + "300": "none", + "301": "away", + "302": "userhost", + "303": "ison", + "305": "unaway", + "306": "nowaway", + "311": "whoisuser", + "312": "whoisserver", + "313": "whoisoperator", + "314": "whowasuser", + "315": "endofwho", + "316": "whoischanop", + "317": "whoisidle", + "318": "endofwhois", + "319": "whoischannels", + "321": "liststart", + "322": "list", + "323": "listend", + "324": "channelmodeis", + "329": "channelcreate", + "331": "notopic", + "332": "currenttopic", + "333": "topicinfo", + "341": "inviting", + "342": "summoning", + "346": "invitelist", + "347": "endofinvitelist", + "348": "exceptlist", + "349": "endofexceptlist", + "351": "version", + "352": "whoreply", + "353": "namreply", + "361": "killdone", + "362": "closing", + "363": "closeend", + "364": "links", + "365": "endoflinks", + "366": "endofnames", + "367": "banlist", + "368": "endofbanlist", + "369": "endofwhowas", + "371": "info", + "372": "motd", + "373": "infostart", + "374": "endofinfo", + "375": "motdstart", + "376": "endofmotd", + "377": "motd2", # 1997-10-16 -- tkil + "381": "youreoper", + "382": "rehashing", + "384": "myportis", + "391": "time", + "392": "usersstart", + "393": "users", + "394": "endofusers", + "395": "nousers", + "401": "nosuchnick", + "402": "nosuchserver", + "403": "nosuchchannel", + "404": "cannotsendtochan", + "405": "toomanychannels", + "406": "wasnosuchnick", + "407": "toomanytargets", + "409": "noorigin", + "411": "norecipient", + "412": "notexttosend", + "413": "notoplevel", + "414": "wildtoplevel", + "421": "unknowncommand", + "422": "nomotd", + "423": "noadmininfo", + "424": "fileerror", + "431": "nonicknamegiven", + "432": "erroneusnickname", # Thiss iz how its speld in thee RFC. + "433": "nicknameinuse", + "436": "nickcollision", + "437": "unavailresource", # "Nick temporally unavailable" + "441": "usernotinchannel", + "442": "notonchannel", + "443": "useronchannel", + "444": "nologin", + "445": "summondisabled", + "446": "usersdisabled", + "451": "notregistered", + "461": "needmoreparams", + "462": "alreadyregistered", + "463": "nopermforhost", + "464": "passwdmismatch", + "465": "yourebannedcreep", # I love this one... + "466": "youwillbebanned", + "467": "keyset", + "471": "channelisfull", + "472": "unknownmode", + "473": "inviteonlychan", + "474": "bannedfromchan", + "475": "badchannelkey", + "476": "badchanmask", + "477": "nochanmodes", # "Channel doesn't support modes" + "478": "banlistfull", + "481": "noprivileges", + "482": "chanoprivsneeded", + "483": "cantkillserver", + "484": "restricted", # Connection is restricted + "485": "uniqopprivsneeded", + "491": "nooperhost", + "492": "noservicehost", + "501": "umodeunknownflag", + "502": "usersdontmatch", +} + +generated_events = [ + # Generated events + "dcc_connect", + "dcc_disconnect", + "dccmsg", + "disconnect", + "ctcp", + "ctcpreply", +] + +protocol_events = [ + # IRC protocol events + "error", + "join", + "kick", + "mode", + "part", + "ping", + "privmsg", + "privnotice", + "pubmsg", + "pubnotice", + "quit", + "invite", + "pong", +] + +all_events = generated_events + protocol_events + numeric_events.values() + diff --git a/oyoyo/ircevents.pyc b/oyoyo/ircevents.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ee05f8a315a64ddcdbd31aa22adf90db1f6810d GIT binary patch literal 5693 zcmeI0WtxRPch?S`4{rcKcWcXrOKG}+ONJTuyjN@<%iGdE3{ zxhXSqn=&(VQ|6urBh5PB`nlep{ny_6@V0md(46#PAmRKiPPwXz(Kx`E3LF_5mMC>Klo7hLNFR`Csf8qeafy6G-~{4C!AZmx!O6raf>Vjp1g8^c2xf_fph>g@ z9^nhxL`Tpi<^=P^nS!&3vjyi6=L*gv&KF!jTqwARxL9xrajD=k;&QjXXo+fxY@eIK;iDwC(O*}{N zT;h3x=My&xUO?O|cp>p3!HbEP2wqCOOz?8z6@ph1uM)hPc#Yt-#OnmFC*B}g3l437u-sGLGVT5OM)*GUlDwj_?qDB#5V-rB)%p1Ht`+7cZu%_zEAu> z@I&H9f*%t<5&V?+nc(NdF9g3NekJ%d@f*Q!iQfr+PuwQ>1Mx?}pNKyT{zCj!@HgV` zf`1VI6#R?$x8Og7C@97HQ;qQ(+Uam%`q}J_`F1`zh>C z9H4L@agf4h;$VeCh(i?)BMw(Mf;dv)DB@^^V~ArFjw6m&IDt4(;Ur>)XY~H?xm8q`X za*Yxx*Hgn*q9n`)Q8~lUjYhNFog8PQyq^`NGqy~_Fpq*Vg0p$$IyM}P<8(1|CcoT+ zrbV_Iw3m4h(wZ)r)~!aP+`F=dS(-*+8K*txYnFRezJ8FR=m$%7fvrZX z+_Q3x(xo(8NnIbW)T(S|$%auLlv(aP{&fCP5mnZYLwHr<5XRo0fX+CwyLqd^cS&OC2IZEH1i z<=APOJTRwaJhpA8<=T#eUJ$!7?09Bf=?*R+aD#T*reV6Hmt+eQW2fZXNz%+^vPVJC zhF~QaoAEuTMLO0KE%I3Zx>a0cc0#XVg=m!4I@;J!8)`Nio0WbR7ZVZiSZ-Rfj8$in z69KQ;GG%D&tHi`}^+wN1P#?%QTQnh}&u*Y;CB}>r@5wMC>E{00(okAG)!DBvTC(4 z4F+|i)up94Nia!c7K^@B!z3#vn{kz*ZPDZmSSf4Skm9mr>)h*DbupW(o2{Z5GZzq5 ztvhC-g@Cf}u3E2S?7uhMoU`eXNByAaPa-;J&toti z@|LekWzIL7nTWeLZ-q-{en!hNly5bDlNxpX0D}4 zUip+OEfI@x5=D9L-gQ2uO1~g^gYXn|Vf5l|P#M+LLgy$pS?YbMi4!obAos#B)Cxlm@iIP5BPuU$Rv z4$YEma#Fqxq*Y18MX->#r?~IibTB!(i>Kpqugn=7>VIDKp~&eMb{a((Xq^l4VBivk z0=6$*0XG?7ylY2FnN4RF=wLCM-poGrOb%S`QF)q#>{guy%+=qvOwRVPQ~)4QQ+l=|YSOU;~BF(zl3^M;=E@Xdja z(s*Y!)N`#KuhKIuxs!L6Pw8~BWuNCYPs?Vz-l2>2ViMS=Vw*CkS7&pPH|jJA+7v<^ z287{`>dTOBs()wJRwgY8G!2TL5t^DuziPrV92zOmAM8!6?@%iWy1{iBrA>cW(#otq zm^{!QnB%3f4D~Id?`R#1Y9jqv7cXmCFJU-Z&>pQi{OBBdl%1ovG%aj8*#Wb(w{44F zh}nEP8bpl$4$5On_0>n&i&FiKG(u(689&VVl%mX3Ha+ihkc@bIT4RHx@@(O6GX1A$ z@YmTszq8LG57J(g&#q+o((I5O`L(1!8q8*6{>;WyD6@t$hGQfCXEPY1Bs%v14p8tv cEM-Qm|Nqbb7=evzXH@mGq4v45S#Fs5FH!AY(*OVf literal 0 HcmV?d00001 diff --git a/oyoyo/parse.py b/oyoyo/parse.py new file mode 100644 index 0000000..ac5fc12 --- /dev/null +++ b/oyoyo/parse.py @@ -0,0 +1,97 @@ +# Copyright (c) 2008 Duncan Fordyce +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +import logging +import sys + +from oyoyo.ircevents import * + +# Python < 3 compatibility +if sys.version_info < (3,): + class bytes(object): + def __new__(self, b='', encoding='utf8'): + return str(b) + + +def parse_raw_irc_command(element): + """ + This function parses a raw irc command and returns a tuple + of (prefix, command, args). + The following is a psuedo BNF of the input text: + + ::= [':' ] + ::= | [ '!' ] [ '@' ] + ::= { } | + ::= ' ' { ' ' } + ::= [ ':' | ] + + ::= + ::= + + ::= CR LF + """ + parts = element.strip().split(bytes(" ", "ascii")) + if parts[0].startswith(bytes(':', 'ascii')): + prefix = parts[0][1:] + command = parts[1] + args = parts[2:] + else: + prefix = None + command = parts[0] + args = parts[1:] + + if command.isdigit(): + try: + command = numeric_events[command] + except KeyError: + logging.warn('unknown numeric event %s' % command) + command = command.lower() + + if args[0].startswith(bytes(':', 'ascii')): + args = [bytes(" ", "ascii").join(args)[1:]] + else: + for idx, arg in enumerate(args): + if arg.startswith(bytes(':', 'ascii')): + args = args[:idx] + [bytes(" ", 'ascii').join(args[idx:])[1:]] + break + + return (prefix, command, args) + + +def parse_nick(name): + """ parse a nickname and return a tuple of (nick, mode, user, host) + + [ '!' [ = ] ] [ '@' ] + """ + + try: + nick, rest = name.split('!') + except ValueError: + return (name, None, None, None) + try: + mode, rest = rest.split('=') + except ValueError: + mode, rest = None, rest + try: + user, host = rest.split('@') + except ValueError: + return (name, mode, rest, None) + + return (name, mode, user, host) + diff --git a/oyoyo/parse.pyc b/oyoyo/parse.pyc new file mode 100644 index 0000000000000000000000000000000000000000..24e7278867b99120451c899848a4fe8c548d095b GIT binary patch literal 2869 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¢d~GL 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 CZv2b@ literal 0 HcmV?d00001 diff --git a/themes/pesterchum/abouticon.png b/themes/pesterchum/abouticon.png new file mode 100644 index 0000000000000000000000000000000000000000..02fa8875f007b5291673a8e78f7499c1c0f0f317 GIT binary patch literal 3774 zcmeHK`8O1P7ygLsTh=79Z`s%E%-Gj3nvs1SC83lp8aojoyP2r$OQA*+vhR$Lbu8Hu z!Z%B!Ec5D|_lNgyc+dBq^W5j0`@=owKKGt`?oGUIVaPyxi539BU~Hskea3o!K}~+< znTFg^XGG&~WOp9`I@Z4+19=4(0id7UR}QLXU5Oo@J#@TC7}G3=GkL=*Ab(CPb0t+lE>bp0?@D>Z$Vk%E;HioP7e zd*N$zPiObyinLB7t&l%prmpwkzkeb~1`Z=MG_DG?Qhfqs!DDpPpw&FTRrYc`iD?6p z>p+HzA!`jxyJkv_Vgov%DUcGNV?c&N=ZM&VLJHtA;O@2zu1f(I(Z}D$01ADW8%74~ zpYyYm6{Z0`R?h@I;H?g-hHpI42MAff=4INc3Z|rhtTEin2)u0ot$1d-IzUYiWUUfn z#Q{YaaOo8k3P1*IF zYo3mDdq^&qe54}N*S$di3e(uns@*#Y#xvI7@yaP!MrWyw7D|$Uo7?i~>TspM4giaR z5hJIPGWC~G>Xazo)0e{A6y8pBg%5~HUUf`5??K`E41CZ3uQvKc&v4Vzt1By0CY=y_ z*M4~TDYD(U6@GH(cZ9|<@!;#HC80=p$4Enp!>{dw`)0+Lhtp|d+-AR}8Xh;$k&b!B z1Uik~a0m&uWh<6|6urFUJ^5mRL`b@Lm+&abV`)M1h+Jzy3B0|nMHZGORp#hU{>xO9 z84=jJL$Q8R&jztDQsS*H z_kP<&$yUnCZRcm(=#E{KV<1AE?GR=Ntq1DzJs0t+D2Q0x&|4k}7nv_QJc_MW-fZy}V-NY;j3`)=g!uXr*sKIh z)0B+lte?R6Y>jw!HSe8Mjdw8kn5Nzf z?Tsq(#>4~n;o2YymPq|p8fA(g2%jsjt`WivVKHS?#&=mr@xly^3JrOTRlBG_Mw#h5 zk&hRCcV2Xpmy1UjNeWJ|q_WB|hb2HeRfJd)q4J`*XXlJ-U&BUOMh!;qS_`gAmgg%P zT@uXboAL0eqf&h?$#=Ckb_KoCv7)fTy~4k1Pm6Zb33z>Ivm|ESf7^s>m3dWhmC`du zUf1?jp7mT=5$u9e>P<*>5!U*RReTw%;)6WZp=b_c)8guvnPZo{IlYOu-h2=IcwsJ+ z*CP8fd~{&l@O$=m^8FxshB)@9Y1d)aVF`V0Raoo1+|rUDB-IXm=FJsM}*A>L6-}OvRr^uh~r7%$3rX za+qtX9n?ry_!M&&HR=Vm+%4VC!F+N;Va)tW=R=y;{#*{1If0${{wX~$q(@NJ(+g1& z=Lv20}U$Ctm-nE~# zE`vl2GY?NGEMr**#5-@HZSuzqk(@}}{ph`fq(sxG0qJZl>3r_)x!&d#lfZ)j$Hmam z19X0Ue*0D#;mx-4_O0#s*%yO~FT^o+3im&E^g_Q{t&V8Zy~vdHS*VJzgjz--->(VE zxXYx$t0&(!6bDrhU3WOOerer%v8=VMp)xN&Z|6Ly(%R75Fkso?hjETwfIb!^d5}U$ zBcK!|Ook*+jMR;^KX-H(`iQ?JMO%&F`KxYvOE0dRcn&`A9iS z)i+WmN)lQX(zi8cR6Z(x)b5t{vKt&npb^G*OfRcSOVlXez4K||cxx|y3B5$O9LAX= z)9dITQiN~ck1gdWmu8Vv%hEARu(o_3^w%!u+x!W7g& zg4bf#NWwfc{YP4pQixEOLb2p3E=IKcS(6!q*<8LFh9mDGpRc^8TC-eqdfKx9NCm%n z1{S%2{O0v=pvp70?zHP}QiBX{CRLwL{j;j`c2cxhNXd8DO|eM{syd`6+^c0Mv0pW- z5_5HEYp}kb@Jyv(=LKntrJZFl9a|h{3YX$Rd~2?{ty-rM5JI3`WRusJTz1Q(J#j+j}yfO*&iJ)!6XO*~u+OON5Nw!h6?0acFKW_QWSO zYy{41_Qz9Vv%#y}@qYa+xwFsTl~;D+JchkSz1F|YOJVF8vnsN`Wi#Gon4WpZuyEtu z*1<1*f=u?17@;v53&p)^(fH8hS=xsmQrCvPhV8@tz?8Q~=ia+c9^M_<<_>H6rTAl< zVBbVM(dzp|uqCrKANLyfJTgA2Cu-LuR;(Xp9r-#|TlfZS^^lK}pHK-hVkdE5#(73H zVb-Y=S2qnAd#-#sMehVjF(@j zr-MYdtD7vFocDFMbf=+n@#EU|r?XQ#vyX4L1{Lm&%o-9YW21*p(+*OZpyyL_QwQQ0 z;x;kYv{Y4>wC|m)AD2RhJ%&XvoTo2O2WmJuWFij7Hz)BUIU_~cyV)5nzK@DeHd;5i z-VnOmyLmtL1uMuo?cX@sY73eT;@Nq%z+}1di0`o&$@_Qhfz9XAqYSQ$3=#!-&fc-R zf)wHG-sE#PvNi`GR2TqMGyuOzXS@!;16cqzTmVqZ0f5sl-MPyE0CI5M45r`J!oS%- z_q+cJi3mvlV`sVkwSN`(zgIv>dGqX-0Mvoj7B>GKe=r~2Y?b;wWjKW0R^#$cAgMXlFG`TC}6tF}mV|I;c>w0T7 z@8-4)&7z^iVkU9%t8kOpXPzAxQTl?~H(C~%jDOmb(e)*TnXK>XAJSK+slW9x2K*Du;EO4iV`zETQ94PIdiO{0qF{I450VBcqeO5@VUR;G}gD!tAV&g F{RjO5rXc_T literal 0 HcmV?d00001 diff --git a/themes/pesterchum/alarm.wav b/themes/pesterchum/alarm.wav new file mode 100644 index 0000000000000000000000000000000000000000..910abdcb31e2cf53c97fd614ec556630c0ad378a GIT binary patch literal 25388 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 E0KOh3HUIzs literal 0 HcmV?d00001 diff --git a/themes/pesterchum/detestful.gif b/themes/pesterchum/detestful.gif new file mode 100644 index 0000000000000000000000000000000000000000..e8f3e086c43985725d1eddf3d6e21cc6e60a825f GIT binary patch literal 164 zcmZ?wbhEHb6krfw*vtR||NsAgU(AqU#Bhm$p@@MY1t_v~DNqnBiB2f~WMO1r;9$@J zNr22?U`G~LvzV6VD8L%9Drft;bqQTBYM-{qF>R3Sz4AeTsd1j`#Rn06 XC;2y5Hf}W%?3`?JHfvWK3xhQP_0%ni literal 0 HcmV?d00001 diff --git a/themes/pesterchum/discontent.gif b/themes/pesterchum/discontent.gif new file mode 100644 index 0000000000000000000000000000000000000000..addcf54adc17679d59584c14b100bd9a0acdd705 GIT binary patch literal 127 zcmZ?wbhEHb6krfwSi}GV|NsAgU(AqU#Bhm$AqC6@3M&3&VPs%nW6%Mq0I6kQcG1|T z_HT`?c>`G~LvzW%}C=$DiY3ZsmBS!9J5zp@C?bN!a%EEA}WoFybu+17$ XGQmZP9aYPC9vv6#%$V21!e9*mo3$!{ literal 0 HcmV?d00001 diff --git a/themes/pesterchum/distraught.gif b/themes/pesterchum/distraught.gif new file mode 100644 index 0000000000000000000000000000000000000000..0103ac5b8083641a615cb2418acd3df62aa26718 GIT binary patch literal 93 zcmZ?wbhEHb6kyhfCmu1{))RCISKRvD3r6iDv!5RSb<{Sk8 literal 0 HcmV?d00001 diff --git a/themes/pesterchum/estatic.gif b/themes/pesterchum/estatic.gif new file mode 100644 index 0000000000000000000000000000000000000000..dc3ee6116a9416234498ee7e50478a8cf808b33e GIT binary patch literal 137 zcmZ?wbhEHb6krfwSi}GV|NsAgU(AqU#Bhm$AqB`?x)dm)_>+Z^fq|Vt2c!a|mVwz% zW4rplHMZsrtjYVTcAuT1o^;M)8mps7>@KFItICWRxtB#SmFC|Ub4u`#`R8;<>Eg7^ k4?L$D4lc{!2?}_$+|z`(+w1LAmYc?KqlIl3#0_MVriN%u?1 Tytn5!f6)w!G+$3yRt9ST?Uoh3 literal 0 HcmV?d00001 diff --git a/themes/pesterchum/pcbg.png b/themes/pesterchum/pcbg.png new file mode 100644 index 0000000000000000000000000000000000000000..1f93fa9205b2556d2d3083ff85c9c596790f46a3 GIT binary patch literal 4572 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 literal 0 HcmV?d00001 diff --git a/themes/pesterchum/rancorous.gif b/themes/pesterchum/rancorous.gif new file mode 100644 index 0000000000000000000000000000000000000000..a826c755b0e8134100818c138f36975e129f92bf GIT binary patch literal 138 zcmZ?wbhEHb6kyCB2`g`G~LvzW%}C=$DiY3ZsmBS!9J5zp@OUD@i*@nF?Pk6!POsevXI V%Xpj_zIrGh?pJQQS|H3|4FFeeDn0-J literal 0 HcmV?d00001 diff --git a/themes/pesterchum/sleek.gif b/themes/pesterchum/sleek.gif new file mode 100644 index 0000000000000000000000000000000000000000..5573aa51865701678191c50f4d624f31ce5a4965 GIT binary patch literal 134 zcmZ?wbhEHb6k!lxSi}GV|NsAgU(AqU#Bd4B28%H${$ycfU|?m?0dYZU8JN8zR9Ai4 zpv!rmL89l>tg{K*O3#VTo9(pbNaZFM#_jL!oH1z&uJE70eZYsEnSu4loPt)%SyQZh cx*l;cdWXIgeLc&|hG}xy@7RJ|1I%Bl`r$2d4C>q`Q|&Oj#MM0m1bi$^ZZW literal 0 HcmV?d00001 diff --git a/themes/pesterchum/style.pcs b/themes/pesterchum/style.pcs new file mode 100644 index 0000000..8ea9940 --- /dev/null +++ b/themes/pesterchum/style.pcs @@ -0,0 +1,162 @@ +#PESTERCHUM STYLE + +// The title will appear at the top of the window. +// Instead of a space in the name or title, use an '_'. It will come out as a space. +// The name and author will only be in the 'about' section. +// The name you will enter in the 'options' is the name of the folder this is in. +// The alarm only plays when a message is recieved. +// The mode can be set to 'regular' or 'trollian'. + +name Pesterchum +title Pesterchum +author Grimlive95 +alarm alarm.wav +mode regular + +// Colors are in the format of 'red/green/blue/alpha', alpha being transparency. +// 255 is solid and 000 is invisible. + +// MAIN WINDOW + +// If you have a background image, set 'c 3' alpa to '000'. +// If your background image has a header on it, do the same with the title text color. + +c 1 000 000 000 000 // title text +c 2 000 000 000 255 // chumhandle/ mood label text +c 3 000 000 000 255 // outside menu text +c 4 000 000 000 255 // inside menu text +c 5 255 181 000 000 // main background +c 6 255 181 000 255 // menu background + +// BUTTONS + +// Main buttons are the moods that aren't 'rancorous', the 'pester' and 'add chum' buttons. +// They are also the buttons on the Options, Quirks Manager, and Trollslum. +// Block buttons are the 'rancorous' and 'block' buttons. + +c 7 196 135 000 255 // main button borders +c 8 196 135 000 255 // block button borders +c 9 196 135 000 255 // offline button border + +c 10 255 255 000 255 // main buttons +c 11 240 000 000 255 // block buttons +c 12 000 000 000 255 // offline button + +c 13 000 000 000 255 // main button text +c 14 000 000 000 255 // block button text +c 15 255 255 255 255 // offline button text + +// CHUMROLL & CHUMHANDLE + +c 16 255 255 000 255 // chumroll border +c 17 000 000 000 255 // chumroll background +c 18 150 150 150 255 // chumroll highlight + +c 19 100 100 100 255 // chumroll usertext +c 20 255 255 255 255 // chumroll highlighted usertext + +c 21 255 255 000 255 // my chumhandle border +c 22 000 000 000 255 // my chumhandle background +c 23 255 255 255 255 // my chumhandle usertext + +// PESTER WINDOW + +c 24 255 181 000 255 // pester window background +c 25 255 255 255 255 // pesterlog background +c 26 255 255 255 255 // text field background +c 27 000 000 000 255 // text field text color + +c 28 196 135 000 255 // pesterwindow topbar +c 29 255 255 255 255 // pesterwindow top bar text + +c 30 196 135 000 255 // pesterlog border +c 31 196 135 000 255 // text field border + +// PESTER WINDOW BUTTONS + +c 32 196 135 000 255 // main button borders +c 33 196 135 000 255 // block button border + +c 34 255 255 000 255 // main buttons +c 35 255 000 000 255 // block button + +c 36 000 000 000 255 // pesterwindow button text +c 37 000 000 000 255 // pesterwindow block button text + +// OPTIONS WINDOW + +c 38 255 181 000 255 // background +c 39 000 000 000 255 // text color +c 40 196 135 000 255 // button borders +c 41 255 255 000 255 // buttons +c 42 000 000 000 255 // button text + +// QUIRKS MANAGER WINDOW + +c 43 255 181 000 255 // background +c 44 000 000 000 255 // text color +c 45 196 135 000 255 // button borders +c 46 255 255 000 255 // buttons +c 47 000 000 000 255 // button text + +// TROLLSLUM WINDOW + +c 48 255 181 000 255 // background +c 49 000 000 000 255 // text color +c 50 196 135 000 255 // button borders +c 51 255 255 000 255 // buttons +c 52 000 000 000 255 // button text + +// FONTS (In the format: Font_name MODE size) + +// menu is for the top menu. +// tagandmood is for the CHUMHANDLE and MOOD labels. +// message is for the text field in the pester window. +// topbar is for the ::nameName:: text on the top of the pester window. +// tray is for your tray popups. +// debug is for the debug console. + +f title Courier BOLD 14 +f menu Courier BOLD 12 +f buttons Courier BOLD 14 + +f tagandmood Courier BOLD 14 +f chumroll Courier BOLD 14 +f chumhandle Courier BOLD 14 + +f message Courier BOLD 13 +f topbar Courier BOLD 13 + +f tray Courier BOLD 12 + +f debug Courier BOLD 13 + +// PESTERCHUM MOOD ICONS + +i ichummy chummy.gif +i ipleasant pleasant.gif +i idistraught distraught.gif +i iunruly unruly.gif +i ismooth smooth.gif +i irancorous rancorous.gif +i ioffline offline.gif + +// TROLLIAN MOOD ICONS + +i iestatic estatic.gif +i irelaxed relaxed.gif +i idiscontent discontent.gif +i idevious devious.gif +i isleek sleek.gif +i idetestful detestful.gif + +// ETC. + +// iicon only appears in the about section. +// ticon will appear in both your tray and your pesterwindow. + +i ticon trayicon2.png +i iicon abouticon.png +i iclose x.gif +i ihide m.gif +i ibg pcbg.png \ No newline at end of file diff --git a/themes/pesterchum/trayicon.gif b/themes/pesterchum/trayicon.gif new file mode 100644 index 0000000000000000000000000000000000000000..926ccc711a8026d438a7cf60cf1094ec0267a3d9 GIT binary patch literal 116 zcmZ?wbhEHb6krfwSj52a|3AaqOPqIC34Xe}@IM$ZfPvyq7DfgJRt6mq52TiX*)n3) zg?$@#{8ZSRka)&yYOg|!l4a1+supQh MtJ6hhGB8*J0MRum(EtDd literal 0 HcmV?d00001 diff --git a/themes/pesterchum/trayicon2.png b/themes/pesterchum/trayicon2.png new file mode 100644 index 0000000000000000000000000000000000000000..817bf4ba1ec013dca2a45fde27a99b8e5dda174b GIT binary patch literal 3708 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 literal 0 HcmV?d00001 diff --git a/themes/pesterchum/unruly.gif b/themes/pesterchum/unruly.gif new file mode 100644 index 0000000000000000000000000000000000000000..09c58ecd22954629a99432c25ed97ffffd0d8adc GIT binary patch literal 99 zcmZ?wbhEHb6kyct&;S4c literal 0 HcmV?d00001 diff --git a/themes/pesterchum/x.gif b/themes/pesterchum/x.gif new file mode 100644 index 0000000000000000000000000000000000000000..41b47e60458ee76f7e0d0ab9bf72c45c6417da7b GIT binary patch literal 105 zcmZ?wbhEHblw*)%Si}GV|Ns9#x^dH?Lx+G2umFfq{K>+|z`(+w1LAZN;@x)t4lF3}(2;88WUvMRZ2%{= literal 0 HcmV?d00001