187 lines
5.6 KiB
Python
187 lines
5.6 KiB
Python
|
|
import schedule
|
||
|
|
import time
|
||
|
|
import asyncio
|
||
|
|
import sys
|
||
|
|
from datetime import datetime, timedelta
|
||
|
|
|
||
|
|
from public.times import Times
|
||
|
|
from src.hashrate import HashRate
|
||
|
|
from src.report import Report, ReportEnx
|
||
|
|
from src.confirm import Confirm
|
||
|
|
from src.distribution import Distribution
|
||
|
|
from src.blanace import Balance, DGBBlance
|
||
|
|
from src.clear import ClearDBData
|
||
|
|
from src.notice import Notice
|
||
|
|
|
||
|
|
|
||
|
|
def main():
|
||
|
|
# 获取命令行参数
|
||
|
|
if len(sys.argv) < 3:
|
||
|
|
raise Exception("请提供方法和币种参数")
|
||
|
|
|
||
|
|
method = sys.argv[1]
|
||
|
|
methods = ["hashrate", "report", "clear", "distribution", "confirm", "balance", "stats", "notice"]
|
||
|
|
|
||
|
|
if method not in methods:
|
||
|
|
raise Exception(f"暂不支持{method}方法")
|
||
|
|
|
||
|
|
coin = sys.argv[2]
|
||
|
|
coins = ["nexa", "mona", "grs", "dgbq", "dgbs", "dgbo", "rxd", "enx", "alph"]
|
||
|
|
|
||
|
|
if coin not in coins:
|
||
|
|
raise Exception(f"暂不支持{coin}")
|
||
|
|
|
||
|
|
# hashrate 任务
|
||
|
|
if method == "hashrate":
|
||
|
|
hashrate = HashRate(coin)
|
||
|
|
|
||
|
|
def hashrate_job():
|
||
|
|
asyncio.run(hashrate_task(hashrate))
|
||
|
|
|
||
|
|
# 每5分钟的第30秒执行
|
||
|
|
schedule.every().hour.at(":00:30").do(hashrate_job)
|
||
|
|
schedule.every().hour.at(":05:30").do(hashrate_job)
|
||
|
|
schedule.every().hour.at(":10:30").do(hashrate_job)
|
||
|
|
schedule.every().hour.at(":15:30").do(hashrate_job)
|
||
|
|
schedule.every().hour.at(":20:30").do(hashrate_job)
|
||
|
|
schedule.every().hour.at(":25:30").do(hashrate_job)
|
||
|
|
schedule.every().hour.at(":30:30").do(hashrate_job)
|
||
|
|
schedule.every().hour.at(":35:30").do(hashrate_job)
|
||
|
|
schedule.every().hour.at(":40:30").do(hashrate_job)
|
||
|
|
schedule.every().hour.at(":45:30").do(hashrate_job)
|
||
|
|
schedule.every().hour.at(":50:30").do(hashrate_job)
|
||
|
|
schedule.every().hour.at(":55:30").do(hashrate_job)
|
||
|
|
|
||
|
|
# report 任务
|
||
|
|
elif method == "report":
|
||
|
|
if coin == "enx":
|
||
|
|
report = ReportEnx(coin)
|
||
|
|
else:
|
||
|
|
report = Report(coin)
|
||
|
|
|
||
|
|
interval = 60 # 秒
|
||
|
|
if coin == "rxd":
|
||
|
|
interval = 300
|
||
|
|
elif coin == "nexa":
|
||
|
|
interval = 120
|
||
|
|
|
||
|
|
def report_job():
|
||
|
|
report.main()
|
||
|
|
|
||
|
|
schedule.every(interval).seconds.do(report_job)
|
||
|
|
|
||
|
|
# confirm 任务
|
||
|
|
elif method == "confirm":
|
||
|
|
interval = 60 # 秒
|
||
|
|
if coin == "rxd":
|
||
|
|
interval = 300
|
||
|
|
elif coin == "nexa":
|
||
|
|
interval = 120
|
||
|
|
|
||
|
|
confirm = Confirm(coin)
|
||
|
|
|
||
|
|
def confirm_job():
|
||
|
|
confirm.main()
|
||
|
|
|
||
|
|
schedule.every(interval).seconds.do(confirm_job)
|
||
|
|
|
||
|
|
# distribution 任务
|
||
|
|
elif method == "distribution":
|
||
|
|
distribution = Distribution(coin)
|
||
|
|
|
||
|
|
now_ts = datetime.now()
|
||
|
|
last_ts = now_ts - timedelta(hours=24)
|
||
|
|
|
||
|
|
ymd_now = Times.utc_time(now_ts.isoformat())
|
||
|
|
ymd_last = Times.utc_time(last_ts.isoformat())
|
||
|
|
|
||
|
|
end_time = ymd_now.split(" ")[0] + " 00:00:00"
|
||
|
|
start_time = ymd_last.split(" ")[0] + " 00:00:00"
|
||
|
|
|
||
|
|
distribution.main(start_time, end_time)
|
||
|
|
|
||
|
|
# balance 任务
|
||
|
|
elif method == "balance":
|
||
|
|
special_coins = ["dgbo", "dgbs", "dgbq"]
|
||
|
|
|
||
|
|
if coin in special_coins:
|
||
|
|
balance = DGBBlance(coin)
|
||
|
|
else:
|
||
|
|
balance = Balance(coin)
|
||
|
|
|
||
|
|
hour = 4
|
||
|
|
if coin in ["rxd", "alph"]:
|
||
|
|
hour = 9
|
||
|
|
|
||
|
|
async def balance_task_async(balance_obj):
|
||
|
|
count = 0
|
||
|
|
last_height = await balance_obj.node.getblockcount()
|
||
|
|
|
||
|
|
while count < 36: # 最多执行 36 次 (6小时)
|
||
|
|
enable = await balance_obj.query_now_height(last_height)
|
||
|
|
if enable:
|
||
|
|
result = await balance_obj.main()
|
||
|
|
if not result:
|
||
|
|
print(f"{coin}转账已完成")
|
||
|
|
return # 成功执行后退出循环
|
||
|
|
|
||
|
|
print(f"等待中... (已等待 {count * 10} 分钟)")
|
||
|
|
await asyncio.sleep(1000 * 60 * 10) # 休眠 10 分钟
|
||
|
|
count += 1
|
||
|
|
|
||
|
|
print("等待超时,任务结束!")
|
||
|
|
|
||
|
|
def balance_job():
|
||
|
|
asyncio.run(balance_task_async(balance))
|
||
|
|
|
||
|
|
schedule.every().day.at(f"{hour:02d}:10:00").do(balance_job)
|
||
|
|
|
||
|
|
# clear 任务
|
||
|
|
elif method == "clear":
|
||
|
|
clear = ClearDBData(coin)
|
||
|
|
|
||
|
|
try:
|
||
|
|
clear.clear_shares_db(72)
|
||
|
|
print("sharesdb:ok")
|
||
|
|
clear.clear_hashrate_db()
|
||
|
|
print("hashratedb:ok")
|
||
|
|
except Exception as err:
|
||
|
|
print(err)
|
||
|
|
finally:
|
||
|
|
sys.exit(0)
|
||
|
|
|
||
|
|
# notice 任务
|
||
|
|
elif method == "notice":
|
||
|
|
notice = Notice(coin)
|
||
|
|
|
||
|
|
def notice_job():
|
||
|
|
notice.main()
|
||
|
|
|
||
|
|
schedule.every().day.at("09:30:00").do(notice_job)
|
||
|
|
|
||
|
|
# 运行调度器
|
||
|
|
while True:
|
||
|
|
schedule.run_pending()
|
||
|
|
time.sleep(1)
|
||
|
|
|
||
|
|
|
||
|
|
async def hashrate_task(hashrate):
|
||
|
|
"""hashrate 异步任务"""
|
||
|
|
ymd_now = Times.utc_time(datetime.now().isoformat())
|
||
|
|
ymd = ymd_now.split(":")
|
||
|
|
end_time = ymd[0] + ":" + ymd[1] + ":00"
|
||
|
|
|
||
|
|
await hashrate.insert_hashrate_miners_table(end_time)
|
||
|
|
|
||
|
|
current_minute = datetime.now().minute
|
||
|
|
data = await hashrate.query_hashrate_miners_accepts(end_time)
|
||
|
|
|
||
|
|
if current_minute == 0 or current_minute == 30:
|
||
|
|
await hashrate.insert_mhs(data)
|
||
|
|
await hashrate.insert_mhs_real(data)
|
||
|
|
else:
|
||
|
|
await hashrate.insert_mhs_real(data)
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
main()
|