Beispiel #1
0
    def send_post(self, destination):
        try:
            # Отправляем текст, нарезая при необходимости
            for text in cut_long_text(self.final_text):
                my_bot.send_message(
                    destination,
                    text,
                    parse_mode="HTML",
                    disable_web_page_preview=self.web_preview_url == '')

            # Отправляем отображаемые приложения к посту
            for url in self.gif_links:
                my_bot.send_document(destination, url)
            if len(self.image_links) > 0:
                my_bot.send_media_group(
                    destination,
                    [InputMediaPhoto(url) for url in self.image_links])
            if len(self.video_links) > 0:
                my_bot.send_media_group(
                    destination,
                    [InputMediaVideo(url) for url in self.video_links])
            for url in self.audio_links:
                my_bot.send_audio(destination, url)
        except apihelper.ApiException:
            action_log("VK Error: api exception")
Beispiel #2
0
def arxiv_search(query, message):
    try:
        arxiv_search_res = arxiv.query(search_query=query, max_results=3)
        query_answer = ''
        for paper in arxiv_search_res:
            end = '…' if len(paper['summary']) > 251 else ''
            a_name = paper['authors'][0]
            if len(paper['authors']) > 1:
                a_name += 'et al.'
            query_answer += \
                '• {0}. <a href="{1}">{2}</a>. {3}{4}\n'.format(
                        a_name, paper['arxiv_url'],
                        escape(paper['title'].replace('\n', ' ')),
                        escape(paper['summary'][0:250].replace('\n', ' ')),
                        end)
        print(query_answer)
        user_action_log(message,
                        "called arxiv search with query {}".format(query))
        my_bot.reply_to(message, query_answer, parse_mode="HTML")

    except Exception as ex:
        exc_type, exc_obj, exc_tb = sys.exc_info()
        fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
        action_log("Unknown Exception:\n{}: {}\nat {} line {}\n"
                   "Creating the alert file.".format(exc_type, ex, fname,
                                                     exc_tb.tb_lineno))
Beispiel #3
0
def welcoming_task(message):
    chat_id = message.chat.id

    new_members_names = []
    new_members_info = []
    users = []

    for member in message.new_chat_members:
        new_members_names.append(member.first_name)
        new_members_info.append(user_info(member))
        if not member.is_bot:
            user = {
                'user_id': member.id,
                'chat_id': chat_id,
                'first_name': member.first_name,
                'last_name': member.last_name,
                'is_member': True
            }
            users.append(user)

    if users:  # Bot check
        with db.atomic():
            User.insert_many(users).on_conflict_replace().execute()

    if str(message.chat.id) == config.mm_chat:
        welcoming_msg = "{}, {}!\nЕсли здесь впервые, то ознакомься с правилами — /rules, " \
                        "и представься, если несложно.".format(random.choice(config.welcome_list),
                                                               ', '.join(new_members_names))
    else:
        welcoming_msg = "{}, {}!\n".format(random.choice(config.welcome_list),
                                           ', '.join(new_members_names))
    my_bot.reply_to(message, welcoming_msg)
    action_log("User(s) {} joined the chat.".format(
        ', '.join(new_members_info)))
Beispiel #4
0
def morning_msg():
    text = ''

    # TODO: добавить генерацию разных вариантов приветствий
    text += 'Доброе утро, народ!'
    # TODO: Проверять на наличие картинки
    text += ' [😺](https://t.me/funkcat/{})'.format(random.randint(1, 826))
    text += '\n'

    month_names = [u'января', u'февраля', u'марта',
                   u'апреля', u'мая', u'июня',
                   u'июля', u'августа', u'сентября',
                   u'октября', u'ноября', u'декабря']

    weekday_names = [u'понедельник', u'вторник', u'среда', u'четверг', u'пятница', u'суббота', u'воскресенье']

    now = datetime.datetime.now(pytz.timezone('Europe/Moscow'))

    text += 'Сегодня *{} {}*, *{}*. Нас в чате *{}*!'.format(now.day, month_names[now.month - 1],
                                                             weekday_names[now.weekday()],
                                                             my_bot.get_chat_members_count(config.mm_chat))
    text += '\n\n'
    text += '{}'.format(daily_weather())
    text += '\n\n'

    text += 'Котик дня:'

    # Отправить и запинить сообщение без уведомления
    msg = my_bot.send_message(config.mm_chat, text, parse_mode="Markdown")
    my_bot.pin_chat_message(config.mm_chat, msg.message_id, disable_notification=True)

    action_log('Scheduled morning message sent: id = {}'.format(msg.message_id))
Beispiel #5
0
def welcoming_task(message):
    chat_id = message.chat.id

    new_members_names = []
    new_members_info = []
    users = []

    for member in message.new_chat_members:
        new_members_names.append(member.first_name)
        new_members_info.append(user_info(member))
        if not member.is_bot:
            user = {
                'user_id'   : member.id,
                'chat_id'   : chat_id,
                'first_name': member.first_name,
                'last_name' : member.last_name,
                'is_member' : True
            }
            users.append(user)

    if users:  # Bot check
        with db.atomic():
            User.insert_many(users).on_conflict_replace().execute()

    if str(message.chat.id) == config.mm_chat:
        welcoming_msg = "{}, {}!\nЕсли здесь впервые, то ознакомься с правилами — /rules, " \
                        "и представься, если несложно.".format(random.choice(config.welcome_list),
                                                               ', '.join(new_members_names))
    else:
        welcoming_msg = "{}, {}!\n".format(random.choice(config.welcome_list), ', '.join(new_members_names))
    my_bot.reply_to(message, welcoming_msg)
    action_log("User(s) {} joined the chat.".format(', '.join(new_members_info)))
Beispiel #6
0
def check_disa(message):
    if getattr(message, 'forward_from_chat') is not None:
        if message.forward_from_chat.id in config.stupid_channels:
            try:
                my_bot.delete_message(chat_id=message.chat.id, message_id=message.message_id)
                action_log("Successfully deleted a forward-post from this crap channel:\n{}".format(
                        message.forward_from_chat.title))
            except Exception:
                pass

    disa_commands.check_disa(message)
Beispiel #7
0
def welcoming_task(message):
    new_members_names = []
    new_members_info = []
    for member in message.new_chat_members:
        new_members_names.append(member.first_name)
        new_members_info.append(user_info(member))
    welcoming_msg = "{}, {}!\nЕсли здесь впервые, то ознакомься с правилами — /rules, " \
                    "и представься, если несложно.".format(random.choice(config.welcome_list),
                                                           ', '.join(new_members_names))
    my_bot.reply_to(message, welcoming_msg)
    action_log("User(s) {} joined the chat.".format(
        ', '.join(new_members_info)))
Beispiel #8
0
def check_disa(message):
    if getattr(message, 'forward_from_chat') is not None:
        if message.forward_from_chat.id in config.stupid_channels:
            try:
                my_bot.delete_message(chat_id=message.chat.id,
                                      message_id=message.message_id)
                action_log(
                    "Successfully deleted a forward-post from this crap channel:\n{}"
                    .format(message.forward_from_chat.title))
            except Exception:
                pass

    disa_commands.check_disa(message)
Beispiel #9
0
def vk_listener():
    """
    Проверяет наличие новых постов в паблике мехмата и отправляет их при наличии
    :return: None
    """
    if tokens.vk == '':
        return

    try:
        vk_post = vk_find_last_post()

        if vk_post.not_posted():
            action_log("We have new post in mechmath public")

            vk_post.prepare_post()
            if config.my_chatID != '':
                vk_post.send_post(config.my_chatID)
            if config.my_channel != '':
                vk_post.send_post(config.my_channel)
            vk_post.set_as_posted()

        time.sleep(5)

    except requests.ReadTimeout:
        action_log("Read Timeout in vkListener() function")
    except requests.ConnectionError:
        action_log("Connection Error in vkListener() function")
    except RuntimeError:
        action_log("Runtime Error in vkListener() function")
Beispiel #10
0
    def repost_header(self):
        # TODO: попробовать обойтись без дополнительного вызова API (extended = 1)
        original_poster_id = int(self.post['copy_history'][-1]['owner_id'])
        web_preview = "<a href=\"{}\">📢</a>".format(
            self.web_preview_url) if self.web_preview_url != "" else "📢"
        # если значение ключа 'copy_owner_id' отрицательное, то репост из группы
        if original_poster_id < 0:
            response = requests.get('https://api.vk.com/method/groups.getById',
                                    params={
                                        'access_token': tokens.vk,
                                        'group_ids': -original_poster_id,
                                        'v': config.vk_ver
                                    })
            try:
                op_name = response.json()['response'][0]['name']
                op_screenname = response.json()['response'][0]['screen_name']
                self.repost_header_fb = "Репост из группы {} (https://vk.com/{}):".format(
                    op_name, op_screenname)

                return web_preview + " <a href=\"https://vk.com/wall{}_{}\">Репост</a> " \
                                     "из группы <a href=\"https://vk.com/{}\">{}</a>:".format(self.owner_id,
                                                                                              self.post['id'],
                                                                                              op_screenname, op_name)
            except KeyError:
                action_log(
                    'We have an error in getting a VK post header with following message:\n{0}'
                    .format(response.json()['error']['error_msg']))
                return 'VK Error'
        # если значение ключа 'copy_owner_id' положительное, то репост пользователя
        else:
            response = requests.get('https://api.vk.com/method/users.get',
                                    params={
                                        'access_token': tokens.vk,
                                        'user_id': original_poster_id,
                                        'v': config.vk_ver
                                    })
            op_name = "{0} {1}".format(
                response.json()['response'][0]['first_name'],
                response.json()['response'][0]['last_name'],
            )
            op_screenname = response.json()['response'][0]['id']
            self.repost_header_fb = "Репост пользователя {} (https://vk.com/id{}):".format(
                op_name, op_screenname)

            return web_preview + (
                " <a href=\"https://vk.com/wall{}_{}\">Репост</a> "
                "пользователя <a href=\"https://vk.com/id{}\">{}</a>:").format(
                    self.owner_id, self.post['id'], op_screenname, op_name)
Beispiel #11
0
 def post_header(self):
     # TODO: попробовать обойтись без дополнительного вызова API (extended = 1)
     web_preview = "<a href=\"{}\">📋</a>".format(self.web_preview_url) if self.web_preview_url != "" else "📋"
     response = requests.get('https://api.vk.com/method/groups.getById',
                             params={'access_token': tokens.vk, 'group_ids': -(int(self.owner_id)),
                                     'v': config.vk_ver})
     try:
         op_name = response.json()['response'][0]['name']
         op_screenname = response.json()['response'][0]['screen_name']
         return web_preview + (" <a href=\"https://vk.com/wall{}_{}\">Пост</a> в группе "
                               "<a href=\"https://vk.com/{}\">{}</a>:").format(self.owner_id, self.post['id'],
                                                                               op_screenname, op_name)
     except KeyError:
         action_log('We have an error in getting a VK post header with following message:\n{0}'.format(
             response.json()['error']['error_msg']))
         return 'VK Error'
Beispiel #12
0
def vk_listener():
    """
    Проверяет наличие новых постов в паблике мехмата и отправляет их при наличии
    :return: None
    """
    if tokens.vk == '':
        return

    try:
        vk_post = vk_get_last_post(config.mm_vk_group)

        if vk_post == 1:
            return
        if vk_post.not_posted():
            action_log("We have new post in mechmath public")

            vk_post.prepare_post()
            try:
                if config.mm_chat != '':
                    vk_post.send_post(config.mm_chat)
                if config.mm_channel != '':
                    vk_post.send_post(config.mm_channel)
                if tokens.fb != '' and config.mm_fb_album != '':
                    try:
                        vk_post.send_post_fb(tokens.fb, config.mm_fb_album)
                    except facebook.GraphAPIError as ex:
                        logging.exception(ex)
                        scheduler.pause_job('vk_listener')
                        my_bot.send_message(config.mm_chat_debug,
                                            'Что-то не так с токеном у ФБ! Проверка новых постов приостановлена.\n'
                                            'Фиксики приде, порядок наведе!')
                        action_log('Error reposting a VK post to FB. Most likely there\'s invalid FB token.\n'
                                   'Job "vk_listener" has been paused.')
            except Exception as ex:
                logging.exception(ex)
                my_bot.send_message(config.mm_chat_debug,
                                    "Последний пост вызвал ошибку при репостинге! @rm_bk, выезжай.")
            vk_post.set_as_posted()

        time.sleep(5)

    except requests.exceptions.ReadTimeout:
        action_log("Read Timeout in vkListener() function")
    except requests.exceptions.ConnectionError:
        action_log("Connection Error in vkListener() function")
    except RuntimeError:
        action_log("Runtime Error in vkListener() function")
Beispiel #13
0
    def send_post(self, destination):
        try:
            # Отправляем текст, нарезая при необходимости
            for text in cut_long_text(self.final_text):
                my_bot.send_message(destination, text, parse_mode="HTML",
                                    disable_web_page_preview=self.web_preview_url == '')

            # Отправляем отображаемые приложения к посту
            for url in self.gif_links:
                my_bot.send_document(destination, url)
            if len(self.image_links) > 0:
                my_bot.send_media_group(destination, [InputMediaPhoto(url) for url in self.image_links])
            if len(self.video_links) > 0:
                my_bot.send_media_group(destination, [InputMediaVideo(url) for url in self.video_links])
            for url in self.audio_links:
                my_bot.send_audio(destination, url)
        except apihelper.ApiException:
            action_log("VK Error: api exception")
Beispiel #14
0
async def morning_msg():
    text = ''

    # TODO: добавить генерацию разных вариантов приветствий
    text += 'Доброе утро, народ!'
    # TODO: Проверять на наличие картинки
    text += ' [😺](https://t.me/funkcat/{})'.format(random.randint(1, 826))
    text += '\n'

    month_names = [
        u'января', u'февраля', u'марта', u'апреля', u'мая', u'июня', u'июля',
        u'августа', u'сентября', u'октября', u'ноября', u'декабря'
    ]

    weekday_names = [
        u'понедельник', u'вторник', u'среда', u'четверг', u'пятница',
        u'суббота', u'воскресенье'
    ]

    now = datetime.datetime.now(pytz.timezone('Europe/Moscow'))

    people_in_chat = await my_bot.get_chat_members_count(config.mm_chat)

    text += 'Сегодня *{} {}*, *{}*. Нас в чате *{}*!'.format(
        now.day, month_names[now.month - 1], weekday_names[now.weekday()],
        people_in_chat)
    text += '\n\n'
    text += '{}'.format(daily_weather())
    text += '\n\n'

    text += 'Котик дня:'

    # Отправить и запинить сообщение без уведомления
    msg = await my_bot.send_message(config.mm_chat,
                                    text,
                                    parse_mode="Markdown")
    await my_bot.pin_chat_message(config.mm_chat,
                                  msg.message_id,
                                  disable_notification=True)

    action_log('Scheduled morning message sent: id = {}'.format(
        msg.message_id))
Beispiel #15
0
def disa_vk_report(disa_chromo, message):
    login, password = tokens.vk_disa_login, tokens.vk_disa_password
    vk_session = vk_api.VkApi(login, password)
    vk_session.auth()
    vk = vk_session.get_api()
    wall = vk.wall.get(owner_id=config.vk_disa_groupID, count=1)
    if time.localtime(wall['items'][0]['date'])[2] == time.localtime()[2]:
        disa_chromo_post = disa_chromo - 46
        try:
            old_chromo = int(wall['items'][0]['text'])
            disa_chromo_post += old_chromo
        except Exception as ex:
            logging.error(ex)
            disa_chromo_post = disa_chromo
        vk.wall.edit(owner_id=config.vk_disa_groupID,
                     post_id=wall['items'][0]['id'],
                     message=str(disa_chromo_post))
    else:
        disa_chromo_post = 46 + disa_chromo
        vk.wall.post(owner_id=config.vk_disa_groupID,
                     message=str(disa_chromo_post))

    if 1 < disa_chromo - 46 % 10 < 5:
        chromo_end = "ы"
    elif disa_chromo - 46 % 10 == 1:
        chromo_end = "а"
    else:
        chromo_end = ""

    my_bot.reply_to(
        message, "С последнего репорта набежало {0} хромосом{1}.\n"
        "Мы успешно зарегистрировали этот факт: "
        "https://vk.com/disa_count".format((disa_chromo - 46), chromo_end))
    action_log("Disa summary printed")
    disa_chromo = 46
    global_lock.acquire()
    with open(config.file_location_disa, 'w',
              encoding='utf-8') as file_disa_write:
        file_disa_write.write(str(disa_chromo))
    global_lock.release()
    disa.disa_first = True
Beispiel #16
0
async def arxiv_random(message):
    user_action_log(message, "made arxiv random query")
    try:
        eastern = pytz.timezone('US/Eastern')
        eastern_time = datetime.datetime.now(eastern)
        # publications on 20:00
        if eastern_time.hour < 20:
            eastern_time -= datetime.timedelta(days=1)
        # no publications on friday and saturday
        if eastern_time.weekday() == 5:
            eastern_time -= datetime.timedelta(days=2)
        elif eastern_time.weekday() == 4:
            eastern_time -= datetime.timedelta(days=1)
        last_published_date = eastern_time.strftime("%Y-%m-%d")
        response = requests.get('http://export.arxiv.org/oai2',
                                params={'verb': 'ListIdentifiers',
                                        'set': 'math',
                                        'metadataPrefix': 'oai_dc',
                                        'from': last_published_date})
        action_log("Random arxiv paper since {}".format(last_published_date))
        # если всё хорошо
        if response.status_code == 200:
            response_tree = ElementTree.fromstring(response.content)
            num_of_papers = len(response_tree[2])
            paper_index = random.randint(0, num_of_papers)
            paper_arxiv_id = response_tree[2][paper_index][0].text.split(':')[-1]  # hardcoded
            papep_obj = arxiv.query(id_list=[paper_arxiv_id])[0]
            paper_link = papep_obj['pdf_url'].replace('http://', 'https://') + '.pdf'
            paper_link_name = paper_link.split("/pdf/")[1]
            print(paper_link)
            print(paper_link_name)
            req_pdf_size = requests.head(paper_link)
            pdf_size = round(int(req_pdf_size.headers["Content-Length"]) / 1024 / 1024, 2)
            query_answer = '{}. <a href="{}">{}</a>. {}\n\n— <a href="{}">{}</a>, {} Мб\n'.format(
                papep_obj['author_detail']['name'],
                papep_obj['arxiv_url'],
                escape(papep_obj['title'].replace('\n', ' ')),
                escape(papep_obj['summary'].replace('\n', ' ')),
                paper_link,
                paper_link_name,
                pdf_size
            )
            await message.reply(query_answer, parse_mode="HTML", disable_web_page_preview=False)
            user_action_log(message,
                            "arxiv random query was successful: "
                            "got paper {}".format(papep_obj['arxiv_url']))
            # TODO(randl): doesn't send. Download and delete?
            # my_bot.send_document(message.chat.id, data=paper_link)
        elif response.status_code == 503:
            # слишком часто запрашиваем
            action_log("Too much queries. 10 minutes break should be enough")
            arxiv_checker.last_call = datetime.datetime.utcnow() - datetime.timedelta(seconds=610)
        else:
            # если всё плохо
            user_action_log(message, "arxiv random query failed: response {}".format(response.status_code))

    except Exception as ex:
        exc_type, exc_obj, exc_tb = sys.exc_info()
        fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
        action_log("Unknown Exception: {}: {}\nat {} line {}".format(exc_type, ex, fname, exc_tb.tb_lineno))
Beispiel #17
0
def vk_get_last_post(vkgroup_id):
    try:
        # Берём первые два поста
        response = requests.get('https://api.vk.com/method/wall.get',
                                params={'access_token': tokens.vk, 'owner_id': vkgroup_id, 'count': 2, 'offset': 0,
                                        'v': config.vk_ver})
        # print(response.json())
        # Cоздаём json-объект для работы
        posts = response.json()['response']['items']
        # Cверяем два верхних поста на предмет свежести, т.к. верхний может быть запинен
        post = posts[0] if posts[0]['date'] >= posts[1]['date'] else posts[1]
        return VkPost(post)
    except KeyError as ex:
        logging.exception(ex)
        if response.json()['error']['error_code'] == 5:
            scheduler.pause_job('vk_listener')
            my_bot.send_message(config.mm_chat_debug,
                                'Что-то не так с токеном у ВК! Проверка новых постов приостановлена.\n'
                                'Фиксики приде, порядок наведе!')
            action_log('KeyError exception in vk_listener. Most likely there\'s invalid token.\n'
                       'Job "vk_listener" has been paused.')
        return 1
Beispiel #18
0
 def post_header(self):
     # TODO: попробовать обойтись без дополнительного вызова API (extended = 1)
     web_preview = "<a href=\"{}\">📋</a>".format(
         self.web_preview_url) if self.web_preview_url != "" else "📋"
     response = requests.get('https://api.vk.com/method/groups.getById',
                             params={
                                 'access_token': tokens.vk,
                                 'group_ids': -(int(self.owner_id)),
                                 'v': config.vk_ver
                             })
     try:
         op_name = response.json()['response'][0]['name']
         op_screenname = response.json()['response'][0]['screen_name']
         return web_preview + (
             " <a href=\"https://vk.com/wall{}_{}\">Пост</a> в группе "
             "<a href=\"https://vk.com/{}\">{}</a>:").format(
                 self.owner_id, self.post['id'], op_screenname, op_name)
     except KeyError:
         action_log(
             'We have an error in getting a VK post header with following message:\n{0}'
             .format(response.json()['error']['error_msg']))
         return 'VK Error'
Beispiel #19
0
def disa_vk_report(disa_chromo, message):
    login, password = tokens.vk_disa_login, tokens.vk_disa_password
    vk_session = vk_api.VkApi(
        login, password, config_filename=config.file_location['vk_config'])
    vk_session.auth()
    vk = vk_session.get_api()
    wall = vk.wall.get(owner_id=config.disa_vk_group, count=1)
    if time.localtime(wall['items'][0]['date'])[2] == time.localtime()[2]:
        disa_chromo_post = disa_chromo - 46
        try:
            old_chromo = int(wall['items'][0]['text'])
            disa_chromo_post += old_chromo
        except Exception as ex:
            logging.error(ex)
            disa_chromo_post = disa_chromo
        vk.wall.edit(owner_id=config.disa_vk_group,
                     post_id=wall['items'][0]['id'],
                     message=str(disa_chromo_post))
    else:
        disa_chromo_post = 46 + disa_chromo
        vk.wall.post(owner_id=config.disa_vk_group,
                     message=str(disa_chromo_post))

    if 1 < disa_chromo - 46 % 10 < 5:
        chromo_end = "ы"
    elif disa_chromo - 46 % 10 == 1:
        chromo_end = "а"
    else:
        chromo_end = ""

    my_bot.reply_to(
        message, "С последнего репорта набежало {0} хромосом{1}.\n"
        "Мы успешно зарегистрировали этот факт: "
        "https://vk.com/disa_count".format((disa_chromo - 46), chromo_end))
    action_log("Disa summary printed")

    value_to_file(config.file_location['chromo'], 46)
    disa.disa_first = True
Beispiel #20
0
    def repost_header(self):
        # TODO: попробовать обойтись без дополнительного вызова API (extended = 1)
        original_poster_id = int(self.post['copy_history'][-1]['owner_id'])
        web_preview = "<a href=\"{}\">📢</a>".format(self.web_preview_url) if self.web_preview_url != "" else "📢"
        # если значение ключа 'copy_owner_id' отрицательное, то репост из группы
        if original_poster_id < 0:
            response = requests.get('https://api.vk.com/method/groups.getById',
                                    params={'access_token': tokens.vk, 'group_ids': -original_poster_id,
                                            'v': config.vk_ver})
            try:
                op_name = response.json()['response'][0]['name']
                op_screenname = response.json()['response'][0]['screen_name']
                self.repost_header_fb = "Репост из группы {} (https://vk.com/{}):".format(op_name,
                                                                                          op_screenname)

                return web_preview + " <a href=\"https://vk.com/wall{}_{}\">Репост</a> " \
                                     "из группы <a href=\"https://vk.com/{}\">{}</a>:".format(self.owner_id,
                                                                                              self.post['id'],
                                                                                              op_screenname, op_name)
            except KeyError:
                action_log('We have an error in getting a VK post header with following message:\n{0}'.format(
                    response.json()['error']['error_msg']))
                return 'VK Error'
        # если значение ключа 'copy_owner_id' положительное, то репост пользователя
        else:
            response = requests.get('https://api.vk.com/method/users.get',
                                    params={'access_token': tokens.vk, 'user_id': original_poster_id,
                                            'v': config.vk_ver})
            op_name = "{0} {1}".format(response.json()['response'][0]['first_name'],
                                       response.json()['response'][0]['last_name'], )
            op_screenname = response.json()['response'][0]['id']
            self.repost_header_fb = "Репост пользователя {} (https://vk.com/id{}):".format(op_name,
                                                                                           op_screenname)

            return web_preview + (" <a href=\"https://vk.com/wall{}_{}\">Репост</a> "
                                  "пользователя <a href=\"https://vk.com/id{}\">{}</a>:").format(self.owner_id,
                                                                                                 self.post['id'],
                                                                                                 op_screenname, op_name)
Beispiel #21
0
def disa_vk_report(disa_chromo, message):
    login, password = tokens.vk_disa_login, tokens.vk_disa_password
    vk_session = vk_api.VkApi(login, password, config_filename=config.file_location['vk_config'])
    vk_session.auth()
    vk = vk_session.get_api()
    wall = vk.wall.get(owner_id=config.disa_vk_group, count=1)
    if time.localtime(wall['items'][0]['date'])[2] == time.localtime()[2]:
        disa_chromo_post = disa_chromo - 46
        try:
            old_chromo = int(wall['items'][0]['text'])
            disa_chromo_post += old_chromo
        except Exception as ex:
            logging.error(ex)
            disa_chromo_post = disa_chromo
        vk.wall.edit(owner_id=config.disa_vk_group,
                     post_id=wall['items'][0]['id'],
                     message=str(disa_chromo_post))
    else:
        disa_chromo_post = 46 + disa_chromo
        vk.wall.post(owner_id=config.disa_vk_group,
                     message=str(disa_chromo_post))

    if 1 < disa_chromo - 46 % 10 < 5:
        chromo_end = "ы"
    elif disa_chromo - 46 % 10 == 1:
        chromo_end = "а"
    else:
        chromo_end = ""

    my_bot.reply_to(message,
                    "С последнего репорта набежало {0} хромосом{1}.\n"
                    "Мы успешно зарегистрировали этот факт: "
                    "https://vk.com/disa_count".format((disa_chromo - 46), chromo_end))
    action_log("Disa summary printed")

    value_to_file(config.file_location['chromo'], 46)
    disa.disa_first = True
Beispiel #22
0
def arxiv_search(query, message):
    try:
        arxiv_search_res = arxiv.query(search_query=query, max_results=3)
        query_answer = ''
        for paper in arxiv_search_res:
            end = '…' if len(paper['summary']) > 251 else ''
            a_name = paper['authors'][0]
            if len(paper['authors'])>1:
                a_name += 'et al.'
            query_answer += \
                '• {0}. <a href="{1}">{2}</a>. {3}{4}\n'.format(
                        a_name, paper['arxiv_url'],
                        escape(paper['title'].replace('\n', ' ')),
                        escape(paper['summary'][0:250].replace('\n', ' ')),
                        end)
        print(query_answer)
        user_action_log(message, "called arxiv search with query {}".format(query))
        my_bot.reply_to(message, query_answer, parse_mode="HTML")

    except Exception as ex:
        exc_type, exc_obj, exc_tb = sys.exc_info()
        fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
        action_log("Unknown Exception:\n{}: {}\nat {} line {}\n"
                   "Creating the alert file.".format(exc_type, ex, fname, exc_tb.tb_lineno))
Beispiel #23
0
def vk_listener():
    """
    Проверяет наличие новых постов в паблике мехмата и отправляет их при наличии
    :return: None
    """
    if tokens.vk == '':
        return

    try:
        vk_post = vk_get_last_post(config.mm_vk_group)

        if vk_post.not_posted():
            action_log("We have new post in mechmath public")

            vk_post.prepare_post()
            try:
                if config.mm_chat != '':
                    vk_post.send_post(config.mm_chat)
                if config.mm_channel != '':
                    vk_post.send_post(config.mm_channel)
                if tokens.fb != '' and config.mm_fb_album != '':
                    vk_post.send_post_fb(tokens.fb, config.mm_fb_album)
            except Exception as ex:
                logging.exception(ex)
                my_bot.send_message(
                    config.mm_chat_debug,
                    "Последний пост вызвал ошибку при репостинге! @rm_bk, выезжай."
                )
            vk_post.set_as_posted()

        time.sleep(5)

    except requests.exceptions.ReadTimeout:
        action_log("Read Timeout in vkListener() function")
    except requests.exceptions.ConnectionError:
        action_log("Connection Error in vkListener() function")
    except RuntimeError:
        action_log("Runtime Error in vkListener() function")
Beispiel #24
0
    disa_commands.check_disa(message)


# All messages handler
def handle_messages(messages):
    dump_messages(messages)


while __name__ == '__main__':
    try:
        if os.path.isfile(config.file_location['bot_killed']):
            os.remove(config.file_location['bot_killed'])

        if config.debug_mode:
            action_log("Running bot in Debug mode!")
        else:
            action_log("Running bot!")

        scheduler.add_job(vk_listener.vk_listener, 'interval', id='vk_listener', replace_existing=True, seconds=30)

        scheduler.add_job(morning_message.morning_msg, 'cron', id='morning_msg', replace_existing=True, hour=7,
                          timezone=pytz.timezone('Europe/Moscow'))

        scheduler.add_job(morning_message.unpin_msg, 'cron', id='unpin_msg', replace_existing=True, hour=13,
                          timezone=pytz.timezone('Europe/Moscow'))

        # Запуск Long Poll бота
        my_bot.set_update_listener(handle_messages)
        my_bot.polling(none_stop=True, interval=1, timeout=60)
        time.sleep(1)
Beispiel #25
0
            choosen_answer = re.sub(r'(?i)\bя\b', 'ты', choosen_answer)
        else:
            choosen_answer = re.sub(r'(?i)\bi\b', 'you', choosen_answer)
        # more subs to come
        await message.reply(choosen_answer)


@dp.message_handler(func=commands_handler(['/kek']))
@command_with_delay(delay=1)
async def my_kek(message):
    await kek.my_kek(message)


if __name__ == '__main__':
    if config.debug_mode:
        action_log("Running bot in Debug mode!")
    else:
        action_log("Running bot!")

    scheduler.add_job(morning_message.morning_msg,
                      'cron',
                      id='morning_msg',
                      replace_existing=True,
                      hour=7,
                      timezone=pytz.timezone('Europe/Moscow'))

    scheduler.add_job(morning_message.unpin_msg,
                      'cron',
                      id='unpin_msg',
                      replace_existing=True,
                      hour=13,
Beispiel #26
0
    disa_commands.check_disa(message)


# All messages handler
def handle_messages(messages):
    dump_messages(messages)


while __name__ == '__main__':
    try:
        if os.path.isfile(config.file_location['bot_killed']):
            os.remove(config.file_location['bot_killed'])

        if config.debug_mode:
            action_log("Running bot in Debug mode!")
        else:
            action_log("Running bot!")

        scheduler.add_job(vk_listener.vk_listener,
                          'interval',
                          id='vk_listener',
                          replace_existing=True,
                          seconds=30)

        scheduler.add_job(morning_message.morning_msg,
                          'cron',
                          id='morning_msg',
                          replace_existing=True,
                          hour=7,
                          timezone=pytz.timezone('Europe/Moscow'))
Beispiel #27
0
def my_wiki(message):
    """
    Обрабатывает запрос и пересылает результат.
    Если запроса нет, выдаёт рандомный факт.
    :param message:
    :return:
    """
    # обрабатываем всё, что пользователь ввёл после '/wiki '
    if not len(message.text.split()) == 1:
        your_query = ' '.join(message.text.split()[1:])
        user_action_log(message,
                        "entered this query for /wiki:\n{0}".format(your_query))
        try:
            # определяем язык запроса. Эвристика для английского и русского
            if all(ord(x) < 127 or not x.isalpha() for x in your_query):
                wikipedia.set_lang('en')
            # TODO: a bit dirty condition
            elif all(ord(x) < 127 or (ord('Ё') <= ord(x) <= ord('ё')) or not x.isalpha() for x in your_query):
                wikipedia.set_lang('ru')
            else:
                wikipedia.set_lang(detect(your_query))
            wiki_response = wikipedia.summary(your_query, sentences=7)
            if '\n  \n' in str(wiki_response):
                wiki_response = "{}...\n\n" \
                                "<i>В данной статье " \
                                "имеется математическая вёрстка. " \
                                "Ссылка на статью:</i>".format(str(wiki_response).split('\n  \n', 1)[0])
            # print(wiki_response)
            # извлекаем ссылку на саму статью
            wiki_url = parse.unquote(wikipedia.page(your_query).url)
            # извлекаем название статьи
            wiki_title = wikipedia.page(your_query).title
            my_bot.reply_to(message, "<b>{0}.</b>\n{1}\n\n{2}".format(
                    wiki_title,
                    wiki_response,
                    wiki_url),
                            parse_mode="HTML")
            user_action_log(message,
                            "got Wikipedia article\n{0}".format(str(wiki_title)))
        # всё плохо, ничего не нашли
        except wikipedia.exceptions.PageError:
            my_bot.reply_to(message, "Запрос не найден.")
            user_action_log(message, "didn't received any data.")
        # нашли несколько статей, предлагаем пользователю список
        except wikipedia.exceptions.DisambiguationError as ex:
            wiki_options = ex.options
            my_bot.reply_to(message,
                            "Пожалуйста, уточни запрос. "
                            "Выбери, что из перечисленного имелось в виду, "
                            "и вызови /wiki ещё раз.\n"
                            + "\n".join(map(str, wiki_options)))
            print("There are multiple possible pages for that article.\n")
            # берём рандомную статью на рандомном языке (языки в config.py)
    else:
        wikipedia.set_lang(random.choice(['en', 'ru']))
        wikp = wikipedia.random(pages=1)
        try:
            print("Trying to get Wikipedia article\n{0}".format(str(wikp)))
            wikpd = wikipedia.page(wikp)
            wiki_fact = wikipedia.summary(wikp, sentences=3)
            my_bot.reply_to(message, "<b>{0}.</b>\n{1}".format(wikpd.title, wiki_fact), parse_mode="HTML")
            user_action_log(message, "got Wikipedia article\n{0}".format(str(wikp)))
        except wikipedia.exceptions.DisambiguationError:
            wikp = wikipedia.random(pages=1)
            try:
                print("Trying to get Wikipedia article\n{0}".format(str(wikp)))
                wiki_var = wikipedia.search(wikp, results=1)
                print("There are multiple possible pages for that article.\n")
                # wikpd = wikipedia.page(str(wiki_var[0]))
                wiki_fact = wikipedia.summary(wiki_var, sentences=4)
                my_bot.reply_to(message, "<b>{0}.</b>\n{1}".format(wikp, wiki_fact), parse_mode="HTML")
            except wikipedia.exceptions.PageError:
                print("Page error for Wikipedia article\n{0}".format(str(wikp)))
                my_bot.reply_to(message, "<b>{0}.</b>".format("You're even unluckier"), parse_mode="HTML")
            except Exception as ex:
                exc_type, exc_obj, exc_tb = sys.exc_info()
                fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
                action_log("Unknown Exception in Wikipedia: {}: {}\nat {} line {}".format(exc_type, ex,
                                                                                          fname, exc_tb.tb_lineno))
        except wikipedia.exceptions.PageError:
            print("Page error for Wikipedia article\n{0}".format(str(wikp)))
            my_bot.reply_to(message, "<b>{0}.</b>".format("You're very unlucky bastard"), parse_mode="HTML")

        except Exception as ex:
            exc_type, exc_obj, exc_tb = sys.exc_info()
            fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
            action_log("Unknown Exception in Wikipedia: {}: {}\nat {} line {}".format(exc_type, ex,
                                                                                      fname, exc_tb.tb_lineno))
Beispiel #28
0
def arxiv_random(message):
    user_action_log(message, "made arxiv random query")
    try:
        eastern = pytz.timezone('US/Eastern')
        eastern_time = datetime.datetime.now(eastern)
        # publications on 20:00
        if eastern_time.hour < 20:
            eastern_time -= datetime.timedelta(days=1)
        # no publications on friday and saturday
        if eastern_time.weekday() == 5:
            eastern_time -= datetime.timedelta(days=2)
        elif eastern_time.weekday() == 4:
            eastern_time -= datetime.timedelta(days=1)
        last_published_date = eastern_time.strftime("%Y-%m-%d")
        response = requests.get('http://export.arxiv.org/oai2',
                                params={'verb'          : 'ListIdentifiers',
                                        'set'           : 'math',
                                        'metadataPrefix': 'oai_dc',
                                        'from'          : last_published_date})
        action_log("Random arxiv paper since {}".format(last_published_date))
        # если всё хорошо
        if response.status_code == 200:
            response_tree = ElementTree.fromstring(response.content)
            num_of_papers = len(response_tree[2])
            paper_index = random.randint(0, num_of_papers)
            paper_arxiv_id = response_tree[2][paper_index][0].text.split(':')[-1]  # hardcoded
            papep_obj = arxiv.query(id_list=[paper_arxiv_id])[0]
            paper_link = papep_obj['pdf_url'].replace('http://', 'https://') + '.pdf'
            paper_link_name = paper_link.split("/pdf/")[1]
            print(paper_link)
            print(paper_link_name)
            req_pdf_size = requests.head(paper_link)
            pdf_size = round(int(req_pdf_size.headers["Content-Length"]) / 1024 / 1024, 2)
            
            a_name = papep_obj['authors'][0]
            if len(papep_obj['authors'])>1:
                a_name += 'et al.'
                
            query_answer = '{}. <a href="{}">{}</a>. {}\n\n— <a href="{}">{}</a>, {} Мб\n'.format(
                    a_name,
                    papep_obj['arxiv_url'],
                    escape(papep_obj['title'].replace('\n', ' ')),
                    escape(papep_obj['summary'].replace('\n', ' ')),
                    paper_link,
                    paper_link_name,
                    pdf_size
            )
            my_bot.reply_to(message, query_answer, parse_mode="HTML", disable_web_page_preview=False)
            user_action_log(message,
                            "arxiv random query was successful: "
                            "got paper {}".format(papep_obj['arxiv_url']))
            # TODO(randl): doesn't send. Download and delete?
            # my_bot.send_document(message.chat.id, data=paper_link)
        elif response.status_code == 503:
            # слишком часто запрашиваем
            action_log("Too much queries. 10 minutes break should be enough")
            arxiv_checker.last_call = datetime.datetime.utcnow() - datetime.timedelta(seconds=610)
        else:
            # если всё плохо
            user_action_log(message, "arxiv random query failed: response {}".format(response.status_code))

    except Exception as ex:
        exc_type, exc_obj, exc_tb = sys.exc_info()
        fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
        action_log("Unknown Exception: {}: {}\nat {} line {}".format(exc_type, ex, fname, exc_tb.tb_lineno))
Beispiel #29
0
def callback_chai(call):
    action_log(user_name(call.message.chat) + " called: " + call.data)
    current_controller.set_school_callback(call)