diff --git a/html/src/app.js b/html/src/app.js
index b3af9f65..4086d680 100644
--- a/html/src/app.js
+++ b/html/src/app.js
@@ -4172,7 +4172,7 @@ speechSynthesis.getVoices();
) {
var joiningMap = [];
var bias = new Date(Date.now() - 120000).toJSON(); // 2 minutes
- var feedTable = this.feedTable.data;
+ var feedTable = this.feedSessionTable;
for (var i = feedTable.length - 1; i > -1; i--) {
var ctx = feedTable[i];
if (ctx.created_at < bias) {
@@ -4197,7 +4197,7 @@ speechSynthesis.getVoices();
continue;
}
var joining = true;
- var gameLogTable = this.gameLogTable.data;
+ var gameLogTable = this.gameLogSessionTable;
for (var k = gameLogTable.length - 1; k > -1; k--) {
var gameLogItem = gameLogTable[k];
if (
@@ -4264,7 +4264,7 @@ speechSynthesis.getVoices();
$app.methods.updateSharedFeedGameLog = function (forceUpdate) {
// Location, OnPlayerJoined, OnPlayerLeft
- var {data} = this.gameLogTable;
+ var data = this.gameLogSessionTable;
var i = data.length;
if (i > 0) {
if (
@@ -4466,7 +4466,7 @@ speechSynthesis.getVoices();
$app.methods.updateSharedFeedFeedTable = function (forceUpdate) {
// GPS, Online, Offline, Status, Avatar
- var {data} = this.feedTable;
+ var data = this.feedSessionTable;
var i = data.length;
if (i > 0) {
if (
@@ -6884,12 +6884,11 @@ speechSynthesis.getVoices();
// App: Feed
- $app.methods.feedSearch = function (row, filter) {
- var {value} = filter;
+ $app.methods.feedSearch = function (row) {
+ var value = this.feedTable.search.toUpperCase();
if (!value) {
return true;
}
- value = value.toUpperCase();
switch (row.type) {
case 'GPS':
if (String(row.displayName).toUpperCase().includes(value)) {
@@ -6919,6 +6918,9 @@ speechSynthesis.getVoices();
if (String(row.displayName).toUpperCase().includes(value)) {
return true;
}
+ if (String(row.status).toUpperCase().includes(value)) {
+ return true;
+ }
if (
String(row.statusDescription).toUpperCase().includes(value)
) {
@@ -6937,28 +6939,17 @@ speechSynthesis.getVoices();
return true;
};
+ $app.data.tablePageSize = 10;
+ if (configRepository.getInt('VRCX_tablePageSize')) {
+ $app.data.tablePageSize = configRepository.getInt('VRCX_tablePageSize');
+ }
+
$app.data.feedTable = {
data: [],
- filters: [
- {
- prop: 'type',
- value: [],
- filterFn: (row, filter) =>
- filter.value.some((v) => v === row.type)
- },
- {
- prop: 'displayName',
- value: '',
- filterFn: (row, filter) => $app.feedSearch(row, filter)
- },
- {
- prop: 'userId',
- value: false,
- filterFn: (row, filter) =>
- !filter.value ||
- API.cachedFavoritesByObjectId.has(row.userId)
- }
- ],
+ search: '',
+ vip: false,
+ loading: false,
+ filter: [],
tableProps: {
stripe: true,
size: 'mini',
@@ -6967,20 +6958,58 @@ speechSynthesis.getVoices();
order: 'descending'
}
},
- pageSize: 10,
+ pageSize: $app.data.tablePageSize,
paginationProps: {
small: true,
layout: 'sizes,prev,pager,next,total',
- pageSizes: [10, 25, 50, 100]
+ pageSizes: [10, 15, 25, 50, 100]
}
};
+ $app.data.feedSessionTable = [];
+
+ $app.methods.feedTableLookup = async function () {
+ configRepository.setString(
+ 'VRCX_feedTableFilters',
+ JSON.stringify(this.feedTable.filter)
+ );
+ configRepository.setBool('VRCX_feedTableVIPFilter', this.feedTable.vip);
+ this.feedTable.loading = true;
+ var vipList = [];
+ if (this.feedTable.vip) {
+ vipList = this.getUserVipList();
+ }
+ this.feedTable.data = await database.lookupFeedDatabase(
+ this.feedTable.search,
+ this.feedTable.filter,
+ vipList
+ );
+ this.feedTable.loading = false;
+ };
+
+ $app.methods.getUserVipList = function () {
+ var vipList = [];
+ API.cachedFavorites.forEach((favorite) => {
+ if (favorite.type === 'friend') {
+ vipList.push(favorite.favoriteId);
+ }
+ });
+ return vipList;
+ };
+
API.$on('LOGIN', async function (args) {
$app.feedTable.data = [];
+ $app.feedSessionTable = [];
$app.friendLogInitStatus = false;
await database.initUserTables(args.json.id);
- $app.feedTable.data = await database.getFeedDatabase();
- $app.sweepFeed();
+ // eslint-disable-next-line require-atomic-updates
+ $app.gameLogTable.data = await database.lookupGameLogDatabase(
+ $app.gameLogTable.search,
+ $app.gameLogTable.filter
+ );
+ // eslint-disable-next-line require-atomic-updates
+ $app.feedSessionTable = await database.getFeedDatabase();
+ $app.feedTableLookup();
// eslint-disable-next-line require-atomic-updates
$app.notificationTable.data = await database.getNotifications();
if (configRepository.getBool(`friendLogInit_${args.json.id}`)) {
@@ -6989,9 +7018,7 @@ speechSynthesis.getVoices();
await $app.initFriendLog(args.json.id);
}
this.getAuth();
-
$app.updateSharedFeed(true);
-
if ($app.isGameRunning) {
$app.loadPlayerList();
}
@@ -7004,7 +7031,7 @@ speechSynthesis.getVoices();
});
$app.methods.loadPlayerList = function () {
- var {data} = this.gameLogTable;
+ var data = this.gameLogSessionTable;
if (data.length === 0) {
return;
}
@@ -7180,10 +7207,26 @@ speechSynthesis.getVoices();
});
$app.methods.addFeed = function (feed) {
+ this.queueFeedNoty(feed);
+ this.feedSessionTable.push(feed);
+ if (
+ this.feedTable.filter.length > 0 &&
+ !this.feedTable.filter.includes(feed.type)
+ ) {
+ return;
+ }
+ if (
+ this.feedTable.vip &&
+ !API.cachedFavoritesByObjectId.has(feed.userId)
+ ) {
+ return;
+ }
+ if (!this.feedSearch(feed)) {
+ return;
+ }
this.feedTable.data.push(feed);
this.sweepFeed();
this.updateSharedFeed(false);
- this.queueFeedNoty(feed);
this.notifyMenu('feed');
};
@@ -7238,18 +7281,22 @@ speechSynthesis.getVoices();
$app.methods.sweepFeed = function () {
var {data} = this.feedTable;
var j = data.length;
- if (j > 5000) {
- data.splice(0, j - 5000);
+ if (j > this.maxTableSize) {
+ data.splice(0, j - this.maxTableSize);
}
- var limit = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toJSON();
+
+ var date = new Date();
+ date.setDate(date.getDate() - 1); // 24 hour limit
+ var limit = date.toJSON();
var i = 0;
- while (i < j && data[i].created_at < limit) {
+ var k = this.feedSessionTable.length;
+ while (i < k && this.feedSessionTable[i].created_at < limit) {
++i;
}
- if (i === j) {
- this.feedTable.data = [];
+ if (i === k) {
+ this.feedSessionTable = [];
} else if (i) {
- data.splice(0, i);
+ this.feedSessionTable.splice(0, i);
}
};
@@ -7276,12 +7323,7 @@ speechSynthesis.getVoices();
time
};
database.addGamelogJoinLeaveToDatabase(entry);
- this.gameLogTable.data.push(entry);
- }
- if (playerList.length > 0) {
- this.updateSharedFeed(false);
- this.notifyMenu('gameLog');
- this.sweepGameLog();
+ this.addGameLog(entry);
}
if (this.lastLocation.date !== 0) {
var timeLocation = new Date().getTime() - this.lastLocation.date;
@@ -7328,12 +7370,11 @@ speechSynthesis.getVoices();
this.updateDiscord();
};
- $app.methods.gameLogSearch = function (row, filter) {
- var {value} = filter;
+ $app.methods.gameLogSearch = function (row) {
+ var value = this.gameLogTable.search.toUpperCase();
if (!value) {
return true;
}
- value = value.toUpperCase();
switch (row.type) {
case 'Location':
if (String(row.worldName).toUpperCase().includes(value)) {
@@ -7358,11 +7399,11 @@ speechSynthesis.getVoices();
return true;
}
return false;
- case 'AvatarChange':
- if (String(row.name).toUpperCase().includes(value)) {
- return true;
- }
- return false;
+ // case 'AvatarChange':
+ // if (String(row.name).toUpperCase().includes(value)) {
+ // return true;
+ // }
+ // return false;
case 'Event':
if (String(row.data).toUpperCase().includes(value)) {
return true;
@@ -7385,33 +7426,9 @@ speechSynthesis.getVoices();
$app.data.gameLogTable = {
data: [],
- lastEntryDate: '',
- filters: [
- {
- prop: 'type',
- value: [],
- filterFn: (row, filter) =>
- filter.value.some((v) => v === row.type)
- },
- {
- prop: 'displayName',
- value: '',
- filterFn: (row, filter) => $app.gameLogSearch(row, filter)
- },
- {
- prop: 'displayName',
- value: true,
- filterFn: (row) =>
- row.displayName !== API.currentUser.displayName
- },
- {
- prop: 'type',
- value: true,
- filterFn: (row) =>
- row.type !== 'Notification' &&
- row.type !== 'LocationDestination'
- }
- ],
+ loading: false,
+ search: '',
+ filter: [],
tableProps: {
stripe: true,
size: 'mini',
@@ -7420,14 +7437,54 @@ speechSynthesis.getVoices();
order: 'descending'
}
},
- pageSize: 10,
+ pageSize: $app.data.tablePageSize,
paginationProps: {
small: true,
layout: 'sizes,prev,pager,next,total',
- pageSizes: [10, 25, 50, 100]
+ pageSizes: [10, 15, 25, 50, 100]
}
};
+ $app.data.gameLogSessionTable = [];
+
+ $app.methods.gameLogTableLookup = async function () {
+ configRepository.setString(
+ 'VRCX_gameLogTableFilters',
+ JSON.stringify(this.gameLogTable.filter)
+ );
+ this.gameLogTable.loading = true;
+ this.gameLogTable.data = await database.lookupGameLogDatabase(
+ this.gameLogTable.search,
+ this.gameLogTable.filter
+ );
+ this.gameLogTable.loading = false;
+ };
+
+ $app.methods.addGameLog = function (entry) {
+ this.gameLogSessionTable.push(entry);
+ if (
+ this.gameLogTable.filter.length > 0 &&
+ !this.gameLogTable.filter.includes(entry.type)
+ ) {
+ return;
+ }
+ if (!this.gameLogSearch(entry)) {
+ return;
+ }
+ if (
+ entry.type === 'LocationDestination' ||
+ (entry.userId === API.currentUser.id &&
+ (entry.type === 'OnPlayerJoined' ||
+ entry.type === 'OnPlayerLeft'))
+ ) {
+ return;
+ }
+ this.gameLogTable.data.push(entry);
+ this.sweepGameLog();
+ this.updateSharedFeed(false);
+ this.notifyMenu('gameLog');
+ };
+
$app.methods.resetGameLog = async function () {
await gameLogService.reset();
this.gameLogTable.data = [];
@@ -7437,18 +7494,22 @@ speechSynthesis.getVoices();
$app.methods.sweepGameLog = function () {
var {data} = this.gameLogTable;
var j = data.length;
- if (j > 5000) {
- data.splice(0, j - 5000);
+ if (j > this.maxTableSize) {
+ data.splice(0, j - this.maxTableSize);
}
- var limit = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toJSON();
+
+ var date = new Date();
+ date.setDate(date.getDate() - 1); // 24 hour limit
+ var limit = date.toJSON();
var i = 0;
- while (i < j && data[i].created_at < limit) {
+ var k = this.gameLogSessionTable.length;
+ while (i < k && this.gameLogSessionTable[i].created_at < limit) {
++i;
}
- if (i === j) {
- this.gameLogTable.data = [];
+ if (i === k) {
+ this.gameLogSessionTable = [];
} else if (i) {
- data.splice(0, i);
+ this.gameLogSessionTable.splice(0, i);
}
};
@@ -7469,14 +7530,9 @@ speechSynthesis.getVoices();
$app.methods.getGameLogTable = async function () {
await database.initTables();
- this.gameLogTable.data = await database.getGamelogDatabase();
- this.sweepGameLog();
- var length = this.gameLogTable.data.length;
- if (length > 1) {
- this.updateGameLog(this.gameLogTable.data[length - 1].created_at);
- } else {
- this.updateGameLog('1970-01-01');
- }
+ this.gameLogSessionTable = await database.getGamelogDatabase();
+ var dateTill = await database.getLastDateGameLogDatabase();
+ this.updateGameLog(dateTill);
};
$app.methods.updateGameLog = async function (dateTill) {
@@ -7654,12 +7710,12 @@ speechSynthesis.getVoices();
}
return;
case 'notification':
- var entry = {
- created_at: gameLog.dt,
- type: 'Notification',
- data: gameLog.json
- };
- break;
+ // var entry = {
+ // created_at: gameLog.dt,
+ // type: 'Notification',
+ // data: gameLog.json
+ // };
+ return;
case 'event':
var entry = {
created_at: gameLog.dt,
@@ -7671,10 +7727,7 @@ speechSynthesis.getVoices();
}
if (pushToTable && entry) {
this.queueGameLogNoty(entry);
- this.gameLogTable.data.push(entry);
- this.updateSharedFeed(false);
- this.notifyMenu('gameLog');
- this.sweepGameLog();
+ this.addGameLog(entry);
}
};
@@ -7741,10 +7794,7 @@ speechSynthesis.getVoices();
if (pushToTable) {
this.setNowPlaying(entry);
this.queueGameLogNoty(entry);
- this.gameLogTable.data.push(entry);
- this.updateSharedFeed(false);
- this.notifyMenu('gameLog');
- this.sweepGameLog();
+ this.addGameLog(entry);
}
database.addGamelogVideoPlayToDatabase(entry);
}
@@ -7811,10 +7861,7 @@ speechSynthesis.getVoices();
if (pushToTable) {
this.setNowPlaying(entry);
this.queueGameLogNoty(entry);
- this.gameLogTable.data.push(entry);
- this.updateSharedFeed(false);
- this.notifyMenu('gameLog');
- this.sweepGameLog();
+ this.addGameLog(entry);
}
database.addGamelogVideoPlayToDatabase(entry);
}
@@ -8636,11 +8683,11 @@ speechSynthesis.getVoices();
order: 'descending'
}
},
- pageSize: 10,
+ pageSize: $app.data.tablePageSize,
paginationProps: {
small: true,
layout: 'sizes,prev,pager,next,total',
- pageSizes: [10, 25, 50, 100]
+ pageSizes: [10, 15, 25, 50, 100]
}
};
@@ -8917,11 +8964,11 @@ speechSynthesis.getVoices();
order: 'descending'
}
},
- pageSize: 10,
+ pageSize: $app.data.tablePageSize,
paginationProps: {
small: true,
layout: 'sizes,prev,pager,next,total',
- pageSizes: [10, 25, 50, 100]
+ pageSizes: [10, 15, 25, 50, 100]
}
};
@@ -9001,11 +9048,11 @@ speechSynthesis.getVoices();
order: 'descending'
}
},
- pageSize: 10,
+ pageSize: $app.data.tablePageSize,
paginationProps: {
small: true,
layout: 'sizes,prev,pager,next,total',
- pageSizes: [10, 25, 50, 100]
+ pageSizes: [10, 15, 25, 50, 100]
}
};
@@ -9141,18 +9188,6 @@ speechSynthesis.getVoices();
// Save Table Filters
$app.methods.saveTableFilters = function () {
- configRepository.setString(
- 'VRCX_feedTableFilters',
- JSON.stringify(this.feedTable.filters[0].value)
- );
- configRepository.setBool(
- 'VRCX_feedTableVIPFilter',
- this.feedTable.filters[2].value
- );
- configRepository.setString(
- 'VRCX_gameLogTableFilters',
- JSON.stringify(this.gameLogTable.filters[0].value)
- );
configRepository.setString(
'VRCX_friendLogTableFilters',
JSON.stringify(this.friendLogTable.filters[0].value)
@@ -9167,15 +9202,15 @@ speechSynthesis.getVoices();
);
};
if (configRepository.getString('VRCX_feedTableFilters')) {
- $app.data.feedTable.filters[0].value = JSON.parse(
+ $app.data.feedTable.filter = JSON.parse(
configRepository.getString('VRCX_feedTableFilters')
);
- $app.data.feedTable.filters[2].value = configRepository.getBool(
+ $app.data.feedTable.vip = configRepository.getBool(
'VRCX_feedTableVIPFilter'
);
}
if (configRepository.getString('VRCX_gameLogTableFilters')) {
- $app.data.gameLogTable.filters[0].value = JSON.parse(
+ $app.data.gameLogTable.filter = JSON.parse(
configRepository.getString('VRCX_gameLogTableFilters')
);
}
@@ -9349,6 +9384,8 @@ speechSynthesis.getVoices();
'VRCX_autoUpdateVRCX'
);
$app.data.branch = configRepository.getString('VRCX_branch');
+ $app.data.maxTableSize = configRepository.getInt('VRCX_maxTableSize');
+ database.setmaxTableSize($app.data.maxTableSize);
$app.methods.saveOpenVROption = function () {
configRepository.setBool('openVR', this.openVR);
configRepository.setBool('openVRAlways', this.openVRAlways);
@@ -9547,6 +9584,11 @@ speechSynthesis.getVoices();
if (!configRepository.getString('VRCX_lastVRCXVersion')) {
configRepository.setString('VRCX_lastVRCXVersion', appVersion);
}
+ if (!configRepository.getInt('VRCX_maxTableSize')) {
+ $app.data.maxTableSize = 1000;
+ configRepository.getInt('VRCX_maxTableSize', $app.data.maxTableSize);
+ database.setmaxTableSize($app.data.maxTableSize);
+ }
if (!configRepository.getString('sharedFeedFilters')) {
var sharedFeedFilters = {
noty: {
@@ -10180,6 +10222,38 @@ speechSynthesis.getVoices();
});
};
+ $app.methods.promptMaxTableSizeDialog = function () {
+ this.$prompt('Enter a number', 'Max Table Size', {
+ distinguishCancelAndClose: true,
+ confirmButtonText: 'Save',
+ cancelButtonText: 'Cancel',
+ inputValue: this.maxTableSize,
+ inputPattern: /\d+$/,
+ inputErrorMessage: 'Valid number is required',
+ callback: (action, instance) => {
+ if (action === 'confirm' && instance.inputValue) {
+ this.maxTableSize = instance.inputValue;
+ configRepository.setString(
+ 'VRCX_maxTableSize',
+ this.maxTableSize
+ );
+ database.setmaxTableSize(this.maxTableSize);
+ this.feedTableLookup();
+ }
+ }
+ });
+ };
+
+ $app.methods.setTablePageSize = function (pageSize) {
+ this.tablePageSize = pageSize;
+ this.feedTable.pageSize = pageSize;
+ this.gameLogTable.pageSize = pageSize;
+ this.friendLogTable.pageSize = pageSize;
+ this.playerModerationTable.pageSize = pageSize;
+ this.notificationTable.pageSize = pageSize;
+ configRepository.setInt('VRCX_tablePageSize', pageSize);
+ };
+
// App: Dialog
var adjustDialogZ = (el) => {
diff --git a/html/src/index.pug b/html/src/index.pug
index d23cbe19..7add0d6e 100644
--- a/html/src/index.pug
+++ b/html/src/index.pug
@@ -70,15 +70,15 @@ html
//- feed
.x-container(v-show="$refs.menu && $refs.menu.activeIndex === 'feed'")
- data-tables(v-bind="feedTable")
+ data-tables(v-bind="feedTable" v-loading="feedTable.loading")
template(#tool)
div(style="margin:0 0 10px;display:flex;align-items:center")
div(style="flex:none;margin-right:10px")
el-tooltip(placement="bottom" content="Filter VIP only" :disabled="hideTooltips")
- el-switch(v-model="feedTable.filters[2].value" @change="saveTableFilters" active-color="#13ce66")
- el-select(v-model="feedTable.filters[0].value" @change="saveTableFilters" multiple clearable collapse-tags style="flex:1" placeholder="Filter")
+ el-switch(v-model="feedTable.vip" @change="feedTableLookup" active-color="#13ce66")
+ el-select(v-model="feedTable.filter" @change="feedTableLookup" multiple clearable collapse-tags style="flex:1" placeholder="Filter")
el-option(v-once v-for="type in ['GPS', 'Online', 'Offline', 'Status', 'Avatar']" :key="type" :label="type" :value="type")
- el-input(v-model="feedTable.filters[1].value" placeholder="Search" style="flex:none;width:150px;margin:0 10px")
+ el-input(v-model="feedTable.search" placeholder="Search" @keyup.native.13="feedTableLookup" @change="feedTableLookup" clearable style="flex:none;width:150px;margin:0 10px")
el-tooltip(placement="bottom" content="Clear feed" :disabled="hideTooltips")
el-button(type="default" @click="clearFeed()" icon="el-icon-delete" circle style="flex:none")
el-table-column(type="expand" width="20")
@@ -180,12 +180,12 @@ html
//- gameLog
.x-container(v-show="$refs.menu && $refs.menu.activeIndex === 'gameLog'")
- data-tables(v-bind="gameLogTable")
+ data-tables(v-bind="gameLogTable" v-loading="gameLogTable.loading")
template(#tool)
div(style="margin:0 0 10px;display:flex;align-items:center")
- el-select(v-model="gameLogTable.filters[0].value" @change="saveTableFilters" multiple clearable collapse-tags style="flex:1" placeholder="Filter")
+ el-select(v-model="gameLogTable.filter" @change="gameLogTableLookup" multiple clearable collapse-tags style="flex:1" placeholder="Filter")
el-option(v-once v-for="type in ['Location', 'OnPlayerJoined', 'OnPlayerLeft', 'PortalSpawn', 'AvatarChange', 'Event', 'VideoPlay']" :key="type" :label="type" :value="type")
- el-input(v-model="gameLogTable.filters[1].value" placeholder="Search" style="flex:none;width:150px;margin:0 10px")
+ el-input(v-model="gameLogTable.search" placeholder="Search" @keyup.native.13="gameLogTableLookup" @change="gameLogTableLookup" clearable style="flex:none;width:150px;margin:0 10px")
//- el-tooltip(placement="bottom" content="Reload game log" :disabled="hideTooltips")
//- el-button(type="default" @click="resetGameLog" icon="el-icon-refresh" circle style="flex:none")
el-table-column(label="Date" prop="created_at" sortable="custom" width="90")
@@ -724,7 +724,7 @@ html
span.name Support
span.extra https://vrcx.pypy.moe/discord
div.options-container
- span.sub-header VRCX Updater
+ span.header VRCX Updater
div.options-container-item
el-button(size="small" icon="el-icon-upload" @click="showVRCXUpdateDialog()") Check for update
div.options-container-item
@@ -749,6 +749,14 @@ html
div.options-container-item
span.name Disable Tooltips
el-switch(v-model="hideTooltips" @change="saveOpenVROption")
+ div.options-container-item
+ el-button(size="small" icon="el-icon-notebook-1" @click="promptMaxTableSizeDialog") Table Max Size
+ div.options-container-item
+ el-dropdown(@click.native.stop trigger="click" size="small")
+ el-button(size="mini")
+ span Page Size: {{ tablePageSize }} #[i.el-icon-arrow-down.el-icon--right]
+ el-dropdown-menu(#default="dropdown")
+ el-dropdown-item(v-for="(number) in [10, 15, 25, 50, 100]" v-text="number" @click.native="setTablePageSize(number)")
div.options-container
span.header Side Panel
br
@@ -815,6 +823,8 @@ html
span * Only works when VRChat is running.
div.options-container-item
span.name Enable
+ el-tooltip(placement="top" style="margin-left:5px" content="Recommended to disable Rich Presence in VRChat config.json below to stop it from conflicting")
+ i.el-icon-warning
el-switch(v-model="discordActive" @change="saveDiscordOption")
div.options-container-item
span.name Instance type/player count
@@ -903,7 +913,7 @@ html
div.options-container-item
span.name TTS Voice
el-dropdown(@command="(voice) => changeTTSVoice(voice)" trigger="click" size="small")
- el-button(size="mini" :disabled="!notificationTTS")
+ el-button(size="mini" :disabled="notificationTTS === 'Never'")
span {{ TTSvoices[notificationTTSVoice].name }} #[i.el-icon-arrow-down.el-icon--right]
el-dropdown-menu(#default="dropdown")
el-dropdown-item(v-if="voice" v-for="(voice, index) in TTSvoices" :key="index" v-text="voice.name" :command="index")
@@ -986,7 +996,7 @@ html
div.options-container-item
el-button(size="small" icon="el-icon-tickets" @click="showConsole") Show Console
div.options-container
- span.header SQLite Table Size
+ span.sub-header SQLite Table Size
div.options-container-item
el-button(size="small" icon="el-icon-refresh" @click="getSqliteTableSizes") Refresh
div.options-container-item
@@ -1412,7 +1422,7 @@ html
el-tooltip(placement="top" content="Refresh player count" :disabled="hideTooltips")
el-button(@click="refreshInstancePlayerCount(room.$location.tag)" size="mini" icon="el-icon-refresh" style="margin-left:5px" circle)
span(v-if="room.occupants" style="margin-left:5px") {{ room.occupants }} #[template(v-if="room.friendCount > 0") ({{ room.friendCount }})]
- .x-friend-list(style="margin:10px 0" v-if="room.$location.userId || room.users.length")
+ .x-friend-list(style="margin:10px 0;max-height:unset" v-if="room.$location.userId || room.users.length")
.x-friend-item(v-if="room.$location.userId" @click="showUserDialog(room.$location.userId)" class="x-friend-item-border")
template(v-if="room.$location.user")
.avatar(:class="userStatusClass(room.$location.user)")
diff --git a/html/src/repository/database.js b/html/src/repository/database.js
index fca32931..1f1ca942 100644
--- a/html/src/repository/database.js
+++ b/html/src/repository/database.js
@@ -1,28 +1,33 @@
import sqliteService from '../service/sqlite.js';
class Database {
+ setmaxTableSize(limit) {
+ Database.maxTableSize = limit;
+ }
+
async initUserTables(userId) {
- Database.userId = userId.replaceAll('-', '').replaceAll('_', '');
+ Database.userId = userId;
+ Database.userPrefix = userId.replaceAll('-', '').replaceAll('_', '');
await sqliteService.executeNonQuery(
- `CREATE TABLE IF NOT EXISTS ${Database.userId}_feed_gps (id INTEGER PRIMARY KEY, created_at TEXT, user_id TEXT, display_name TEXT, location TEXT, world_name TEXT, previous_location TEXT, time INTEGER)`
+ `CREATE TABLE IF NOT EXISTS ${Database.userPrefix}_feed_gps (id INTEGER PRIMARY KEY, created_at TEXT, user_id TEXT, display_name TEXT, location TEXT, world_name TEXT, previous_location TEXT, time INTEGER)`
);
await sqliteService.executeNonQuery(
- `CREATE TABLE IF NOT EXISTS ${Database.userId}_feed_status (id INTEGER PRIMARY KEY, created_at TEXT, user_id TEXT, display_name TEXT, status TEXT, status_description TEXT, previous_status TEXT, previous_status_description TEXT)`
+ `CREATE TABLE IF NOT EXISTS ${Database.userPrefix}_feed_status (id INTEGER PRIMARY KEY, created_at TEXT, user_id TEXT, display_name TEXT, status TEXT, status_description TEXT, previous_status TEXT, previous_status_description TEXT)`
);
await sqliteService.executeNonQuery(
- `CREATE TABLE IF NOT EXISTS ${Database.userId}_feed_avatar (id INTEGER PRIMARY KEY, created_at TEXT, user_id TEXT, display_name TEXT, owner_id TEXT, avatar_name TEXT, current_avatar_image_url TEXT, current_avatar_thumbnail_image_url TEXT, previous_current_avatar_image_url TEXT, previous_current_avatar_thumbnail_image_url TEXT)`
+ `CREATE TABLE IF NOT EXISTS ${Database.userPrefix}_feed_avatar (id INTEGER PRIMARY KEY, created_at TEXT, user_id TEXT, display_name TEXT, owner_id TEXT, avatar_name TEXT, current_avatar_image_url TEXT, current_avatar_thumbnail_image_url TEXT, previous_current_avatar_image_url TEXT, previous_current_avatar_thumbnail_image_url TEXT)`
);
await sqliteService.executeNonQuery(
- `CREATE TABLE IF NOT EXISTS ${Database.userId}_feed_online_offline (id INTEGER PRIMARY KEY, created_at TEXT, user_id TEXT, display_name TEXT, type TEXT, location TEXT, world_name TEXT, time INTEGER)`
+ `CREATE TABLE IF NOT EXISTS ${Database.userPrefix}_feed_online_offline (id INTEGER PRIMARY KEY, created_at TEXT, user_id TEXT, display_name TEXT, type TEXT, location TEXT, world_name TEXT, time INTEGER)`
);
await sqliteService.executeNonQuery(
- `CREATE TABLE IF NOT EXISTS ${Database.userId}_friend_log_current (user_id TEXT PRIMARY KEY, display_name TEXT, trust_level TEXT)`
+ `CREATE TABLE IF NOT EXISTS ${Database.userPrefix}_friend_log_current (user_id TEXT PRIMARY KEY, display_name TEXT, trust_level TEXT)`
);
await sqliteService.executeNonQuery(
- `CREATE TABLE IF NOT EXISTS ${Database.userId}_friend_log_history (id INTEGER PRIMARY KEY, created_at TEXT, type TEXT, user_id TEXT, display_name TEXT, previous_display_name TEXT, trust_level TEXT, previous_trust_level TEXT)`
+ `CREATE TABLE IF NOT EXISTS ${Database.userPrefix}_friend_log_history (id INTEGER PRIMARY KEY, created_at TEXT, type TEXT, user_id TEXT, display_name TEXT, previous_display_name TEXT, trust_level TEXT, previous_trust_level TEXT)`
);
await sqliteService.executeNonQuery(
- `CREATE TABLE IF NOT EXISTS ${Database.userId}_notifications (id TEXT PRIMARY KEY, created_at TEXT, type TEXT, sender_user_id TEXT, sender_username TEXT, receiver_user_id TEXT, message TEXT, world_id TEXT, world_name TEXT, image_url TEXT, invite_message TEXT, request_message TEXT, response_message TEXT, expired INTEGER)`
+ `CREATE TABLE IF NOT EXISTS ${Database.userPrefix}_notifications (id TEXT PRIMARY KEY, created_at TEXT, type TEXT, sender_user_id TEXT, sender_username TEXT, receiver_user_id TEXT, message TEXT, world_id TEXT, world_name TEXT, image_url TEXT, invite_message TEXT, request_message TEXT, response_message TEXT, expired INTEGER)`
);
await sqliteService.executeNonQuery(
`CREATE TABLE IF NOT EXISTS memos (user_id TEXT PRIMARY KEY, edited_at TEXT, memo TEXT)`
@@ -50,7 +55,7 @@ class Database {
async getFeedDatabase() {
var feedDatabase = [];
var date = new Date();
- date.setDate(date.getDate() - 3); // 3 day limit
+ date.setDate(date.getDate() - 1); // 24 hour limit
var dateOffset = date.toJSON();
await sqliteService.execute((dbRow) => {
var row = {
@@ -65,7 +70,7 @@ class Database {
time: dbRow[7]
};
feedDatabase.unshift(row);
- }, `SELECT * FROM ${Database.userId}_feed_gps WHERE created_at >= date('${dateOffset}') LIMIT 5000`);
+ }, `SELECT * FROM ${Database.userPrefix}_feed_gps WHERE created_at >= date('${dateOffset}') ORDER BY id DESC`);
await sqliteService.execute((dbRow) => {
var row = {
rowId: dbRow[0],
@@ -79,7 +84,7 @@ class Database {
previousStatusDescription: dbRow[7]
};
feedDatabase.unshift(row);
- }, `SELECT * FROM ${Database.userId}_feed_status WHERE created_at >= date('${dateOffset}') LIMIT 5000`);
+ }, `SELECT * FROM ${Database.userPrefix}_feed_status WHERE created_at >= date('${dateOffset}') ORDER BY id DESC`);
await sqliteService.execute((dbRow) => {
var row = {
rowId: dbRow[0],
@@ -95,7 +100,7 @@ class Database {
previousCurrentAvatarThumbnailImageUrl: dbRow[9]
};
feedDatabase.unshift(row);
- }, `SELECT * FROM ${Database.userId}_feed_avatar WHERE created_at >= date('${dateOffset}') LIMIT 5000`);
+ }, `SELECT * FROM ${Database.userPrefix}_feed_avatar WHERE created_at >= date('${dateOffset}') ORDER BY id DESC`);
await sqliteService.execute((dbRow) => {
var row = {
rowId: dbRow[0],
@@ -108,7 +113,7 @@ class Database {
time: dbRow[7]
};
feedDatabase.unshift(row);
- }, `SELECT * FROM ${Database.userId}_feed_online_offline WHERE created_at >= date('${dateOffset}') LIMIT 5000`);
+ }, `SELECT * FROM ${Database.userPrefix}_feed_online_offline WHERE created_at >= date('${dateOffset}') ORDER BY id DESC`);
var compareByCreatedAt = function (a, b) {
var A = a.created_at;
var B = b.created_at;
@@ -121,7 +126,6 @@ class Database {
return 0;
};
feedDatabase.sort(compareByCreatedAt);
- feedDatabase.splice(0, feedDatabase.length - 5000);
return feedDatabase;
}
@@ -175,13 +179,13 @@ class Database {
trustLevel: dbRow[2]
};
friendLogCurrent.unshift(row);
- }, `SELECT * FROM ${Database.userId}_friend_log_current`);
+ }, `SELECT * FROM ${Database.userPrefix}_friend_log_current`);
return friendLogCurrent;
}
setFriendLogCurrent(entry) {
sqliteService.executeNonQuery(
- `INSERT OR REPLACE INTO ${Database.userId}_friend_log_current (user_id, display_name, trust_level) VALUES (@user_id, @display_name, @trust_level)`,
+ `INSERT OR REPLACE INTO ${Database.userPrefix}_friend_log_current (user_id, display_name, trust_level) VALUES (@user_id, @display_name, @trust_level)`,
{
'@user_id': entry.userId,
'@display_name': entry.displayName,
@@ -209,13 +213,13 @@ class Database {
}
sqlValues = sqlValues.slice(0, -2);
sqliteService.executeNonQuery(
- `INSERT OR REPLACE INTO ${Database.userId}_friend_log_current (user_id, display_name, trust_level) VALUES ${sqlValues}`
+ `INSERT OR REPLACE INTO ${Database.userPrefix}_friend_log_current (user_id, display_name, trust_level) VALUES ${sqlValues}`
);
}
deleteFriendLogCurrent(userId) {
sqliteService.executeNonQuery(
- `DELETE FROM ${Database.userId}_friend_log_current WHERE user_id = @user_id`,
+ `DELETE FROM ${Database.userPrefix}_friend_log_current WHERE user_id = @user_id`,
{
'@user_id': userId
}
@@ -239,13 +243,13 @@ class Database {
row.previousTrustLevel = dbRow[7];
}
friendLogHistory.unshift(row);
- }, `SELECT * FROM ${Database.userId}_friend_log_history LIMIT 10000`);
+ }, `SELECT * FROM ${Database.userPrefix}_friend_log_history`);
return friendLogHistory;
}
addFriendLogHistory(entry) {
sqliteService.executeNonQuery(
- `INSERT OR IGNORE INTO ${Database.userId}_friend_log_history (created_at, type, user_id, display_name, previous_display_name, trust_level, previous_trust_level) VALUES (@created_at, @type, @user_id, @display_name, @previous_display_name, @trust_level, @previous_trust_level)`,
+ `INSERT OR IGNORE INTO ${Database.userPrefix}_friend_log_history (created_at, type, user_id, display_name, previous_display_name, trust_level, previous_trust_level) VALUES (@created_at, @type, @user_id, @display_name, @previous_display_name, @trust_level, @previous_trust_level)`,
{
'@created_at': entry.created_at,
'@type': entry.type,
@@ -295,13 +299,13 @@ class Database {
// sqlValues `('${line.created_at}', '${line.type}', '${line.userId}', '${line.displayName}', '${line.previousDisplayName}', '${line.trustLevel}', '${line.previousTrustLevel}'), `
}
sqliteService.executeNonQuery(
- `INSERT OR IGNORE INTO ${Database.userId}_friend_log_history (created_at, type, user_id, display_name, previous_display_name, trust_level, previous_trust_level) VALUES ${sqlValues}`
+ `INSERT OR IGNORE INTO ${Database.userPrefix}_friend_log_history (created_at, type, user_id, display_name, previous_display_name, trust_level, previous_trust_level) VALUES ${sqlValues}`
);
}
deleteFriendLogHistory(rowId) {
sqliteService.executeNonQuery(
- `DELETE FROM ${Database.userId}_friend_log_history WHERE id = @row_id`,
+ `DELETE FROM ${Database.userPrefix}_friend_log_history WHERE id = @row_id`,
{
'@row_id': rowId
}
@@ -310,7 +314,7 @@ class Database {
addGPSToDatabase(entry) {
sqliteService.executeNonQuery(
- `INSERT OR IGNORE INTO ${Database.userId}_feed_gps (created_at, user_id, display_name, location, world_name, previous_location, time) VALUES (@created_at, @user_id, @display_name, @location, @world_name, @previous_location, @time)`,
+ `INSERT OR IGNORE INTO ${Database.userPrefix}_feed_gps (created_at, user_id, display_name, location, world_name, previous_location, time) VALUES (@created_at, @user_id, @display_name, @location, @world_name, @previous_location, @time)`,
{
'@created_at': entry.created_at,
'@user_id': entry.userId,
@@ -325,7 +329,7 @@ class Database {
addStatusToDatabase(entry) {
sqliteService.executeNonQuery(
- `INSERT OR IGNORE INTO ${Database.userId}_feed_status (created_at, user_id, display_name, status, status_description, previous_status, previous_status_description) VALUES (@created_at, @user_id, @display_name, @status, @status_description, @previous_status, @previous_status_description)`,
+ `INSERT OR IGNORE INTO ${Database.userPrefix}_feed_status (created_at, user_id, display_name, status, status_description, previous_status, previous_status_description) VALUES (@created_at, @user_id, @display_name, @status, @status_description, @previous_status, @previous_status_description)`,
{
'@created_at': entry.created_at,
'@user_id': entry.userId,
@@ -340,7 +344,7 @@ class Database {
addAvatarToDatabase(entry) {
sqliteService.executeNonQuery(
- `INSERT OR IGNORE INTO ${Database.userId}_feed_avatar (created_at, user_id, display_name, owner_id, avatar_name, current_avatar_image_url, current_avatar_thumbnail_image_url, previous_current_avatar_image_url, previous_current_avatar_thumbnail_image_url) VALUES (@created_at, @user_id, @display_name, @owner_id, @avatar_name, @current_avatar_image_url, @current_avatar_thumbnail_image_url, @previous_current_avatar_image_url, @previous_current_avatar_thumbnail_image_url)`,
+ `INSERT OR IGNORE INTO ${Database.userPrefix}_feed_avatar (created_at, user_id, display_name, owner_id, avatar_name, current_avatar_image_url, current_avatar_thumbnail_image_url, previous_current_avatar_image_url, previous_current_avatar_thumbnail_image_url) VALUES (@created_at, @user_id, @display_name, @owner_id, @avatar_name, @current_avatar_image_url, @current_avatar_thumbnail_image_url, @previous_current_avatar_image_url, @previous_current_avatar_thumbnail_image_url)`,
{
'@created_at': entry.created_at,
'@user_id': entry.userId,
@@ -360,7 +364,7 @@ class Database {
addOnlineOfflineToDatabase(entry) {
sqliteService.executeNonQuery(
- `INSERT OR IGNORE INTO ${Database.userId}_feed_online_offline (created_at, user_id, display_name, type, location, world_name, time) VALUES (@created_at, @user_id, @display_name, @type, @location, @world_name, @time)`,
+ `INSERT OR IGNORE INTO ${Database.userPrefix}_feed_online_offline (created_at, user_id, display_name, type, location, world_name, time) VALUES (@created_at, @user_id, @display_name, @type, @location, @world_name, @time)`,
{
'@created_at': entry.created_at,
'@user_id': entry.userId,
@@ -376,7 +380,7 @@ class Database {
async getGamelogDatabase() {
var gamelogDatabase = [];
var date = new Date();
- date.setDate(date.getDate() - 7); // 7 day limit
+ date.setDate(date.getDate() - 1); // 24 hour limit
var dateOffset = date.toJSON();
await sqliteService.execute((dbRow) => {
var row = {
@@ -389,7 +393,7 @@ class Database {
time: dbRow[5]
};
gamelogDatabase.unshift(row);
- }, `SELECT * FROM gamelog_location WHERE created_at >= date('${dateOffset}') LIMIT 5000`);
+ }, `SELECT * FROM gamelog_location WHERE created_at >= date('${dateOffset}') ORDER BY id DESC`);
await sqliteService.execute((dbRow) => {
var row = {
rowId: dbRow[0],
@@ -401,7 +405,7 @@ class Database {
time: dbRow[6]
};
gamelogDatabase.unshift(row);
- }, `SELECT * FROM gamelog_join_leave WHERE created_at >= date('${dateOffset}') LIMIT 5000`);
+ }, `SELECT * FROM gamelog_join_leave WHERE created_at >= date('${dateOffset}') ORDER BY id DESC`);
await sqliteService.execute((dbRow) => {
var row = {
rowId: dbRow[0],
@@ -414,7 +418,7 @@ class Database {
worldName: dbRow[6]
};
gamelogDatabase.unshift(row);
- }, `SELECT * FROM gamelog_portal_spawn WHERE created_at >= date('${dateOffset}') LIMIT 5000`);
+ }, `SELECT * FROM gamelog_portal_spawn WHERE created_at >= date('${dateOffset}') ORDER BY id DESC`);
await sqliteService.execute((dbRow) => {
var row = {
rowId: dbRow[0],
@@ -428,7 +432,7 @@ class Database {
userId: dbRow[7]
};
gamelogDatabase.unshift(row);
- }, `SELECT * FROM gamelog_video_play WHERE created_at >= date('${dateOffset}') LIMIT 5000`);
+ }, `SELECT * FROM gamelog_video_play WHERE created_at >= date('${dateOffset}') ORDER BY id DESC`);
await sqliteService.execute((dbRow) => {
var row = {
rowId: dbRow[0],
@@ -437,7 +441,7 @@ class Database {
data: dbRow[2]
};
gamelogDatabase.unshift(row);
- }, `SELECT * FROM gamelog_event WHERE created_at >= date('${dateOffset}') LIMIT 5000`);
+ }, `SELECT * FROM gamelog_event WHERE created_at >= date('${dateOffset}') ORDER BY id DESC`);
var compareByCreatedAt = function (a, b) {
var A = a.created_at;
var B = b.created_at;
@@ -449,7 +453,6 @@ class Database {
}
return 0;
};
- gamelogDatabase.splice(0, gamelogDatabase.length - 5000);
gamelogDatabase.sort(compareByCreatedAt);
return gamelogDatabase;
}
@@ -555,7 +558,7 @@ class Database {
row.$isExpired = true;
}
notifications.unshift(row);
- }, `SELECT * FROM ${Database.userId}_notifications LIMIT 5000`);
+ }, `SELECT * FROM ${Database.userPrefix}_notifications ORDER BY id DESC LIMIT ${Database.maxTableSize}`);
return notifications;
}
@@ -584,7 +587,7 @@ class Database {
expired = 1;
}
sqliteService.executeNonQuery(
- `INSERT OR IGNORE INTO ${Database.userId}_notifications (id, created_at, type, sender_user_id, sender_username, receiver_user_id, message, world_id, world_name, image_url, invite_message, request_message, response_message, expired) VALUES (@id, @created_at, @type, @sender_user_id, @sender_username, @receiver_user_id, @message, @world_id, @world_name, @image_url, @invite_message, @request_message, @response_message, @expired)`,
+ `INSERT OR IGNORE INTO ${Database.userPrefix}_notifications (id, created_at, type, sender_user_id, sender_username, receiver_user_id, message, world_id, world_name, image_url, invite_message, request_message, response_message, expired) VALUES (@id, @created_at, @type, @sender_user_id, @sender_username, @receiver_user_id, @message, @world_id, @world_name, @image_url, @invite_message, @request_message, @response_message, @expired)`,
{
'@id': entry.id,
'@created_at': entry.created_at,
@@ -606,7 +609,7 @@ class Database {
deleteNotification(rowId) {
sqliteService.executeNonQuery(
- `DELETE FROM ${Database.userId}_notifications WHERE id = @row_id`,
+ `DELETE FROM ${Database.userPrefix}_notifications WHERE id = @row_id`,
{
'@row_id': rowId
}
@@ -619,7 +622,7 @@ class Database {
expired = 1;
}
sqliteService.executeNonQuery(
- `UPDATE ${Database.userId}_notifications SET expired = @expired WHERE id = @id`,
+ `UPDATE ${Database.userPrefix}_notifications SET expired = @expired WHERE id = @id`,
{
'@id': entry.id,
'@expired': expired
@@ -631,7 +634,7 @@ class Database {
var size = 0;
await sqliteService.execute((row) => {
size = row[0];
- }, `SELECT COUNT(*) FROM ${Database.userId}_feed_gps`);
+ }, `SELECT COUNT(*) FROM ${Database.userPrefix}_feed_gps`);
return size;
}
@@ -639,7 +642,7 @@ class Database {
var size = 0;
await sqliteService.execute((row) => {
size = row[0];
- }, `SELECT COUNT(*) FROM ${Database.userId}_feed_status`);
+ }, `SELECT COUNT(*) FROM ${Database.userPrefix}_feed_status`);
return size;
}
@@ -647,7 +650,7 @@ class Database {
var size = 0;
await sqliteService.execute((row) => {
size = row[0];
- }, `SELECT COUNT(*) FROM ${Database.userId}_feed_avatar`);
+ }, `SELECT COUNT(*) FROM ${Database.userPrefix}_feed_avatar`);
return size;
}
@@ -655,7 +658,7 @@ class Database {
var size = 0;
await sqliteService.execute((row) => {
size = row[0];
- }, `SELECT COUNT(*) FROM ${Database.userId}_feed_online_offline`);
+ }, `SELECT COUNT(*) FROM ${Database.userPrefix}_feed_online_offline`);
return size;
}
@@ -663,7 +666,7 @@ class Database {
var size = 0;
await sqliteService.execute((row) => {
size = row[0];
- }, `SELECT COUNT(*) FROM ${Database.userId}_friend_log_history`);
+ }, `SELECT COUNT(*) FROM ${Database.userPrefix}_friend_log_history`);
return size;
}
@@ -671,7 +674,7 @@ class Database {
var size = 0;
await sqliteService.execute((row) => {
size = row[0];
- }, `SELECT COUNT(*) FROM ${Database.userId}_notifications`);
+ }, `SELECT COUNT(*) FROM ${Database.userPrefix}_notifications`);
return size;
}
@@ -805,6 +808,301 @@ class Database {
}, `SELECT time FROM gamelog_join_leave WHERE (type = 'OnPlayerLeft') AND (user_id = '${userId}' OR display_name = '${displayName}')`);
return ref;
}
+
+ async lookupFeedDatabase(search, filters, vipList) {
+ var search = search.replaceAll("'", "''");
+ 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 status = true;
+ var avatar = true;
+ var online = true;
+ var offline = true;
+ if (filters.length > 0) {
+ gps = false;
+ status = false;
+ avatar = false;
+ online = false;
+ offline = false;
+ filters.forEach((filter) => {
+ switch (filter) {
+ case 'GPS':
+ gps = true;
+ break;
+ case 'Status':
+ status = true;
+ break;
+ case 'Avatar':
+ avatar = true;
+ break;
+ case 'Online':
+ online = true;
+ break;
+ case 'Offline':
+ offline = true;
+ break;
+ }
+ });
+ }
+ var feedDatabase = [];
+ 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]
+ };
+ feedDatabase.unshift(row);
+ }, `SELECT * FROM ${Database.userPrefix}_feed_gps WHERE (display_name LIKE '%${search}%' OR world_name LIKE '%${search}%') ${vipQuery} ORDER BY id DESC LIMIT ${Database.maxTableSize}`);
+ }
+ if (status) {
+ await sqliteService.execute((dbRow) => {
+ var row = {
+ rowId: dbRow[0],
+ created_at: dbRow[1],
+ userId: dbRow[2],
+ displayName: dbRow[3],
+ type: 'Status',
+ status: dbRow[4],
+ statusDescription: dbRow[5],
+ previousStatus: dbRow[6],
+ previousStatusDescription: dbRow[7]
+ };
+ feedDatabase.unshift(row);
+ }, `SELECT * FROM ${Database.userPrefix}_feed_status WHERE (display_name LIKE '%${search}%' OR status LIKE '%${search}%' OR status_description LIKE '%${search}%') ${vipQuery} ORDER BY id DESC LIMIT ${Database.maxTableSize}`);
+ }
+ if (avatar) {
+ await sqliteService.execute((dbRow) => {
+ var row = {
+ rowId: dbRow[0],
+ created_at: dbRow[1],
+ userId: dbRow[2],
+ displayName: dbRow[3],
+ type: 'Avatar',
+ ownerId: dbRow[4],
+ avatarName: dbRow[5],
+ currentAvatarImageUrl: dbRow[6],
+ currentAvatarThumbnailImageUrl: dbRow[7],
+ previousCurrentAvatarImageUrl: dbRow[8],
+ previousCurrentAvatarThumbnailImageUrl: dbRow[9]
+ };
+ feedDatabase.unshift(row);
+ }, `SELECT * FROM ${Database.userPrefix}_feed_avatar WHERE (display_name LIKE '%${search}%' OR avatar_name LIKE '%${search}%') ${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]
+ };
+ feedDatabase.unshift(row);
+ }, `SELECT * FROM ${Database.userPrefix}_feed_online_offline WHERE ((display_name LIKE '%${search}%' OR world_name LIKE '%${search}%') ${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 lookupGameLogDatabase(search, filters) {
+ var search = search.replaceAll("'", "''");
+ var location = true;
+ var onplayerjoined = true;
+ var onplayerleft = true;
+ var portalspawn = true;
+ var msgevent = true;
+ var videoplay = true;
+ if (filters.length > 0) {
+ location = false;
+ onplayerjoined = false;
+ onplayerleft = false;
+ portalspawn = false;
+ msgevent = false;
+ videoplay = 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 'Event':
+ msgevent = true;
+ break;
+ case 'VideoPlay':
+ videoplay = true;
+ break;
+ }
+ });
+ }
+ var gamelogDatabase = [];
+ 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]
+ };
+ gamelogDatabase.unshift(row);
+ }, `SELECT * FROM gamelog_location WHERE world_name LIKE '%${search}%' 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 (display_name LIKE '%${search}%' 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 (display_name LIKE '%${search}%' OR world_name LIKE '%${search}%') ORDER BY id DESC LIMIT ${Database.maxTableSize}`);
+ }
+ if (msgevent) {
+ await sqliteService.execute((dbRow) => {
+ var row = {
+ rowId: dbRow[0],
+ created_at: dbRow[1],
+ type: 'Event',
+ data: dbRow[2]
+ };
+ gamelogDatabase.unshift(row);
+ }, `SELECT * FROM gamelog_event WHERE data LIKE '%${search}%' 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 video_url LIKE '%${search}%' OR video_name LIKE '%${search}%' OR display_name LIKE '%${search}%' 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 getLastDateGameLogDatabase() {
+ var gamelogDatabase = [];
+ var date = '1970-01-01';
+ await sqliteService.execute((dbRow) => {
+ gamelogDatabase.unshift(dbRow[0]);
+ }, 'SELECT created_at FROM gamelog_location ORDER BY id DESC LIMIT 1');
+ await sqliteService.execute((dbRow) => {
+ gamelogDatabase.unshift(dbRow[0]);
+ }, 'SELECT created_at FROM gamelog_join_leave ORDER BY id DESC LIMIT 1');
+ await sqliteService.execute((dbRow) => {
+ gamelogDatabase.unshift(dbRow[0]);
+ }, 'SELECT created_at FROM gamelog_portal_spawn ORDER BY id DESC LIMIT 1');
+ await sqliteService.execute((dbRow) => {
+ gamelogDatabase.unshift(dbRow[0]);
+ }, 'SELECT created_at FROM gamelog_event ORDER BY id DESC LIMIT 1');
+ await sqliteService.execute((dbRow) => {
+ gamelogDatabase.unshift(dbRow[0]);
+ }, 'SELECT created_at FROM gamelog_video_play ORDER BY id DESC LIMIT 1');
+ if (gamelogDatabase.length > 0) {
+ gamelogDatabase.sort();
+ date = gamelogDatabase[gamelogDatabase.length - 1];
+ }
+ return date;
+ }
}
var self = new Database();