Ejemplo n.º 1
0
def process_step_4(message):
    cursor3 = db.token.find_one({"id": encoder(str(message.chat.id))})
    cur = []
    cursor4 = dict(cursor3)
    for j in cursor4["token"]:
        cur.append(decoder(j))

    if message.text in cur:
        try:
            gl = Gitlab('https://git.iu7.bmstu.ru/',
                        private_token=message.text)
            gl.auth()
            username = gl.user.username
            db.token.find_one_and_update(
                {
                    "id": encoder(str(message.chat.id)),
                    "token": encoder(cur)
                }, {'$set': {
                    "idGitLab": encoder(username)
                }})

        except gitlab.GitlabAuthenticationError:
            st = open('./static/access_denied.webp', 'rb')
            bot.send_sticker(message.chat.id, st)

            bot.send_message(
                message.chat.id,
                "Произошла ошибка при авторизации в GitLab. Проверьте правильность токена",
                parse_mode="html",
                reply_markup=types.ReplyKeyboardRemove())
    else:
        bot.send_message(message.chat.id,
                         "Такого TOKEN нет в твоем списке...",
                         parse_mode="html",
                         reply_markup=types.ReplyKeyboardRemove())
Ejemplo n.º 2
0
 def send_reopen(self, receiver):
     message = "В проекте \"{0}\" пользователем {1} " \
               "был переоткрыт merge request {2)".format(self.project_name,
                                                         self.author_name,
                                                         self.mg_title)
     try:
         bot.send_message(chat_id=decoder(receiver['id']), text=message)
     except telebot.apihelper.ApiException:
         logging.error("The chat was not founded. It looks like a trouble with db :c")
Ejemplo n.º 3
0
 def send_button(self, receiver):
     inline_item1 = types.InlineKeyboardButton('Merge Request', url=self.merge_request_url)
     inline_bt1 = types.InlineKeyboardMarkup()
     inline_bt1.add(inline_item1)
     try:
         bot.send_message(chat_id=decoder(receiver['id']),
                          text="Более подробную информацию о мерж реквесте можно узнать, "
                               "перейдя по ссылке.",
                          reply_markup=inline_bt1)
     except telebot.apihelper.ApiException:
         logging.error("The chat was not founded. It looks like a trouble with db :c")
Ejemplo n.º 4
0
 def send_open(self, receiver, file):
     diff = "```" + str(file['diff']).replace("```", "\`\`\`") + "```"
     message = "Пользователь {0} отправил Вам " \
               "запрос на слитие веток {1} и {2} " \
               "в проекте {3}\n".format(self.author_name,
                                        self.target_branch,
                                        self.source_branch,
                                        self.project_name).replace("_", "\_")
     try:
         bot.send_message(chat_id=decoder(receiver['id']), text=message + diff,
                          parse_mode="markdown")
     except telebot.apihelper.ApiException:
         logging.error("The chat was not founded. It looks like a trouble with db :c")
Ejemplo n.º 5
0
def process_step_1(message):
    if message.text == 'Ввод TOKEN':
        bot.register_next_step_handler(message, process_step_2)
    elif message.text == 'Выбор TOKEN':
        cursor3 = db.token.find_one({"id": encoder(str(message.chat.id))})
        cur = []
        cursor4 = dict(cursor3)
        for j in cursor4["token"]:
            cur.append(decoder(j))

        bot.send_message(
            message.chat.id,
            "Давай выберем, какой TOKEN нужно использовать. Вот список твоих TOKEN:\n"
            + '\n'.join(cur),
            parse_mode="html",
            reply_markup=types.ReplyKeyboardRemove())

        bot.register_next_step_handler(message, process_step_4)
    elif message.text == 'Удаление TOKEN':
        cursor3 = db.token.find_one({"id": encoder(str(message.chat.id))})
        cur = []
        cursor4 = dict(cursor3)
        for j in cursor4["token"]:
            cur.append(decoder(j))

        bot.send_message(
            message.chat.id,
            "Давай выберем, какой TOKEN нужно удалить. Вот список твоих TOKEN:\n"
            + '\n'.join(cur),
            parse_mode="html",
            reply_markup=types.ReplyKeyboardRemove())

        bot.register_next_step_handler(message, process_step_5)
    else:
        bot.send_message(message.chat.id,
                         'Странно, такой команды нет...',
                         parse_mode="html",
                         reply_markup=types.ReplyKeyboardRemove())
Ejemplo n.º 6
0
def process_step_5(message):
    if message.chat.username is None:
        name_user = str(message.chat.id)
    else:
        name_user = "******" + message.chat.username

    cursor3 = db.token.find_one({"id": encoder(str(message.chat.id))})
    cur = []
    cursor4 = dict(cursor3)
    for j in cursor4["token"]:
        cur.append(decoder(j))

    if message.text in cur:
        for j, i in enumerate(cur):
            if message.text == i:
                cur.pop(j)

        db.token.find_one_and_update({"id": encoder(str(message.chat.id))},
                                     {'$set': {
                                         "token": encoder(cur)
                                     }})

        bot.send_message(message.chat.id,
                         "Ваш TOKEN ( " + message.text +
                         " ) был удачно удален из нашей базы данных",
                         parse_mode="html")

        if len(cur) != 0:
            item3 = types.KeyboardButton("Удаление TOKEN")
            markup1 = types.ReplyKeyboardMarkup(resize_keyboard=True)
            markup1.add(item3)

            bot.send_message(
                message.chat.id,
                "Могу предложить удалить еще TOKEN. Если надо, жми кнопочку",
                parse_mode="html",
                reply_markup=markup1)

            bot.register_next_step_handler(message, process_step_1)
        else:
            bot.send_message(message.chat.id,
                             name_user + ", ты удалил все TOKEN",
                             parse_mode="html",
                             reply_markup=types.ReplyKeyboardRemove())

    else:
        bot.send_message(message.chat.id,
                         "Такого TOKEN нет в твоем списке...",
                         parse_mode="html",
                         reply_markup=types.ReplyKeyboardRemove())
Ejemplo n.º 7
0
def process_step_2(message):
    cursor3 = db.token.find_one({"id": encoder(str(message.chat.id))})
    cur = []
    cursor4 = dict(cursor3)
    for j in cursor4["token"]:
        cur.append(decoder(j))

    if message.text in cur:
        bot.send_message(message.chat.id,
                         "Данный TOKEN уже есть в нашей базе данных",
                         parse_mode="html",
                         reply_markup=types.ReplyKeyboardRemove())
    else:
        cur.append(message.text)
        db.token.find_one_and_update({"id": encoder(str(message.chat.id))},
                                     {'$set': {
                                         "token": encoder(cur)
                                     }})
        bot.send_message(message.chat.id,
                         "Ваш TOKEN был успешно добавлен в нашу базу данных 🎉",
                         parse_mode="html",
                         reply_markup=types.ReplyKeyboardRemove())

        try:
            gl = Gitlab('https://git.iu7.bmstu.ru/',
                        private_token=message.text)
            gl.auth()
            username = gl.user.username
            db.token.find_one_and_update(
                {
                    "id": encoder(str(message.chat.id)),
                    "token": encoder(cur)
                }, {'$set': {
                    "idGitLab": encoder(username)
                }})

        except gitlab.GitlabAuthenticationError:
            st4 = open('./static/access_denied.webp', 'rb')
            bot.send_sticker(message.chat.id, st4)

            bot.send_message(
                message.chat.id,
                "Произошла ошибка при авторизации в GitLab. Проверьте правильность токена",
                parse_mode="html",
                reply_markup=types.ReplyKeyboardRemove())
Ejemplo n.º 8
0
 def send_others(self, receiver, result):
     message = "А так же еще изменения в {0} файлах".format(len(result['diffs']) - 1)
     try:
         bot.send_message(chat_id=decoder(receiver['id']), text=message)
     except telebot.apihelper.ApiException:
         logging.error("The chat was not founded. It looks like a trouble with db :c")
Ejemplo n.º 9
0
 def send_undefined(self, receiver):
     message = "В репозитории {0} произошло неопознанное событие".format(self.project_name)
     try:
         bot.send_message(chat_id=decoder(receiver['id']), text=message)
     except telebot.apihelper.ApiException:
         logging.error("The chat was not founded. It looks like a trouble with db :c")
Ejemplo n.º 10
0
 def send_new(self, receiver):
     message = "В Merge Request {0} произошло новое событие.".format(self.mg_title)
     try:
         bot.send_message(chat_id=decoder(receiver['id']), text=message)
     except telebot.apihelper.ApiException:
         logging.error("The chat was not founded. It looks like a trouble with db :c")
Ejemplo n.º 11
0
 def send_close(self, receiver):
     message = "Merge request {0} был закрыт.".format(self.mg_title)
     try:
         bot.send_message(chat_id=decoder(receiver['id']), text=message)
     except telebot.apihelper.ApiException:
         logging.error("The chat was not founded. It looks like a trouble with db :c")
Ejemplo n.º 12
0
 def send_update(self, receiver):
     message = "В Merge Request {0} произошло новое событие.".format(self.mg_title)
     bot.send_message(chat_id=decoder(receiver['id']), text=message)
Ejemplo n.º 13
0
 def get_repo_compare(self, private_key):
     # авторизуемся для каждого юзера по последнему токену
     gl = gitlab.Gitlab('https://git.iu7.bmstu.ru/', private_token=decoder(private_key['token'][-1]))
     # ['token'][-1]
     project = gl.projects.get(self.project_id)  # находим проект
     return project.repository_compare(self.target_branch, self.source_branch)
Ejemplo n.º 14
0
    def index(self):
        # raw_body = cherrypy.request.body.read()
        raw_json = cherrypy.request.json  # получаем вебхук
        if raw_json[
                'object_kind'] == 'merge_request':  # если вебхук вызван мержреквестом
            print(raw_json)

            # Парсинг вебхука ########################################################################
            assignees_array = raw_json[
                'assignees']  # находим всем юзеров, заасаненных к мержреквесту
            project_name = raw_json['project']['name']  # название проекта
            project_id = raw_json['project']['id']  # id проекта
            source_branch = raw_json['object_attributes'][
                'source_branch']  # ветка, которую сливаем
            target_branch = raw_json['object_attributes'][
                'target_branch']  # ветка, в которую сливаем
            author_name = raw_json['user']['name']  # имя автора merge request
            merge_request_url = raw_json['object_attributes'][
                'url']  # адрес страницы merge request
            mg_title = raw_json['object_attributes'][
                'title']  # заголовок мерд реквеста
            try:
                action = raw_json['object_attributes']['action']  # действие
            except KeyError:
                action = None
            result = None
            ##########################################################################################

            for i in assignees_array:  # для каждого пользователя
                private_key = db.token.find_one({
                    'idGitLab':
                    encoder(i['username'])
                })  # достаем ключ авторизации пользователя
                if private_key is None:
                    print("Warning! No user was found to a merge request!")
                else:
                    # авторизуемся для каждого юзера по последнему токену
                    gl = gitlab.Gitlab(
                        'https://git.iu7.bmstu.ru/',
                        private_token=decoder(
                            private_key['token'][-1]))  # ['token'][-1]
                    project = gl.projects.get(project_id)  # находим проект
                    if action is not None:
                        result = project.repository_compare(
                            target_branch, source_branch)
                    for receiver in db.token.find(
                        {'idGitLab': encoder(i['username'])}):
                        if action is not None and result:
                            # для каждого телеграм аккаунта, прикрепленного к этому юзеру
                            for j, file in enumerate(result['diffs']):
                                if action == 'open' or action == 'merged':
                                    diff = "```" + str(file['diff']).replace(
                                        "```", "\`\`\`") + "```"
                                    message = "Пользователь {0} отправил Вам " \
                                              "запрос на слитие веток {1} и {2} " \
                                              "в проекте {3}\n".format(author_name,
                                                                       target_branch,
                                                                       source_branch,
                                                                       project_name).replace("_", "\_")
                                    try:
                                        bot.send_message(chat_id=decoder(
                                            receiver['id']),
                                                         text=message + diff,
                                                         parse_mode="markdown")
                                    except telebot.apihelper.ApiException:
                                        print(
                                            "The chat was not founded. It looks like a trouble with db :c"
                                        )

                                if action == 'reopen' and j < 1:
                                    message = "В проекте \"{0}\" пользователем {1} " \
                                              "был переоткрыт merge request {2)".format(project_name,
                                                                                        author_name,
                                                                                        mg_title)
                                    try:
                                        bot.send_message(chat_id=decoder(
                                            receiver['id']),
                                                         text=message)
                                    except telebot.apihelper.ApiException:
                                        print(
                                            "The chat was not founded. It looks like a trouble with db :c"
                                        )

                                if action == 'update' and j < 1:
                                    message = "В Merge Request {0} произошло новое событие.".format(
                                        mg_title)
                                    bot.send_message(chat_id=decoder(
                                        receiver['id']),
                                                     text=message)

                                if action == 'close' and j < 1:
                                    message = "Merge request {0} был закрыт.".format(
                                        mg_title)
                                    try:
                                        bot.send_message(chat_id=decoder(
                                            receiver['id']),
                                                         text=message)
                                    except telebot.apihelper.ApiException:
                                        print(
                                            "The chat was not founded. It looks like a trouble with db :c"
                                        )

                                if action == 'none' and j < 1:
                                    message = "В Merge Request {0} произошло новое событие.".format(
                                        mg_title)
                                    try:
                                        bot.send_message(chat_id=decoder(
                                            receiver['id']),
                                                         text=message)
                                    except telebot.apihelper.ApiException:
                                        print(
                                            "The chat was not founded. It looks like a trouble with db :c"
                                        )

                                if (
                                        action == 'update' or action == 'close'
                                ) and j >= 1 and len(result['diffs']) - 1 != 0:
                                    message = "А так же еще изменения в {0} файлах".format(
                                        len(result['diffs']) - 1)
                                    try:
                                        bot.send_message(chat_id=decoder(
                                            receiver['id']),
                                                         text=message)
                                    except telebot.apihelper.ApiException:
                                        print(
                                            "The chat was not founded. It looks like a trouble with db :c"
                                        )
                                    break  # прерываем вывод сообщений, чтобы не засорять чат
                        else:
                            message = "В репозитории {0} произошло неопознанное событие".format(
                                project_name)
                            try:
                                bot.send_message(chat_id=decoder(
                                    receiver['id']),
                                                 text=message)
                            except telebot.apihelper.ApiException:
                                print(
                                    "The chat was not founded. It looks like a trouble with db :c"
                                )

                        # отсылаем кнопочку со ссылкой на merge request
                        inline_item1 = types.InlineKeyboardButton(
                            'Merge Request', url=merge_request_url)
                        inline_bt1 = types.InlineKeyboardMarkup()
                        inline_bt1.add(inline_item1)
                        try:
                            bot.send_message(
                                chat_id=decoder(receiver['id']),
                                text=
                                "Более подробную информацию о мерж реквесте можно узнать, "
                                "перейдя по ссылке.",
                                reply_markup=inline_bt1)
                        except telebot.apihelper.ApiException:
                            print(
                                "The chat was not founded. It looks like a trouble with db :c"
                            )
Ejemplo n.º 15
0
def send_welcome(message):
    if (message.chat.username is None) and (db.token.count_documents(
        {"id": encoder(str(message.chat.id))}) == 0):
        inline_item2 = types.InlineKeyboardButton(
            'Создание Username', url='https://telegram-rus.ru/nik')
        inline_bt2 = types.InlineKeyboardMarkup()
        inline_bt2.add(inline_item2)

        bot.send_message(
            message.chat.id, "У тебя нет никнейма в телеграме, "
            "мне приятнее обращаться к людям по никам, а не id. "
            "Нажав на кнопку, ты узнаешь, как создать никнейм. "
            "Но если тебя все устраивает, я не настаиваю, моей работе это не помешает 🤔",
            parse_mode="html",
            reply_markup=inline_bt2)

    if message.chat.username is None:
        name_user = str(message.chat.id)
    else:
        name_user = "******" + message.chat.username

    st = open('./static/privet.webp', 'rb')
    bot.send_sticker(message.chat.id, st)

    if 5 <= timer[3] < 11:
        bot.send_message(
            message.chat.id,
            "Доброе утро , " + name_user +
            "! Какая же ты ранняя пташка, а я ведь мог и спать в это время 😅",
            parse_mode="html")

    if 11 <= timer[3] < 17:
        bot.send_message(
            message.chat.id,
            "Добрый день, " + name_user +
            "! Как же ты вовремя я только вернулся с обеденного перекуса 🥘 А ты покушал?",
            parse_mode="html")

    if 17 <= timer[3] < 23:
        bot.send_message(message.chat.id,
                         "Добрый вечер, " + name_user +
                         "! Ого уже вечер, ты домой то не собираешься? 🌅",
                         parse_mode="html")

    if (timer[3] == 23) or (0 <= timer[3] < 5):
        bot.send_message(
            message.chat.id,
            "Доброй ночи... добрая ночь... в общем, привет, " + name_user +
            "! Ты чего не спишь, давай не засиживайся, спать - полезно 😴",
            parse_mode="html")

    if db.token.count_documents({"id": encoder(str(message.chat.id))}) == 1:
        cursor = db.token.find_one({"id": encoder(str(message.chat.id))})
        cur = []
        cursor1 = dict(cursor)
        for j in cursor1['token']:
            cur.append(decoder(j))
        token_string = '\n'.join(cur)

        if cur:
            bot.send_message(
                message.chat.id,
                "По твоему id в базе данных я нашел следующие TOKEN:\n" +
                token_string,
                parse_mode="html")

            item1 = types.KeyboardButton("Ввод TOKEN")
            item2 = types.KeyboardButton("Выбор TOKEN")
            item3 = types.KeyboardButton("Удаление TOKEN")
            markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
            markup.add(item1)
            markup.add(item2)
            markup.add(item3)

            bot.send_message(
                message.chat.id,
                "Хочешь добавить TOKEN, выбрать или удалить один из уже имеющихся - "
                "жми на соответствующие кнопочки ",
                parse_mode="html",
                reply_markup=markup)

            bot.register_next_step_handler(message, process_step_1)

        elif not cur:
            item1 = types.KeyboardButton("Ввод TOKEN")
            markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
            markup.add(item1)

            bot.send_message(
                message.chat.id,
                name_user + ", по твоему id не было найденно ни одного TOKEN. "
                "Давай добавим, жми на кнопочку",
                parse_mode="html",
                reply_markup=markup)

            bot.register_next_step_handler(message, process_step_1)

    elif db.token.count_documents({"id": encoder(str(message.chat.id))}) > 1:
        bot.send_message(
            message.chat.id,
            "По твоему id в базе данных я нашел больше одного упоминания! "
            "Это ненормально, но твоей вины здесь нет. "
            "Напиши /problem и опиши этот случай "
            "(можешь перекопировать текст моего сообщения). Извини за неудобства 😬",
            parse_mode="html")

    elif db.token.count_documents({"id": encoder(str(message.chat.id))}) == 0:
        db.token.insert_one({
            "id": encoder(str(message.chat.id)),
            "token": [],
            "idGitLab": []
        })

        inline_item1 = types.InlineKeyboardButton(
            'Как получить TOKEN',
            url='https://habr.com/ru/company/flant/blog/340996/')
        inline_bt1 = types.InlineKeyboardMarkup()
        inline_bt1.add(inline_item1)

        item1 = types.KeyboardButton("Ввод TOKEN")
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        markup.add(item1)

        bot.send_message(
            message.chat.id,
            name_user +
            ", ты у нас впервые, твой id был удачно записан в базу данных.",
            parse_mode="html",
            reply_markup=markup)

        bot.send_message(
            message.chat.id,
            "Теперь давай добавим TOKEN. Если ты не знаешь, где его найти, нажми на кнопочку ",
            parse_mode="html",
            reply_markup=inline_bt1)

        bot.register_next_step_handler(message, process_step_1)