ZHIWEI666 commited on
Commit
af39c17
·
verified ·
1 Parent(s): 0dea3d0

Update router_messages.py

Browse files
Files changed (1) hide show
  1. router_messages.py +105 -172
router_messages.py CHANGED
@@ -1,173 +1,106 @@
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
7
- from notifications import add_notification
8
- from models import PrivateMessage
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={})
46
- conv_id = f"{min(msg.sender, msg.receiver)}_{max(msg.sender, msg.receiver)}"
47
- if conv_id not in chats_db: chats_db[conv_id] = []
48
-
49
- chat_msg = {"id": f"chat_{int(time.time())}_{uuid.uuid4().hex[:6]}", "sender": msg.sender, "receiver": msg.receiver, "content": msg.content, "created_at": int(time.time()), "is_read": False}
50
- chats_db[conv_id].append(chat_msg)
51
- db.save_data("chats.json", chats_db)
52
-
53
- add_notification(msg.receiver, {"type": "private", "from_user": msg.sender, "content": msg.content})
54
- return {"status": "success"}
55
-
56
- @router.get("/api/chats/{account}")
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())
91
- seven_days = 7 * 24 * 3600
92
- valid_msgs = []
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
101
-
102
- # 本次访问即为已读
103
- if m["receiver"] == account and not m.get("is_read"):
104
- m["is_read"] = True
105
- modified = True
106
-
107
- if modified or len(valid_msgs) != len(msgs):
108
- chats_db[conv_id] = valid_msgs
109
- db.save_data("chats.json", chats_db)
110
-
111
- return {"status": "success", "data": valid_msgs}
112
-
113
- @router.get("/api/messages/{account}")
114
- async def get_messages(account: str):
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):
148
- valid.append(m)
149
- else:
150
- modified = True
151
-
152
- if modified:
153
- msgs_db[account] = valid
154
- db.save_data("messages.json", msgs_db)
155
-
156
- return {"status": "success", "data": valid, "unread_count": sum(1 for m in valid if not m.get("is_read"))}
157
-
158
- @router.post("/api/messages/{account}/read")
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"}
 
1
+ # router_messages.py
2
+ from fastapi import APIRouter
3
+ import time
4
+ import uuid
5
+ import 数据库连接 as db
6
+ from notifications import add_notification
7
+ 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={})
14
+ conv_id = f"{min(msg.sender, msg.receiver)}_{max(msg.sender, msg.receiver)}"
15
+ if conv_id not in chats_db: chats_db[conv_id] = []
16
+
17
+ chat_msg = {"id": f"chat_{int(time.time())}_{uuid.uuid4().hex[:6]}", "sender": msg.sender, "receiver": msg.receiver, "content": msg.content, "created_at": int(time.time()), "is_read": False}
18
+ chats_db[conv_id].append(chat_msg)
19
+ db.save_data("chats.json", chats_db)
20
+
21
+ add_notification(msg.receiver, {"type": "private", "from_user": msg.sender, "content": msg.content})
22
+ return {"status": "success"}
23
+
24
+ @router.get("/api/chats/{account}")
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())
55
+ seven_days = 7 * 24 * 3600
56
+ valid_msgs = []
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
65
+
66
+ # 本次访问即为已读
67
+ if m["receiver"] == account and not m.get("is_read"):
68
+ m["is_read"] = True
69
+ modified = True
70
+
71
+ if modified or len(valid_msgs) != len(msgs):
72
+ chats_db[conv_id] = valid_msgs
73
+ db.save_data("chats.json", chats_db)
74
+
75
+ return {"status": "success", "data": valid_msgs}
76
+
77
+ @router.get("/api/messages/{account}")
78
+ 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):
89
+ valid.append(m)
90
+ else:
91
+ modified = True
92
+
93
+ if modified:
94
+ msgs_db[account] = valid
95
+ db.save_data("messages.json", msgs_db)
96
+
97
+ return {"status": "success", "data": valid, "unread_count": sum(1 for m in valid if not m.get("is_read"))}
98
+
99
+ @router.post("/api/messages/{account}/read")
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"}