def read_messages(driver, queue, **params): page_number = 1 messages_on_page = 10 messages = {} while True: driver.get('%s?t=0&order=DESC&page=%d' % (Player.PAGES['MESSAGES'], page_number)) time.sleep(2) unread_messages = Player._parse_message_table(driver) for i in unread_messages: messages.update({ i[1]: { 'header': i[2], 'from_id': i[3], 'from_name': i[4], 'date_time': i[5] } }) if len(unread_messages) < messages_on_page: break page_number += 1 for travian_id, message_params in messages.items(): driver.get('%s?id=%d' % (Player.PAGES['MESSAGES'], travian_id)) time.sleep(2) try: body = driver.find_element_by_xpath("//div[@id='message']") except NoSuchElementException: logging.error('Cant read message mody id=%d' % travian_id) return queue body = body.text message_params['body'] = body if messages: logging.info('%d New messages!' % len(messages)) for travian_id, message_params in messages.items(): Message.create_new( travian_id, message_params['from_id'], message_params['from_name'], message_params['header'], message_params['body'], message_params['date_time'], ) need_def_messages = Message.get_need_def_messages() if need_def_messages: try: server_time = driver.find_element_by_xpath( "//div[@id='servertime']/span") except NoSuchElementException: logging.error('Cant define servertime') return queue h, m, s = server_time.text.split(':') h = Player._to_int(h) m = Player._to_int(m) s = Player._to_int(s) now = datetime.now() year, month, day = now.year, now.month, now.day now = datetime(year, month, day, h, m, s) for need_def_message in need_def_messages: if need_def_message.valid_def_message() is False: logging.warning( 'Someone in message travian_id = %s whant def.' % need_def_message.travian_id) continue params = need_def_message.get_def_params() if params is None: continue return queue x, y, atack_time = params atack_timedelta = atack_time - now if atack_timedelta.total_seconds() < 0: logging.warning('Passed atack. Message travian_id = %s' % need_def_message.travian_id) need_def_message.readed() continue helpers = get_help(x, y, atack_timedelta) if 'Dictator' in helpers: helpers.remove('Dictator') attention_message = ''' ########################################## Внимание! Наша деревня [x|y]({x}|{y})[/x|y] атакована. Атака будет совершена в {atack_time}. Всем кто успевает. Необходимо выслать деф на данные координаты. p.s. Всем удачи! И не забывайте выслать кроп для своих войск. ########################################## '''.format(x=x, y=y, atack_time=str(atack_time)) head = 'Нужен ДЕФ' if helpers: # We can write only for 25 peoples. counter = 0 to_helpers = [] for helper in helpers: counter += 1 to_helpers.append(helper) if counter == 24: Player.write_message(driver, to_helpers, head, attention_message) counter = 0 to_helpers = [] if to_helpers: Player.write_message(driver, to_helpers, head, attention_message) head = 'RE: %s' % need_def_message.header if helpers: attention_message = ''' ########################################## Игроки, которые могут оперативно прислать помощь оповещены. ########################################## ''' dictator_message = ''' ########################################## Наша деревня [x|y]({x}|{y})[/x|y] атакована. Атака будет совершена в {atack_time}. Игроки, которые могут помочь проинформированы: {helpers} ########################################## '''.format(x=x, y=y, atack_time=str(atack_time), helpers='\n'.join(helpers)) else: attention_message = ''' ########################################## Нет игроков, готовых оперативно помочь. ########################################## ''' dictator_message = ''' ########################################## Наша деревня [x|y]({x}|{y})[/x|y] атакована. Атака будет совершена в {atack_time}. Нет игроков, готовых оперативно помочь. ########################################## '''.format(x=x, y=y, atack_time=str(atack_time)) Player.write_message(driver, need_def_message.from_name, head, attention_message) Player.write_message( driver, 'Dictator', 'На деревню (%s, %s) будет совершено нападение' % (x, y), dictator_message) need_def_message.readed() return queue