sirochild commited on
Commit
8b8ef1f
·
verified ·
1 Parent(s): bd3722f

Upload 2 files

Browse files
Files changed (2) hide show
  1. main_app.py +24 -13
  2. persistent_user_manager.py +57 -38
main_app.py CHANGED
@@ -182,10 +182,20 @@ def run_async(coro):
182
 
183
  def update_background(scene_manager: SceneManager, theme: str):
184
  """現在のテーマに基づいて背景画像を動的に設定するCSSを注入する(重複実行防止)"""
185
- logger.info(f"update_background関数が呼び出されました - テーマ: {theme}")
 
 
 
 
 
 
 
 
 
 
 
186
 
187
- # 背景更新スキップ機能を無効化:常に背景を更新
188
- logger.info(f"背景更新を実行します - テーマ: {theme} (スキップ機能無効)")
189
 
190
  try:
191
  logger.info(f"背景更新を開始します - テーマ: {theme}")
@@ -392,9 +402,12 @@ def update_background(scene_manager: SceneManager, theme: str):
392
  if st.session_state.get("debug_mode", False) and image_url:
393
  st.success(f"🖼️ 背景更新: {theme}")
394
 
395
- # 現在のテーマを記録(参考用のみ)
 
396
  st.session_state.last_background_theme = theme
397
 
 
 
398
  except Exception as e:
399
  logger.error(f"背景更新エラー: {e}")
400
  import traceback
@@ -412,7 +425,11 @@ def update_background(scene_manager: SceneManager, theme: str):
412
  </style>
413
  """
414
  st.markdown(fallback_css, unsafe_allow_html=True)
 
415
  st.session_state.last_background_theme = theme
 
 
 
416
 
417
  # --- ▼▼▼ 1. 初期化処理の一元管理 ▼▼▼ ---
418
 
@@ -1184,10 +1201,8 @@ def render_chat_tab(managers):
1184
  # 背景を更新
1185
  try:
1186
  current_theme = st.session_state.chat['scene_params'].get("theme", "default")
1187
- logger.info(f"チャットタブ背景更新: テーマ '{current_theme}' を適用します")
1188
- logger.info(f"update_background関数を呼び出します...")
1189
  update_background(managers['scene_manager'], current_theme)
1190
- logger.info(f"update_background関数の呼び出しが完了しました")
1191
  except Exception as e:
1192
  logger.error(f"チャットタブ背景更新でエラーが発生: {e}")
1193
  import traceback
@@ -2246,10 +2261,8 @@ Streamlit情報:
2246
 
2247
  # シーン変更時に背景を更新
2248
  try:
2249
- logger.info(f"シーン変更時の背景更新: テーマ '{new_theme}' を適用します")
2250
- logger.info(f"update_background関数を呼び出します...")
2251
  update_background(managers['scene_manager'], new_theme)
2252
- logger.info(f"update_background関数の呼び出しが完了しました")
2253
  except Exception as e:
2254
  logger.error(f"シーン変更時の背景更新でエラーが発生: {e}")
2255
  import traceback
@@ -3002,12 +3015,10 @@ def main():
3002
  # CSS読み込み完了後に背景を更新(初期設定)
3003
  try:
3004
  initial_theme = st.session_state.chat['scene_params'].get('theme', 'default')
3005
- logger.info(f"初期背景設定: テーマ '{initial_theme}' を適用します")
3006
- logger.info(f"update_background関数を呼び出します...")
3007
 
3008
  # 常に背景を更新(CSS読み込み待ちなし)
3009
  update_background(managers['scene_manager'], initial_theme)
3010
- logger.info(f"初期背景設定完了")
3011
 
3012
  except Exception as e:
3013
  logger.error(f"初期背景設定でエラーが発生: {e}")
 
182
 
183
  def update_background(scene_manager: SceneManager, theme: str):
184
  """現在のテーマに基づいて背景画像を動的に設定するCSSを注入する(重複実行防止)"""
185
+ # 重複実行防止: 同じテーマで既に更新済みの場合はスキップ
186
+ current_background_theme = st.session_state.get('current_background_theme', None)
187
+ if current_background_theme == theme:
188
+ logger.debug(f"背景更新スキップ - 既に同じテーマ適用済み: {theme}")
189
+ return
190
+
191
+ logger.info(f"背景更新開始 - テーマ: {theme}")
192
+
193
+ # 背景更新中フラグを設定(重複呼び出し防止)
194
+ if st.session_state.get('background_updating', False):
195
+ logger.debug(f"背景更新中 - スキップ: {theme}")
196
+ return
197
 
198
+ st.session_state.background_updating = True
 
199
 
200
  try:
201
  logger.info(f"背景更新を開始します - テーマ: {theme}")
 
402
  if st.session_state.get("debug_mode", False) and image_url:
403
  st.success(f"🖼️ 背景更新: {theme}")
404
 
405
+ # 現在のテーマを記録(重複実行防止用)
406
+ st.session_state.current_background_theme = theme
407
  st.session_state.last_background_theme = theme
408
 
409
+ logger.info(f"背景更新完了 - テーマ: {theme}")
410
+
411
  except Exception as e:
412
  logger.error(f"背景更新エラー: {e}")
413
  import traceback
 
425
  </style>
426
  """
427
  st.markdown(fallback_css, unsafe_allow_html=True)
428
+ st.session_state.current_background_theme = theme
429
  st.session_state.last_background_theme = theme
430
+ finally:
431
+ # 背景更新中フラグをクリア
432
+ st.session_state.background_updating = False
433
 
434
  # --- ▼▼▼ 1. 初期化処理の一元管理 ▼▼▼ ---
435
 
 
1201
  # 背景を更新
1202
  try:
1203
  current_theme = st.session_state.chat['scene_params'].get("theme", "default")
1204
+ logger.debug(f"チャットタブ背景更新: テーマ '{current_theme}'")
 
1205
  update_background(managers['scene_manager'], current_theme)
 
1206
  except Exception as e:
1207
  logger.error(f"チャットタブ背景更新でエラーが発生: {e}")
1208
  import traceback
 
2261
 
2262
  # シーン変更時に背景を更新
2263
  try:
2264
+ logger.debug(f"シーン変更時の背景更新: テーマ '{new_theme}'")
 
2265
  update_background(managers['scene_manager'], new_theme)
 
2266
  except Exception as e:
2267
  logger.error(f"シーン変更時の背景更新でエラーが発生: {e}")
2268
  import traceback
 
3015
  # CSS読み込み完了後に背景を更新(初期設定)
3016
  try:
3017
  initial_theme = st.session_state.chat['scene_params'].get('theme', 'default')
3018
+ logger.debug(f"初期背景設定: テーマ '{initial_theme}'")
 
3019
 
3020
  # 常に背景を更新(CSS読み込み待ちなし)
3021
  update_background(managers['scene_manager'], initial_theme)
 
3022
 
3023
  except Exception as e:
3024
  logger.error(f"初期背景設定でエラーが発生: {e}")
persistent_user_manager.py CHANGED
@@ -110,47 +110,66 @@ class PersistentUserManager:
110
  ユーザーID
111
  """
112
  try:
113
- # フルリセット時以外で、既にセッション状態にuser_idがある場合はそれを使用
114
- if not force_reset and 'user_id' in st.session_state:
115
- existing_id = st.session_state.user_id
116
- if existing_id and self._is_valid_uuid(existing_id):
117
- logger.debug(f"セッション状態からユーザーID使用: {existing_id[:8]}...")
118
- return existing_id
119
-
120
- # Cookie管理システムを初期化(ブラウザごとに一度だけ)
121
- self._ensure_cookie_manager(force_init=force_reset)
122
-
123
- # 1. CookieからユーザーIDを取得(最優先)
124
- user_id = self._get_user_id_from_cookie()
125
-
126
- if user_id and self._is_valid_user_id(user_id):
127
- # 有効なCookieベースのユーザーIDが存在
128
- self._update_user_access_time(user_id)
129
- st.session_state.user_id = user_id # セッション状態に保存
130
- logger.info(f"Cookie認証成功: {user_id[:8]}...")
131
- return user_id
132
-
133
- # 2. Cookieが無効または存在しない場合は新規作成
134
- if force_reset or not user_id:
135
- user_id = self._create_new_user_with_cookie()
136
- logger.info(f"新規Cookie認証ユーザー作成: {user_id[:8]}...")
137
- return user_id
138
-
139
- # 3. 最終フォールバック(Cookieが無効だが何らかのIDがある場合)
140
- if user_id and self._is_valid_uuid(user_id):
141
- # UUIDとして有効だが、ユーザーファイルが存在しない場合は新規作成
142
- user_id = self._create_new_user_with_cookie()
143
- logger.info(f"フォールバック新規ユーザー作成: {user_id[:8]}...")
144
- return user_id
145
-
146
- # 4. 完全フォールバック(Cookie無効時)
147
- logger.warning("Cookie認証失敗 - 一時的なセッションIDを使用")
148
- temp_id = str(uuid.uuid4())
149
- st.session_state.user_id = temp_id
150
- return temp_id
151
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
  except Exception as e:
153
  logger.error(f"Cookie認証エラー: {e}")
 
 
154
  # 完全フォールバック: 一時的なIDを生成(Cookieに保存しない)
155
  temp_id = str(uuid.uuid4())
156
  st.session_state.user_id = temp_id
 
110
  ユーザーID
111
  """
112
  try:
113
+ # 重複呼び出し防止: 処理中フラグをチェック
114
+ if st.session_state.get('user_id_processing', False):
115
+ logger.debug("ユーザーID取得処理中 - 待機")
116
+ # 既存のuser_idがあればそれを返す
117
+ if 'user_id' in st.session_state:
118
+ return st.session_state.user_id
119
+ # なければ一時的なIDを返す
120
+ return f"temp_{id(st.session_state)}"
121
+
122
+ # 処理中フラグを設定
123
+ st.session_state.user_id_processing = True
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
124
 
125
+ try:
126
+ # フルリセット時以外で、既にセッション状態にuser_idがある場合はそれを使用
127
+ if not force_reset and 'user_id' in st.session_state:
128
+ existing_id = st.session_state.user_id
129
+ if existing_id and self._is_valid_uuid(existing_id):
130
+ logger.debug(f"セッション状態からユーザーID使用: {existing_id[:8]}...")
131
+ return existing_id
132
+
133
+ # Cookie管理システムを初期化(ブラウザごとに一度だけ)
134
+ self._ensure_cookie_manager(force_init=force_reset)
135
+
136
+ # 1. CookieからユーザーIDを取得(最優先)
137
+ user_id = self._get_user_id_from_cookie()
138
+
139
+ if user_id and self._is_valid_user_id(user_id):
140
+ # 有効なCookieベースのユーザーIDが存在
141
+ self._update_user_access_time(user_id)
142
+ st.session_state.user_id = user_id # セッション状態に保存
143
+ logger.info(f"Cookie認証成功: {user_id[:8]}...")
144
+ return user_id
145
+
146
+ # 2. Cookieが無効または存在しない場合は新規作成
147
+ if force_reset or not user_id:
148
+ user_id = self._create_new_user_with_cookie()
149
+ logger.info(f"新規Cookie認証ユーザー作成: {user_id[:8]}...")
150
+ return user_id
151
+
152
+ # 3. 最終フォールバック(Cookieが無効だが何らかのIDがある場合)
153
+ if user_id and self._is_valid_uuid(user_id):
154
+ # UUIDとして有効だが、ユーザーファイルが存在しない場合は新規作成
155
+ user_id = self._create_new_user_with_cookie()
156
+ logger.info(f"フォールバック新規ユーザー作成: {user_id[:8]}...")
157
+ return user_id
158
+
159
+ # 4. 完全フォールバック(Cookie無効時)
160
+ logger.warning("Cookie認証失敗 - 一時的なセッションIDを使用")
161
+ temp_id = str(uuid.uuid4())
162
+ st.session_state.user_id = temp_id
163
+ return temp_id
164
+
165
+ finally:
166
+ # 処理中フラグをクリア
167
+ st.session_state.user_id_processing = False
168
+
169
  except Exception as e:
170
  logger.error(f"Cookie認証エラー: {e}")
171
+ # 処理中フラグをクリア
172
+ st.session_state.user_id_processing = False
173
  # 完全フォールバック: 一時的なIDを生成(Cookieに保存しない)
174
  temp_id = str(uuid.uuid4())
175
  st.session_state.user_id = temp_id