guilds.js 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. const cheerio = require('cheerio');
  2. const {defaultPermissions} = require('../util/default.json');
  3. const {settingsData, createNotice, escapeText} = require('./util.js');
  4. const forms = {
  5. settings: require('./settings.js').get,
  6. verification: require('./verification.js').get,
  7. rcscript: require('./rcscript.js').get
  8. };
  9. const DiscordOauth2 = require('discord-oauth2');
  10. const oauth = new DiscordOauth2( {
  11. clientId: process.env.bot,
  12. clientSecret: process.env.secret,
  13. redirectUri: process.env.dashboard
  14. } );
  15. const file = require('fs').readFileSync('./dashboard/index.html');
  16. /**
  17. * Let a user view settings
  18. * @param {import('http').ServerResponse} res - The server response
  19. * @param {String} state - The user state
  20. * @param {URL} reqURL - The used url
  21. * @param {String} [action] - The action the user made
  22. * @param {String[]} [actionArgs] - The arguments for the action
  23. */
  24. function dashboard_guilds(res, state, reqURL, action, actionArgs) {
  25. reqURL.pathname = reqURL.pathname.replace( /^(\/(?:guild\/\d+(?:\/(?:settings|verification|rcscript)(?:\/(?:\d+|new))?)?)?)(?:\/.*)?$/, '$1' );
  26. var args = reqURL.pathname.split('/');
  27. args = reqURL.pathname.split('/');
  28. var settings = settingsData.get(state);
  29. var $ = cheerio.load(file);
  30. if ( process.env.READONLY ) createNotice($, 'readonly');
  31. if ( action ) createNotice($, action, actionArgs);
  32. $('head').append(
  33. $('<script>').text(`history.replaceState(null, null, '${reqURL.pathname}');`)
  34. );
  35. $('#logout img').attr('src', settings.user.avatar);
  36. $('#logout span').text(`${settings.user.username} #${settings.user.discriminator}`);
  37. $('.guild#invite a').attr('href', oauth.generateAuthUrl( {
  38. scope: ['identify', 'guilds', 'bot'],
  39. permissions: defaultPermissions, state
  40. } ));
  41. $('.guild#refresh a').attr('href', '/refresh?return=' + reqURL.pathname);
  42. if ( settings.guilds.isMember.size ) {
  43. $('<div class="guild">').append(
  44. $('<div class="separator">')
  45. ).insertBefore('.guild#last-separator');
  46. settings.guilds.isMember.forEach( guild => {
  47. $('<div class="guild">').attr('id', guild.id).append(
  48. $('<div class="bar">'),
  49. $('<a>').attr('href', `/guild/${guild.id}/settings`).attr('alt', guild.name).append(
  50. ( guild.icon ?
  51. $('<img class="avatar">').attr('src', `${guild.icon}?size=64`).attr('alt', guild.name)
  52. : $('<div class="avatar noicon">').text(guild.acronym) )
  53. )
  54. ).insertBefore('.guild#last-separator');
  55. } );
  56. }
  57. if ( settings.guilds.notMember.size ) {
  58. $('<div class="guild">').append(
  59. $('<div class="separator">')
  60. ).insertBefore('.guild#last-separator');
  61. settings.guilds.notMember.forEach( guild => {
  62. $('<div class="guild">').attr('id', guild.id).append(
  63. $('<div class="bar">'),
  64. $('<a>').attr('href', `/guild/${guild.id}`).attr('alt', guild.name).append(
  65. ( guild.icon ?
  66. $('<img class="avatar">').attr('src', `${guild.icon}?size=64`).attr('alt', guild.name)
  67. : $('<div class="avatar noicon">').text(guild.acronym) )
  68. )
  69. ).insertBefore('.guild#last-separator');
  70. } );
  71. }
  72. let id = args[2];
  73. $(`.guild#${id}`).addClass('selected');
  74. if ( settings.guilds.isMember.has(id) ) {
  75. let guild = settings.guilds.isMember.get(id);
  76. $('head title').text(`${guild.name} – ` + $('head title').text());
  77. $('<script>').text(`const isPatreon = ${guild.patreon};`).insertBefore('script#indexjs');
  78. $('.channel#settings').attr('href', `/guild/${guild.id}/settings`);
  79. $('.channel#verification').attr('href', `/guild/${guild.id}/verification`);
  80. $('.channel#rcscript').attr('href', `/guild/${guild.id}/rcscript`);
  81. if ( args[3] === 'settings' ) return forms.settings(res, $, guild, args);
  82. if ( args[3] === 'verification' ) return forms.verification(res, $, guild, args);
  83. if ( args[3] === 'rcscript' ) return forms.rcscript(res, $, guild, args);
  84. return forms.settings(res, $, guild, args);
  85. }
  86. else if ( settings.guilds.notMember.has(id) ) {
  87. let guild = settings.guilds.notMember.get(id);
  88. $('head title').text(`${guild.name} – ` + $('head title').text());
  89. res.setHeader('Set-Cookie', [`guild="${guild.id}/settings"; HttpOnly; Path=/`]);
  90. let url = oauth.generateAuthUrl( {
  91. scope: ['identify', 'guilds', 'bot'],
  92. permissions: defaultPermissions,
  93. guildId: guild.id, state
  94. } );
  95. $('#channellist').empty();
  96. $('<a class="channel channel-header">').attr('href', url).append(
  97. $('<img>').attr('src', '/src/settings.svg'),
  98. $('<div>').text('Invite Wiki-Bot')
  99. ).appendTo('#channellist');
  100. $('#text .description').append(
  101. $('<p>').append(
  102. escapeText(`Wiki-Bot is not a member of "${guild.name}" yet, but you can `),
  103. $('<a>').attr('href', url).text('invite Wiki-Bot'),
  104. escapeText('.')
  105. ),
  106. $('<a id="login-button">').attr('href', url).text('Invite Wiki-Bot').prepend(
  107. $('<img alt="Discord">').attr('src', 'https://discord.com/assets/f8389ca1a741a115313bede9ac02e2c0.svg')
  108. )
  109. );
  110. }
  111. else {
  112. $('head title').text('Server Selector – ' + $('head title').text());
  113. $('#channellist').empty();
  114. $('<p>').append(
  115. escapeText('This is a list of all servers you can change settings on because you have the '),
  116. $('<code>').text('Manage Server'),
  117. escapeText(' permission. Please select a server:')
  118. ).appendTo('#text .description');
  119. if ( settings.guilds.isMember.size ) {
  120. $('<h2 id="with-wikibot">').text('Server with Wiki-Bot').appendTo('#text');
  121. $('<a class="channel">').attr('href', '#with-wikibot').append(
  122. $('<img>').attr('src', '/src/channel.svg'),
  123. $('<div>').text('Server with Wiki-Bot')
  124. ).appendTo('#channellist');
  125. $('<div class="server-selector" id="isMember">').appendTo('#text');
  126. settings.guilds.isMember.forEach( guild => {
  127. $('<a class="server">').attr('href', `/guild/${guild.id}/settings`).append(
  128. ( guild.icon ?
  129. $('<img class="avatar">').attr('src', `${guild.icon}?size=256`).attr('alt', guild.name)
  130. : $('<div class="avatar noicon">').text(guild.acronym) ),
  131. $('<div class="server-name description">').text(guild.name)
  132. ).appendTo('.server-selector#isMember');
  133. } );
  134. }
  135. if ( settings.guilds.notMember.size ) {
  136. $('<h2 id="without-wikibot">').text('Server without Wiki-Bot').appendTo('#text');
  137. $('<a class="channel">').attr('href', '#without-wikibot').append(
  138. $('<img>').attr('src', '/src/channel.svg'),
  139. $('<div>').text('Server without Wiki-Bot')
  140. ).appendTo('#channellist');
  141. $('<div class="server-selector" id="notMember">').appendTo('#text');
  142. settings.guilds.notMember.forEach( guild => {
  143. $('<a class="server">').attr('href', `/guild/${guild.id}`).append(
  144. ( guild.icon ?
  145. $('<img class="avatar">').attr('src', `${guild.icon}?size=256`).attr('alt', guild.name)
  146. : $('<div class="avatar noicon">').text(guild.acronym) ),
  147. $('<div class="server-name description">').text(guild.name)
  148. ).appendTo('.server-selector#notMember');
  149. } );
  150. }
  151. if ( !settings.guilds.count ) {
  152. let url = oauth.generateAuthUrl( {
  153. scope: ['identify', 'guilds'],
  154. prompt: 'consent', state
  155. } );
  156. $('<a class="channel channel-header">').attr('href', url).append(
  157. $('<img>').attr('src', '/src/settings.svg'),
  158. $('<div>').text('Switch Accounts')
  159. ).appendTo('#channellist');
  160. $('#text .description').append(
  161. $('<p>').append(
  162. escapeText('You currently don\'t have the '),
  163. $('<code>').text('Manage Server'),
  164. escapeText(' permission on any servers, are you logged into the correct account?')
  165. ),
  166. $('<a id="login-button">').attr('href', url).text('Switch Accounts').prepend(
  167. $('<img alt="Discord">').attr('src', 'https://discord.com/assets/f8389ca1a741a115313bede9ac02e2c0.svg')
  168. )
  169. );
  170. }
  171. }
  172. let body = $.html();
  173. res.writeHead(200, {'Content-Length': body.length});
  174. res.write( body );
  175. return res.end();
  176. }
  177. module.exports = dashboard_guilds;