async def infection(self): percent = (DB.who_healthy_and_walk() + DB.who_ill_and_walk()*1.5) / (DB.show_users_count()) if percent <= 0: return self.min_chance elif percent > self.max_chance: return self.max_chance return round(percent, 2)
async def time_eat_and_drink(): hungry = DB.hunger_and_thirsted() max_mes = 30 - 1 if hungry: for i in enumerate(hungry): if i[1].count(0) == 2: await bot.send_message( i[1][0], 'Ты голоден и хочешь пить\! Используй еду и воду из хранилища\.' ) elif i[1][1] == 0: await bot.send_message( i[1][0], 'Ты проголодался\! Используй еду из своего хранилища, пока не замучал голод\.' ) elif i[1][2] == 0: await bot.send_message( i[1][0], 'Ты хочешь пить\! Выпей воды из своего хранилища, пока не замучала жажда\.' ) if i[0] == max_mes: max_mes += 30 await sleep(1) dead = tuple(DB.dead()) if dead: for i in dead: await bot.send_message( i, '*Здоровье обнулилось до нуля\!*\nПонижен уровень, отнято по 100 с каждого запаса ' 'хранилища\.')
async def start(message: types.Message): if DB.return_id(message.chat.id) != message.chat.id: db.add_user(message.chat.id) DB.add(message.chat.id, message.date) await message.answer( '*Добро пожаловать в Карантин Бот\!*' 'Данный бот представляет собой симулятор карантина, где твоя задача получить ' 'как можно больше ограниченое кол\-во припасов для выживания\!' 'Чтобы получать припасы, тебе нужно выходить на улицу, населенной вирусами\!' ) await sleep(3) await message.answer( 'Для начала введи свой никнейм\.\nДоступны символы кириллицы, латиницы и цифры\.\n' 'Максимальная длина ника \- 12, минимальная 4\.') else: name = DB.return_name(message.chat.id) if name is None: await message.answer( 'Приветствую\! По\-моему, ты должен был ввести свой никнейм\. Введи его сейчас\!\n' '_Доступны символы кириллицы, латиницы и цифры\n' 'Максимальная длина ника \- 12, минимальная 4\._') else: await message.answer(f'Привет, {name}\!', reply_markup=await KEY.main())
async def new_level(self): need_exp = await self.need_exp() experience = DB.check_experience(self.id) if experience >= need_exp: DB.upd_lvl(self.id, self.experience - need_exp) return '\n*Новый уровень\!* 🆙 ' else: return ''
async def take_medicine(self): if self.drug == 0 and self.drugs > 0 and self.ill > 0: DB.take_med(self.id) return '*Ты принял лекарство\.*\n_Действие лекарства продлится 2 часа\._' elif self.drugs <= 0: return '_У тебя нет лекарств\!_' elif self.ill == 0: return '_Ты здоров\! Нет необходимости в лекарстве\._' else: return '_Лекарство уже действует\!_'
async def registration(message: types.Message): if message.text.isalnum() is False or (4 >= len(message.text) > 12): await message.answer('Такой никнейм не пойдет\.') elif DB.check_name(message.text) is not None: await message.answer('Это имя уже занято\!') else: await message.answer('Отлично\!\nЧто ж, удачи в выживании\!') DB.registered(message.chat.id, message.text) await sleep(1) await main(message)
async def washed_hands(self): if self.water >= 5 and self.medicines >= 1: DB.wash_hands(self.id) upd = db.get_info(self.id)['chance_sick'] - 0.02 if upd <= 0.01: upd = 0.01 db.equipment(self.id, {'washed_hands': True, 'chance_sick': upd}) return 'Помыты руки.' elif self.water < 5: return 'Не хватает воды!' else: return 'Не хватает медикамента для дезинфекции!'
async def try_luck(self, value, price=100): async def you_gave(chances): return f'_Ты получил:_\n`' \ f'🧻{chances[0]} 🍖{chances[1]} 💧{chances[2]} 💉{chances[3]} 😷{chances[4]} 💊{chances[5]}\n`' if self.paper >= price: DB.buy_luck_chance(self.id, price) if value == 1: return f"*Номер 1*\n_Ты ничего не получил_" elif value > 1: DB.you_win(self.id, prizes[value]) return f"*Номер {value}*\n" + await you_gave(prizes[value]) else: return '_Не хватает бумаги для розыгрыша\!_'
async def try_go(self): if self.ill > 0 and self.drug == 0: return f'*Ты не здоров\!*\n_Тебе нужно принять лекарство, чтобы ты мог выходить на улицу\._' minutes = randint(10, 20) if self.exploring is None: DB.set_exploring(self.id, minutes) db.equipment(self.id, {"exp": minutes}) if db.get_info(self.id)['masked'] is True: DB.use_mask(self.id) return f'*Путешествие началось\!*\n_Это займёт {minutes} минут времени\._' else: return f'*Ты уже гуляешь по окрестностям\!*' \ f'\n_Осталось времени: около \{self.exploring} мин\._'
async def heal(self): count = 5 if self.health < 100 and self.medicines > 0: if self.health > 95: count = 100 - self.health DB.heal(self.id, count) else: DB.heal(self.id) return f'*Ты принял медикаменты\.*\n_\+ {count} к здоровью\._' elif self.medicines <= 0: return '_Нет медикаментов\!_' else: return '_У тебя здоровье на максимуме\!_'
async def drink(self): count = 10 if self.thirst < 100 and self.water > 0: if self.thirst > 90: count = 100 - self.thirst DB.drink(self.id, count) else: DB.drink(self.id) return f'*Ты выпил освежающей воды\.*\n_\+ {count} к твоему водному балансу\._' elif self.water <= 0: return '_У тебя не хватает воды\!_' else: return '_Тебе не хочется пить\!_'
async def eat(self): count = 10 if self.hunger < 100 and self.foods > 0: if self.hunger > 90: count = 100-self.hunger DB.eating(self.id, count) else: DB.eating(self.id) return f'*Ты поел вкусной еды\.*\n_\+ {count} к сытости\._' elif self.foods <= 0: return '_У тебя не хватает еды\!_' else: return '_Ты не голоден\!_'
async def statistics_storage(): show = DB.top_storage() text = '*📦Наибольшие запасы:*\n' + MONO + "\n" for i in show: text += f"{smile}{await str_num_2(i[0], 6)}{await str_num_2(i[1], 12)}\n" return text + MONO
async def play_dice(message): if DB.check_exploring(message.chat.id) is not None: await message.answer('Ты гуляешь\! Играть можно только дома\.') else: dice = await bot.send_dice(message.chat.id) await sleep(5) if dice.dice.value > message.dice.value: await message.answer('Моя взяла\!') elif dice.dice.value == message.dice.value: await message.answer('Ну ничья\.') else: await message.answer('Ты выиграл\!')
async def end(self): chances = [ CHANCES.paper(), CHANCES.foods(), CHANCES.water(), CHANCES.medicines(), CHANCES.masks(), CHANCES.drugs() ] if self.ill > 0: chances = tuple(map(lambda i: i//2, chances)) illness = await CHANCES.ill(self.id) if illness != 0: if self.ill > illness: illness = self.ill sick = f'\n_\- Ты подхватил болезнь\!\nТебе необходимы медикаменты, чтобы поддерживать здоровье\.\n' \ f'Болезнь будет длиться где\-то {illness // 60} часов\._' else: sick = '' illness = self.ill world = await WORLD.show() if world['stocks'] <= 0: db.end_exploring(self.id) DB.set_exploring(self.id, 'NULL') return '*Путешествие окончилось\!*\n_Ты ничего не получил, так как все мировые запасы пустуют\!_' if world['stocks'] >= sum(chances): await WORLD.upd_stocks((-sum(chances))) else: x = world['stocks'] / sum(chances) chances = tuple(map(lambda i: round(i * x), chances)) await WORLD.upd_stocks(-world['stocks']) event = await CHANCES.random_event() DB.end_exploring(self.id, chances[0], chances[1], chances[2], chances[3], chances[4], chances[5], illness, event[0]) db.end_exploring(self.id) return f'*Путешествие окончилось\!*\n_Ты получил:_\n`' \ f'Бумаги: {chances[0]}🧻\n' \ f'Еды: {chances[1]}🍖\n' \ f'Воды: {chances[2]}💧\n' \ f'Медикаментов: {chances[3]}💉\n' \ f'Масок: {chances[4]}😷\n' \ f'Лекарств: {chances[5]}💊\n`' + sick + event[1] + await self.new_level()
async def time_flow(): messages = 0 max_mes = 30 time_is_now = DB.time_flow() if time_is_now: for user in time_is_now: exp_end = packages.Exploring(user[0]) messages += 1 await bot.send_message(user[0], await exp_end.end(), reply_markup=await KEY.inl_back(cb='home')) if messages == max_mes: max_mes += 30 await sleep(1)
def __init__(self, chat_id): self.id = chat_id self.info = DB.show_user_info(self.id) self.nickname = self.info[2] self.paper = self.info[4] self.foods = self.info[5] self.water = self.info[6] self.medicines = self.info[7] self.masks = self.info[8] self.drugs = self.info[9] self.hunger = self.info[10] self.thirst = self.info[11] self.health = self.info[12] self.level = self.info[13] self.experience = self.info[14] self.drug = self.info[15] self.ill = self.info[16] self.exploring = self.info[17] self.stayhome = self.info[18] self.sum_storage = sum((self.paper, self.foods, self.water, self.medicines, self.masks, self.drugs))
'Для начала введи свой никнейм\.\nДоступны символы кириллицы, латиницы и цифры\.\n' 'Максимальная длина ника \- 12, минимальная 4\.') else: name = DB.return_name(message.chat.id) if name is None: await message.answer( 'Приветствую\! По\-моему, ты должен был ввести свой никнейм\. Введи его сейчас\!\n' '_Доступны символы кириллицы, латиницы и цифры\n' 'Максимальная длина ника \- 12, минимальная 4\._') else: await message.answer(f'Привет, {name}\!', reply_markup=await KEY.main()) @dp.message_handler(lambda message: DB.return_name(message.chat.id) is None) async def registration(message: types.Message): if message.text.isalnum() is False or (4 >= len(message.text) > 12): await message.answer('Такой никнейм не пойдет\.') elif DB.check_name(message.text) is not None: await message.answer('Это имя уже занято\!') else: await message.answer('Отлично\!\nЧто ж, удачи в выживании\!') DB.registered(message.chat.id, message.text) await sleep(1) await main(message) @dp.message_handler(lambda message: message.chat.id == config.ADMIN, commands='set_commands') async def cmd_set_commands(message: types.Message):
async def buy_drug(self, price=50): if self.paper >= price: DB.buy_drug(self.id, price) return '_Куплено лекарств\._' else: return '_Не хватает бумаги\!_'
async def statistics_stayhome(): show = DB.top_stayhome() text = '*🕑Наидольше дома:*\n' + MONO + "\n" for i in show: text += f"{smile}{await str_num_2(i[0], 6)}{await str_num_2(i[1], 12)}\n" return text + MONO
async def stocks(self): return DB.show_users_count() * randint(50, 100) def __init__(self, file='situation.world'):