cm_bot_v2/app/cm_transfer_credit.py
yiekheng d73439698a Refactor Docker layout for Gitea publishing
- move Python sources into app package and switch services to module entrypoints
- relocate Dockerfiles under docker/, add buildx publish script, override compose for local builds
- configure images to pull from gitea.04080616.xyz/yiekheng with env-driven tags and limits
- harden installs and transfer worker logging/concurrency for cleaner container output
2025-10-19 22:22:55 +08:00

66 lines
2.6 KiB
Python

import logging, time, requests, json, os, threading
from concurrent.futures import ThreadPoolExecutor
from datetime import datetime
from .cm_bot_hal import CM_BOT_HAL
# Suppress httpx logs
logging.getLogger("httpx").setLevel(logging.WARNING)
# api_url = 'https://api.luckytown888.net'
api_url = os.getenv('API_BASE_URL', 'http://api-server:3000')
max_threading = int(os.getenv('CM_TRANSFER_MAX_THREADS', '20'))
def transfer(data: dict, local_logger):
bot = CM_BOT_HAL()
thread_name = threading.current_thread().name
local_logger.info(f"[Thread-{thread_name}] [Start] Transfer Credit from {data['f_username']} to {data['t_username']}")
result = bot.transfer_credit_api(data['f_username'], data['f_password'], data['t_username'], data['t_password'])
local_logger.info(f"[Thread-{thread_name}] {result}")
local_logger.info(f"[Thread-{thread_name}] [Done] {data['f_username']} transfer done!")
del bot
time.sleep(5)
def main():
while True:
weekday = int(datetime.now().strftime("%w"))
hour = int(datetime.now().strftime("%H"))
if weekday == 1 and (hour >= 6 and hour < 12):
local_logger = logging.getLogger(__name__)
if not local_logger.handlers:
handler = logging.StreamHandler()
handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
local_logger.addHandler(handler)
local_logger.setLevel(logging.INFO)
local_logger.info("=" * 80)
local_logger.info(
"Transfer window triggered | weekday=%s | hour=%s | max_threads=%s | api_url=%s",
weekday,
hour,
max_threading,
api_url,
)
local_logger.info("=" * 80)
response = requests.get(f'{api_url}/user')
items = json.loads(response.text)
total_items = len(items) if isinstance(items, list) else 0
if total_items == 0:
local_logger.info("No items to process.")
local_logger.info("=" * 80)
else:
local_logger.info(f"Processing {total_items} transfer items...")
with ThreadPoolExecutor(max_workers=max_threading) as executor:
list(executor.map(lambda item: transfer(item, local_logger), items))
local_logger.info(f"Completed processing {total_items} transfer items.")
local_logger.info("=" * 80)
time.sleep(10 * 60)
if __name__ == "__main__":
main()