guilds.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. const cheerio = require('cheerio');
  2. const {defaultPermissions} = require('../util/default.json');
  3. const {settingsData, createNotice} = 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. */
  22. function dashboard_guilds(res, state, reqURL) {
  23. var args = reqURL.pathname.split('/');
  24. var settings = settingsData.get(state);
  25. var $ = cheerio.load(file);
  26. if ( reqURL.searchParams.get('refresh') === 'success' ) {
  27. createNotice($, {
  28. type: 'success',
  29. title: 'Refresh successful!',
  30. text: 'Your server list has been successfully refeshed.'
  31. }).prependTo('#text');
  32. }
  33. if ( reqURL.searchParams.get('refresh') === 'failed' ) {
  34. createNotice($, {
  35. type: 'error',
  36. title: 'Refresh failed!',
  37. text: 'You server list could not be refreshed, please try again.'
  38. }).prependTo('#text');
  39. }
  40. if ( reqURL.searchParams.get('save') === 'success' ) {
  41. $('<script>').text(`history.replaceState(null, null, '${reqURL.pathname}');`).insertBefore('script#indexjs');
  42. createNotice($, {
  43. type: 'success',
  44. title: 'Settings saved!',
  45. text: 'The settings have been updated successfully.'
  46. }).prependTo('#text');
  47. }
  48. if ( reqURL.searchParams.get('save') === 'failed' ) {
  49. $('<script>').text(`history.replaceState(null, null, '${reqURL.pathname}');`).insertBefore('script#indexjs');
  50. createNotice($, {
  51. type: 'error',
  52. title: 'Save failed!',
  53. text: 'The settings could not be saved, please try again.'
  54. }).prependTo('#text');
  55. }
  56. if ( reqURL.searchParams.get('save') === 'partial' ) {
  57. $('<script>').text(`history.replaceState(null, null, '${reqURL.pathname}');`).insertBefore('script#indexjs');
  58. createNotice($, {
  59. type: 'info',
  60. title: 'Settings partially saved!',
  61. text: 'The settings have only been partially updated.'
  62. }).prependTo('#text');
  63. }
  64. if ( process.env.READONLY ) {
  65. createNotice($, {
  66. type: 'info',
  67. title: 'Read-only database!',
  68. text: 'You can currently only view your settings but not change them.'
  69. }).prependTo('#text');
  70. }
  71. $('#logout img').attr('src', settings.user.avatar);
  72. $('#logout span').text(`${settings.user.username} #${settings.user.discriminator}`);
  73. $('.guild#invite a').attr('href', oauth.generateAuthUrl( {
  74. scope: ['identify', 'guilds', 'bot'],
  75. permissions: defaultPermissions, state
  76. } ));
  77. $('.guild#refresh a').attr('href', '/refresh?return=' + reqURL.pathname);
  78. if ( settings.guilds.isMember.size ) {
  79. $('<div class="guild">').append(
  80. $('<div class="separator">')
  81. ).insertBefore('.guild#last-separator');
  82. settings.guilds.isMember.forEach( guild => {
  83. $('<div class="guild">').attr('id', guild.id).append(
  84. $('<div class="bar">'),
  85. $('<a>').attr('href', `/guild/${guild.id}/settings`).attr('alt', guild.name).append(
  86. ( guild.icon ?
  87. $('<img class="avatar">').attr('src', `${guild.icon}?size=64`).attr('alt', guild.name)
  88. : $('<div class="avatar noicon">').text(guild.acronym) )
  89. )
  90. ).insertBefore('.guild#last-separator');
  91. } );
  92. }
  93. if ( settings.guilds.notMember.size ) {
  94. $('<div class="guild">').append(
  95. $('<div class="separator">')
  96. ).insertBefore('.guild#last-separator');
  97. settings.guilds.notMember.forEach( guild => {
  98. $('<div class="guild">').attr('id', guild.id).append(
  99. $('<div class="bar">'),
  100. $('<a>').attr('href', `/guild/${guild.id}`).attr('alt', guild.name).append(
  101. ( guild.icon ?
  102. $('<img class="avatar">').attr('src', `${guild.icon}?size=64`).attr('alt', guild.name)
  103. : $('<div class="avatar noicon">').text(guild.acronym) )
  104. )
  105. ).insertBefore('.guild#last-separator');
  106. } );
  107. }
  108. if ( args[1] === 'guild' ) {
  109. let id = args[2];
  110. $(`.guild#${id}`).addClass('selected');
  111. if ( settings.guilds.isMember.has(id) ) {
  112. let guild = settings.guilds.isMember.get(id);
  113. $('head title').text(`${guild.name} – ` + $('head title').text());
  114. $('<script>').text(`const isPatreon = ${guild.patreon};`).insertBefore('script#indexjs');
  115. $('.channel#settings').attr('href', `/guild/${guild.id}/settings`);
  116. $('.channel#verification').attr('href', `/guild/${guild.id}/verification`);
  117. $('.channel#rcscript').attr('href', `/guild/${guild.id}/rcscript`);
  118. if ( args[3] === 'settings' ) return forms.settings(res, $, guild, args);
  119. if ( args[3] === 'verification' ) return forms.verification(res, $, guild, args);
  120. if ( args[3] === 'rcscript' ) return forms.rcscript(res, $, guild, args);
  121. return forms.settings(res, $, guild, args);
  122. }
  123. else if ( settings.guilds.notMember.has(id) ) {
  124. let guild = settings.guilds.notMember.get(id);
  125. $('head title').text(`${guild.name} – ` + $('head title').text());
  126. res.setHeader('Set-Cookie', [`guild="${guild.id}/settings"; HttpOnly; Path=/`]);
  127. let url = oauth.generateAuthUrl( {
  128. scope: ['identify', 'guilds', 'bot'],
  129. permissions: defaultPermissions,
  130. guildId: guild.id, state
  131. } );
  132. $('<a>').attr('href', url).text(guild.name).appendTo('#text .description');
  133. }
  134. else {
  135. $('head title').text('Unknown Server – ' + $('head title').text());
  136. $('#text .description').text('You are missing the <code>MANAGE_GUILD</code> permission.');
  137. }
  138. }
  139. else {
  140. $('head title').text('Server Selector – ' + $('head title').text());
  141. $('#channellist').empty();
  142. $('#text .description').text('This is a list of all servers you can change settings on. Please select a server:');
  143. if ( settings.guilds.isMember.size ) {
  144. $('<h2 id="with-wikibot">').text('Server with Wiki-Bot').appendTo('#text');
  145. $('<a class="channel">').attr('href', '#with-wikibot').append(
  146. $('<img>').attr('src', '/src/channel.svg'),
  147. $('<div>').text('Server with Wiki-Bot')
  148. ).appendTo('#channellist');
  149. $('<div class="server-selector" id="isMember">').appendTo('#text');
  150. settings.guilds.isMember.forEach( guild => {
  151. $('<a class="server">').attr('href', `/guild/${guild.id}/settings`).append(
  152. ( guild.icon ?
  153. $('<img class="avatar">').attr('src', `${guild.icon}?size=256`).attr('alt', guild.name)
  154. : $('<div class="avatar noicon">').text(guild.acronym) ),
  155. $('<div class="server-name description">').text(guild.name)
  156. ).appendTo('.server-selector#isMember');
  157. } );
  158. }
  159. if ( settings.guilds.notMember.size ) {
  160. $('<h2 id="without-wikibot">').text('Server without Wiki-Bot').appendTo('#text');
  161. $('<a class="channel">').attr('href', '#without-wikibot').append(
  162. $('<img>').attr('src', '/src/channel.svg'),
  163. $('<div>').text('Server without Wiki-Bot')
  164. ).appendTo('#channellist');
  165. $('<div class="server-selector" id="notMember">').appendTo('#text');
  166. settings.guilds.notMember.forEach( guild => {
  167. $('<a class="server">').attr('href', `/guild/${guild.id}`).append(
  168. ( guild.icon ?
  169. $('<img class="avatar">').attr('src', `${guild.icon}?size=256`).attr('alt', guild.name)
  170. : $('<div class="avatar noicon">').text(guild.acronym) ),
  171. $('<div class="server-name description">').text(guild.name)
  172. ).appendTo('.server-selector#notMember');
  173. } );
  174. }
  175. if ( !settings.guilds.count ) {
  176. $('#text .description').text('You currently don\'t have the MANAGE_GUILD permission on any servers, are you logged into the correct account?');
  177. $('<a class="channel">').attr('href', oauth.generateAuthUrl( {
  178. scope: ['identify', 'guilds'],
  179. prompt: 'consent', state
  180. } )).append(
  181. $('<img>').attr('src', '/src/channel.svg'),
  182. $('<div>').text('Switch accounts')
  183. ).appendTo('#channellist');
  184. }
  185. }
  186. let body = $.html();
  187. res.writeHead(200, {'Content-Length': body.length});
  188. res.write( body );
  189. return res.end();
  190. }
  191. module.exports = dashboard_guilds;