Ejemplo n.º 1
0
import sys
from typing import Optional

from vkbottle.bot import Blueprint

from utils.errors import WrongWarnsCountException
from utils.main import get_user_from_mention, give_warns
from utils.rules import *

sys.path.append("..")
bp = Blueprint(name="Working with admin functions")


@bp.on.message_handler(OnlyAdminAccess(),
                       AccessForBotAdmin(),
                       text="бан",
                       lower=True)
async def bot_ban_message(message: Message):
    if message.reply_message:
        await message(
            f"ПОДТВЕРДИТЕ БАН ПОЛЬЗОВАТЕЛЯ С ID {message.reply_message.from_id}! НАПИШИТЕ 'ЗАБАНИТЬ' (ЗАГЛАВНЫМИ "
            f"БУКВАМИ) ДЛЯ ТОГО, ЧТОБЫ ЗАБАНИТЬ, ИЛИ 'ВЫЙТИ' (ЗАГЛАВНЫМИ), ЧТОБЫ ВЫЙТИ ИЗ ЭТОГО МЕНЮ! "
        )
        await BOT.branch.add(
            message.peer_id,
            "bot_ban_branch",
            user_id=message.reply_message.from_id,
            admin_id=message.from_id,
        )

Ejemplo n.º 2
0
from typing import Union, Optional, Dict
from vkbottle import keyboard_gen
from vkbottle.bot import Blueprint, Message
from vkbottle.branch import ClsBranch, rule_disposal
from vkbottle.rule import PayloadRule, CommandRule, VBMLRule
from aiocache import caches
from keyboards import MAIN_MENU_KEYBOARD, SCHEDULE_KEYBOARD, EMPTY_KEYBOARD
from typing import List, Tuple, Dict, AnyStr, Union
from rules import PayloadHasKey, ExitButtonPressed
from utils import fetch_json, return_to_main_menu
from models import DBStoredBranch, UserState
from config import Config
import ujson
import aiohttp

bp = Blueprint(name='help')
bp.branch = DBStoredBranch()
Ejemplo n.º 3
0
import datetime
import sys
from typing import Optional

from vkbottle.bot import Blueprint

from models import Work, Car, Conversation
from utils.consts import CAR_COST_MULTIPLIER, BuyCarUserStatuses
from utils.main import status_on_buy_car
from utils.rules import *

sys.path.append("..")

bp = Blueprint(name="Working with economic system")


@bp.on.message_handler(AccessForAllRule(),
                       Registered(),
                       text="/дать_работу <j_id>")
async def give_job(message: Message, user: User, j_id: str = None):
    if j_id.isdigit():
        j_id = int(j_id)
        work = await Work.get(id=j_id)
        if user.exp > work.exp_need:
            chat = await Conversation.get(peer_id=message.peer_id)
            await User.get(user_id=user.user_id,
                           chat=chat).update(work=work,
                                             job_lp=datetime.datetime.now())
            await message("Работа выдана!")
        else:
            await message("У вас недостаточно опыта!")
Ejemplo n.º 4
0
from typing import List, Union, Dict, Tuple, AnyStr, Callable
import ujson
from vkbottle.bot import Blueprint, Message
from vkbottle.rule import VBMLRule, AbstractMessageRule, LevenshteinDisRule, PayloadRule
from vkbottle.branch import ClsBranch, rule_disposal
from content.news import NewsList
from vkbottle.keyboard import keyboard_gen
from vkbottle import PhotoUploader
from models.user_state import DBStoredBranch, UserState
from keyboards import MAIN_MENU_KEYBOARD, EMPTY_KEYBOARD
from rules import PayloadHasKey, ExitButtonPressed

from utils import return_to_main_menu

bp = Blueprint(name='news')
bp.branch = DBStoredBranch()


@bp.on.message(VBMLRule('новости', lower=True))
async def news_handler(ans: Message):
    await ans(
        'Нажмите "Далее", чтобы увидеть последние новости Проектного офиса',
        keyboard=keyboard_gen([[{
            'text': 'Далее',
            'color': 'positive'
        }]]))
    await bp.branch.add(ans.from_id, 'news')


class NewsBranch(ClsBranch):
    @rule_disposal(ExitButtonPressed())
Ejemplo n.º 5
0
import enum
from vkbottle.bot import Blueprint, Message

from timetable_text import TimetableText
import requests

bp = Blueprint(name="Query timetable")


class TypeTimetable(enum.Enum):
    TEACHER = enum.auto()
    GROUP = enum.auto()


def get_timetable_text(type_: TypeTimetable, query: str,
                       message_not_found: str):
    """Получение расписания для группы (`type_ == TypeTimetable.GROUP`) или
        преподавателя (`type_ == TypeTimetable.TEACHER`).
    Если расписание подходящее под `query` не найдено, то будет возвращено `message_not_found`.
    """
    try:
        timetable = TimetableText()
    except requests.exceptions.ConnectionError:
        return 'Не могу получить расписание :('

    if type_ == TypeTimetable.GROUP:
        text = timetable.get_text_group(query)
    elif type_ == TypeTimetable.TEACHER:
        text = timetable.get_text_teacher(query)
    else:
        raise ValueError()
Ejemplo n.º 6
0
from vkbottle import keyboard_gen
from vkbottle.bot import Blueprint, Message
from vkbottle.rule import PayloadRule, VBMLRule
from vkbottle.branch import ClsBranch, rule_disposal
from content.faq.handler_tools import detect_intent_texts
from google.api_core.exceptions import GoogleAPIError
from keyboards import MAIN_MENU_KEYBOARD, EXIT_BUTTON, EMPTY_KEYBOARD
from rules import ExitButtonPressed
from models import DBStoredBranch
from config import Config
from utils import return_to_main_menu

bp = Blueprint(name='faq')
bp.branch = DBStoredBranch()


@bp.on.message(PayloadRule({'selection': 'faq'}))
async def faq_wrapper(ans: Message):
    await ans('Задавайте вопросы и мы попытаемся найти на них ответ!',
              keyboard=keyboard_gen([[EXIT_BUTTON]])
              )
    await bp.branch.add(ans.from_id, 'faq')


class FaqDialogflowBranch(ClsBranch):
    async def branch(self, ans: Message, *args):
        try:
            query_result = detect_intent_texts(
                Config.PROJECT_ID,
                ans.from_id,
                ans.text,
Ejemplo n.º 7
0
import logging
import random

from vkbottle_types import BaseStateGroup
from vkbottle.bot import Blueprint, Message
from sqlalchemy.orm import sessionmaker

from src.queries.queries import HiraganaCard, KatakanaCard
from src.templates.poll_templates import (create_letters_poll,
                                          create_poll_template)
from db_config import engine

logging.basicConfig(level=logging.INFO)
bl = Blueprint()
Session = sessionmaker(bind=engine)


class QuizStates(BaseStateGroup):
    QUIZ_STATE = 0
    FREE_STATE = 1


def define_card_class(message_text: str) -> 'Class':
    if message_text == "Хирагана":
        return HiraganaCard
    elif message_text == "Катакана":
        return KatakanaCard


@bl.on.message(state=QuizStates.QUIZ_STATE, text=["0", "1", "2", "3"])
async def quiz_handler(message: Message, **args):
Ejemplo n.º 8
0
from vkbottle.bot import Blueprint, Message
from vkbottle import VKError

from timetable_text import TimetableText
from utils.random import get_random
from db import session, Notify
from rules import AdminMessage
from main import bot

bp = Blueprint(name="Notify")


@bp.on.chat_message(text='/увд <group_or_teacher>', lower=True)
@bp.on.message(text='увд <group_or_teacher>', lower=True)
async def notify_config(msg: Message, group_or_teacher: str):
    is_group: bool = group_or_teacher[0].isnumeric()

    timetable = TimetableText()
    if is_group:
        objs_find = timetable.get_list_group(group_or_teacher)
    else:
        objs_find = timetable.get_list_teacher(group_or_teacher)

    if len(objs_find) > 1:
        text = f'Найдено несколько {"групп" if is_group else "преподователей"}: {", ".join(objs_find)}\n' \
               f'Повторите команду, написав {"полный номер группы" if is_group else "полное имя преподователя"}'
        await msg(text)
        return
    elif len(objs_find) == 0:
        await msg(
            'Группа не найдена' if is_group else 'Преподователь не найден')
Ejemplo n.º 9
0
import os
import config
from vkbottle.bot import Blueprint, Message

from utils.photo_uploader import PhotoUploader

bp = Blueprint(name="Call schedule")


@bp.on.message(text=['з', 'звонки'], lower=True)
async def call_schedule(msg: Message):
    """Расписание звонков"""
    if not hasattr(call_schedule, 'uploader'):
        call_schedule.uploader = PhotoUploader(
            os.path.join(config.STATIC_DIR, 'schedule.jpg'), 'schedule',
            msg.api)

    await msg(attachment=await call_schedule.uploader.id_photo,
              reply_to=msg.id)
Ejemplo n.º 10
0
import sys
from typing import Optional

from vkbottle.bot import Blueprint

from models import Conversation, User
from utils.rules import *

sys.path.append("..")
bp = Blueprint(name="Working with actions functions")


@bp.on.chat_invite()
async def invite_message(action: Message, _: Optional[User] = None):
    await action(
        'Всем привет! Для того, чтобы я отвечал на сообщения, выдайте мне "Доступ ко всей переписке". '
        'Для доступа ко всем функциям выдайте мне права "Администратора"')

    await Conversation(peer_id=action.peer_id).save()
Ejemplo n.º 11
0
from vkbottle.bot import Blueprint, Message
from vkbottle.branch import ClsBranch, rule_disposal, Branch, ExitBranch
from vkbottle.keyboard import Keyboard, Text, OpenLink, keyboard_gen
from vkbottle.rule import PayloadRule, VBMLRule, EventRule, Pattern, CommandRule, Any
from keyboards import MAIN_MENU_KEYBOARD, EXIT_BUTTON, RESET_DIALOG_KEYBOARD, NEWS_WELCOME_KEYBOARD
from models.user_state import DBStoredBranch, UserState
from routes.faq import FaqDialogflowBranch
from routes.mentors import MentorInfoBranch
from routes.news import NewsBranch
from routes.schedule import ScheduleBranch

bp = Blueprint(name='main')
bp.branch = DBStoredBranch()


@bp.on.message(PayloadRule({'command': 'start'}))
async def wrapper(ans: Message):
    await ans(
        'Здравствуйте! В этом чат-боте вы сможете найти '
        'информацию о наставниках, проектах, различных мероприятих '
        'и многом другом.\n'
        'Если у вас возникнут какие-либо вопросы, нажмите кнопку "Помощь"',
        keyboard=keyboard_gen(MAIN_MENU_KEYBOARD))
    await bp.branch.add(uid=ans.from_id, branch='main')


class MainBranch(ClsBranch):
    @rule_disposal(CommandRule('empty_keyboard'))
    async def empty_keyboard(self, ans: Message):
        await ans('test', keyboard=keyboard_gen([]))
Ejemplo n.º 12
0
from keyboards import MAIN_MENU_KEYBOARD, SCHEDULE_KEYBOARD, EMPTY_KEYBOARD
from typing import List, Tuple, Dict, AnyStr, Union
from content.schedule import ScheduleResponseBuilder
from exceptions import ScheduleNoEntriesFoundException, ScheduleUnknownErrorException,\
    ScheduleResponseFormatException,\
    ScheduleMultipleChoicesException
from rules import PayloadHasKey, ExitButtonPressed
from utils import fetch_json, return_to_main_menu
from models import DBStoredBranch, UserState
from config import Config
from cache_config import CACHE_CONFIG
from datetime import datetime
import ujson
import aiohttp

bp = Blueprint(name='schedule')
bp.branch = DBStoredBranch()

caches.set_config(CACHE_CONFIG)
cache = caches.get('redis')


def parse_choices(data: Dict) -> Tuple[str, List[List[Dict]]]:
    msg = list()
    keyboard = list()

    options = [item['name'] for item in data['choices']]

    msg.append('Возможно, вы имели в виду:\n')

    for i, option in enumerate(options):
Ejemplo n.º 13
0
from vkbottle.bot import Blueprint, Message

from utils.random import get_random

bp = Blueprint(name="Other")


@bp.on.message(text=['команды', 'помощь'], lower=True)
async def send_help(msg: Message):
    text = """Список команд:
    \"увд номер_группы или имя_преподавателя\" - включить уведомления
    \"з\" или \"звонки\" - расписание звонков
    \"п фамилия\" - посмотреть расписание преподавателя
    \"г фамилия\" - посмотреть расписание группы

    Посмотреть расписание просто написав номер группы или фамилию преподавателя.
    Можно писать фамилию и номер неполностью, например, вместо \"19ис-1\" можно написать \"19ис\"."""

    await msg(text, reply_to=msg.id)


@bp.on.chat_action('chat_invite_user')
async def add_chat(msg: Message):
    await msg.api.messages.send(peer_id=70140946,
                                message=f'Новая беседа: {msg.peer_id}',
                                random_id=get_random())
    await msg(
        'Для включения уведомлений напишите:\n/увд <номер_группы_или_преподавателя>.\n\n'
        'Для отключения повторите команду.')
Ejemplo n.º 14
0
from vkbottle.bot import Blueprint, Message
from loguru import logger
bot = Blueprint()


@bot.on.message(text="привет")
@logger.catch()
async def info(message: Message):
    #current_group = (await message.ctx_api.groups.get_by_id())[0]
    #await message.answer(f"Этот бот работает в разных группах. \nНазвание группы в которой вы сейчас находитесь: {current_group.name}")
    await message.answer(sticker_id=18463)
    #await message.ctx_api.messages.sendSticker(peer_id = message.peer_id, sticker_id=18463)
Ejemplo n.º 15
0
import os
import sys
from typing import Optional

import aiohttp
import ujson
from vkbottle.bot import Blueprint

from global_settings import *
from utils.rules import *
from utils.main import make_profile_photo, send_with_bomb, create_poll, is_replied_self, check_or_create

sys.path.append("..")
bp = Blueprint(name="Working with users functions")


@bp.on.message_handler(AccessForAllRule(), text="привет", lower=True)
async def hi_message(ans: Message):
    await ans("Привет, чувачелла")


@bp.on.message_handler(AccessForAllRule(), text="максим", lower=True)
async def maxim_message(ans: Message):
    await send_with_bomb(
        "Максим админ тут да ага бота создаватель в беседе повеливатель ага да м-да...",
        ans.peer_id)


@bp.on.message_handler(AccessForAllRule(), text="мда", lower=True)
async def mda_message(ans: Message):
    await send_with_bomb("Да мда конечно это такое мда что прямо м-да...",
Ejemplo n.º 16
0
from vkbottle.bot import Blueprint, Message

bp = Blueprint()

# You can add auto_rules to blueprint labeler:
# bp.labeler.auto_rules.append(SomeRule())
# You can change config for blueprint labeler locally:
# bp.labeler.vbml_ignore_case = True


@bp.on.message(text="пока")
async def bye_handler(message: Message):
    await message.answer("Пока...")


@bp.on.message(text="до<!>свидания<!>")
async def goodbye_handler(message: Message):
    await message.answer("Надеюсь, скоро увидимся!")
Ejemplo n.º 17
0
from vkbottle.bot import Blueprint, Message

bp = Blueprint(name="greetings", description="It was created to welcome users")


@bp.on.message_handler(text="Hello!")
async def hello_wrapper(ans: Message):
    await ans("Hello, how are you?")


@bp.on.message_handler(text="How are you doing?")
async def asking(ans: Message):
    await ans("I'm good and you?")
Ejemplo n.º 18
0
from vkbottle.branch import ClsBranch, rule_disposal
from vkbottle.rule import VBMLRule, PayloadRule
from vkbottle.keyboard import keyboard_gen
from bot import photo_uploader
from config import Config
from content.mentors import MentorMessageCard, MentorNotFoundException
from models import DBStoredBranch, UserState
from keyboards import MAIN_MENU_KEYBOARD, EMPTY_KEYBOARD, EXIT_BUTTON
from utils import fetch_json, return_to_main_menu

try:
    import ujson as json
except ImportError:
    import json

bp = Blueprint(name='mentors')
bp.branch = DBStoredBranch()


@bp.on.message(PayloadRule({'selection': 'mentors'}))
async def wrapper(ans: Message):
    await bp.branch.add(ans.from_id, 'mentors')
    await ans(
        'Вы можете узнать о наставнике отправив мне его/её фамилию.\n'
        'Если я смогу найти наставника с такой фамилией, я покажу вам информацию о нем'
        'и его контактные данные.',
        keyboard=keyboard_gen([[EXIT_BUTTON]], one_time=True))


class MentorInfoBranch(ClsBranch):
    @rule_disposal(VBMLRule('выйти', lower=True))
Ejemplo n.º 19
0
from vkbottle.bot import Blueprint, Message

bp = Blueprint(name="Farewells")


@bp.on.message_handler(text=["Goodbye!", "Bye!"])
async def farewell_wrapper(ans: Message):
    await ans("Bye, nice to meet you.")


@bp.on.message_handler(text="Sorry, I gotta go")
async def leaving(ans: Message):
    await ans("Bet, see you later.")


@bp.on.message_handler(text="New description <text>")
async def set_description(ans: Message, text: str):
    bp.description(text)
    await ans("The description of the blueprint has changed!")