skip to Main Content
from coinbase.wallet.client import Client
from telegram import ParseMode
from telegram.ext import CommandHandler, Defaults, Updater

COINBASE_KEY = 'xxxxxxxxxxxx'
COINBASE_SECRET = 'xxxxxxxxxxxx' 
TELEGRAM_TOKEN = 'xxxxxxxxxxxx'

coinbase_client = Client(COINBASE_KEY, COINBASE_SECRET)

#if __name__ == '__main__':
updater = Updater(token=TELEGRAM_TOKEN, defaults=Defaults(parse_mode=ParseMode.HTML))
dispatcher = updater.dispatcher
dispatcher.add_handler('start', startCommand) # Accessed via /start
dispatcher.add_handler('alert', priceAlert) # Accessed via /alert

updater.start_polling() # Start the bot

updater.idle() # Wait for the script to be stopped, this will stop the bot


def startCommand(update, context):
    context.bot.send_message(chat_id=update.effective_chat.id, text='Hello there!')

def priceAlert(update, context):
    if len(context.args) > 2:
        crypto = context.args[0].upper()
        sign = context.args[1]
        price = context.args[2]

        context.job_queue.run_repeating(priceAlertCallback, interval=15, first=15, context=[crypto, sign, price, update.message.chat_id])

        response = f"⏳ I will send you a message when the price of {crypto} reaches £{price}, n"
        response += f"the current price of {crypto} is £{coinbase_client.get_spot_price(currency_pair=crypto + '-GBP')['amount']}"
    else:
        response = '⚠️ Please provide a crypto code and a price value: n<i>/price_alert {crypto code} {> / &lt;} {price}</i>'

    context.bot.send_message(chat_id=update.effective_chat.id, text=response)


def priceAlertCallback(context):
    crypto = context.job.context[0]
    sign = context.job.context[1]
    price = context.job.context[2]
    chat_id = context.job.context[3]

    send = False
    spot_price = coinbase_client.get_spot_price(currency_pair=crypto + '-GBP')['amount']

    if sign == '<':
        if float(price) >= float(spot_price):
            send = True
    else:
        if float(price) <= float(spot_price):
            send = True

    if send:
        response = f'👋 {crypto} has surpassed £{price} and has just reached <b>£{spot_price}</b>!'

        context.job.schedule_removal()

        context.bot.send_message(chat_id=chat_id, text=response)

enter image description here

I get this error of the code above, also I have already tried changing the position of the def but, it also shows error, How to solve this?
It is the code for telegram bot and also this keeps on showing me NameError, I have already added python3 and pip, but still not solved

2

Answers


  1. Try

    dispatcher.add_handler('start', startCommand()) # Accessed via /start
    dispatcher.add_handler('alert', priceAlert()) # Accessed via /alert
    

    You will also need to add the two arguments required by both functions.

    dispatcher.add_handler('start', startCommand(update, context))
    dispatcher.add_handler('alert', startCommand(update, context))
    

    I’m not exactly sure what data the two functions take in but I’m going to guess that it is whatever the bot is returning.

    Login or Signup to reply.
  2. Python reads files top to bottom. So when you call dispatcher.add_handler('start', startCommand), the function startCommand is not yet known. Move the part

    updater = Updater(token=TELEGRAM_TOKEN, defaults=Defaults(parse_mode=ParseMode.HTML))
    dispatcher = updater.dispatcher
    dispatcher.add_handler('start', startCommand) # Accessed via /start
    dispatcher.add_handler('alert', priceAlert) # Accessed via /alert
    
    updater.start_polling() # Start the bot
    
    updater.idle() # Wait for the script to be stopped, this will stop the bot
    

    below the callback definitions.

    Apart from that, add_handler needs a Handler as argument, in your case something like add_handler(CommandHanlder('start', startCommand). Please see PTB tutorial as well as the examples.


    Disclaimer: I’m the current maintainer of the python-telegram-bot library.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search