revamp - bring the bot to life again
This commit is contained in:
parent
594407c204
commit
a6f858671e
|
@ -132,4 +132,3 @@ dmypy.json
|
|||
|
||||
# Local data
|
||||
data
|
||||
config.py
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
setup:
|
||||
python3 -m venv .venv
|
||||
.venv/bin/pip install -r requirements.txt
|
||||
|
||||
up:
|
||||
.venv/bin/python3 -m tipbot
|
|
@ -0,0 +1,32 @@
|
|||
#!/bin/bash
|
||||
|
||||
export $(cat .env)
|
||||
|
||||
if [ ! -d "$WALLET_PATH" ]; then
|
||||
# initialize new wow wallet and retain seed
|
||||
mkdir -p $WALLET_PATH
|
||||
docker run --rm -it --name tgbot-wallet-init \
|
||||
-v $WALLET_PATH:/root \
|
||||
lalanza808/wownero:latest \
|
||||
wownero-wallet-cli \
|
||||
--daemon-address $DAEMON_URI \
|
||||
--generate-new-wallet /root/wow \
|
||||
--password $WALLET_PASS \
|
||||
--trusted-daemon
|
||||
fi
|
||||
|
||||
# setup rpc process
|
||||
docker run --rm -d --name tgbot-wallet \
|
||||
-v $WALLET_PATH:/root \
|
||||
-p 127.0.0.1:9999:9999 \
|
||||
lalanza808/wownero:latest \
|
||||
wownero-wallet-rpc \
|
||||
--daemon-address $DAEMON_URI \
|
||||
--wallet-file /root/wow \
|
||||
--password $WALLET_PASS \
|
||||
--rpc-bind-port 9999 \
|
||||
--rpc-bind-ip 0.0.0.0 \
|
||||
--confirm-external-bind \
|
||||
--rpc-login "$WALLET_RPC_USER:$WALLET_RPC_PASS" \
|
||||
--log-file /root/rpc.log \
|
||||
--trusted-daemon
|
|
@ -0,0 +1,9 @@
|
|||
WALLET_PATH=xxx
|
||||
DAEMON_URI=xxx
|
||||
WALLET_PASS=xxx
|
||||
WALLET_RPC_USER=xxx
|
||||
WALLET_RPC_PASS=xxx
|
||||
TG_TOKEN=xxx
|
||||
TG_ADMIN_ID=xxx
|
||||
SQLITE_DB_PATH=xxx
|
||||
DEBUG=xxx
|
|
@ -6,8 +6,11 @@ cryptography==2.9.2
|
|||
decorator==4.4.2
|
||||
idna==2.10
|
||||
peewee==3.13.3
|
||||
Pillow==8.2.0
|
||||
pycparser==2.20
|
||||
python-dotenv==0.17.1
|
||||
python-telegram-bot==12.8
|
||||
qrcode==6.1
|
||||
requests==2.24.0
|
||||
six==1.15.0
|
||||
tornado==6.0.4
|
||||
|
|
|
@ -5,7 +5,6 @@ from tipbot.commands.tip import tip
|
|||
from tipbot.commands.withdraw import withdraw
|
||||
from tipbot.commands.balance import balance
|
||||
from tipbot.commands.deposit import deposit
|
||||
from tipbot.commands.qr import qr
|
||||
|
||||
|
||||
all_commands = {
|
||||
|
@ -39,11 +38,6 @@ all_commands = {
|
|||
'example': '/help',
|
||||
'help': 'Show available commands for the bot',
|
||||
},
|
||||
'qr': {
|
||||
'func': qr,
|
||||
'example': '/qr <address>',
|
||||
'help': 'Provides a helpful URL for generating QR code for a Wownero address'
|
||||
},
|
||||
'debug': {
|
||||
'func': debug,
|
||||
'admin': True
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
from tipbot.helpers.decorators import wallet_rpc_required, log_event, check_debug
|
||||
from tipbot.helpers.utils import is_tg_admin
|
||||
from tipbot.wownero import Wallet
|
||||
|
||||
|
||||
@wallet_rpc_required
|
||||
|
@ -7,6 +8,6 @@ from tipbot.helpers.utils import is_tg_admin
|
|||
@check_debug
|
||||
def debug(update, context):
|
||||
if is_tg_admin(update.message.from_user['id']):
|
||||
pass
|
||||
update.message.reply_text('ohai')
|
||||
else:
|
||||
update.message.reply_text('you cant do that.')
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
import logging
|
||||
from telegram import ParseMode
|
||||
from tipbot import wownero
|
||||
from tipbot import db
|
||||
from tipbot.helpers.decorators import wallet_rpc_required, log_event, registration_required, check_debug
|
||||
from tipbot.helpers.utils import generate_qr
|
||||
|
||||
|
||||
@wallet_rpc_required
|
||||
|
@ -12,3 +14,8 @@ def deposit(update, context):
|
|||
u = db.User.get(telegram_id=update.message.from_user['id'])
|
||||
address = wownero.Wallet().addresses(account=u.account_index)[0]
|
||||
update.message.reply_text(f'Deposit address for {u.telegram_user}: {address}')
|
||||
update.message.reply_photo(
|
||||
photo=generate_qr(address),
|
||||
caption=f'{u.telegram_user} deposit address: {address}',
|
||||
quote=False
|
||||
)
|
||||
|
|
|
@ -1,13 +0,0 @@
|
|||
def qr(update, context):
|
||||
if len(context.args) < 1:
|
||||
update.message.reply_text('Not enough arguments passed.')
|
||||
return False
|
||||
|
||||
# validate address
|
||||
if len(context.args[0]) in [97, 108]:
|
||||
address = context.args[0]
|
||||
else:
|
||||
update.message.reply_text('This does not look like a valid Wownero address. Try again.')
|
||||
return False
|
||||
|
||||
update.message.reply_text(f'https://wownero.club/address/{address}')
|
|
@ -1,9 +0,0 @@
|
|||
DEBUG = True
|
||||
TG_TOKEN = 'tttttttttttt'
|
||||
TG_ADMIN_ID = 0000000000
|
||||
WALLET_PROTO = 'http'
|
||||
WALLET_HOST = 'localhost'
|
||||
WALLET_PORT = 8888
|
||||
WALLET_USER = 'yyyy'
|
||||
WALLET_PASS = 'xxxxxxxxx'
|
||||
SQLITE_DB_PATH = '/tmp/db.sqlite'
|
|
@ -0,0 +1,19 @@
|
|||
from dotenv import load_dotenv
|
||||
from os import getenv
|
||||
|
||||
load_dotenv()
|
||||
|
||||
TG_TOKEN = getenv('TG_TOKEN')
|
||||
TG_ADMIN_ID = int(getenv('TG_ADMIN_ID'))
|
||||
WALLET_RPC_USER = getenv('WALLET_RPC_USER')
|
||||
WALLET_RPC_PASS = getenv('WALLET_RPC_PASS')
|
||||
SQLITE_DB_PATH = getenv('SQLITE_DB_PATH')
|
||||
DAEMON_URI = getenv('DAEMON_URI')
|
||||
_d = getenv('DEBUG', True)
|
||||
|
||||
if isinstance(_d, str):
|
||||
print(_d)
|
||||
if _d.lower() == 'false':
|
||||
DEBUG = False
|
||||
else:
|
||||
DEBUG = True
|
|
@ -22,8 +22,11 @@ def check_debug(f):
|
|||
def log_event(f):
|
||||
@wraps(f)
|
||||
def decorated_function(*args, **kwargs):
|
||||
_d = ''
|
||||
if config.DEBUG:
|
||||
_d = ' (debug mode on)'
|
||||
msg = args[0].message
|
||||
logging.info(f'"{f.__name__}" invoked from {msg.from_user["id"]} ({msg.from_user["first_name"]}) - Full command: "{msg.text}"')
|
||||
logging.info(f'"{f.__name__}" invoked from {msg.from_user["id"]} ({msg.from_user["first_name"]}) - Full command: "{msg.text}"{_d}')
|
||||
return f(*args, **kwargs)
|
||||
return decorated_function
|
||||
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
from io import BytesIO
|
||||
|
||||
from PIL import Image
|
||||
from base64 import b64encode
|
||||
from qrcode import make as qrcode_make
|
||||
|
||||
from tipbot import config
|
||||
|
||||
def is_tg_admin(chat_id):
|
||||
|
@ -5,3 +11,9 @@ def is_tg_admin(chat_id):
|
|||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def generate_qr(s):
|
||||
_address_qr = BytesIO()
|
||||
qrcode_make(s).save(_address_qr, format="PNG")
|
||||
_address_qr.seek(0)
|
||||
return _address_qr
|
||||
|
|
|
@ -10,16 +10,9 @@ PICOWOW = Decimal('0.00000000001')
|
|||
|
||||
class Wallet(object):
|
||||
def __init__(self):
|
||||
self.host = config.WALLET_HOST
|
||||
self.port = config.WALLET_PORT
|
||||
self.proto = config.WALLET_PROTO
|
||||
self.username = config.WALLET_USER
|
||||
self.password = config.WALLET_PASS
|
||||
self.endpoint = '{}://{}:{}/json_rpc'.format(
|
||||
self.proto, self.host, self.port
|
||||
)
|
||||
self.endpoint = f'http://127.0.0.1:9999/json_rpc'
|
||||
self.auth = requests.auth.HTTPDigestAuth(
|
||||
self.username, self.password
|
||||
config.WALLET_RPC_USER, config.WALLET_RPC_PASS
|
||||
)
|
||||
|
||||
try:
|
||||
|
@ -35,7 +28,6 @@ class Wallet(object):
|
|||
data=json.dumps({'method': method, 'params': params}),
|
||||
auth=self.auth
|
||||
)
|
||||
# print(r.status_code)
|
||||
if 'error' in r.json():
|
||||
return r.json()['error']
|
||||
else:
|
||||
|
@ -54,15 +46,8 @@ class Wallet(object):
|
|||
return self.make_wallet_rpc('query_key', {'key_type': 'mnemonic'})['key']
|
||||
|
||||
def accounts(self):
|
||||
accounts = []
|
||||
_accounts = self.make_wallet_rpc('get_accounts')
|
||||
idx = 0
|
||||
self.master_address = _accounts['subaddress_accounts'][0]['base_address']
|
||||
for _acc in _accounts['subaddress_accounts']:
|
||||
assert idx == _acc['account_index']
|
||||
accounts.append(_acc['account_index'])
|
||||
idx += 1
|
||||
return accounts
|
||||
return [i['account_index'] for i in _accounts['subaddress_accounts']]
|
||||
|
||||
def new_account(self, label=None):
|
||||
_account = self.make_wallet_rpc('create_account', {'label': label})
|
||||
|
|
Loading…
Reference in New Issue