diff --git a/html/src/app.js b/html/src/app.js index 892cd5f2..51d32ff1 100644 --- a/html/src/app.js +++ b/html/src/app.js @@ -10416,6 +10416,55 @@ speechSynthesis.getVoices(); }); }; + $app.data.discordNamesDialogVisible = false; + $app.data.discordNamesContent = ''; + + $app.methods.showDiscordNamesDialog = function () { + var { friends } = API.currentUser; + if (Array.isArray(friends) === false) { + return; + } + var lines = [ + 'DisplayName,DiscordName' + ]; + var _ = function (str) { + if (/[\x00-\x1f,"]/.test(str) === true) { + str = `"${str.replace(/"/g, '""')}"`; + } + return str; + }; + for (var userId of friends) { + var { ref } = this.friends.get(userId); + var discord = ''; + if (typeof ref === 'undefined') { + continue; + } + var name = ref.displayName; + if (ref.statusDescription) { + var statusRegex = /(?:^|\n*)(?:(?:[^\n:]|\|)*(?::|˸|discord)[\t\v\f\r]*)?([^\n]*(#|#)(?: )?\d{4})/gi.exec(ref.statusDescription); + if (statusRegex) { + discord = statusRegex[1]; + } + } + if ((!discord) && (ref.bio)) { + var bioRegex = /(?:^|\n*)(?:(?:[^\n:]|\|)*(?::|˸|discord)[\t\v\f\r]*)?([^\n]*(#|#)(?: )?\d{4})/gi.exec(ref.bio); + if (bioRegex) { + discord = bioRegex[1]; + } + } + if (!discord) { + continue; + } + discord = discord.replace('#', '#'); + if (discord.substring(0, 1) === '#') { + discord = `${_(name)}${_(discord)}`; + } + lines.push(`${_(name)},${_(discord)}`); + } + this.discordNamesContent = lines.join('\n'); + this.discordNamesDialogVisible = true; + }; + $app = new Vue($app); window.$app = $app; }()); diff --git a/html/src/index.pug b/html/src/index.pug index 1aaafed6..7a9e04ad 100644 --- a/html/src/index.pug +++ b/html/src/index.pug @@ -427,6 +427,7 @@ html div(style="margin-top:10px") el-button(size="small" icon="el-icon-switch-button" @click="logout()") Logout el-button(size="small" icon="el-icon-printer" @click="showExportFriendsListDialog()") Export Friends List + el-button(size="small" icon="el-icon-chat-dot-round" @click="showDiscordNamesDialog()") Discord Names div.options-container span.header Game Info .x-friend-list(style="margin-top:10px") @@ -1403,10 +1404,16 @@ html el-checkbox(v-model="launchDialog.desktop" style="float:left;margin-top:5px") Start as Desktop (No VR) el-button(size="small" @click="showInviteDialog(launchDialog.location)") Invite el-button(type="primary" size="small" @click="launchGame(locationToLaunchArg(launchDialog.location))") Launch - + //- dialog: export friends list el-dialog.x-dialog(:visible.sync="exportFriendsListDialog" title="Export Friends List" width="650px") - el-input(type="textarea" v-model="exportFriendsListContent" size="mini" rows="15" resize="none" readonly style="margin-top:15px" @click.native="$event.target.tagName === 'TEXTAREA' && $event.target.select()") + el-input(type="textarea" v-model="exportFriendsListContent" size="mini" rows="15" resize="none" readonly style="margin-top:15px" @click.native="$event.target.tagName === 'TEXTAREA' && $event.target.select()") + + //- dialog: Discord username list + el-dialog.x-dialog(:visible.sync="discordNamesDialogVisible" title="Discord Names" width="650px") + div(style='font-size:12px;') + | Click load missing entries in the Friends List tab to search entire friends list + el-input(type="textarea" v-model="discordNamesContent" size="mini" rows="15" resize="none" readonly style="margin-top:15px") //- dialog: Notification position el-dialog.x-dialog(ref="notificationPositionDialog" :visible.sync="notificationPositionDialog.visible" title="Notification Position" width="400px")