import sys
import threading
import irc.client
import re
from net.packet_out import whisper
import config
replace_map = {
# colors (we could use mIRC colors but we're just stripping)
"##0": "", "##1": "", "##2": "", "##3": "", "##4": "",
"##5": "", "##6": "", "##7": "", "##8": "", "##9": "",
# afk color
"##a": "",
# bold
"##B": "__", "##b": "__",
# emotes (we're using discord names)
r"%%0": ":grinning:",
r"%%1": ":slightly_smiling_face:",
r"%%2": ":wink:",
r"%%3": ":slightly_frowning_face:",
r"%%4": ":open_mouth:",
r"%%5": ":neutral_face:",
r"%%6": ":worried:",
r"%%7": ":sunglasses:",
r"%%8": ":grin:",
r"%%9": ":rage:",
r"%%:": ":yum:",
r"%%;": ":blush:",
r"%%<": ":sob:",
r"%%=": ":smiling_imp:",
r"%%>": ":no_mouth:",
r"%%?": ":ninja:",
r"%%@": ":nerd:",
r"%%A": ":star:",
r"%%B": ":question:",
r"%%C": ":exclamation:",
r"%%D": ":bulb:",
r"%%E": ":arrow_right:",
r"%%F": ":heart:",
r"%%G": ":smile:",
r"%%H": ":upside_down:",
r"%%I": ":wink:",
r"%%J": ":fearful:",
r"%%K": ":scream:",
r"%%L": ":imp:",
r"%%M": ":flushed:",
r"%%N": ":smiley:",
r"%%O": ":woozy_face:",
r"%%P": ":rage:",
r"%%Q": ":yum:",
r"%%R": ":smirk:",
r"%%S": ":cry:",
r"%%T": ":smiling_imp:",
r"%%U": ":face_with_raised_eyebrow:",
r"%%V": ":ninja:",
r"%%W": ":angry:",
r"%%X": ":star2:",
r"%%Y": ":grey_question:",
r"%%Z": ":grey_exclamation:",
r"%%[": ":speech_left:",
r"%%\\": ":rolling_eyes:",
r"%%]": ":heart_eyes:",
r"%%^": ":sick:",
r"%%_": ":japanese_ogre:",
r"%%`": ":pouting_cat:",
r"%%a": ":laughing:",
r"%%b": ":relaxed:",
r"%%c": ":dizzy_face:",
r"%%d": ":facepalm:",
r"%%e": ":face_with_symbols_over_mouth:",
r"%%f": ":tired_face:",
r"%%g": ":innocent:",
r"%%h": ":angry:",
r"%%i": ":cold_sweat:",
r"%%j": ":speech_baloon:",
r"%%k": ":swearing:",
r"%%l": ":smiley_cat:",
r"%%m": ":sleeping:",
r"%%n": ":unamused:",
r"%%o": ":alien:",
r"%%p": ":smiling_imp:",
r"%%q": ":jack_o_lantern:",
r"%%r": ":no_mouth:",
r"%%s": ":hearts:",
r"%%t": ":money_mouth:",
}
class IRCBot:
def __init__(self):
self._client_thread = threading.Thread(target=self.__client_threadfunc, args=())
self.conn = None
self._active = False
self._ready = False
self._reactor = None
self.broadcastFunc = None
def __client_threadfunc(self):
print '__client_threadfunc started'
self._reactor = irc.client.Reactor()
try:
self.conn = self._reactor.server().connect(config.irc_server, config.irc_port, config.irc_nick, password=config.irc_password)
except irc.client.ServerConnectionError:
print(sys.exc_info()[1])
raise SystemExit(1)
self.conn.add_global_handler("welcome", self.__on_connect)
self.conn.add_global_handler("join", self.__on_join)
self.conn.add_global_handler("pubmsg", self.__on_pubmsg)
self.conn.add_global_handler("disconnect", self.__on_disconnect)
while self._active:
self._reactor.process_once(timeout=1)
def __on_connect(self, conn, event):
print "Connected to IRC on %s:%i" % (config.irc_server, config.irc_port)
if irc.client.is_channel(config.irc_channel):
self.conn.join(config.irc_channel)
def __on_join(self, conn, event):
print "Joined channel %s" % config.irc_channel
self._ready = True
def __on_pubmsg(self, conn, event):
self.broadcastFunc(event.source.nick, event.arguments[0])
def __on_disconnect(self, conn, event):
self.stop()
def isAFK(self, msg):
lower = msg.lower()
if lower[1:3] == "afk" or lower[0:2] == "afk" or lower[0:2] == "##a":
return True # don't relay AFK messages
return False
# strip manaplus formatting
def manaplusToIRC(self, msg):
for manaplus, literal in replace_map.items():
msg = msg.replace(manaplus, literal)
# now that we're done, return it
return msg
def send(self, nick, msg):
if not self._ready:
return
msg = self.manaplusToIRC(msg)
if not msg:
return # if the message is empty, discard it
if msg[:1] == "!":
self.conn.privmsg(config.irc_channel, "Command sent from TMW by %s:" % nick)
self.conn.privmsg(config.irc_channel, msg)
else:
self.conn.privmsg(config.irc_channel, "<%s> %s" % (nick, msg))
def start(self):
self._active = True
self._client_thread.start()
def stop(self):
self._ready = False
if self._active:
self._active = False
self._client_thread.join()
if __name__=='__main__':
print "You should not run this file. Use main.py"