"from flask import Flask, request, jsonify, render_template
from datetime import datetime
import os
import random
from dotenv import load_dotenv
load_dotenv()
app = Flask(__name__, template_folder="templates", static_folder="static")
# Safe SDK import with micropip-free fallback
sdk = None
try:
from xumm import XummSdk
sdk = XummSdk(
api_key=os.getenv('XUMM_API_KEY', ''),
api_secret=os.getenv('XUMM_API_SECRET', '')
)
except Exception as e:
print("Xumm SDK not available, using mock.", str(e))
class XummSdkMock:
def payload_create(self, payload):
return {
'uuid': 'mock-uuid',
'next': {'always': 'mock-url'},
'refs': {'qr_png': 'mock-qr', 'websocket_status': 'mock-ws'}
}
def get_account_trustlines(self, address):
return {'lines': [
{'currency': 'FMEO', 'issuer': 'rQBsybc537dSFcKVckEb8UrGrtH1ecxgaS'},
{'currency': 'RLUSD', 'issuer': 'rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De'}
]}
def ping(self):
class App: name = 'MockApp'; uuidv4 = '0000'; webhookurl = ''; disabled = 0
class Call: uuidv4 = 'mock-call-uuid'
return type('MockPing', (), {'application': App(), 'call': Call(), 'quota': {}})()
def verify_user_token(self, token):
return type('MockToken', (), {'active': True})()
sdk = XummSdkMock()
# ML payout weighting simulation
def calculate_payout_weight(view_time_minutes):
if view_time_minutes < 10:
return 0.5 # light viewer
elif 10 <= view_time_minutes <= 30:
return 1.0 # normal
elif view_time_minutes > 30:
return 1.5 # power viewer
return 1.0
# Real wallet logic
def get_wallet_address_from_user(user_id):
if isinstance(user_id, str) and user_id.startswith('r') and len(user_id) >= 25:
return user_id
return None
@app.route('/')
def index():
return render_template(
'index.html',
rlusd_trustline_url='https://xpmarket.com/trustline/RLUSD-rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De/set',
fmeo_trustline_url='https://xpmarket.com/trustline/FMEO-rQBsybc537dSFcKVckEb8UrGrtH1ecxgaS/set'
)
@app.route('/calculate-reward', methods=['POST'])
def calculate_reward():
try:
data = request.get_json()
view_time = int(data.get("minutes_watched", 0))
base_reward = 100
multiplier = calculate_payout_weight(view_time)
reward = int(base_reward * multiplier)
# Log streaming session for admin tracking (simulate)
user_id = data.get("user_id", "unknown")
with open("streaming_sessions.log", "a") as log:
log.write(f"User: {user_id}, Minutes Watched: {view_time}, Multiplier: {multiplier}, Reward: {reward}
")
return jsonify({"reward": reward, "multiplier": multiplier})
except Exception as e:
return jsonify({"error": str(e)}), 500
except Exception as e:
return jsonify({"error": str(e)}), 500
@app.route('/create-payload', methods=['POST'])
def create_payload():
try:
data = request.get_json()
destination = data.get("destination", "rwiETSee2wMz3SBnAG8hkMsCgvGy9LWbZ1")
amount = data.get("amount", "1337")
new_payload = {
'txjson': {
'TransactionType': 'Payment',
'Destination': destination,
'Amount': str(amount)
}
}
created = sdk.payload_create(new_payload)
return jsonify({
"uuid": created.get('uuid'),
"sign_url": created['next']['always'],
"qr": created['refs']['qr_png'],
"websocket": created['refs']['websocket_status']
})
except Exception as e:
return jsonify({"error": str(e)}), 500
@app.route('/check-trustline/', methods=['GET'])
def check_trustline(user_id):
try:
wallet_address = get_wallet_address_from_user(user_id)
if not wallet_address:
return jsonify({"error": "Invalid wallet address"}), 400
result = sdk.get_account_trustlines(wallet_address)
has_fmeo = any(line['currency'] == 'FMEO' and line['issuer'] == 'rQBsybc537dSFcKVckEb8UrGrtH1ecxgaS' for line in result['lines'])
has_rlusd = any(line['currency'] == 'RLUSD' and line['issuer'] == 'rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De' for line in result['lines'])
if not has_rlusd:
return jsonify({
"error": "Missing RLUSD trustline. Please add it via https://xpmarket.com/trustline/RLUSD-rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De/set",
"trustline_FMEO": has_fmeo,
"trustline_RLUSD": has_rlusd
}), 400
return jsonify({"trustline_FMEO": has_fmeo, "trustline_RLUSD": has_rlusd})
except Exception as e:
return jsonify({"error": str(e)}), 500
@app.route('/ping', methods=['GET'])
def ping():
try:
pong = sdk.ping()
return jsonify({
"app_name": pong.application.name,
"uuid": pong.application.uuidv4,
"webhook": pong.application.webhookurl,
"call_uuid": pong.call.uuidv4
})
except Exception as e:
return jsonify({"error": str(e)}), 500
@app.route('/verify-token', methods=['POST'])
def verify_token():
try:
data = request.get_json()
token = data.get("token")
active = sdk.verify_user_token(token).active
return jsonify({"active": active})
except Exception as e:
return jsonify({"error": str(e)}), 500
@app.route('/connect-wallet', methods=['POST'])
def connect_wallet():
try:
sign_in_payload = {
"txjson": {
"TransactionType": "SignIn"
}
}
result = sdk.payload_create(sign_in_payload)
return jsonify({
"uuid": result.get('uuid'),
"sign_url": result['next']['always'],
"qr": result['refs']['qr_png'],
"websocket": result['refs']['websocket_status']
})
except Exception as e:
return jsonify({"error": str(e)}), 500