示例#1
0
 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
示例#2
0
 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
示例#3
0
 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)
示例#4
0
 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)
示例#5
0
 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)
示例#6
0
 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")
示例#7
0
 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)
示例#8
0
 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)
示例#9
0
 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!")
示例#10
0
    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)
示例#11
0
 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)
示例#12
0
 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)
示例#13
0
 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!")
示例#14
0
 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
示例#15
0
 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)
示例#16
0
 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)
示例#17
0
 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!")
示例#18
0
 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)
示例#19
0
 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);
示例#20
0
 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)
示例#21
0
 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)
示例#22
0
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
示例#23
0
    def update_on_ping(self, data, connection: Connection):
#        print('Module Ping')
        msg = 'PONG ' + data['server']
        connection.raw_send(msg)
示例#24
0
 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)
示例#25
0
 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)
示例#26
0
 def _is_idented_mod(self, data: dict, connection: Connection):
     return data['nick'] in self._config.mods and connection.is_idented(data['nick'])
示例#27
0
 def update_on_ping(self, data, connection: Connection):
     # print('Module Ping')
     msg = 'PONG ' + data['server']
     connection.raw_send(msg)
示例#28
0
 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)
示例#29
0
 def __init__(self, config_path: str):
     self._config = Config(config_path)
     connection_details = ConnectionDetails(self.config)
     self._connection = Connection(connection_details)
示例#30
0
 def __init__(self, config_path: str):
     self._config = Config(config_path)
     connection_details = ConnectionDetails(self.config)
     self._connection = Connection(connection_details)
示例#31
0
 def _is_idented_mod(self, data: dict, connection: Connection):
     return data['nick'] in self._config.mods and connection.is_idented(
         data['nick'])
示例#32
0
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