Пример #1
0
def finish(message, nickname, letter=None):
    if letter:
        cong_text = take_game_phrase('congrats_letter').format(letter.upper())
    else:
        cong_text = take_game_phrase('congrats')

    bot.send_message(message.chat.id, cong_text, parse_mode='Markdown')
    make_query('insert into Winners (Name) values (?)', (nickname, ))
    menu(message)
Пример #2
0
def towns_parsing():
    
    r = requests.get('http://heaclub.ru/goroda-mira-rossii-po-alfavitu-ot-a-do-ya-spisok-i-nazvaniya-gorodov-dlya-igry-v-goroda-v-alfavitnom-poryadke')
    soup = BeautifulSoup(r.text, 'html.parser') 

    spans = list()
    for span in soup.find_all('span'):
        spans.append(span.text)

    for i in range(10):
        spans.pop(0)
    for i in range(712):
        spans.pop()

    towns = list()
    for span in spans:
        towns += span.strip().split()
    
    while 'БУКВА' in towns:
        towns.remove('БУКВА')
    
    symbols = ['А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ъ','Ь','Ы','Э','Ю','Я']

    for word in towns:
        if word in symbols: towns.remove(word)
    
    for i in range(2):
        for word in towns:
            if ')' in word or '(' in word: towns.remove(word)
    
    extra_1 = ['Александровск-', 'Сахалинский', 'Белая', 'Белая', 'Калитва', 'Холуница', 'Верхний', 'Тагил','Верхний', 
               'Уфалей','Верхняя', 'Пышма','Верхняя', 'Салда','Верхняя', 'Тура', 'Горячий', 'Ключ','Великие' ,'Луки',
               'Великий' ,'Новгород','Великий', 'Устюг', 'Большой', 'Камень', 'Вышний', 'Волочек', 'Вятские', 'Поляны',
               'Гаврилов', 'Посад', 'Дагестанские', 'Огни', 'Железногорск', 'Заречный', 'Благовещенск', 
               'Гурьевск', 'Красноармейск', 'Красный', 'Кут', 'Красный', 'Сулин', 'Красный', 'Холм', 'Никольск', 'Нижние', 
               'Серги','Нижний', 'Ломов','Нижний', 'Новгород','Нижний', 'Тагил','Нижняя', 'Салда','Нижняя', 'Тура', 
               'Павловский', 'Посад', 'Советск', 'Советск', 'Советская', 'Гавань', 'Приморск', 'Старая', 'Купавна', 'Старая',
               'Русса','Мариинский', 'Посад', 'Минеральные', 'Воды','Мирный', 'Михайловск', 'Набережные', 'Челны', 'Новый',
               'Оскол', 'Новый', 'Уренгой', 'Озерск', 'Полярные', 'Зори', 'Лодейное', 'Поле', 'Краснослободск', 'Краснознаменск',
               'Кировск', 'В', 'Сосновый', 'Бор', 'Старый', 'Крым', 'Старый', 'Оскол']
    extra_2 = ['Александровск-Сахалинский', 'Белая Калитва', 'Белая Холуница', 'Верхний Тагил','Верхний Уфалей',
               'Верхняя Пышма','Верхняя Салда','Верхняя Тура', 'Горячий Ключ','Великие Луки','Великий Новгород',
               'Великий Устюг', 'Большой Камень', 'Вышний Волочек', 'Вятские Поляны', 'Гаврилов Посад', 'Дагестанские Огни',
               'Красный Кут', 'Нижние Серги','Нижний Ломов','Нижний Новгород','Нижний Тагил', 'Нижняя Салда',
               'Нижняя Тура', 'Павловский Посад', 'Советская Гавань', 'Старая Купавна', 'Старая Русса', 'Мариинский Посад', 
               'Минеральные Воды', 'Набережные Челны', 'Новый Оскол', 'Новый Уренгой', 'Полярные Зори', 'Лодейное Поле', 
               'Красный Кут','Красный Сулин','Красный Холм','Сосновый Бор', 'Старый Крым', 'Старый Оскол']
    extra_3 = ['Курчалой', 'Кудрово', 'Кукмор', 'Сунжа']

    for word in extra_1:
        towns.remove(word)  
    for town in extra_2:
        towns.append(town)
    for town in extra_3:
        towns.append(town)

    make_query('insert into Rus_Towns (Russian) values (?)', ('|'.join(towns), ))
Пример #3
0
def languages_f(message, word=None):
    if word: lang_num = 1 if 'рус' in word.lower() else 0
    else: lang_num = 1 if 'рус' in message.text.lower() else 0

    check_user_all_new(message, take_phrase_1('languages_type', lang_num))
    make_query('update Users_new set lang = "{}"'.format(take_phrase_1('languages_type', lang_num)))   
    bot.send_message(message.chat.id, text=take_phrase_1('langs', lang_num)+take_phrase_1('languages_type', lang_num))
    if message.text == 'Русский(ru)' or message.text == 'English(en)':
        start_menu(message)
    else:
        settings(message)
Пример #4
0
def query_add_stat(message, stat, answer):
    try:
        Statistic = stat
        Answer = answer
        Tel_ID = message.from_user.id
        Time_d, Time = date_time()

        make_query(
            '''insert into Queries_stat (Statistic, Answer, Tel_ID, Time_d, Time) 
        values (?, ?, ?, ?, ?)''', (Statistic, Answer, Tel_ID, Time_d, Time))
    except Exception as e:
        report_error(e)
Пример #5
0
def check_user_all_new(message, lang):
    try:
        FirstName = message.from_user.first_name
        LastName = message.from_user.last_name
        Tel_ID = str(message.from_user.id)
        Username = message.from_user.username
        Time = date_time('date')

        make_query(
            '''insert into Users_All_new (FirstName, LastName, Tel_ID, Username, Time, Lang) 
        values (?, ?, ?, ?, ?, ?)''',
            (FirstName, LastName, Tel_ID, Username, Time, lang))
    except Exception as e:
        report_error(e)
Пример #6
0
def get_query_all(message):
    lang_num = language_define(message)
    queries = (make_query('''select count(*) from (select * from Queries); '''))[0][0]
    queries_s = (make_query('''select count(*) from (select * from Queries_stat);'''))[0][0]

    answer = f"{take_phrase_2('stat_answers', 'requests_all', lang_num)}{queries+queries_s}"
    bot.send_message(message.chat.id, answer)

    try:
        query_add_stat(message, phrases['stat_db']['requests_all'], answer)
        check_user(message)
        check_user_all(message)
    except Exception as e:
        report_error(e)
Пример #7
0
def get_query_today(message):
    lang_num = language_define(message)
    Time_d = date_time('date')
    queries = (make_query('''select count(*) from (select * from Queries where Time_d=?); ''', (Time_d, )))[0][0]
    queries_s = (make_query('''select count(*) from (select * from Queries_stat where Time_d=?); ''', (Time_d, )))[0][0]
    answer = take_phrase_2('stat_answers', 'requests_today', lang_num)+str(queries+queries_s)
    bot.send_message(message.chat.id, answer)

    try:
        query_add_stat(message, phrases['stat_db']['requests_today'], answer)
        check_user(message)
        check_user_all(message)
    except Exception as e:
        report_error(e)
Пример #8
0
def query_add(message, quest, town, inf, thumbnail_url, poem):
    try:
        Quest = quest
        Town = town
        Weather = inf
        Photo = thumbnail_url
        Poem = poem
        Tel_ID = message.from_user.id
        Time_d, Time = date_time()

        make_query(
            '''insert into Queries (Quest, Town, Weather, Photo, Poem, Tel_ID, Time_d, Time ) 
        values (?, ?, ?, ?, ?, ?, ?, ?)''',
            (Quest, Town, Weather, Photo, Poem, Tel_ID, Time_d, Time))
    except Exception as e:
        report_error(e)
Пример #9
0
def preparing_game_1(message, place, towns, forbidden_letters, state=0):
    for i in range(1, 4):
        if place[-i] not in forbidden_letters:
            sym = place[-i].upper()
            break

    nickname = nickname_define(message)       
    used_towns = make_query(f'''select Town from {nickname}; ''')
    used_towns = [town[0] for town in used_towns]
    choice = list()

    for town in towns:
        if sym == town[0] and town not in used_towns: 
            choice.append(town)

    if len(choice) == 0:
        defeat(message, sym)
    else:
        if state == 0:
            ask_text = take_game_phrase('write_town_with_letter').format(sym)
        elif state == 1:
            ask_text = take_game_phrase('write_other_town_with_letter').format(sym)
        else:
            ask_text = take_game_phrase('write_town_with_other_letter').format(sym)

        sent = bot.send_message(message.chat.id, ask_text)
        bot.register_next_step_handler(sent, game_play_1)
Пример #10
0
def top(message):
    people = [human[0] for human in make_query('select Name from Winners')]
    results = collections.Counter(people).most_common()
    
    text = 'Пользователь | Кол-во побед\n'
    for result in results:
        text += f'{result[0]} | {result[1]}\n'

    bot.send_message(message.chat.id, text)
Пример #11
0
def check_user(message):
    try:
        FirstName = message.from_user.first_name
        LastName = message.from_user.last_name
        Tel_ID = message.from_user.id
        Username = message.from_user.username

        if (len(
                make_query('''select * from Users where Tel_ID = ? ''',
                           (Tel_ID, ))) == 0):
            make_query(
                '''insert into Users (FirstName, LastName, Tel_ID, Username) 
            values (?, ?, ?, ?)''', (
                    FirstName,
                    LastName,
                    Tel_ID,
                    Username,
                ))
    except Exception as e:
        report_error(e)
Пример #12
0
def game_play(message):
    place = message.text

    if place == take_phrase_1('back_menu',1):
        menu(message)
    else:
        towns = (make_query('''select Russian from Rus_Towns; ''')[0][0]).split('|')
        if place in towns:
            nickname = nickname_define(message)
            forbidden_letters = ('ё', 'ъ', 'ь', 'ы')
            choice = list()

            make_query(f'insert into {nickname} (Town) values (?)', (place, ))
            keyboard = types.InlineKeyboardMarkup()
            keyboard.add(*[types.InlineKeyboardButton(text=name, callback_data=name) for name in [take_game_phrase('inf')]])
            
            bot.send_message(message.chat.id, take_game_phrase('town_inf').format(place), reply_markup=keyboard)

            for i in range(1, 4):
                if place[-i] not in forbidden_letters:
                    sym = place[-i]
                    break

            for town in towns:
                if sym.upper() == town[0] and town != place:
                    choice.append(town)
            random_town = random.choice(choice)

            keyboard = types.InlineKeyboardMarkup()
            keyboard.add(*[types.InlineKeyboardButton(text=name, callback_data=name) for name in [take_game_phrase('inf')]])
            bot.send_message(message.chat.id, random_town, reply_markup=keyboard)

            make_query(f'insert into {nickname} (Town) values (?)', (random_town, ))

            preparing_game_1(message, random_town, towns, forbidden_letters)
                    
        else:
            preparing_game(message, 0)
Пример #13
0
def get_users_all(message):
    lang_num = language_define(message)
    num_of_users = make_query(
        'select count(*) from (select Tel_ID from Users_new)')[0][0]

    answer = f"{take_phrase_2('stat_answers', 'users_all', lang_num)}{num_of_users}"
    bot.send_message(message.chat.id, answer)

    try:
        query_add_stat(message, phrases['stat_db']['users_all'], answer)
        check_user(message)
        check_user_all(message)
    except Exception as e:
        report_error(e)
Пример #14
0
def game_play_1(message):
    place = message.text
    if place == take_phrase_1('back_menu',1):
        menu(message)
    else:
        towns = (make_query('''select Russian from Rus_Towns; ''')[0][0]).split('|')
        nickname = nickname_define(message)
        used_towns = make_query(f'''select Town from {nickname}; ''')
        used_towns = [town[0] for town in used_towns]
        forbidden_letters = ('ё', 'ъ', 'ь', 'ы')
        if place in towns and place not in used_towns:
            last_town = used_towns[-1]
            choice = list()
            for i in range(1, 4):
                if last_town[-i] not in forbidden_letters:
                    bot_sym = last_town[-i]
                    break
            if bot_sym == (place[0]).lower():
                
                keyboard = types.InlineKeyboardMarkup()
                keyboard.add(*[types.InlineKeyboardButton(text=name, callback_data=name) for name in [take_game_phrase('inf')]])
                bot.send_message(message.chat.id, take_game_phrase('town_inf').format(place), reply_markup=keyboard)
                make_query(f'insert into {nickname} (Town) values (?)', (place, ))
                
                if len(used_towns) == 30:
                    finish(message, nickname)
                else:
                    for i in range(1, 4):
                        if place[-i] not in forbidden_letters:
                            user_sym = place[-i]
                            break
                    for town in towns:
                        if user_sym.upper() == town[0] and town not in used_towns: 
                            choice.append(town)
                    if len(choice) == 0:
                        finish(message, nickname, user_sym)
                    else:
                        random_town = random.choice(choice)

                        keyboard = types.InlineKeyboardMarkup()
                        keyboard.add(*[types.InlineKeyboardButton(text=name, callback_data=name) for name in [take_game_phrase('inf')]])
                        bot.send_message(message.chat.id, random_town, reply_markup=keyboard)

                        make_query(f'insert into {nickname} (Town) values (?)', (random_town, ))
                        preparing_game_1(message, random_town, towns, forbidden_letters)
            else:
                preparing_game_1(message, used_towns[-1], towns, forbidden_letters, state=2)
        else:
            preparing_game_1(message, used_towns[-1], towns, forbidden_letters, state=1)
Пример #15
0
def get_users_today(message):
    lang_num = language_define(message)
    Time = date_time('date')

    query = make_query(
        '''select distinct Tel_ID from Users_All_new where Time=?; ''',
        (Time, ))

    people = set()
    for user in query:
        people.add(user[0])

    answer = f"{take_phrase_2('stat_answers', 'users_today', lang_num)}{len(people)}"
    bot.send_message(message.chat.id, answer)

    try:
        query_add_stat(message, phrases['stat_db']['users_today'], answer)
        check_user(message)
        check_user_all(message)
    except Exception as e:
        report_error(e)
Пример #16
0
def translate(to_translate, lang_num=1):
    try:
        trans = make_query('select * from Translations where main=? or sub=?',
                           (
                               to_translate,
                               to_translate,
                           ))
        try:
            translated = tran[0 if tran[0][3] == lang_num else 1][2]
        except:
            data = {
                "key": translation_key,
                "text": to_translate,
                "lang": "ru" if lang_num == 1 else "en"
            }

            req_data = requests.get(
                'https://translate.yandex.net/api/v1.5/tr.json/translate',
                data=data).json()
            translated = req_data['text'][0]

        return translated
    except Exception as e:
        report_error(e)
Пример #17
0
def language_define(message):
    ID = message.from_user.id
    lang = make_query('''select Lang from Users_new where Tel_ID=?''', (ID, ))[0][0]
    return 0 if lang == 'English' else 1
Пример #18
0
def prepare_db():
    try:
        make_query(
            "CREATE TABLE IF NOT EXISTS Users_All (Ua_ID INTEGER PRIMARY KEY AUTOINCREMENT, FirstName text, LastName text, Tel_ID INTEGER, Username text, Time date);"
        )
        make_query(
            "CREATE TABLE IF NOT EXISTS Users (U_ID INTEGER PRIMARY KEY AUTOINCREMENT, FirstName text, LastName text, Tel_ID INTEGER, Username text);"
        )
        make_query(
            "CREATE TABLE IF NOT EXISTS Users_All_new (Ua_ID INTEGER PRIMARY KEY AUTOINCREMENT, FirstName text, LastName text, Tel_ID text, Username text, Time date, Lang text);"
        )
        make_query(
            "CREATE TABLE IF NOT EXISTS Users_new (U_ID INTEGER PRIMARY KEY AUTOINCREMENT, FirstName text, LastName text, Tel_ID text, Username text, Lang text);"
        )
        make_query(
            "CREATE TABLE IF NOT EXISTS Queries (Q_ID INTEGER PRIMARY KEY AUTOINCREMENT, Quest text, Town TEXT, Weather TEXT, Photo TEXT, Poem text, Tel_ID integer, Time_d date, Time text);"
        )
        make_query(
            "CREATE TABLE IF NOT EXISTS Queries_stat (Qs_ID INTEGER PRIMARY KEY AUTOINCREMENT, Statistic text, Answer TEXT, Tel_ID integer, Time_d date, Time text);"
        )
        make_query(
            "CREATE TABLE IF NOT EXISTS Translations (U_ID INTEGER PRIMARY KEY AUTOINCREMENT, main text, sub text, num integer);"
        )
        make_query("CREATE TABLE IF NOT EXISTS Rus_Towns (Russian text);")
        make_query(
            "CREATE TABLE IF NOT EXISTS Inf_towns (U_ID INTEGER PRIMARY KEY AUTOINCREMENT, town text, inf text);"
        )
        make_query(
            "CREATE TABLE IF NOT EXISTS Winners (Ua_ID INTEGER PRIMARY KEY AUTOINCREMENT, Name text);"
        )
    except Exception as e:
        report_error(e)
Пример #19
0
def prepare_game_db(message):
    nickname = nickname_define(message)
    make_query(f"DROP TABLE IF EXISTS {nickname};")
    make_query(f"CREATE TABLE {nickname} (Ua_ID INTEGER PRIMARY KEY AUTOINCREMENT, Town text);")
Пример #20
0
def inline(c):
    if c.data == 'Подробнее':
        bot.edit_message_text(chat_id=c.message.chat.id, message_id=c.message.message_id, text=phrases['game']['advanced_rules'], parse_mode='Markdown')
    elif c.data == 'Информация':
        c_req = (c.message.text).strip().split()
        town = c_req[-1]

        if len(c_req) == 5: town = f'{c_req[3]}_{c_req[4]}'
        elif len(c_req) == 2: town =  f'{c_req[0]}_{c_req[1]}'

        db_inf = make_query('select inf from Inf_towns where town=?', (town, ))
        
        if len(db_inf) != 0:
            text = db_inf[0][0]
        else:
            req = requests.get(f'https://ru.wikipedia.org/wiki/{town}').text
            soup = BeautifulSoup(req, 'html.parser')
            all_p = soup.find_all('p')
            try:
                inf_extra = (all_p[0]).text
                if 'отпатрулирована' in inf_extra: inf_extra = (all_p[1]).text
                inf_extra = inf_extra.strip().split()
                inf = ''
                
                for j in range(2):
                    for part in inf_extra:
                        l, r = part.find('['), part.find(']')
                        if l != -1: part = part.replace(part[l:r+1], '')
                        inf += f'{part} '

                if 'фамилия' in inf or 'населённых пунктов' in inf: raise Exception
                else: text = phrases['game']['all_inf'].format(inf, town)

                make_query(f'insert into Inf_towns (town, inf) values ("{town}", "{text}")')
            
            except Exception:
                text = phrases['game']['no_inf'].format(' '.join(town.split('_')), town)
                
        bot.edit_message_text(chat_id=c.message.chat.id, message_id=c.message.message_id, text=text, parse_mode='Markdown')
        
    elif 'Больше' in c.data or 'More' in c.data:
        _, lang_num, town, date = (c.data).split('&')
        lang_num, date = int(lang_num), list(map(int, date.split('-')))
        date = datetime.date(day=date[2], month=date[1], year=date[0])
        n = (date - datetime.date.today()).days
        
        try:
            coords = get_coords(c.message, town)
            town = coords[0]
            if len(coords) == 3: latitude, longitude = coords[1:]
            name = name_define(n, lang_num)
            weather_inf = get_inf(lang_num, latitude, longitude)   
            precipType_ru, summary, search_term, inf = get_main_parts(n, lang_num, town, weather_inf, name)

            bot.edit_message_text(chat_id=c.message.chat.id, message_id=c.message.message_id, text=inf, parse_mode='Markdown')
            
        except Exception as e:
            bot.edit_message_text(chat_id=c.message.chat.id, message_id=c.message.message_id, text=take_phrase_2('errors', 'top_error', lang_num))
            inf = ''
        try:
            check_user(c.message)
            check_user_all(c.message)
            query_add(c.message, name, town, inf, '', '')
        except Exception as e:
            report_error(e) 

    elif 'Get weather' in c.data or 'Получить погоду' in c.data:
        address = c.data.strip().split('|')[-1]
        if address != 'None': weather_0(c.message, address, lang_num=0 if 'Get' in c.data else 1)
        else: preparing_0(c.message, c.data)

    elif 'Get statistics'  in c.data or 'Получить статистику' in c.data:
        lang_num = 0 if 'Get' in c.data else 1
        text = take_phrase_1('stats_text_pq_2', lang_num)
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        markup.row(take_phrase_2('statistic', 'today_users', lang_num), take_phrase_2('statistic', 'today_requests', lang_num))
        markup.row(take_phrase_1('back_menu', lang_num), take_phrase_1('back_start', lang_num))
        bot.send_message(c.message.chat.id, text, reply_markup=markup)         
    else:
        bot.send_message(c.message.chat.id, 'C Error')