예제 #1
0
파일: pricebot.py 프로젝트: minoshw/priceb
def main():
    module_logger.info("Start the pricebot!")

    # create an object "bot"
    updater = Updater(token=TOKEN_BOT)
    dispatcher = updater.dispatcher

    # bot's error handler
    dispatcher.add_error_handler(error)

    # bot's command handlers
    price_handler = CommandHandler('p', price, pass_args=True)
    dispatcher.add_handler(price_handler)

    cap_handler = CommandHandler('cap', cap)
    dispatcher.add_handler(cap_handler)

    # here put the job for the bot
    job_queue = updater.job_queue
    job_queue.run_repeating(download_api_coinslists_handler,
                            TIME_INTERVAL,
                            10,
                            context='coinmarketcap')
    job_queue.run_repeating(download_api_global_handler, TIME_INTERVAL, 5)

    # for use start_polling() updates method
    updater.start_polling()
def price(bot, update, args):
    """
    the handler of the user command "price"

    :param  bot: a telegram bot main object
    :type   bot: Bot

    :param  args: a list of user' arguments
    :type   args: list
    """

    usr_chat_id = update.message.chat_id

    # logging
    if update:
        usr_command = str(update.effective_message.text
                          ) if update.effective_message.text else 'None'

        usr_name = update.message.from_user.first_name

        if update.message.from_user.last_name:
            usr_name += ' ' + update.message.from_user.last_name

        if update.message.from_user.username:
            usr_name += ' (@' + update.message.from_user.username + ')'

        module_logger.info(
            "Has received a command \"{}\" from user {}, with id {}".format(
                usr_command, usr_name, usr_chat_id))
    # logging

    # to concatenate items from the user command
    usr_msg_text = ' '.join(args)

    # for always work with a text in a uppercase
    usr_msg_text = usr_msg_text.upper()

    text_response = parse_api_coinmarketcapjson(usr_msg_text)
    """
    if text_response is not empty, bot sends a response to user
    """
    if text_response:
        bot.send_message(usr_chat_id, text_response, parse_mode="Markdown")
        module_logger.info("Has sent a message to a channel %s", usr_chat_id)
def download_api_global_handler(bot, job):
    """
    the handler for download global Coin Market Cap API Info by job_queue of telegram.ext

    :param  bot: a telegram bot main object
    :type   bot: Bot

    :param  job: job.context is a name of the site-agregator, which has been send from job_queue.run_repeating... method
    :type   job: Job
    """

    module_logger.info('Start a request to CoinMarketCap API')

    response = requests.get(COINMARKET_API_URL_GLOBAL)

    # extract a json from response to a class 'dict' or 'list'
    response_dict_list = response.json()

    if response.status_code == requests.codes.ok:

        module_logger.info('Success download a global CoinMarketCap JSON API')

        with open(FILE_JSON_GLOBALINFOAPI, 'w') as outfile:
            json.dump(response_dict_list, outfile)
            module_logger.info('Success save it to %s',
                               FILE_JSON_GLOBALINFOAPI)

        jsonfiles.change_globalinfoapijson_json(response_dict_list)

    else:
        module_logger.error(
            'CoinMarketCap JSON API /global not responses successfully')
def cap(bot, update):
    """
    the handler of the user command "price"

    :param  bot: a telegram bot main object
    :type   bot: Bot

    :param  args: a list of user' arguments
    :type   args: list
    """
    usr_chat_id = update.message.chat_id

    # logging
    if update:
        usr_command = str(update.effective_message.text
                          ) if update.effective_message.text else 'None'

        usr_name = update.message.from_user.first_name

        if update.message.from_user.last_name:
            usr_name += ' ' + update.message.from_user.last_name

        if update.message.from_user.username:
            usr_name += ' (@' + update.message.from_user.username + ')'

        module_logger.info(
            "Has received a command \"{}\" from user {}, with id {}".format(
                usr_command, usr_name, usr_chat_id))
    # logging

    text_response = parse_api_globalinfoapijson()
    """
    if text_response is not empty, bot sends a response to user
    """
    if text_response:
        bot.send_message(usr_chat_id, text_response, parse_mode="Markdown")
        module_logger.info("Has sent a message to a channel %s", usr_chat_id)
def download_api_coinslists_handler(bot, job):
    """
    the handler for download the lists of coins from API agregators by job_queue of telegram.ext

    :param  bot: a telegram bot main object
    :type   bot: Bot

    :param  job: job.context is a name of the site-agregator, which has been send from job_queue.run_repeating... method
    :type   job: Job
    """

    module_logger.info('Start a request to %s API', job.context)

    response = requests.get(COINMARKET_API_URL_COINSLIST)

    # extract a json from response to a class 'dict' or 'list'
    response_dict_list = response.json()

    if response.status_code == requests.codes.ok:

        # check if one of the APIs response is an error
        if ('error' in response_dict_list) or (
            ('Response' in response_dict_list) and
            (response_dict_list['Response'] is 'Error')):

            error_msg = response_dict_list['error']
            module_logger.error('%s error message: %s' %
                                (job.context, error_msg))

        else:
            module_logger.info('Success download a coinslist from %s',
                               job.context)

            with open(FILE_JSON_COINMARKET, 'w') as outfile:
                json.dump(response_dict_list, outfile)
                module_logger.info('Success save it to %s',
                                   FILE_JSON_COINMARKET)

            # save a json to variable
            if job.context == 'coinmarketcap':
                jsonfiles.change_coinmarketcapjson(response_dict_list)

    else:
        module_logger.error('%s not response successfully', job.context)