def update_on_priv_msg(self, data, connection: Connection): regex = "(?P<url>https?://[^\s]+)" url = re.search(regex, data['message']) if url is not None: url = url.group() print(url) try: headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'} url = url req = urllib.request.Request(url, None, headers) resource = urllib.request.urlopen(req) encoding = resource.headers.get_content_charset() # der erste Fall kann raus, wenn ein anderer Channel benutzt wird if url.find('rehakids.de') != -1: encoding = 'windows-1252' if not encoding: encoding = 'utf-8' content = resource.read().decode(encoding, errors='replace') title_re = re.compile("<title>(.+?)</title>") title = title_re.search(content).group(1) title = html.unescape(title) title = title.replace('\n', ' ').replace('\r', '') print(title) connection.send_back(title, data) except Exception as exc: print(exc) pass
def update_on_ping(self, data, connection: Connection): if self.active == 0: return if 1 == randint(1, 11): if self.duck_alive == 0: connection.send_channel("*. *. *. * <<w°)> *. *. * Quack!") self.duck_alive = 1
def _answer_query(self, data, connection: Connection): """ :param data: :param connection: :return: """ glossary_provider = GlossaryProvider() split = data['message'].split(GlossaryModule._QUERY_EXPLANATION) if not len(split) == 2: return answer = glossary_provider.get_explanation(split[1].strip()) if answer is None or answer[1] is None or answer[1].strip() == '': if split[1].strip() == '': return connection.send_back( "Tut mir leid, " + data['nick'] + ". Für " + split[1].strip() + " habe ich noch keinen Eintrag. Aber Wikipedia sagt dazu:", data) wikiObserver = WikiObserver() wikiObserver.config = self.config data2 = data data2['message'] = '.w ' + split[1] + " \r\n" wikiObserver.update_on_priv_msg(data2, connection) else: connection.send_back( data['nick'] + ": " + split[1] + " - " + answer[1], data)
def update_on_priv_msg(self, data, connection: Connection): if data['message'].find('.modmail') == -1: return mods = connection.details.get_mods() print(mods) message = data['message'].split('.modmail ')[1] for mod in mods: connection.send_to_user(mod, data['nick'] + ' meldet: ' + message)
def update_on_priv_msg(self, data, connection: Connection): if data['message'].find('.modmail') == -1: return mods = connection.details.get_mods() print(mods) message = data['message'].split('.modmail ')[1] for mod in mods: connection.send_to_user(mod, data['nick'] + ' meldet: ' + message)
def update_on_priv_msg(self, data, connection: Connection): if data['message'].find('.guess ') != -1: self.guess(data, connection) return if data['message'].find('.word ') != -1: self.takeword(data, connection) if data['message'].find('.stop') != -1: self.word = '' self.guesses = [] self.leftTrys = 0 connection.send_channel("Spiel gestoppt")
def update_on_priv_msg(self, data, connection: Connection): if data['message'].find('.seen') == -1: return who = data['message'].split(' ')[1] user_provider = UserProvider() activity = user_provider.get_activity(who) delta = time.time() - activity i18n_server = i18n() replacements = {'user': who, 'time': str(datetime.timedelta(seconds=delta))} output = i18n_server.get_text('seen', replacements=replacements, lang=self.config.lang) connection.send_channel(output)
def update_on_priv_msg(self, data, connection: Connection): if data['message'].find('.seen') == -1: return who = data['message'].split(' ')[1] user_provider = UserProvider() activity = user_provider.get_activity(who) delta = time.time() - activity i18n_server = i18n() replacements = {'user': who, 'time': str(datetime.timedelta(seconds=delta)),'asker':data['nick']} output = i18n_server.get_text('seen', replacements=replacements, lang=self.config.lang) connection.send_channel(output)
def update_on_ping(self, data, connection: Connection): for user in self.user_list.userList: offline_time = Kicker.get_offline_time(user) if offline_time < 36000: self.warned_users[user] = 0 # 36000s (= 1h) to test instead of 18000s (= 5h) if offline_time > self.idle_time and not user == connection.details.get_nick() and not user == "Sigyn": if self.warned_users[user] % 30 == 0: connection.send_channel( '\001ACTION schenkt ' + user + ' ' + random.choice(getraenke) + ' ein.\001') self.warned_users[user] += 1 if self.warned_users[user] % 29 == 0: connection.raw_send("KICK " + connection.details.get_channel() + " " + user + " :Zu lang geidlet, komm gerne wieder!")
def _remove_query(self, data, connection: Connection): """ :param data: :param connection: :return: """ if not self._is_idented_mod(data, connection): connection.send_back("Dir fehlen die Berechtigungen zum Löschen von Einträgen, " + data['nick'] + ".", data) return glossary_provider = GlossaryProvider() split = data['message'].split(GlossaryModule._REMOVE_EXPLANATION) if not len(split) == 2: return glossary_provider.delete_explanation(split[1]) connection.send_back("Der Eintrag zu " + split[1] + " wurde gelöscht, " + data['nick'] + ".", data)
def _add_query(self, data, connection: Connection): """ :param data: :param connection: :return: """ if not self._is_idented_mod(data, connection): connection.send_back("Dir fehlen leider die Rechte zum Hinzufügen von Einträgen, " + data['nick'] + ".", data) return msg = data['message'].split(GlossaryModule._ADD_EXPLANATION)[1].strip() split = msg.split(' ', 1) glossary_provider = GlossaryProvider() glossary_provider.save_or_replace(split[0], split[1]) connection.send_back(data['nick'] + ": der Eintrag zu " + split[0] + " wurde gespeichert.", data)
def update_on_priv_msg(self, data, connection: Connection): if data['message'].find('.allseen') == -1: return if not self._is_idented_mod(data, connection): return User_afk = defaultdict(int) for who in self.user_list.userList.keys(): user_provider = UserProvider() activity = user_provider.get_activity(who) delta = time.time() - activity User_afk[who] = delta print(who) print(delta) for w in sorted(User_afk, key=User_afk.get): output = (w + ":\t" + str(datetime.timedelta(seconds=User_afk[w]))) connection.send_back(output, data)
def update_on_ping(self, data, connection: Connection): for user in self.user_list.userList: offline_time = Kicker.get_offline_time(user) if offline_time < 36000: self.warned_users[user] = 0 # 36000s (= 1h) to test instead of 18000s (= 5h) if offline_time > self.idle_time and not user == connection.details.get_nick( ) and not user == "Sigyn": if self.warned_users[user] % 30 == 0: connection.send_channel('\001ACTION schenkt ' + user + ' ' + random.choice(getraenke) + ' ein.\001') self.warned_users[user] += 1 if self.warned_users[user] % 29 == 0: connection.raw_send( "KICK " + connection.details.get_channel() + " " + user + " :Zu lang geidlet, komm gerne wieder!")
def update_on_priv_msg(self, data, connection: Connection): regex = "(?P<url>https?://[^\s]+)" url = re.search(regex, data['message']) if url is not None: url = url.group() print(url) try: headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'} url = url req = urllib.request.Request(url, None, headers) resource = urllib.request.urlopen(req) title = self.getTitle(resource) print(title) title = title[:250] connection.send_back(title, data) except Exception as exc: print(exc) pass
def _answer_query(self, data, connection: Connection): """ :param data: :param connection: :return: """ glossary_provider = GlossaryProvider() split = data['message'].split(GlossaryModule._QUERY_EXPLANATION) if not len(split) == 2: return answer = glossary_provider.get_explanation(split[1].strip()) if answer is None or answer[1] is None or answer[1].strip() == '': if split[1].strip() == '': return connection.send_back("Tut mir leid, " + data['nick'] + ". Für " + split[1].strip() + " habe ich noch keinen Eintrag.", data) else: connection.send_back(data['nick'] + ": " + split[1] + " - " + answer[1], data)
def update_on_priv_msg(self, data, connection: Connection): regex = "(?P<url>https?://[^\s]+)" message = re.sub(regex, ' ', data['message']) if data['channel'] != connection.details.get_channel(): return regex = r'\b(\w\d{2}\.?\d?)\b' codes = re.findall(regex, message) for code in codes: code = code.capitalize() text = self.get_icd(code) if text == 0: if code.find('.') != -1: code += '-' else: code += '.-' text = self.get_icd(code) if text != 0: connection.send_back(text, data)
def update_on_ping(self, data, connection: Connection): for user in self.user_list.userList.keys(): offline_time = Kicker.get_offline_time(user) if offline_time < self.idle_time: self.warned_users[user] = 0 host = self.user_list.userList.get(user).host if offline_time > self.idle_time \ and not user == connection.details.get_nick() \ and 'freenode/staff' not in host: if self.warned_users[user] % 30 == 0: connection.send_channel('\001ACTION schenkt ' + user + ' ' + random.choice(getraenke) + ' ein.\001') self.warned_users[user] += 1 if self.warned_users[user] % 29 == 0: connection.raw_send( "KICK " + connection.details.get_channel() + " " + user + " :Zu lang geidlet, komm gerne wieder!")
def update_on_priv_msg(self, data, connection: Connection): regex = "(?P<url>https?://[^\s]+)" message = re.sub(regex, ' ', data['message']) if data['channel'] != connection.details.get_channel(): return regex = r'\b(\w\d{2}\.?\d?)\b' codes = re.findall(regex, message) for code in codes: code = code.capitalize() text = self.get_icd(code) if text == 0: if code.find('.') != -1: code += '-' else: code += '.-' text = self.get_icd(code) if text != 0: connection.send_back(text, data)
def update_on_priv_msg(self, data: dict, connection: Connection): if data['message'].find('.comic') == -1: return #Join list of comics that have a web based random functionality and those that need a scraper all_comics=comics+scraper_comics #Choose from the joined list comic = random.choice(all_comics) #Check which type of comic it is: If it's one that doesn't need a scaper, get the url and return it. #If it needs a scraper, use ComicScraper to scrape the comic. #If you want to add custom comic scrapers: Look at ComicScraper.py and insert your functionality. if not comic in scraper_comics: headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'} req = urllib.request.Request(comic, None, headers) resource = urllib.request.urlopen(req) title = TitleObserver.getTitle(TitleObserver(), resource) connection.send_back(resource.geturl() + " " + title, data) else: connection.send_back(ComicScraper.getRandomComic(comic),data);
def update_on_priv_msg(self, data, connection: Connection): if data['message'].find('.guess ') != -1: self.guess(data, connection) return if data['message'].find('.word ') != -1: self.take_word(data, connection) if data['message'].find( '.stop') != -1 and not data['message'].find('.stophunt') != -1: connection.send_channel("Spiel gestoppt. Das Wort war: " + self.word) self.word = '' self.guesses = [] self.tries_left = 0 self.wrong_guessed = [] self.worder = '' if data['message'].find('.hint') != -1: self.hint(data, connection) if data['message'].find('.score') != -1: self.print_score(data, connection) if data['message'].find('.spielregeln') != -1: self.rules(data, connection)
def update_on_priv_msg(self, data, connection: Connection): if data['message'].find('.starthunt') != -1: if not self._is_idented_mod(data, connection): connection.send_back( "Dir fehlen leider die Rechte zum Starten der Jagd, " + data['nick'] + ".", data) return self.active = 1 connection.send_channel("Jagd eröffnet") return if data['message'].find('.stophunt') != -1: if not self._is_idented_mod(data, connection): connection.send_back( "Dir fehlen leider die Rechte zum Stoppen der Jagd, " + data['nick'] + ".", data) return self.active = 0 self.duck_alive = 0 connection.send_channel("Jagd beended") return if data['message'].find('.freunde') != -1: self.befriend(data, connection) if data['message'].find('.schiessen') != -1: self.shoot(data, connection)
class FaustBot(object): def __init__(self, config_path: str): self._config = Config(config_path) connection_details = ConnectionDetails(self.config) self._connection = Connection(connection_details) @property def config(self): return self._config def _setup(self): self._connection.establish() user_list = UserList.UserList() self.add_module(user_list) self.add_module(ActivityObserver.ActivityObserver()) self.add_module(NamesObserver.NamesObserver(user_list)) self.add_module(PingAnswerObserver.ModulePing()) self.add_module(Kicker.Kicker(user_list, self._config.idle_time)) self.add_module(SeenObserver.SeenObserver()) self.add_module(TitleObserver.TitleObserver()) self.add_module(WikiObserver.WikiObserver()) self.add_module(ModmailObserver.ModmailObserver()) self.add_module(ICDObserver.ICDObserver()) self.add_module(GlossaryModule.GlossaryModule(self._config)) self.add_module(IdentNickServObserver.IdentNickServObserver()) self.add_module(GiveDrinkObserver.GiveDrinkObserver()) self.add_module(GiveCookieObserver.GiveCookieObserver()) self.add_module(LoveAndPeaceObserver.LoveAndPeaceObserver()) self.add_module(FreeHugsObserver.FreeHugsObserver()) def run(self): self._setup() running = True while running: if not self._connection.receive(): return def add_module(self, module: ModulePrototype): for module_type in module.get_module_types(): observable = self._get_observable_by_module_type(module_type) observable.add_observer(module) module.config = self._config def _get_observable_by_module_type(self, module_type: str): if module_type == ModuleType.ON_JOIN: return self._connection.join_observable if module_type == ModuleType.ON_LEAVE: return self._connection.leave_observable if module_type == ModuleType.ON_KICK: return self._connection.kick_observable if module_type == ModuleType.ON_MSG: return self._connection.priv_msg_observable if module_type == ModuleType.ON_NICK_CHANGE: return self._connection.nick_change_observable if module_type == ModuleType.ON_PING: return self._connection.ping_observable if module_type == ModuleType.ON_NOTICE: return self._connection.notice_observable if module_type == ModuleType.ON_MAGIC_NUMBER: return self._connection.magic_number_observable
def update_on_ping(self, data, connection: Connection): # print('Module Ping') msg = 'PONG ' + data['server'] connection.raw_send(msg)
def update_on_priv_msg(self, data: dict, connection: Connection): if data['message'].find('.drink') == -1: return connection.send_back( '\001ACTION schenkt ' + data['nick'] + ' ' + random.choice(getraenke) + ' ein.\001', data)
def update_on_priv_msg(self, data: dict, connection: Connection): if data['message'].find('.drink') == -1: return connection.send_back('\001ACTION schenkt ' + data['nick'] + ' ' + random.choice(getraenke) + ' ein.\001', data)
def _is_idented_mod(self, data: dict, connection: Connection): return data['nick'] in self._config.mods and connection.is_idented(data['nick'])
def update_on_ping(self, data, connection: Connection): # print('Module Ping') msg = 'PONG ' + data['server'] connection.raw_send(msg)
def update_on_priv_msg(self, data: dict, connection: Connection): if data['message'].find('.food') == -1: return connection.send_back( '\001ACTION tischt ' + data['nick'] + ' ' + random.choice(essen) + ' auf.\001', data)
def __init__(self, config_path: str): self._config = Config(config_path) connection_details = ConnectionDetails(self.config) self._connection = Connection(connection_details)
def __init__(self, config_path: str): self._config = Config(config_path) connection_details = ConnectionDetails(self.config) self._connection = Connection(connection_details)
def _is_idented_mod(self, data: dict, connection: Connection): return data['nick'] in self._config.mods and connection.is_idented( data['nick'])
class FaustBot(object): def __init__(self, config_path: str): self._config = Config(config_path) connection_details = ConnectionDetails(self.config) self._connection = Connection(connection_details) @property def config(self): return self._config def _setup(self): self._connection.establish() user_list = UserList.UserList() self.add_module(user_list) self.add_module(ActivityObserver.ActivityObserver()) self.add_module(NamesObserver.NamesObserver(user_list)) self.add_module(PingAnswerObserver.ModulePing()) self.add_module(Kicker.Kicker(user_list, self._config.idle_time)) self.add_module(SeenObserver.SeenObserver()) self.add_module(TitleObserver.TitleObserver()) self.add_module(WikiObserver.WikiObserver()) self.add_module(ModmailObserver.ModmailObserver()) self.add_module(ICDObserver.ICDObserver()) self.add_module(GlossaryModule.GlossaryModule(self._config)) self.add_module(IdentNickServObserver.IdentNickServObserver()) self.add_module(GiveDrinkObserver.GiveDrinkObserver()) self.add_module(GiveCookieObserver.GiveCookieObserver()) self.add_module(LoveAndPeaceObserver.LoveAndPeaceObserver()) self.add_module(FreeHugsObserver.FreeHugsObserver()) self.add_module(GiveFoodObserver.GiveFoodObserver()) def run(self): self._setup() running = True while running: if not self._connection.receive(): return def add_module(self, module: ModulePrototype): for module_type in module.get_module_types(): observable = self._get_observable_by_module_type(module_type) observable.add_observer(module) module.config = self._config def _get_observable_by_module_type(self, module_type: str): if module_type == ModuleType.ON_JOIN: return self._connection.join_observable if module_type == ModuleType.ON_LEAVE: return self._connection.leave_observable if module_type == ModuleType.ON_KICK: return self._connection.kick_observable if module_type == ModuleType.ON_MSG: return self._connection.priv_msg_observable if module_type == ModuleType.ON_NICK_CHANGE: return self._connection.nick_change_observable if module_type == ModuleType.ON_PING: return self._connection.ping_observable if module_type == ModuleType.ON_NOTICE: return self._connection.notice_observable if module_type == ModuleType.ON_MAGIC_NUMBER: return self._connection.magic_number_observable