Compare commits
2 Commits
f236aa0aed
...
64461ffb1e
| Author | SHA1 | Date | |
|---|---|---|---|
| 64461ffb1e | |||
| a652dac9bd |
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)
|
||||
@ -1,8 +1,12 @@
|
||||
'''
|
||||
python-telegram-bot: 13.7, version 20.XX cannot work
|
||||
'''
|
||||
|
||||
from urllib import response
|
||||
from cairo import Filter
|
||||
from telegram import Update
|
||||
import torch
|
||||
from telegram.ext import MessageHandler, CallbackContext, CommandHandler, filters, Application
|
||||
from telegram.ext import MessageHandler, CallbackContext, CommandHandler, Filters, Updater
|
||||
import json
|
||||
import os
|
||||
|
||||
@ -10,9 +14,12 @@ TOKEN = ""
|
||||
|
||||
class BankBot():
|
||||
def __init__(self):
|
||||
self.application = Application.builder().token(TOKEN).build()
|
||||
self.application.add_handler(CommandHandler('shop', self.addShop))
|
||||
self.application.add_handler(MessageHandler(filters.ALL, self.response))
|
||||
self.updater = Updater(TOKEN, use_context=True)
|
||||
self.dispatcher = self.updater.dispatcher
|
||||
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:
|
||||
@ -21,28 +28,23 @@ class BankBot():
|
||||
self.clients = {}
|
||||
|
||||
def start_polling(self):
|
||||
print("start...")
|
||||
self.application.run_polling()
|
||||
|
||||
async def response(self, update, context):
|
||||
q = update.message.text
|
||||
|
||||
await context.bot.send_message(
|
||||
chat_id=update.effective_chat.id,
|
||||
text="我看不懂這個 {} 指令".format(q)
|
||||
)
|
||||
self.updater.start_polling()
|
||||
|
||||
async def addShop(self, update, context):
|
||||
def echo(self, update, context):
|
||||
message = update.message.text
|
||||
context.bot.send_message(chat_id=update.effective_chat.id, text="我看不懂 {} 指令".format(message))
|
||||
|
||||
def add(self, update, context):
|
||||
args = context.args
|
||||
|
||||
if len(args) != 1:
|
||||
await context.bot.send_message(
|
||||
chat_id=update.effective_chat.id,
|
||||
text="usage: /shop [YOUR_ADDRESS]"
|
||||
)
|
||||
context.bot.send_message(chat_id=update.effective_chat.id, text="usage: /start YOUR_ADDRESS")
|
||||
else:
|
||||
address = args[0]
|
||||
this.client[address] = update.effective_chat.id
|
||||
await context.bot.send_message(
|
||||
chat_id=update.effective_chat.id,
|
||||
text="已經設定 {} 的店家收款通知!"
|
||||
)
|
||||
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))
|
||||
|
||||
def start(self, update, context):
|
||||
context.bot.send_message(chat_id=update.effective_chat.id, text="Hi, 這是暨大區塊鏈銀行 Telegram Bot\n\n/add YOUR_ADDRESS: 追蹤出入帳通知")
|
||||
@ -3,6 +3,9 @@ import sqlite3
|
||||
import os
|
||||
from flask_cors import CORS
|
||||
from bot import BankBot
|
||||
import time
|
||||
import threading
|
||||
from blockchain_listener import Listener
|
||||
|
||||
app = Flask(__name__)
|
||||
CORS(app)
|
||||
@ -169,14 +172,17 @@ def add_products(address):
|
||||
|
||||
return jsonify({'status': 'OK'})
|
||||
|
||||
|
||||
def start_flask():
|
||||
app.run(host="0.0.0.0")
|
||||
|
||||
if __name__ == '__main__':
|
||||
initDB()
|
||||
|
||||
app.run(host="0.0.0.0")
|
||||
|
||||
print("start the bot...")
|
||||
bot = BankBot()
|
||||
print("start polling...")
|
||||
bot.start_polling()
|
||||
bot.application.idle()
|
||||
|
||||
flask_thread = threading.Thread(target=start_flask)
|
||||
flask_thread.start()
|
||||
|
||||
listener = Listener(bot)
|
||||
listener.start()
|
||||
Loading…
Reference in New Issue
Block a user