예제 #1
0
    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