yangtb24 commited on
Commit
b19385f
·
verified ·
1 Parent(s): e537f90

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +72 -6
app.py CHANGED
@@ -5,6 +5,9 @@ from flask import Flask, request, jsonify
5
  from datetime import datetime, timedelta
6
  import asyncio
7
  import re
 
 
 
8
 
9
  app = Flask(__name__)
10
 
@@ -13,8 +16,12 @@ AI_API_ENDPOINT = os.environ.get('AI_API_ENDPOINT')
13
  AI_API_KEY = os.environ.get('AI_API_KEY')
14
  AI_MODEL = os.environ.get('AI_MODEL')
15
  PHP_PROXY_URL = os.environ.get('PHP_PROXY_URL')
 
 
 
 
16
 
17
- if not all([TELEGRAM_BOT_TOKEN, AI_API_ENDPOINT, AI_API_KEY, AI_MODEL]):
18
  raise ValueError("请设置所有必要的环境变量")
19
 
20
  AI_API_HEADERS = {
@@ -80,6 +87,64 @@ BAN_TRIGGER_PHRASES = [
80
  ]
81
  UNBAN_PHRASE = "close username"
82
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
83
  def make_telegram_request(method, data=None):
84
  url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/{method}"
85
  if PHP_PROXY_URL:
@@ -134,7 +199,7 @@ async def handleTelegramUpdate(update):
134
  fromUserFirstName = update['message']['from'].get('first_name', '用户')
135
  fromUserLastName = update['message']['from'].get('last_name', '')
136
  fromUserName = update['message']['from'].get('username', '')
137
-
138
  USER_LAST_ACTIVE[fromUserId] = datetime.now()
139
 
140
  if isGroupChat:
@@ -156,7 +221,6 @@ async def handleTelegramUpdate(update):
156
  else:
157
  GROUP_INFO[chatId]['last_active'] = datetime.now()
158
 
159
-
160
  if not userMessage:
161
  return
162
 
@@ -273,7 +337,7 @@ async def processAiMessage(chatId, userMessage, fromUserId, message_id, fromUser
273
  minutes = int(remaining_time.total_seconds() / 60)
274
  await sendTelegramMessage(chatId, f"您已被禁用,剩余时间: {minutes} 分钟。", options={'reply_to_message_id': message_id})
275
  return
276
-
277
  for pattern in BAN_TRIGGER_PHRASES:
278
  if re.search(pattern, userMessage, re.IGNORECASE):
279
  await banUser(chatId, fromUserId)
@@ -284,7 +348,7 @@ async def processAiMessage(chatId, userMessage, fromUserId, message_id, fromUser
284
  userTemp = USER_SETTINGS.get(fromUserId, {}).get('temperature', DEFAULT_TEMP)
285
  userPromptIndex = USER_SETTINGS.get(fromUserId, {}).get('prompt_index', CURRENT_PROMPT_INDEX)
286
  currentPrompt = PROMPT_TEMPLATES.get(userPromptIndex, "")
287
-
288
  user_last_active = USER_LAST_ACTIVE.get(fromUserId, None)
289
  group_info = GROUP_INFO.get(chatId, None)
290
  group_active_users = GROUP_ACTIVE_USERS.get(chatId, None)
@@ -473,4 +537,6 @@ async def unbanUser(chatId, userId):
473
  print(f"用户 {userId} 在群组 {chatId} 中被解禁。")
474
 
475
  if __name__ == '__main__':
476
- app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 7860)))
 
 
 
5
  from datetime import datetime, timedelta
6
  import asyncio
7
  import re
8
+ import time
9
+ from threading import Thread
10
+ from webdav3.client import Client
11
 
12
  app = Flask(__name__)
13
 
 
16
  AI_API_KEY = os.environ.get('AI_API_KEY')
17
  AI_MODEL = os.environ.get('AI_MODEL')
18
  PHP_PROXY_URL = os.environ.get('PHP_PROXY_URL')
19
+ WEBDAV_URL = os.environ.get('WEBDAV_URL')
20
+ WEBDAV_USERNAME = os.environ.get('WEBDAV_USERNAME')
21
+ WEBDAV_PASSWORD = os.environ.get('WEBDAV_PASSWORD')
22
+ WEBDAV_DIRECTORY = '/tg_bot'
23
 
24
+ if not all([TELEGRAM_BOT_TOKEN, AI_API_ENDPOINT, AI_API_KEY, AI_MODEL, WEBDAV_URL, WEBDAV_USERNAME, WEBDAV_PASSWORD]):
25
  raise ValueError("请设置所有必要的环境变量")
26
 
27
  AI_API_HEADERS = {
 
87
  ]
88
  UNBAN_PHRASE = "close username"
89
 
90
+ webdav_options = {
91
+ 'webdav_hostname': WEBDAV_URL,
92
+ 'webdav_login': WEBDAV_USERNAME,
93
+ 'webdav_password': WEBDAV_PASSWORD
94
+ }
95
+ webdav_client = Client(webdav_options)
96
+
97
+ def save_data_to_webdav():
98
+ data = {
99
+ "chatHistories": chatHistories,
100
+ "GROUP_SETTINGS": GROUP_SETTINGS,
101
+ "USER_SETTINGS": USER_SETTINGS,
102
+ "USER_LAST_ACTIVE": {k: v.isoformat() for k, v in USER_LAST_ACTIVE.items()},
103
+ "GROUP_ACTIVE_USERS": {k: list(v) for k, v in GROUP_ACTIVE_USERS.items()},
104
+ "GROUP_INFO": {k: {**v, 'last_active': v['last_active'].isoformat()} for k, v in GROUP_INFO.items()},
105
+ "BANNED_USERS": {k: v.isoformat() for k, v in BANNED_USERS.items()}
106
+ }
107
+ try:
108
+ file_name = f"{WEBDAV_DIRECTORY}/data.json"
109
+ with open("data.json", "w") as f:
110
+ json.dump(data, f)
111
+
112
+ if not webdav_client.check(WEBDAV_DIRECTORY):
113
+ webdav_client.mkdir(WEBDAV_DIRECTORY)
114
+
115
+ webdav_client.upload_sync(remote_path=file_name, local_path="data.json")
116
+ print(f"数据已上传至 WebDAV: {file_name}")
117
+ except Exception as e:
118
+ print(f"上传数据到 WebDAV 失败: {e}")
119
+
120
+ def load_data_from_webdav():
121
+ global chatHistories, GROUP_SETTINGS, USER_SETTINGS, USER_LAST_ACTIVE, GROUP_ACTIVE_USERS, GROUP_INFO, BANNED_USERS
122
+ try:
123
+ file_name = f"{WEBDAV_DIRECTORY}/data.json"
124
+ if webdav_client.check(file_name):
125
+ webdav_client.download_sync(remote_path=file_name, local_path="data.json")
126
+ with open("data.json", "r") as f:
127
+ data = json.load(f)
128
+ chatHistories = data.get("chatHistories", {})
129
+ GROUP_SETTINGS = data.get("GROUP_SETTINGS", {})
130
+ USER_SETTINGS = data.get("USER_SETTINGS", {})
131
+ USER_LAST_ACTIVE = {int(k): datetime.fromisoformat(v) for k, v in data.get("USER_LAST_ACTIVE", {}).items()}
132
+ GROUP_ACTIVE_USERS = {int(k): set(v) for k, v in data.get("GROUP_ACTIVE_USERS", {}).items()}
133
+ GROUP_INFO = {int(k): {**v, 'last_active': datetime.fromisoformat(v['last_active'])} for k, v in data.get("GROUP_INFO", {}).items()}
134
+ BANNED_USERS = {int(k): datetime.fromisoformat(v) for k, v in data.get("BANNED_USERS", {}).items()}
135
+
136
+ print(f"从 WebDAV 加载数据成功: {file_name}")
137
+ else:
138
+ print("WebDAV 上没有找到数据文件,初始化为空数据。")
139
+ save_data_to_webdav()
140
+ except Exception as e:
141
+ print(f"从 WebDAV 加载数据失败: {e}")
142
+
143
+ def webdav_sync_thread():
144
+ while True:
145
+ save_data_to_webdav()
146
+ time.sleep(60)
147
+
148
  def make_telegram_request(method, data=None):
149
  url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/{method}"
150
  if PHP_PROXY_URL:
 
199
  fromUserFirstName = update['message']['from'].get('first_name', '用户')
200
  fromUserLastName = update['message']['from'].get('last_name', '')
201
  fromUserName = update['message']['from'].get('username', '')
202
+
203
  USER_LAST_ACTIVE[fromUserId] = datetime.now()
204
 
205
  if isGroupChat:
 
221
  else:
222
  GROUP_INFO[chatId]['last_active'] = datetime.now()
223
 
 
224
  if not userMessage:
225
  return
226
 
 
337
  minutes = int(remaining_time.total_seconds() / 60)
338
  await sendTelegramMessage(chatId, f"您已被禁用,剩余时间: {minutes} 分钟。", options={'reply_to_message_id': message_id})
339
  return
340
+
341
  for pattern in BAN_TRIGGER_PHRASES:
342
  if re.search(pattern, userMessage, re.IGNORECASE):
343
  await banUser(chatId, fromUserId)
 
348
  userTemp = USER_SETTINGS.get(fromUserId, {}).get('temperature', DEFAULT_TEMP)
349
  userPromptIndex = USER_SETTINGS.get(fromUserId, {}).get('prompt_index', CURRENT_PROMPT_INDEX)
350
  currentPrompt = PROMPT_TEMPLATES.get(userPromptIndex, "")
351
+
352
  user_last_active = USER_LAST_ACTIVE.get(fromUserId, None)
353
  group_info = GROUP_INFO.get(chatId, None)
354
  group_active_users = GROUP_ACTIVE_USERS.get(chatId, None)
 
537
  print(f"用户 {userId} 在群组 {chatId} 中被解禁。")
538
 
539
  if __name__ == '__main__':
540
+ load_data_from_webdav()
541
+ Thread(target=webdav_sync_thread, daemon=True).start()
542
+ app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 7860)))