diff --git a/app.py b/app.py
index d82c51f0d..bc2cbacf1 100644
--- a/app.py
+++ b/app.py
@@ -1,6 +1,352 @@
-from flask import Flask
+from flask import Flask, render_template_string, request, redirect, session
+from werkzeug.security import generate_password_hash, check_password_hash
+import re
+import json
+import os
+
app = Flask(__name__)
+# システムのセキュリティキー
+app.secret_key = "KASU_NO_ATAMA_SECURE_KEY"
+
+# --- ユーザー情報の保存先(ファイル) ---
+DB_FILE = "users.json"
+
+
+def load_db():
+ if os.path.exists(DB_FILE):
+ with open(DB_FILE, "r", encoding="utf-8") as f:
+ return json.load(f)
+ return {}
+
+
+def save_db(db):
+ with open(DB_FILE, "w", encoding="utf-8") as f:
+ json.dump(db, f, indent=4, ensure_ascii=False)
+
+
+# --- 投稿の保存先(今回はあとで作るので、一時的な仮置き場) ---
+mock_posts = []
+post_id_counter = 1
+
+# --- ログイン画面の見た目(一切変更していません!) ---
+HTML_TEMPLATE = """
+
+
+
+
+ ログイン - カスの頭の配布
+
+
+
+
+
+ {% if msg %}
{{ msg }}
{% endif %}
+
+
+
+
+
+
+
+"""
+
+# --- タイムライン画面の見た目(新機能) ---
+DASHBOARD_TEMPLATE = """
+
+
+
+
+ タイムライン - カスの頭の配布
+
+
+
+
+
+
+
+
+
+
+
+ {% for post in posts|reverse %}
+
+
+
+
+
+
{{ post.content }}
+
+
+
+
+
+
+
+ {% endfor %}
+
+ {% if not posts %}
+
まだ投稿がありません。最初の投稿をしてみましょう!
+ {% endif %}
+
+
+
+"""
+
+# --- システム(裏側の処理) ---
+
+
+@app.route("/", methods=["GET", "POST"])
+def auth():
+ msg = ""
+ msg_type = ""
+ db = load_db()
+
+ if request.method == "POST":
+ action = request.form.get("action")
+ user_id = request.form.get("user_id")
+ password = request.form.get("password")
+
+ if action == "signup":
+ username = request.form.get("username")
+ if len(username) > 12:
+ msg, msg_type = "エラー: ユーザー名が12文字を超過しています。", "error"
+ elif not user_id.startswith("@"):
+ msg, msg_type = "エラー: IDは「@」から始める必要があります。", "error"
+ elif not re.fullmatch(r"[a-zA-Z0-9]+", user_id[1:]):
+ msg, msg_type = "エラー: IDは半角英数字のみ許可されています。", "error"
+ elif user_id in db:
+ msg, msg_type = (
+ "エラー: そのIDは既にシステムに登録されています。",
+ "error",
+ )
+ elif len(password) < 8:
+ msg, msg_type = "エラー: パスワードは最低8文字必要です。", "error"
+ elif not re.fullmatch(r"[!-~]+", password):
+ msg, msg_type = (
+ "エラー: パスワードに不適切な文字が含まれています。",
+ "error",
+ )
+ else:
+ db[user_id] = {
+ "username": username,
+ "password": generate_password_hash(password),
+ }
+ save_db(db)
+ msg, msg_type = (
+ "登録完了: アカウントを作成しました。ログインしてください。",
+ "success",
+ )
+
+ elif action == "login":
+ user = db.get(user_id)
+ if user and check_password_hash(user["password"], password):
+ session["user"] = user_id
+ return redirect("/dashboard")
+ else:
+ msg, msg_type = "エラー: IDまたはパスワードが一致しません。", "error"
+
+ return render_template_string(HTML_TEMPLATE, msg=msg, msg_type=msg_type)
+
+
+@app.route("/dashboard")
+def dashboard():
+ if "user" not in session:
+ return redirect("/")
+
+ # ログイン中のユーザー名を取得
+ db = load_db()
+ current_username = db.get(session["user"], {}).get("username", "Unknown")
+
+ # タイムライン画面を表示
+ return render_template_string(
+ DASHBOARD_TEMPLATE, posts=mock_posts, session=session, username=current_username
+ )
+
+
+@app.route("/add_post", methods=["POST"])
+def add_post():
+ global post_id_counter
+ if "user" not in session:
+ return redirect("/")
+
+ user_id = session["user"]
+ db = load_db()
+ username = db.get(user_id, {}).get("username", "Unknown")
+ content = request.form.get("content")
+
+ # 新しい投稿をリストに追加
+ mock_posts.append(
+ {
+ "id": post_id_counter,
+ "user_id": user_id,
+ "username": username,
+ "content": content,
+ "hearts": 0,
+ "likes": 0,
+ "dislikes": 0,
+ "comments": [],
+ }
+ )
+ post_id_counter += 1
+ return redirect("/dashboard")
+
+
+@app.route("/react//")
+def react(post_id, action):
+ if "user" not in session:
+ return redirect("/")
+
+ # 指定された投稿のリアクション数を増やす
+ for p in mock_posts:
+ if p["id"] == post_id:
+ if action == "heart":
+ p["hearts"] += 1
+ elif action == "like":
+ p["likes"] += 1
+ elif action == "dislike":
+ p["dislikes"] += 1
+ break
+ return redirect("/dashboard")
+
+
+@app.route("/add_comment/", methods=["POST"])
+def add_comment(post_id):
+ if "user" not in session:
+ return redirect("/")
+
+ user_id = session["user"]
+ db = load_db()
+ username = db.get(user_id, {}).get("username", "Unknown")
+ text = request.form.get("comment_text")
+
+ # 指定された投稿にコメントを追加
+ for p in mock_posts:
+ if p["id"] == post_id:
+ p["comments"].append({"username": username, "text": text})
+ break
+ return redirect("/dashboard")
+
+
+@app.route("/logout")
+def logout():
+ session.pop("user", None) # ログアウト処理
+ return redirect("/")
+
-@app.route('/')
-def hello_world():
- return 'Hello, World!'
+if __name__ == "__main__":
+ app.run(debug=True)