Demon Lord Vinsen commited on
Commit
01aca4c
·
1 Parent(s): 5b30cd8
Files changed (1) hide show
  1. app/services/scheduler_service.py +107 -54
app/services/scheduler_service.py CHANGED
@@ -49,93 +49,146 @@ device_tokens = set()
49
 
50
  # 🚀 HELPER MENGAMBIL USERNAME & CHAT HISTORY DARI FIRESTORE
51
  # 🚀 FIX PENCARIAN USER CONTEXT TERBAIK (Mendukung UID, FCM Token, maupun Email)
52
- def _get_user_context(user_id_or_token: str, limit: int = 4) -> Tuple[str, str, str]:
 
 
 
53
  """
54
- Mengembalikan: (username, history_text, actual_user_id)
 
55
  """
 
56
  try:
57
  db = firestore.client()
 
58
  target_doc = None
59
  target_uid = None
60
 
61
- # 1. Coba cari dokumen langsung jika parameter adalah UID (Document ID Firestore)
62
- doc_ref = db.collection("users").document(user_id_or_token).get()
 
 
 
 
 
63
  if doc_ref.exists:
64
  target_doc = doc_ref
65
  target_uid = doc_ref.id
66
- else:
67
- # 2. Jika bukan UID, cari berdasarkan field fcm_token
68
- users_by_token = list(db.collection("users").where(filter=FieldFilter("fcm_token", "==", user_id_or_token)).stream())
69
- if users_by_token:
70
- target_doc = users_by_token[0]
71
- target_uid = target_doc.id
72
- else:
73
- # 3. Cari berdasarkan field username / prefix email
74
- users_by_display_name = list(
75
- db.collection("users")
76
- .where(
77
- filter=FieldFilter(
78
- "displayName",
79
- "==",
80
- user_id_or_token
81
- )
82
- )
83
- .stream()
84
- )
85
 
86
- if users_by_display_name:
87
- target_doc = users_by_display_name[0]
88
- target_uid = target_doc.id
89
  else:
90
- users_by_username = list(
 
91
  db.collection("users")
92
  .where(
93
  filter=FieldFilter(
94
- "username",
95
  "==",
96
  user_id_or_token
97
  )
98
  )
 
99
  .stream()
100
  )
101
 
102
- if users_by_username:
103
- target_doc = users_by_username[0]
104
  target_uid = target_doc.id
105
 
106
- # Jika dokumen user ditemukan
107
- if target_doc and target_doc.exists:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
  data = target_doc.to_dict() or {}
 
109
  display_name = (
110
  data.get("displayName")
111
  or data.get("username")
112
  or data.get("email", "").split("@")[0]
113
  or "Baka"
114
- )
115
-
116
- # Ambil riwayat chat MURNI dari sub-koleksi chats milik UID user ini
117
- chats_ref = db.collection("users").document(target_uid).collection("chats")
118
- docs = chats_ref.order_by("id", direction=firestore.Query.DESCENDING).limit(limit).stream()
119
-
 
 
 
 
 
 
 
 
 
 
 
 
120
  recent_chats = []
121
- for doc in docs:
122
- d = doc.to_dict()
 
 
123
  sender_name = (
124
  display_name
125
- if d.get("sender") == "user"
126
  else "Mini-chan"
127
  )
128
- content = d.get("content", "")
 
 
129
  if content:
130
- recent_chats.append(f"{sender_name}: {content}")
131
-
 
 
132
  recent_chats.reverse()
133
  history_text = "\n".join(recent_chats)
134
-
135
  return display_name, history_text, target_uid
136
 
137
- # Fallback jika benar-benar tidak ditemukan (JANGAN AMBIL ALL_USERS[0]!)
138
- clean_name = user_id_or_token.split("@")[0] if "@" in user_id_or_token else "Baka"
 
 
 
 
 
139
  return clean_name, "", user_id_or_token
140
 
141
  except Exception as e:
@@ -269,18 +322,18 @@ async def send_proactive_message_task(
269
  user_data = user_doc.to_dict() or {}
270
  latest_fcm_token = user_data.get("fcm_token")
271
 
272
- if not latest_fcm_token:
273
- print(
274
- f"⏸️ Pengguna {actual_uid} sedang logout "
275
- f"atau token FCM tidak tersedia."
276
- )
277
- return
278
-
279
  await _send_fcm(
280
  latest_fcm_token,
281
  "Pesan dari Mini-chan! 😤",
282
  message
283
  )
 
 
 
 
 
 
284
 
285
  wib_now = datetime.now(timezone.utc) + timedelta(hours=7)
286
  now_time = wib_now.strftime("%H:%M")
 
49
 
50
  # 🚀 HELPER MENGAMBIL USERNAME & CHAT HISTORY DARI FIRESTORE
51
  # 🚀 FIX PENCARIAN USER CONTEXT TERBAIK (Mendukung UID, FCM Token, maupun Email)
52
+ def _get_user_context(
53
+ user_id_or_token: str,
54
+ limit: int = 4
55
+ ) -> Tuple[str, str, str]:
56
  """
57
+ Mengembalikan:
58
+ (display_name, history_text, actual_user_id)
59
  """
60
+
61
  try:
62
  db = firestore.client()
63
+
64
  target_doc = None
65
  target_uid = None
66
 
67
+ # 1. Prioritas utama: parameter dianggap sebagai UID
68
+ doc_ref = (
69
+ db.collection("users")
70
+ .document(user_id_or_token)
71
+ .get()
72
+ )
73
+
74
  if doc_ref.exists:
75
  target_doc = doc_ref
76
  target_uid = doc_ref.id
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77
 
 
 
 
78
  else:
79
+ # 2. Cari berdasarkan FCM token
80
+ users_by_token = list(
81
  db.collection("users")
82
  .where(
83
  filter=FieldFilter(
84
+ "fcm_token",
85
  "==",
86
  user_id_or_token
87
  )
88
  )
89
+ .limit(1)
90
  .stream()
91
  )
92
 
93
+ if users_by_token:
94
+ target_doc = users_by_token[0]
95
  target_uid = target_doc.id
96
 
97
+ else:
98
+ # 3. Cari berdasarkan displayName akun baru
99
+ users_by_display_name = list(
100
+ db.collection("users")
101
+ .where(
102
+ filter=FieldFilter(
103
+ "displayName",
104
+ "==",
105
+ user_id_or_token
106
+ )
107
+ )
108
+ .limit(1)
109
+ .stream()
110
+ )
111
+
112
+ if users_by_display_name:
113
+ target_doc = users_by_display_name[0]
114
+ target_uid = target_doc.id
115
+
116
+ else:
117
+ # 4. Fallback akun lama berdasarkan username
118
+ users_by_username = list(
119
+ db.collection("users")
120
+ .where(
121
+ filter=FieldFilter(
122
+ "username",
123
+ "==",
124
+ user_id_or_token
125
+ )
126
+ )
127
+ .limit(1)
128
+ .stream()
129
+ )
130
+
131
+ if users_by_username:
132
+ target_doc = users_by_username[0]
133
+ target_uid = target_doc.id
134
+
135
+ # Jika dokumen pengguna berhasil ditemukan
136
+ if target_doc is not None and target_doc.exists:
137
  data = target_doc.to_dict() or {}
138
+
139
  display_name = (
140
  data.get("displayName")
141
  or data.get("username")
142
  or data.get("email", "").split("@")[0]
143
  or "Baka"
144
+ )
145
+
146
+ chats_ref = (
147
+ db.collection("users")
148
+ .document(target_uid)
149
+ .collection("chats")
150
+ )
151
+
152
+ docs = (
153
+ chats_ref
154
+ .order_by(
155
+ "id",
156
+ direction=firestore.Query.DESCENDING
157
+ )
158
+ .limit(limit)
159
+ .stream()
160
+ )
161
+
162
  recent_chats = []
163
+
164
+ for chat_doc in docs:
165
+ chat_data = chat_doc.to_dict() or {}
166
+
167
  sender_name = (
168
  display_name
169
+ if chat_data.get("sender") == "user"
170
  else "Mini-chan"
171
  )
172
+
173
+ content = chat_data.get("content", "")
174
+
175
  if content:
176
+ recent_chats.append(
177
+ f"{sender_name}: {content}"
178
+ )
179
+
180
  recent_chats.reverse()
181
  history_text = "\n".join(recent_chats)
182
+
183
  return display_name, history_text, target_uid
184
 
185
+ # Fallback jika pengguna tidak ditemukan
186
+ clean_name = (
187
+ user_id_or_token.split("@")[0]
188
+ if "@" in user_id_or_token
189
+ else "Baka"
190
+ )
191
+
192
  return clean_name, "", user_id_or_token
193
 
194
  except Exception as e:
 
322
  user_data = user_doc.to_dict() or {}
323
  latest_fcm_token = user_data.get("fcm_token")
324
 
325
+ if latest_fcm_token:
 
 
 
 
 
 
326
  await _send_fcm(
327
  latest_fcm_token,
328
  "Pesan dari Mini-chan! 😤",
329
  message
330
  )
331
+ else:
332
+ print(
333
+ f"⏸️ Pengguna {actual_uid} sedang logout "
334
+ f"atau token FCM tidak tersedia. "
335
+ f"Push tidak dikirim, tetapi chat tetap disimpan."
336
+ )
337
 
338
  wib_now = datetime.now(timezone.utc) + timedelta(hours=7)
339
  now_time = wib_now.strftime("%H:%M")