diff --git a/client/components/app/SideRail.vue b/client/components/app/SideRail.vue index eddcdf26d..f67383bac 100644 --- a/client/components/app/SideRail.vue +++ b/client/components/app/SideRail.vue @@ -63,6 +63,14 @@
+ + connect_without_contact + +

Social

+ +
+ + warning @@ -128,6 +136,9 @@ export default { isAuthorsPage() { return this.$route.name === 'library-library-authors' }, + isSocialPage() { + return this.$route.name === 'social' + }, libraryBookshelfPage() { return this.$route.name === 'library-library-bookshelf-id' }, @@ -137,6 +148,15 @@ export default { filterBy() { return this.$store.getters['user/getUserSetting']('filterBy') }, + async socialTrue() { + let listeningStats = await this.$axios.$get(`/api/social`).catch((err) => { + console.error('Failed to load shared user listening sesions', err) + return false + }) + if (listeningStats != null) { + return true + } else {return false} + }, showingIssues() { if (!this.$route.query) return false return this.libraryBookshelfPage && this.$route.query.filter === 'issues' diff --git a/client/pages/account.vue b/client/pages/account.vue index 88c294c1c..cff547e50 100644 --- a/client/pages/account.vue +++ b/client/pages/account.vue @@ -15,6 +15,18 @@
+
+ + +

+ Share Listening Activity + info_outlined +

+
+
+ +
+

Change Password

@@ -63,6 +75,9 @@ export default { }, isGuest() { return this.usertype === 'guest' + }, + isSharingActivity() { + return this.$store.getters['user/getUserSetting']('shareListeningActivity') } }, methods: { @@ -111,6 +126,11 @@ export default { this.$toast.error('Api call failed') this.changingPassword = false }) + }, + changeSharingSetting() { + console.log('test') + console.log(String(!this.isSharingActivity)) + this.$store.dispatch('user/updateUserSettings', { shareListeningActivity: !this.isSharingActivity }) } }, mounted() {} diff --git a/client/pages/social.vue b/client/pages/social.vue new file mode 100644 index 000000000..9baf91a72 --- /dev/null +++ b/client/pages/social.vue @@ -0,0 +1,134 @@ + + + diff --git a/server/controllers/MiscController.js b/server/controllers/MiscController.js index 399ce7428..f8ed93f03 100644 --- a/server/controllers/MiscController.js +++ b/server/controllers/MiscController.js @@ -263,5 +263,27 @@ class MiscController { }) res.json(tags) } + // GET: api/social + async getSocialStats(req, res) { + var filteredUsers = this.db.users.filter(c => c.settings.shareListeningActivity == true) + var userData = [] + for (let i = 0; i < filteredUsers.length; i++) { + var user = filteredUsers[i] + var listeningStats = await this.getUserListeningStatsHelpers(user.id) + var latestItem = user.mediaProgress.sort(p => p.lastUpdate)[0] + var totalItems = Object.keys(listeningStats.items).length + var totalDays = Object.keys(listeningStats.days).length + var session = { + username: user.username, + lastSeen: user.lastSeen, + latest: latestItem || null, + itemsRead: totalItems || 0, + minutesListened: listeningStats.totalTime || 0, + daysListened: totalDays| 0, + } + userData.push(session) + } + res.json(userData) + } } module.exports = new MiscController() \ No newline at end of file diff --git a/server/objects/user/User.js b/server/objects/user/User.js index c33fb3d0e..dd33c4b45 100644 --- a/server/objects/user/User.js +++ b/server/objects/user/User.js @@ -68,7 +68,8 @@ class User { filterBy: 'all', playbackRate: 1, bookshelfCoverSize: 120, - collapseSeries: false + collapseSeries: false, + shareListeningActivity: false } } diff --git a/server/routers/ApiRouter.js b/server/routers/ApiRouter.js index 1fc5b2c0e..e093410ed 100644 --- a/server/routers/ApiRouter.js +++ b/server/routers/ApiRouter.js @@ -209,6 +209,7 @@ class ApiRouter { this.router.get('/search/podcast', MiscController.findPodcasts.bind(this)) this.router.get('/search/authors', MiscController.findAuthor.bind(this)) this.router.get('/search/chapters', MiscController.findChapters.bind(this)) + this.router.get('/social', MiscController.getSocialStats.bind(this)) this.router.get('/tags', MiscController.getAllTags.bind(this)) }