feat: add blockchain listener to remind the client
This commit is contained in:
parent
a652dac9bd
commit
64461ffb1e
119
backend/blockchain_listener.py
Normal file
119
backend/blockchain_listener.py
Normal file
@ -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)
|
||||
@ -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: 追蹤出入帳通知")
|
||||
@ -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()
|
||||
Loading…
Reference in New Issue
Block a user