diff --git a/html/src/app.js b/html/src/app.js index ac9d5d37..18323917 100644 --- a/html/src/app.js +++ b/html/src/app.js @@ -8634,6 +8634,12 @@ speechSynthesis.getVoices(); if (!value) { return true; } + if ( + value.startsWith('wrld_') && + String(row.location).toUpperCase().includes(value) + ) { + return true; + } switch (row.type) { case 'GPS': if (String(row.displayName).toUpperCase().includes(value)) { @@ -9257,6 +9263,12 @@ speechSynthesis.getVoices(); if (!value) { return true; } + if ( + value.startsWith('wrld_') && + String(row.location).toUpperCase().includes(value) + ) { + return true; + } switch (row.type) { case 'Location': if (String(row.worldName).toUpperCase().includes(value)) { diff --git a/html/src/repository/database.js b/html/src/repository/database.js index a24e9136..3ef3fd17 100644 --- a/html/src/repository/database.js +++ b/html/src/repository/database.js @@ -1090,8 +1090,102 @@ class Database { return data; } + static async getFeedByInstanceId(instanceId, filters, vipList) { + var feedDatabase = []; + var vipQuery = ''; + if (vipList.length > 0) { + vipQuery = 'AND user_id IN ('; + vipList.forEach((vip, i) => { + vipQuery += `'${vip.replaceAll("'", "''")}'`; + if (i < vipList.length - 1) { + vipQuery += ', '; + } + }); + vipQuery += ')'; + } + var gps = true; + var online = true; + var offline = true; + if (filters.length > 0) { + gps = false; + online = false; + offline = false; + filters.forEach((filter) => { + switch (filter) { + case 'GPS': + gps = true; + break; + case 'Online': + online = true; + break; + case 'Offline': + offline = true; + break; + } + }); + } + if (gps) { + await sqliteService.execute((dbRow) => { + var row = { + rowId: dbRow[0], + created_at: dbRow[1], + userId: dbRow[2], + displayName: dbRow[3], + type: 'GPS', + location: dbRow[4], + worldName: dbRow[5], + previousLocation: dbRow[6], + time: dbRow[7], + groupName: dbRow[8] + }; + feedDatabase.unshift(row); + }, `SELECT * FROM ${Database.userPrefix}_feed_gps WHERE location LIKE '%${instanceId}%' ${vipQuery} ORDER BY id DESC LIMIT ${Database.maxTableSize}`); + } + if (online || offline) { + var query = ''; + if (!online || !offline) { + if (online) { + query = "AND type = 'Online'"; + } else if (offline) { + query = "AND type = 'Offline'"; + } + } + await sqliteService.execute((dbRow) => { + var row = { + rowId: dbRow[0], + created_at: dbRow[1], + userId: dbRow[2], + displayName: dbRow[3], + type: dbRow[4], + location: dbRow[5], + worldName: dbRow[6], + time: dbRow[7], + groupName: dbRow[8] + }; + feedDatabase.unshift(row); + }, `SELECT * FROM ${Database.userPrefix}_feed_online_offline WHERE (location LIKE '%${instanceId}%' ${query}) ${vipQuery} ORDER BY id DESC LIMIT ${Database.maxTableSize}`); + } + var compareByCreatedAt = function (a, b) { + var A = a.created_at; + var B = b.created_at; + if (A < B) { + return -1; + } + if (A > B) { + return 1; + } + return 0; + }; + feedDatabase.sort(compareByCreatedAt); + feedDatabase.splice(0, feedDatabase.length - Database.maxTableSize); + return feedDatabase; + } + async lookupFeedDatabase(search, filters, vipList) { var search = search.replaceAll("'", "''"); + if (search.startsWith('wrld_')) { + return Database.getFeedByInstanceId(search, filters, vipList); + } var vipQuery = ''; if (vipList.length > 0) { vipQuery = 'AND user_id IN ('; @@ -1253,8 +1347,161 @@ class Database { return feedDatabase; } + static async getGameLogByLocation(instanceId, filters) { + var gamelogDatabase = []; + var location = true; + var onplayerjoined = true; + var onplayerleft = true; + var portalspawn = true; + var videoplay = true; + var resourceload_string = true; + var resourceload_image = true; + if (filters.length > 0) { + location = false; + onplayerjoined = false; + onplayerleft = false; + portalspawn = false; + videoplay = false; + resourceload_string = false; + resourceload_image = false; + filters.forEach((filter) => { + switch (filter) { + case 'Location': + location = true; + break; + case 'OnPlayerJoined': + onplayerjoined = true; + break; + case 'OnPlayerLeft': + onplayerleft = true; + break; + case 'PortalSpawn': + portalspawn = true; + break; + case 'VideoPlay': + videoplay = true; + break; + case 'StringLoad': + resourceload_string = true; + break; + case 'ImageLoad': + resourceload_image = true; + break; + } + }); + } + if (location) { + await sqliteService.execute((dbRow) => { + var row = { + rowId: dbRow[0], + created_at: dbRow[1], + type: 'Location', + location: dbRow[2], + worldId: dbRow[3], + worldName: dbRow[4], + time: dbRow[5], + groupName: dbRow[6] + }; + gamelogDatabase.unshift(row); + }, `SELECT * FROM gamelog_location WHERE location LIKE '%${instanceId}%' ORDER BY id DESC LIMIT ${Database.maxTableSize}`); + } + if (onplayerjoined || onplayerleft) { + var query = ''; + if (!onplayerjoined || !onplayerleft) { + if (onplayerjoined) { + query = "AND type = 'OnPlayerJoined'"; + } else if (onplayerleft) { + query = "AND type = 'OnPlayerLeft'"; + } + } + await sqliteService.execute((dbRow) => { + var row = { + rowId: dbRow[0], + created_at: dbRow[1], + type: dbRow[2], + displayName: dbRow[3], + location: dbRow[4], + userId: dbRow[5], + time: dbRow[6] + }; + gamelogDatabase.unshift(row); + }, `SELECT * FROM gamelog_join_leave WHERE (location LIKE '%${instanceId}%' AND user_id != '${Database.userId}') ${query} ORDER BY id DESC LIMIT ${Database.maxTableSize}`); + } + if (portalspawn) { + await sqliteService.execute((dbRow) => { + var row = { + rowId: dbRow[0], + created_at: dbRow[1], + type: 'PortalSpawn', + displayName: dbRow[2], + location: dbRow[3], + userId: dbRow[4], + instanceId: dbRow[5], + worldName: dbRow[6] + }; + gamelogDatabase.unshift(row); + }, `SELECT * FROM gamelog_portal_spawn WHERE location LIKE '%${instanceId}%' ORDER BY id DESC LIMIT ${Database.maxTableSize}`); + } + if (videoplay) { + await sqliteService.execute((dbRow) => { + var row = { + rowId: dbRow[0], + created_at: dbRow[1], + type: 'VideoPlay', + videoUrl: dbRow[2], + videoName: dbRow[3], + videoId: dbRow[4], + location: dbRow[5], + displayName: dbRow[6], + userId: dbRow[7] + }; + gamelogDatabase.unshift(row); + }, `SELECT * FROM gamelog_video_play WHERE location LIKE '%${instanceId}%' ORDER BY id DESC LIMIT ${Database.maxTableSize}`); + } + if (resourceload_string || resourceload_image) { + var checkString = ''; + var checkImage = ''; + if (!resourceload_string) { + checkString = `AND resource_type != 'StringLoad'`; + } + if (!resourceload_image) { + checkString = `AND resource_type != 'ImageLoad'`; + } + await sqliteService.execute((dbRow) => { + var row = { + rowId: dbRow[0], + created_at: dbRow[1], + type: dbRow[3], + resourceUrl: dbRow[2], + location: dbRow[4] + }; + gamelogDatabase.unshift(row); + }, `SELECT * FROM gamelog_resource_load WHERE location LIKE '%${instanceId}%' ${checkString} ${checkImage} ORDER BY id DESC LIMIT ${Database.maxTableSize}`); + } + var compareByCreatedAt = function (a, b) { + var A = a.created_at; + var B = b.created_at; + if (A < B) { + return -1; + } + if (A > B) { + return 1; + } + return 0; + }; + gamelogDatabase.sort(compareByCreatedAt); + gamelogDatabase.splice( + 0, + gamelogDatabase.length - Database.maxTableSize + ); + return gamelogDatabase; + } + async lookupGameLogDatabase(search, filters) { var search = search.replaceAll("'", "''"); + if (search.startsWith('wrld_')) { + return Database.getGameLogByLocation(search, filters); + } var location = true; var onplayerjoined = true; var onplayerleft = true;