feat: add blockchain listener to remind the client

This commit is contained in:
snsd0805 2023-06-14 02:10:00 +08:00
parent a652dac9bd
commit 64461ffb1e
Signed by: snsd0805
GPG Key ID: 569349933C77A854
3 changed files with 126 additions and 2 deletions

View 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)

View File

@ -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: 追蹤出入帳通知")

View File

@ -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()