134 lines
4.4 KiB
Python
134 lines
4.4 KiB
Python
|
import requests
|
||
|
import sys
|
||
|
import os
|
||
|
|
||
|
def read_env(key):
|
||
|
if key in os.environ:
|
||
|
return os.environ[key]
|
||
|
else:
|
||
|
return ""
|
||
|
|
||
|
APK_FOLDER = "apks"
|
||
|
API_PREFIX = "http://127.0.0.1:8081/bot" + os.environ["BOT_TOKEN"] + "/"
|
||
|
|
||
|
BOT_TAGET = read_env("BOT_TARGET")
|
||
|
ADMIN_USERID = BOT_TAGET.replace("-100","")
|
||
|
|
||
|
VERSION_NAME = read_env("VERSION_NAME")
|
||
|
VERSION_CODE = read_env("VERSION_CODE")
|
||
|
COMMIT_HASH = read_env("GITHUB_SHA")
|
||
|
COMMIT_MESSAGE = read_env("COMMIT_MESSAGE")
|
||
|
|
||
|
APK_CHANNEL_ID = "@NekoXApks"
|
||
|
UPDATE_CHANNEL_ID = "@NekogramX"
|
||
|
UPDATE_METADATA_CHANNEL_ID = "@nekox_update_metadata"
|
||
|
CI_CHANNEL_ID = "@NekoX_CI"
|
||
|
|
||
|
def generateReleaseMessage(first_apk_message_id, release_text) -> str:
|
||
|
rel_type = 'PRE_RELEASE' if 'preview' in VERSION_NAME else 'RELEASE'
|
||
|
return f"""
|
||
|
#{rel_type} [ ](https://t.me/{APK_CHANNEL_ID.replace("@","")}/{first_apk_message_id + 1}) *{VERSION_NAME}*
|
||
|
|
||
|
{release_text}
|
||
|
|
||
|
[GitHub Release](https://github.com/NekoX-Dev/NekoX/releases/{VERSION_NAME}) | [Apks](https://t.me/{APK_CHANNEL_ID.replace("@","")}/{first_apk_message_id}) | [Check Update](tg://update/)
|
||
|
"""
|
||
|
|
||
|
def waitReply(mid):
|
||
|
last_update = 0
|
||
|
while True:
|
||
|
print(f"Waiting reply for {mid} offset {last_update}...")
|
||
|
resp = requests.post(API_PREFIX + "getUpdates", json={"allowed_updates":["message"], "timeout": 20, "offset": last_update + 1})
|
||
|
resp = resp.json()
|
||
|
if not resp["ok"]:
|
||
|
continue
|
||
|
resp = resp["result"]
|
||
|
for update in resp:
|
||
|
if 'message' in update:
|
||
|
msg = update["message"]
|
||
|
if 'from' in msg and str(msg['from']["id"]) == ADMIN_USERID:
|
||
|
if 'reply_to_message' in msg and str(msg["reply_to_message"]["message_id"]) == str(mid):
|
||
|
return msg
|
||
|
for update in resp:
|
||
|
last_update = max(last_update, update["update_id"])
|
||
|
|
||
|
|
||
|
def sendMessage(message, user_id = BOT_TAGET) -> int:
|
||
|
data = {
|
||
|
"chat_id" : user_id,
|
||
|
"text": message,
|
||
|
"parse_mode": "Markdown"
|
||
|
}
|
||
|
resp = requests.post(API_PREFIX + "sendMessage", json=data).json()
|
||
|
# print(resp)
|
||
|
return int(resp["result"]["message_id"])
|
||
|
|
||
|
|
||
|
def sendDocument(user_id, path, message = ""):
|
||
|
files = {'document': open(path, 'rb')}
|
||
|
data = {'chat_id': user_id, 'caption': message, 'parse_mode': 'Markdown'}
|
||
|
response = requests.post(API_PREFIX + "sendDocument", files=files, data=data)
|
||
|
# print(response.json())
|
||
|
|
||
|
|
||
|
def sendRelease():
|
||
|
apks = os.listdir(APK_FOLDER)
|
||
|
apks.sort()
|
||
|
# print(apks)
|
||
|
|
||
|
# read message from admin
|
||
|
mid = sendMessage(f"Please reply the release message for the version {VERSION_NAME},{VERSION_CODE}:", user_id=BOT_TAGET)
|
||
|
admin_resp = waitReply(mid)
|
||
|
# print(admin_resp)
|
||
|
release_text = admin_resp["text"]
|
||
|
|
||
|
# send message and apks to APK channel
|
||
|
message = f"=== {VERSION_NAME} ==="
|
||
|
apk_channel_first_id = sendMessage(message, user_id=APK_CHANNEL_ID)
|
||
|
|
||
|
for apk in apks:
|
||
|
path = os.path.join(APK_FOLDER, apk)
|
||
|
sendDocument(user_id=APK_CHANNEL_ID, path=path)
|
||
|
|
||
|
# generate release message and send to update channel
|
||
|
release_msg = generateReleaseMessage(apk_channel_first_id, release_text)
|
||
|
sendMessage(release_msg, user_id=UPDATE_CHANNEL_ID)
|
||
|
|
||
|
# send release message to metadata channel
|
||
|
mid = sendMessage(release_text, user_id=UPDATE_METADATA_CHANNEL_ID)
|
||
|
meta_msg = f"{VERSION_NAME},{VERSION_CODE},{apk_channel_first_id},{mid}"
|
||
|
sendMessage(meta_msg, user_id=UPDATE_METADATA_CHANNEL_ID)
|
||
|
|
||
|
|
||
|
def sendCIRelease():
|
||
|
apks = os.listdir(APK_FOLDER)
|
||
|
apks.sort()
|
||
|
apk = os.path.join(APK_FOLDER, apks[0])
|
||
|
message = f"CI Build\n\n{COMMIT_MESSAGE}\n\n{COMMIT_HASH[0:8]}"
|
||
|
sendDocument(user_id=CI_CHANNEL_ID, path = apk, message=message)
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
if len(sys.argv) != 2:
|
||
|
print("Run Type: release, ci, debug")
|
||
|
os._exit(1)
|
||
|
mode = sys.argv[1]
|
||
|
try:
|
||
|
if mode == "release":
|
||
|
sendRelease()
|
||
|
elif mode == "ci":
|
||
|
if COMMIT_MESSAGE.startswith("ci"):
|
||
|
CI_CHANNEL_ID = BOT_TAGET
|
||
|
sendCIRelease()
|
||
|
elif mode == "debug":
|
||
|
APK_CHANNEL_ID = "@test_channel_nekox"
|
||
|
UPDATE_CHANNEL_ID = "@test_channel_nekox"
|
||
|
UPDATE_METADATA_CHANNEL_ID = "@test_channel_nekox"
|
||
|
sendRelease()
|
||
|
else:
|
||
|
os._exit(1)
|
||
|
except Exception as e:
|
||
|
print(e)
|
||
|
os._exit(1)
|
||
|
|