diff --git a/backend/blockchain_listener.py b/backend/blockchain_listener.py new file mode 100644 index 0000000..bd8db44 --- /dev/null +++ b/backend/blockchain_listener.py @@ -0,0 +1,119 @@ +from web3 import Web3 +from bot import BankBot + +SBT_ADDRESS = '' +ABI = [ + { + "anonymous": False, + "inputs": [ + { + "indexed": True, + "internalType": "address", + "name": "client", + "type": "address" + }, + { + "indexed": True, + "internalType": "address", + "name": "bank", + "type": "address" + }, + { + "indexed": False, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": False, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Repay", + "type": "event" + }, + { + "anonymous": False, + "inputs": [ + { + "indexed": True, + "internalType": "address", + "name": "client", + "type": "address" + }, + { + "indexed": True, + "internalType": "address", + "name": "shop", + "type": "address" + }, + { + "indexed": True, + "internalType": "address", + "name": "bank", + "type": "address" + }, + { + "indexed": False, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": False, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Borrow", + "type": "event" + } + ] + +class Listener(): + def __init__(self, bot: BankBot) -> None: + self.w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:7545')) + self.contract = self.w3.eth.contract(address=SBT_ADDRESS, abi=ABI) + self.bot = bot + + def handle_repay_event(self, event): + print("Repay Event received:") + print(event['args']) + print("---") + + args = event['args'] + if args['client'] in self.bot.clients: + chat_id = self.bot.clients[args['client']] + self.bot.updater.bot.send_message(chat_id=chat_id, text="已經收到您編號 #{} 的帳款,共 {} ETH.".format( + args['id'], int(args['amount'])/(10**18) + )) + + def handle_borrow_event(self, event): + print("Borrow Event received:") + print(event['args']) + print("---") + + args = event['args'] + if args['client'] in self.bot.clients: + chat_id = self.bot.clients[args['client']] + self.bot.updater.bot.send_message(chat_id=chat_id, text="您已經透過本銀行向 {} 支付 {} ETH. 帳款編號(#{})".format( + args['shop'], int(args['amount'])/(10**18), args['id'] + )) + + if args['shop'] in self.bot.clients: + chat_id = self.bot.clients[args['shop']] + self.bot.updater.bot.send_message(chat_id=chat_id, text="本銀行已經先替客戶 {} 向您支付 {} ETH. 帳款編號(#{})".format( + args['client'], int(args['amount'])/(10**18), args['id'] + )) + + def start(self): + borrow_event_filter = self.contract.events.Borrow.create_filter(fromBlock='latest') + repay_event_filter = self.contract.events.Repay.create_filter(fromBlock='latest') + while True: + for event in borrow_event_filter.get_new_entries(): + self.handle_borrow_event(event) + for event in repay_event_filter.get_new_entries(): + self.handle_repay_event(event) \ No newline at end of file diff --git a/backend/bot.py b/backend/bot.py index a660b94..dc26d54 100644 --- a/backend/bot.py +++ b/backend/bot.py @@ -10,7 +10,7 @@ from telegram.ext import MessageHandler, CallbackContext, CommandHandler, Filter import json import os -TOKEN = "6207011315:AAH-J0zjPPd_mDPN1_pCgll0w-pZtlJXYVY" +TOKEN = "" class BankBot(): def __init__(self): @@ -19,6 +19,7 @@ class BankBot(): self.dispatcher.add_handler(CommandHandler('start', self.start)) self.dispatcher.add_handler(CommandHandler('add', self.add)) self.dispatcher.add_handler(MessageHandler(Filters.text, self.echo)) + self.clients = {} if os.path.isfile('./client.json'): with open("client.json") as fp: @@ -43,7 +44,7 @@ class BankBot(): self.clients[address] = update.effective_chat.id with open('client.json', 'w') as fp: json.dump(self.clients, fp) - context.bot.send_message(chat_id=update.effective_chat.id, text="開始追蹤 {} 的商店收款通知".format(address)) + context.bot.send_message(chat_id=update.effective_chat.id, text="開始追蹤 {} 的出入帳通知".format(address)) def start(self, update, context): context.bot.send_message(chat_id=update.effective_chat.id, text="Hi, 這是暨大區塊鏈銀行 Telegram Bot\n\n/add YOUR_ADDRESS: 追蹤出入帳通知") \ No newline at end of file diff --git a/backend/main.py b/backend/main.py index 0ab862a..9bdbdf1 100644 --- a/backend/main.py +++ b/backend/main.py @@ -5,6 +5,7 @@ from flask_cors import CORS from bot import BankBot import time import threading +from blockchain_listener import Listener app = Flask(__name__) CORS(app) @@ -182,3 +183,6 @@ if __name__ == '__main__': flask_thread = threading.Thread(target=start_flask) flask_thread.start() + + listener = Listener(bot) + listener.start() \ No newline at end of file