def withdraw(self, text, sender_handle, sender_id): parts = text.split(" ") withdraw_address = "" amount = 0 inputInValid = False reply_message = "" user_details = self.dataStore.getUserDetailsByTwitterHandle( f'@{sender_handle}') from_address = user_details['one_address'] if len(parts) >= 3: if parts[0] == "!withdraw": print(text) try: amount = float(parts[1]) except Exception as ex: inputInValid = True reply_message = "Invalid withdrawal amount." print(ex) if not inputInValid: if amount < 0.00000000: reply_message = f"Withdrawal amount cannot be negative." print(reply_message) inputInValid = True else: if HmyClient.getBalance( from_address) + 0.00000021 < float(amount): inputInValid = True reply_message = f"Please make sure you have enough funds plus the necessary fees for the transfer." print(reply_message) if not inputInValid: withdraw_address = parts[2] if not HmyClient.validateONEAdress(withdraw_address): inputInValid = True reply_message = "Invalid ONE address, transfer cancelled!" print(reply_message) else: inputInValid = True reply_message = "Invalid withdraw command, please use !help get help" if not inputInValid: res = HmyClient.transfer(from_address, withdraw_address, amount) res = eval(res) if 'transaction-hash' in res: reply_message = f"Withdrawal completed! Receipt: {self.explorer_url}/tx/{res['transaction-hash']}" else: reply_message = "Withdrawal has failed with an unknown error." else: if reply_message == "": reply_message = "Unknown Error!" print(f'Withdraw reply :{reply_message}') self.api.send_direct_message(text=reply_message, recipient_id=sender_id)
def confirm_transfer(self, update, context): user_data = context.user_data text = update.message.text if text == "Yes" or text == "Y": try: res = HmyClient.transfer(user_data['from_address'], user_data['to_address'], user_data['amount']) res = eval(res) if 'transaction-hash' in res: update.message.reply_text( f"Withdraw has been completed. Check here the receipt: {self.explorer_url}/tx/{res['transaction-hash']}" ) else: update.message.reply_text( "Withdraw has failed with an unknown error!") except Exception as ex: update.message.reply_text( "Withdraw has failed! please try agian later.") print(ex) else: update.message.reply_text("Withdraw has failed!") user_data.clear() self.send_menu(update, context) return ConversationHandler.END
def get_amount(self, update, context): user_data = context.user_data text = update.message.text if Utility.is_valid_amount(text): sender = self.message.from_user user_details = self.dataStore.getUserDetails( sender.id, sender.username) if user_details != None: one_address = user_details['one_address'] current_balance = float(HmyClient.getBalance(one_address)) if current_balance >= (float(text) + 0.00000021): user_data['amount'] = text user_data['from_address'] = one_address update.message.reply_text( f"Transferring {user_data['to_address']} ONE to {text:.6f}, Please type Yes/Y to confirm, any other input will cancel the transfer!" ) return self.CONFIRM_TRANSFER else: update.message.reply_text( f"Your current balance is lower than {text:.6f}, transfer cancelled!" ) user_data.clear() self.send_menu(update, context) return ConversationHandler.END else: update.message.reply_text("Invalid Amount") user_data.clear() self.send_menu(update, context) return ConversationHandler.END
def register(self, update, context): try: sender = self.message.from_user # If they're not registered nor have they received any tips without an account if not self.dataStore.checkIfUserRecordExists( sender.id, sender.username): new_one_address = HmyClient.regiterNewUser(sender.username) parts = new_one_address.split('\n') if len(parts) > 3: if parts[3].startswith('ONE Address:'): one_address = parts[3].replace('ONE Address: ', '') user_data = { 'balance': 0, 'chat_id': sender.id, 'telegram_user_id': sender.username, 'name': sender.full_name, 'seed': parts[2], 'one_address': one_address } self.dataStore.saveUserDetails(user_data) context.bot.send_message( text= f'Welcome aboard {sender.full_name}, you are successfully registered!', chat_id=self.message.chat.id) context.bot.send_message( text=f'Your Deposit address is: {one_address}', chat_id=self.message.chat.id) context.bot.send_photo( chat_id=self.message.chat.id, photo=open( Utility.getQRCodeImageFilePath(one_address), 'rb')) else: context.bot.send_message( text= 'Registration failed due to error in wallet generation!', chat_id=self.message.chat.id) else: context.bot.send_message(text='Registration failed!', chat_id=self.message.chat.id) else: context.bot.send_message(text='You\'re already registered!', chat_id=self.message.chat.id) # Save the data self.pp.update_chat_data(self.message.chat.id, context.chat_data) except Exception as ex: print(ex) logging.error(ex) finally: self.send_menu(update, context)
def get_address(self, update, context): user_data = context.user_data text = update.message.text if HmyClient.validateONEAdress(text): user_data['to_address'] = text update.message.reply_text( f"Please enter how much you want to send to {text}") return self.GET_AMOUNT else: update.message.reply_text( "Invalid ONE address, transfer cancelled!") user_data.clear() self.send_menu(update, context) return ConversationHandler.END
def balance(self, sender_handle, sender_id): try: # If they're not registered nor have they received any tips without an account user_details = self.dataStore.getUserDetailsByTwitterHandle( f'@{sender_handle}') if user_details != None: one_address = user_details['one_address'] balance = HmyClient.getBalance(one_address) self.api.send_direct_message( text=f'Your Wallet Balance is: {balance}', recipient_id=sender_id) else: self.api.send_direct_message( text= f'You\'re not registered! Please register using the Telegram bot (https://t.me/onetippingbot).i If you are already registered please link you twitter handle.', recipient_id=sender_id) # Save the data except Exception as ex: print(ex)
def balance(self, update, context): try: sender = self.message.from_user # If they're not registered nor have they received any tips without an account user_details = self.dataStore.getUserDetails( sender.id, sender.username) if user_details != None: one_address = user_details['one_address'] balance = HmyClient.getBalance(one_address) context.bot.send_message( text=f'Your Wallet Balance is: \n{balance:.6f}', chat_id=self.message.chat.id) else: context.bot.send_message( text='You\'re not registered! Please register to continue.', chat_id=self.message.chat.id) # Save the data self.pp.update_chat_data(self.message.chat.id, context.chat_data) except Exception as ex: print(ex) logging.error(ex) finally: self.send_menu(update, context)
def tip(self, update, context, *args): try: reply = update.message.reply_to_message sender_details = self.dataStore.getUserDetails( update.message.from_user.id, update.message.from_user.username) if sender_details != None: from_address = sender_details['one_address'] # If the sender isn't in the database, there's no way they have money reply = update.message.reply_to_message # These IDs will be used to look up the two people in the database sender = update.message.from_user.id if reply != None: receiver = reply.from_user.id # Can't tip yourself if sender != receiver: # The *args dict only stores strings, so we make it a number tip = float(context.args[0]) # Can't tip more than you have from_balance = HmyClient.getBalance(from_address) if tip < GlobalVariables._minimumTip: update.message.reply_text( f'Sorry, tip should be greater than or equals to {GlobalVariables._minimumTip:.6f}' ) elif tip + 0.00000021 > from_balance: update.message.reply_text( f'Sorry, your balance is low! tip {tip:.6f}') else: receiver_details = self.dataStore.getUserDetails( reply.from_user.id, reply.from_user.username) new_account = False if receiver_details == None: # Unregistered users get this and they will be registered automatically new_one_address = HmyClient.regiterNewUser( reply.from_user.username) parts = new_one_address.split('\n') if len(parts) > 3: if parts[3].startswith('ONE Address:'): to_address = parts[3].replace( 'ONE Address: ', '') receiver_details = { 'balance': 0, 'chat_id': reply.from_user.id, 'telegram_user_id': reply.from_user.username, 'name': reply.from_user.full_name, 'seed': parts[2], 'one_address': to_address } new_account = True self.dataStore.saveUserDetails( receiver_details) if 'one_address' in receiver_details: res = HmyClient.transfer( from_address, receiver_details['one_address'], tip) res = eval(res) if 'transaction-hash' in res: if new_account: update.message.reply_text( f"Hi @{reply.from_user.username}, @{update.message.from_user.username} has tip you {tip:.6f}, but seems your account is not active with us yet.\n Please click here {self.bot_name} to initiate your account and check your balance!" ) else: update.message.reply_text( f"Hi @{reply.from_user.username}, @{update.message.from_user.username} just tipped you {tip:.6f} ONE" ) else: print( f"Tip failed from {update.message.from_user.username} to {reply.from_user.username} tip {tip:.6f} ONE" ) else: update.message.reply_text('You can\'t tip yourself!') else: update.message.reply_text( 'Please reply to a message to tip.') else: update.message.reply_text( f'You\'re not registered! Please register with @{self.bot_name} to tip.' ) # This means the message doesn't contain a reply, which is required for the command except AttributeError as ae: print(ae) update.message.reply_text( 'You must be replying to a message to tip someone!') self.pp.update_chat_data(update.message.chat.id, context.chat_data)
def process_tip(self, tweet_id, text, sender_handle, receiver): tip = 0 success = "yes" failure_reason = "" tweet_type = "tweet" reply_text = "" print(text) print(f'@{self.bot_twitter_handle} !tip') if f'@{self.bot_twitter_handle} !tip' in text: if not self.dataStore.checkIftweetDataExists(tweet_id): sender_details = self.dataStore.getUserDetailsByTwitterHandle( f'@{sender_handle}') if sender_details != None: if 'twitter_handle_verified' in sender_details: if sender_details['twitter_handle_verified'] == True: parts = text.split(" ") for i in range(0, len(parts)): if parts[i] == "!tip": if i + 1 < len(parts): tip = float(parts[i + 1]) break from_address = sender_details['one_address'] sender = sender_handle if receiver != "": # Can't tip yourself if sender != receiver: # Can't tip more than you have from_balance = HmyClient.getBalance( from_address) if tip + 0.00000021 > from_balance: reply_text = f'@{sender_handle}, your balance is too low to tip {tip} ONE.' else: receiver_details = self.dataStore.getUserDetailsByTwitterHandle( f'@{receiver}') if receiver_details == None: reply_text = f"@{sender_handle}, @{receiver} is not registered! Please register using Telegram the bot (https://t.me/onetippingbot)." else: if 'one_address' in receiver_details: res = HmyClient.transfer( from_address, receiver_details[ 'one_address'], tip) res = eval(res) if 'transaction-hash' in res: reply_text = f"Hi @{receiver}, @{sender_handle} just tipped you {tip} ONE." else: print( f"Tip failed from {sender} to {receiver} tip {tip} ONE." ) else: print( 'Receiver address is missing!' ) else: reply_text = f'@{sender_handle} You can\'t tip yourself!' else: reply_text = f'@{sender_handle} Please, mention a receiver when tipping! Check !help for more detailed instructions.' else: success = "no" failure_reason = "twitter account not verified" reply_text = f'@{sender_handle} Your twitter handle is not verified! Please verify using the Telegram bot (https://t.me/onetippingbot).' else: success = "no" failure_reason = "twitter account not verified" reply_text = f'@{sender_handle} Your twitter handle is not verified! Please verify using the Telegram bot (https://t.me/onetippingbot).' else: success = "no" failure_reason = "account does not exists" reply_text = f'@{sender_handle} You are not registered! Please register using the Telegram bot (https://t.me/onetippingbot).' if reply_text != "": self.api.update_status(status=reply_text, in_reply_to_status_id=tweet_id) print(reply_text) tweetDetails = { 'tweet_id': tweet_id, 'sender': sender_handle, 'receiver': receiver, 'tip': tip, 'text': text, 'replied': "yes", 'success': success, 'failure_reason': failure_reason, 'tweet_type': tweet_type, 'reply_text': reply_text } self.dataStore.saveTweetDetails(tweetDetails) else: print("Tweet already served") else: print("Not a Tipping tweet")