You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

82 lines
3.1 KiB
Python

import logging
from decimal import Decimal
from tipbot import wownero
from tipbot import db
from tipbot.helpers.decorators import wallet_rpc_required, log_event, registration_required, check_debug
@wallet_rpc_required
@registration_required
@log_event
@check_debug
def tip(update, context):
if len(context.args) < 2:
update.message.from_user.send_message('Not enough arguments passed.')
update.message.delete()
return False
elif len(context.args) == 2:
message = ""
elif len(context.args) > 2:
message = context.args[2:]
# validate target user
if context.args[0].startswith('@'):
target_un = context.args[0][1:]
else:
target_un = context.args[0]
if target_un == update.message.from_user['first_name']:
update.message.from_user.send_message('You cannot tip yourself!')
update.message.delete()
return False
if not db.User.filter(telegram_user=target_un):
reply_text = [
'That user has not registered and cannot receive tips yet.',
'If they would like to receive a tip, have them /register with the bot.'
]
update.message.from_user.send_message(' '.join(reply_text))
update.message.delete()
return False
# validate amount
try:
amount = Decimal(context.args[1])
except:
update.message.from_user.send_message(f'Bad Wownero amount specified; not a valid number.')
update.message.delete()
return False
if amount < 1:
update.message.from_user.send_message('Bad Wownero amount specified. Provide only positive integers or decimals greater than or equal to 1.')
update.message.delete()
return False
tipper = db.User.get(telegram_id=update.message.from_user['id'])
tipper_balances = wownero.Wallet().balances(account=tipper.account_index)
if amount >= tipper_balances[1]:
update.message.from_user.send_message(f'You do not have sufficient funds to send {amount} WOW. Check your /balance')
update.message.delete()
return False
# get target user details
receiver = db.User.get(telegram_user=target_un)
address = wownero.Wallet().addresses(account=receiver.account_index)[0]
# transfer funds to user
try:
tx = wownero.Wallet().transfer(dest_address=address, amount=wownero.as_wownero(amount), priority=2, account=tipper.account_index)
if 'tx_hash' in tx:
h = tx['tx_hash']
msg = f'Tipped @{target_un} {amount} WOW! Tx: {h}'
update.message.from_user.send_message(msg)
update.message.delete()
else:
logging.error(f'Transaction failure details for {tipper.telegram_user} ({tipper.telegram_id}): {tx}')
update.message.from_user.send_message(f'Failed to send a tip. Reason: "{tx["message"]}"')
update.message.delete()
except Exception as e:
logging.error(f'Unable to send transfer: {e}. Debug: {update.message}')
update.message.from_user.send_message('Failed to send a tip. Ask for help.')
update.message.delete()