function doGet() { return HtmlService.createHtmlOutputFromFile('index') .setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL) .addMetaTag('viewport', 'width=device-width, initial-scale=1'); } // データベースの簡易取得・保存用ヘルパー function getDB() { var props = PropertiesService.getScriptProperties(); var dbStr = props.getProperty('APP_DB'); if (!dbStr) { var initialDB = { users: { 'curo': { username: 'curo', password: '071011', icon: '', bio: '', following: [], followers: [], isAdmin: true } }, posts: [] // { id, username, type ('image' or 'video'), dataUrl, title, timestamp, likes } }; props.setProperty('APP_DB', JSON.stringify(initialDB)); return initialDB; } return JSON.parse(dbStr); } function saveDB(db) { var props = PropertiesService.getScriptProperties(); props.setProperty('APP_DB', JSON.stringify(db)); } // ログイン処理 function login(username, password) { var db = getDB(); if (db.users[username] && db.users[username].password === password) { return { success: true, user: db.users[username] }; } return { success: false, message: 'ユーザー名またはパスワードが違います。' }; } // 新規登録処理 function register(username, password, icon) { var db = getDB(); if (db.users[username]) { return { success: false, message: 'すでに存在するユーザー名です。' }; } db.users[username] = { username: username, password: password, icon: icon || '', following: [], followers: [], isAdmin: false }; saveDB(db); return { success: true, user: db.users[username] }; } // ユーザー情報取得 function getUser(username) { var db = getDB(); return db.users[username] || null; } // 投稿処理 (1日3本まで、動画は10秒以内などはフロント/バックで制御) function createPost(username, type, dataUrl, title) { var db = getDB(); var today = new Date().toDateString(); // 1日3本までのチェック var userPostsToday = db.posts.filter(function(p) { return p.username === username && new Date(p.timestamp).toDateString() === today; }); if (userPostsToday.length >= 3) { return { success: false, message: '本日の投稿は3本を超えています。' }; } var newPost = { id: 'post_' + Date.now() + '_' + Math.random().toString(36.substr(2, 9)), username: username, type: type, // 'image' or 'video' dataUrl: dataUrl, title: title, timestamp: Date.now(), likes: 0, likedBy: [] }; db.posts.push(newPost); saveDB(db); return { success: true }; } // ホーム画面用データ取得 function getHomeData(username) { var db = getDB(); var todayStr = new Date().toDateString(); // 最近投稿したユーザー5人(重複なし) var sortedPosts = [].concat(db.posts).sort(function(a, b) { return b.timestamp - a.timestamp; }); var recentUsersMap = {}; var recentUsers = []; for (var i = 0; i < sortedPosts.length; i++) { var p = sortedPosts[i]; if (!recentUsersMap[p.username] && recentUsers.length < 5) { recentUsersMap[p.username] = true; var u = db.users[p.username]; if (u) { recentUsers.push({ username: u.username, icon: u.icon }); } } } // 今日のいいねが最も多い投稿5つ var todayPosts = db.posts.filter(function(p) { return new Date(p.timestamp).toDateString() === todayStr; }); todayPosts.sort(function(a, b) { return b.likes - a.likes; }); var topPosts = todayPosts.slice(0, 5); return { recentUsers: recentUsers, topPosts: topPosts }; } // リール用データ取得(全投稿を新しい順など) function getReelsData() { var db = getDB(); var posts = [].concat(db.posts).sort(function(a, b) { return b.timestamp - a.timestamp; }); return posts; } // 検索 function searchUsers(keyword) { var db = getDB(); var results = []; for (var uname in db.users) { if (uname.indexOf(keyword) !== -1) { results.push({ username: uname, icon: db.users[uname].icon }); } } return results; } // フォロー / アンフォロー function toggleFollow(currentUsername, targetUsername) { var db = getDB(); var curr = db.users[currentUsername]; var target = db.users[targetUsername]; if (!curr || !target) return; var idx = curr.following.indexOf(targetUsername); if (idx > -1) { curr.following.splice(idx, 1); var tIdx = target.followers.indexOf(currentUsername); if (tIdx > -1) target.followers.splice(tIdx, 1); } else { curr.following.push(targetUsername); target.followers.push(currentUsername); } saveDB(db); return { following: curr.following, followersCount: target.followers.length }; } // いいねトグル function toggleLike(postId, username) { var db = getDB(); var post = null; for (var i = 0; i < db.posts.length; i++) { if (db.posts[i].id === postId) { post = db.posts[i]; break; } } if (!post) return; if (!post.likedBy) post.likedBy = []; var idx = post.likedBy.indexOf(username); if (idx > -1) { post.likedBy.splice(idx, 1); post.likes = Math.max(0, post.likes - 1); } else { post.likedBy.push(username); post.likes += 1; } saveDB(db); return post.likes; } // 管理者機能:アカウント削除 function deleteAccount(targetUsername) { var db = getDB(); if (db.users[targetUsername]) { delete db.users[targetUsername]; // 投稿も削除 db.posts = db.posts.filter(function(p) { return p.username !== targetUsername; }); saveDB(db); return { success: true }; } return { success: false }; } // 管理者機能:特定ユーザーの指定投稿削除 function deleteUserPosts(targetUsername, postIds) { var db = getDB(); db.posts = db.posts.filter(function(p) { if (p.username === targetUsername && postIds.indexOf(p.id) !== -1) { return false; // 削除対象 } return true; }); saveDB(db); return { success: true }; } インスタ風アプリ

ログイン



新規登録はこちら

新規登録

プロフィール画像 (400KBまで)




ログイン画面へ戻る

ホーム

最近投稿したユーザー (5人)

今日一番いいねされた投稿


投稿一覧