diff --git a/html/src/app.js b/html/src/app.js index f4cb7fdb..ac9b7a76 100644 --- a/html/src/app.js +++ b/html/src/app.js @@ -5284,17 +5284,40 @@ speechSynthesis.getVoices(); } }; - $app.methods.loadMemo = function (id) { - var key = `memo_${id}`; - return VRCXStorage.Get(key); + $app.methods.migrateMemos = function () { + //move memos from json to SQLite + var json = JSON.parse(VRCXStorage.GetAll()); + for (var line in json) { + if (line.substring(0, 8) === 'memo_usr') { + var userId = line.substring(5); + var memo = json[line]; + if (memo) { + console.log(userId); + this.saveMemo(userId, memo); + VRCXStorage.Remove(`memo_${userId}`); + } + } + } + }; + + $app.methods.loadMemo = async function (userId) { + try { + var row = await database.getMemo(userId); + return row.memo; + } catch (err) { + } + return ''; }; $app.methods.saveMemo = function (id, memo) { - var key = `memo_${id}`; if (memo) { - VRCXStorage.Set(key, String(memo)); + database.setMemo({ + userId: id, + editedAt: new Date().toJSON(), + memo + }); } else { - VRCXStorage.Remove(key); + database.deleteMemo(id); } var ref = this.friends.get(id); if (ref) { @@ -5478,8 +5501,11 @@ speechSynthesis.getVoices(); ref, name: '', no: ++this.friendsNo, - memo: this.loadMemo(id) + memo: '' }; + this.loadMemo(id).then((memo) => { + ctx.memo = memo; + }); if (typeof ref === 'undefined') { ref = this.friendLog[id]; if (typeof ref !== 'undefined' && @@ -6117,6 +6143,7 @@ speechSynthesis.getVoices(); $app.sweepFeed(); //remove old table VRCXStorage.Remove(`${args.ref.id}_feedTable`); + $app.migrateMemos(); }); API.$on('USER:UPDATE', async function (args) { @@ -8591,7 +8618,13 @@ speechSynthesis.getVoices(); D.userIcon = ''; D.id = userId; D.treeData = []; - D.memo = this.loadMemo(userId); + this.loadMemo(userId).then((memo) => { + D.memo = memo; + var ref = this.friends.get(userId); + if (ref) { + ref.memo = String(memo || ''); + } + }); D.visible = true; D.loading = true; D.avatars = []; diff --git a/html/src/repository/database.js b/html/src/repository/database.js index 11a29cf0..4087b861 100644 --- a/html/src/repository/database.js +++ b/html/src/repository/database.js @@ -15,6 +15,9 @@ class Database { 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)` ); + await sqliteService.executeNonQuery( + `CREATE TABLE IF NOT EXISTS memos (user_id TEXT PRIMARY KEY, edited_at TEXT, memo TEXT)` + ); } async getFeedDatabase() { @@ -90,6 +93,38 @@ class Database { return feedDatabase; } + async getMemo(userId) { + var row = {}; + await sqliteService.execute((dbRow, userId) => { + row = { + userId: dbRow[0], + editedAt: dbRow[1], + memo: dbRow[2] + }; + }, `SELECT * FROM memos WHERE user_id = '${userId}'`); + return row; + } + + setMemo(entry) { + sqliteService.executeNonQuery( + `INSERT OR REPLACE INTO memos (user_id, edited_at, memo) VALUES (@user_id, @edited_at, @memo)`, + { + '@user_id': entry.userId, + '@edited_at': entry.editedAt, + '@memo': entry.memo + } + ); + } + + deleteMemo(userId) { + sqliteService.executeNonQuery( + `DELETE FROM memos WHERE user_id = @user_id`, + { + '@user_id': userId + } + ); + } + 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)`,