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 json
|
||||||
import os
|
import os
|
||||||
|
|
||||||
TOKEN = "6207011315:AAH-J0zjPPd_mDPN1_pCgll0w-pZtlJXYVY"
|
TOKEN = ""
|
||||||
|
|
||||||
class BankBot():
|
class BankBot():
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@ -19,6 +19,7 @@ class BankBot():
|
|||||||
self.dispatcher.add_handler(CommandHandler('start', self.start))
|
self.dispatcher.add_handler(CommandHandler('start', self.start))
|
||||||
self.dispatcher.add_handler(CommandHandler('add', self.add))
|
self.dispatcher.add_handler(CommandHandler('add', self.add))
|
||||||
self.dispatcher.add_handler(MessageHandler(Filters.text, self.echo))
|
self.dispatcher.add_handler(MessageHandler(Filters.text, self.echo))
|
||||||
|
self.clients = {}
|
||||||
|
|
||||||
if os.path.isfile('./client.json'):
|
if os.path.isfile('./client.json'):
|
||||||
with open("client.json") as fp:
|
with open("client.json") as fp:
|
||||||
@ -43,7 +44,7 @@ class BankBot():
|
|||||||
self.clients[address] = update.effective_chat.id
|
self.clients[address] = update.effective_chat.id
|
||||||
with open('client.json', 'w') as fp:
|
with open('client.json', 'w') as fp:
|
||||||
json.dump(self.clients, 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):
|
def start(self, update, context):
|
||||||
context.bot.send_message(chat_id=update.effective_chat.id, text="Hi, 這是暨大區塊鏈銀行 Telegram Bot\n\n/add YOUR_ADDRESS: 追蹤出入帳通知")
|
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
|
from bot import BankBot
|
||||||
import time
|
import time
|
||||||
import threading
|
import threading
|
||||||
|
from blockchain_listener import Listener
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
CORS(app)
|
CORS(app)
|
||||||
@ -182,3 +183,6 @@ if __name__ == '__main__':
|
|||||||
|
|
||||||
flask_thread = threading.Thread(target=start_flask)
|
flask_thread = threading.Thread(target=start_flask)
|
||||||
flask_thread.start()
|
flask_thread.start()
|
||||||
|
|
||||||
|
listener = Listener(bot)
|
||||||
|
listener.start()
|
||||||
Loading…
Reference in New Issue
Block a user