ZHIWEI666 commited on
Commit
211dc24
·
verified ·
1 Parent(s): d9592d3

Upload router_messages.py

Browse files
Files changed (1) hide show
  1. router_messages.py +92 -25
router_messages.py CHANGED
@@ -1,5 +1,6 @@
1
  # router_messages.py
2
- from fastapi import APIRouter
 
3
  import time
4
  import uuid
5
  import 数据库连接 as db
@@ -8,6 +9,37 @@ from models import PrivateMessage
8
 
9
  router = APIRouter()
10
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  @router.post("/api/messages/private")
12
  async def send_private_message(msg: PrivateMessage):
13
  chats_db = db.load_data("chats.json", default_data={})
@@ -25,30 +57,34 @@ async def send_private_message(msg: PrivateMessage):
25
  async def get_chat_list(account: str):
26
  chats_db = db.load_data("chats.json", default_data={})
27
  users_db = db.load_data("users.json", default_data={})
28
- chat_list = []
29
- now = int(time.time())
30
- seven_days = 7 * 24 * 3600
31
 
 
32
  for conv_id, msgs in chats_db.items():
33
- accs = conv_id.split("_")
34
- if account in accs and msgs:
35
- # 列表中只统计有效消息
36
- valid_msgs = [m for m in msgs if not m.get("is_read") or (now - m.get("created_at", 0) < seven_days)]
37
- if valid_msgs:
38
- target = accs[0] if accs[1] == account else accs[1]
39
- target_info = users_db.get(target, {})
40
- chat_list.append({
41
- "target_account": target, "target_name": target_info.get("name", target),
42
- "last_message": valid_msgs[-1]["content"], "last_time": valid_msgs[-1]["created_at"],
43
- "unread": sum(1 for m in valid_msgs if m["receiver"] == account and not m.get("is_read"))
44
- })
 
 
 
 
 
 
45
  chat_list.sort(key=lambda x: x["last_time"], reverse=True)
46
  return {"status": "success", "data": chat_list}
47
 
48
- @router.get("/api/chats/{account}/{target}")
49
- async def get_chat_history(account: str, target: str):
50
  chats_db = db.load_data("chats.json", default_data={})
51
- conv_id = f"{min(account, target)}_{max(account, target)}"
52
  msgs = chats_db.get(conv_id, [])
53
 
54
  now = int(time.time())
@@ -57,8 +93,8 @@ async def get_chat_history(account: str, target: str):
57
  modified = False
58
 
59
  for m in msgs:
60
- # 【核心策略】:未读的永远保留,已读的超过 7 天直接抛弃
61
- if not m.get("is_read") or (now - m.get("created_at", 0) < seven_days):
62
  valid_msgs.append(m)
63
  else:
64
  modified = True
@@ -79,10 +115,33 @@ async def get_messages(account: str):
79
  msgs_db = db.load_data("messages.json", default_data={})
80
  user_msgs = msgs_db.get(account, [])
81
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82
  now = int(time.time())
83
  seven_days = 7 * 24 * 3600
84
  valid = []
85
- modified = False
 
86
 
87
  for m in user_msgs:
88
  if not m.get("is_read") or (now - m.get("created_at", 0) < seven_days):
@@ -100,7 +159,15 @@ async def get_messages(account: str):
100
  async def mark_messages_read(account: str):
101
  msgs_db = db.load_data("messages.json", default_data={})
102
  user_msgs = msgs_db.get(account, [])
103
- for m in user_msgs: m["is_read"] = True
104
- msgs_db[account] = user_msgs
105
- db.save_data("messages.json", msgs_db)
 
 
 
 
 
 
 
 
106
  return {"status": "success"}
 
1
  # router_messages.py
2
+ from fastapi import APIRouter, HTTPException
3
+ from pydantic import BaseModel
4
  import time
5
  import uuid
6
  import 数据库连接 as db
 
9
 
10
  router = APIRouter()
11
 
12
+ # === 新增:用于接收系统公告的请求体模型 ===
13
+ class SystemAnnouncement(BaseModel):
14
+ admin_account: str
15
+ content: str
16
+
17
+ # === 新增:发布系统公告接口 (仅限管理员) ===
18
+ @router.post("/api/system/announcement")
19
+ async def publish_announcement(ann: SystemAnnouncement):
20
+ # 鉴权:只有指定的官方账号才能发公告
21
+ if ann.admin_account != "666666":
22
+ raise HTTPException(status_code=403, detail="无权发布系统公告")
23
+
24
+ announcements_db = db.load_data("announcements.json", default_data=[])
25
+
26
+ # 构造一条标准的系统公告数据结构
27
+ new_ann = {
28
+ "id": f"sys_{int(time.time())}_{uuid.uuid4().hex[:6]}",
29
+ "type": "system",
30
+ "from_user": "666666",
31
+ "from_name": "官方团队",
32
+ "from_avatar": "https://via.placeholder.com/150/FF9800/FFFFFF?text=Sys", # 专属的橙色系统头像
33
+ "content": ann.content,
34
+ "created_at": int(time.time())
35
+ }
36
+
37
+ announcements_db.append(new_ann)
38
+ db.save_data("announcements.json", announcements_db)
39
+
40
+ return {"status": "success", "data": new_ann}
41
+
42
+
43
  @router.post("/api/messages/private")
44
  async def send_private_message(msg: PrivateMessage):
45
  chats_db = db.load_data("chats.json", default_data={})
 
57
  async def get_chat_list(account: str):
58
  chats_db = db.load_data("chats.json", default_data={})
59
  users_db = db.load_data("users.json", default_data={})
 
 
 
60
 
61
+ chat_list = []
62
  for conv_id, msgs in chats_db.items():
63
+ if account in conv_id:
64
+ participants = conv_id.split("_")
65
+ target_account = participants[0] if participants[1] == account else participants[1]
66
+ if not msgs: continue
67
+
68
+ last_msg = sorted(msgs, key=lambda x: x.get("created_at", 0))[-1]
69
+ unread_count = sum(1 for m in msgs if m["receiver"] == account and not m.get("is_read"))
70
+
71
+ target_user = users_db.get(target_account, {})
72
+ chat_list.append({
73
+ "target_account": target_account,
74
+ "target_name": target_user.get("name", target_account),
75
+ "target_avatar": target_user.get("avatarDataUrl", "https://via.placeholder.com/150"),
76
+ "last_message": last_msg["content"],
77
+ "last_time": last_msg["created_at"],
78
+ "unread_count": unread_count
79
+ })
80
+
81
  chat_list.sort(key=lambda x: x["last_time"], reverse=True)
82
  return {"status": "success", "data": chat_list}
83
 
84
+ @router.get("/api/chats/{account}/{target_account}")
85
+ async def get_chat_history(account: str, target_account: str):
86
  chats_db = db.load_data("chats.json", default_data={})
87
+ conv_id = f"{min(account, target_account)}_{max(account, target_account)}"
88
  msgs = chats_db.get(conv_id, [])
89
 
90
  now = int(time.time())
 
93
  modified = False
94
 
95
  for m in msgs:
96
+ # 聊天记录也遵循 7 天冷数据截断
97
+ if now - m.get("created_at", 0) < seven_days:
98
  valid_msgs.append(m)
99
  else:
100
  modified = True
 
115
  msgs_db = db.load_data("messages.json", default_data={})
116
  user_msgs = msgs_db.get(account, [])
117
 
118
+ # =========================================================
119
+ # 【核心新增】:系统公告懒加载注入逻辑 (Lazy Push)
120
+ # =========================================================
121
+ announcements_db = db.load_data("announcements.json", default_data=[])
122
+ # 获取用户已经拥有的消息 ID 集合,用于快速比对
123
+ user_msg_ids = {m.get("id") for m in user_msgs}
124
+
125
+ injected = False
126
+ for ann in announcements_db:
127
+ if ann.get("id") not in user_msg_ids:
128
+ # 如果是新公告,构造一条个人消息注入进去
129
+ new_sys_msg = dict(ann) # 浅拷贝,防止修改全局数据
130
+ new_sys_msg["is_read"] = False
131
+ new_sys_msg["receiver"] = account
132
+ user_msgs.append(new_sys_msg)
133
+ injected = True
134
+
135
+ if injected:
136
+ # 如果注入了新公告,按照时间重新倒序排列,确保最新的消息/公告在最上面
137
+ user_msgs.sort(key=lambda x: x.get("created_at", 0), reverse=True)
138
+ # =========================================================
139
+
140
  now = int(time.time())
141
  seven_days = 7 * 24 * 3600
142
  valid = []
143
+ # 如果刚才注入了新公告,说明用户的消息列表被修改了,必须触发保存
144
+ modified = injected
145
 
146
  for m in user_msgs:
147
  if not m.get("is_read") or (now - m.get("created_at", 0) < seven_days):
 
159
  async def mark_messages_read(account: str):
160
  msgs_db = db.load_data("messages.json", default_data={})
161
  user_msgs = msgs_db.get(account, [])
162
+ modified = False
163
+
164
+ for m in user_msgs:
165
+ if not m.get("is_read"):
166
+ m["is_read"] = True
167
+ modified = True
168
+
169
+ if modified:
170
+ msgs_db[account] = user_msgs
171
+ db.save_data("messages.json", msgs_db)
172
+
173
  return {"status": "success"}