guilds.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. const cheerio = require('cheerio');
  2. const {defaultPermissions} = require('../util/default.json');
  3. const {db, settingsData, sendMsg, createNotice, hasPerm} = require('./util.js');
  4. const DiscordOauth2 = require('discord-oauth2');
  5. const oauth = new DiscordOauth2( {
  6. clientId: process.env.bot,
  7. clientSecret: process.env.secret,
  8. redirectUri: process.env.dashboard
  9. } );
  10. const file = require('fs').readFileSync('./dashboard/index.html');
  11. /**
  12. * Let a user change settings
  13. * @param {import('http').ServerResponse} res - The server response
  14. * @param {String} state - The user state
  15. * @param {URL} reqURL - The used url
  16. */
  17. function dashboard_guilds(res, state, reqURL) {
  18. var arguments = reqURL.pathname.split('/');
  19. var settings = settingsData.get(state);
  20. var $ = cheerio.load(file);
  21. if ( process.env.READONLY ) {
  22. createNotice($, {
  23. title: 'Read-only database!',
  24. text: 'You can currently only view your settings but not change them.'
  25. }).prependTo('#text');
  26. }
  27. $('#logout img').attr('src', settings.user.avatar);
  28. $('#logout span').text(`${settings.user.username} #${settings.user.discriminator}`);
  29. $('.guild#invite a').attr('href', oauth.generateAuthUrl( {
  30. scope: ['identify', 'guilds', 'bot'],
  31. permissions: defaultPermissions, state
  32. } ));
  33. $('.guild#refresh a').attr('href', '/refresh?return=' + reqURL.pathname);
  34. if ( settings.guilds.isMember.size ) {
  35. $('<div class="guild">').append(
  36. $('<div class="separator">')
  37. ).insertBefore('.guild#last-separator');
  38. settings.guilds.isMember.forEach( guild => {
  39. $('<div class="guild">').attr('id', guild.id).append(
  40. $('<div class="bar">'),
  41. $('<a>').attr('href', `/guild/${guild.id}`).attr('alt', guild.name).append(
  42. ( guild.icon ?
  43. $('<img class="avatar">').attr('src', `${guild.icon}?size=64`).attr('alt', guild.name)
  44. : $('<div class="avatar noicon">').text(guild.acronym) )
  45. )
  46. ).insertBefore('.guild#last-separator');
  47. } );
  48. }
  49. if ( settings.guilds.notMember.size ) {
  50. $('<div class="guild">').append(
  51. $('<div class="separator">')
  52. ).insertBefore('.guild#last-separator');
  53. settings.guilds.notMember.forEach( guild => {
  54. $('<div class="guild">').attr('id', guild.id).append(
  55. $('<div class="bar">'),
  56. $('<a>').attr('href', `/guild/${guild.id}`).attr('alt', guild.name).append(
  57. ( guild.icon ?
  58. $('<img class="avatar">').attr('src', `${guild.icon}?size=64`).attr('alt', guild.name)
  59. : $('<div class="avatar noicon">').text(guild.acronym) )
  60. )
  61. ).insertBefore('.guild#last-separator');
  62. } );
  63. }
  64. if ( arguments[1] === 'guild' ) {
  65. let id = arguments[2];
  66. if ( settings.guilds.isMember.has(id) ) {
  67. $(`.guild#${id}`).addClass('selected');
  68. let guild = settings.guilds.isMember.get(id);
  69. $('head title').text(`${guild.name} – ` + $('head title').text());
  70. res.setHeader('Set-Cookie', [`guild="${id}"; HttpOnly; Path=/`]);
  71. $('<a>').text(`${guild.permissions}`).appendTo('#text');
  72. }
  73. else if ( settings.guilds.notMember.has(id) ) {
  74. $(`.guild#${id}`).addClass('selected');
  75. let guild = settings.guilds.notMember.get(id);
  76. $('head title').text(`${guild.name} – ` + $('head title').text());
  77. res.setHeader('Set-Cookie', [`guild="${id}"; HttpOnly; Path=/`]);
  78. let url = oauth.generateAuthUrl( {
  79. scope: ['identify', 'guilds', 'bot'],
  80. permissions: defaultPermissions,
  81. guild_id: id, state
  82. } );
  83. $('<a>').attr('href', url).text(guild.permissions).appendTo('#text');
  84. }
  85. else {
  86. $('<p>').text('You are missing the <code>MANAGE_GUILD</code> permission.').appendTo('#text');
  87. }
  88. }
  89. else {
  90. $('#channellist').empty();
  91. $('<div>').text('This is a list of all servers you can change settings on. Please select a server:').appendTo('#text');
  92. if ( settings.guilds.isMember.size ) {
  93. $('<h2 id="with-wikibot">').text('Server with Wiki-Bot').appendTo('#text');
  94. $('<a class="channel">').attr('href', '#with-wikibot').append(
  95. $('<img>').attr('src', '/src/channel.svg'),
  96. $('<div>').text('Server with Wiki-Bot')
  97. ).appendTo('#channellist');
  98. $('<div class="server-selector" id="isMember">').appendTo('#text');
  99. settings.guilds.isMember.forEach( guild => {
  100. $('<a class="server">').attr('href', `/guild/${guild.id}`).append(
  101. ( guild.icon ?
  102. $('<img class="avatar">').attr('src', `${guild.icon}?size=256`).attr('alt', guild.name)
  103. : $('<div class="avatar noicon">').text(guild.acronym) ),
  104. $('<div class="server-name">').text(guild.name)
  105. ).appendTo('.server-selector#isMember');
  106. } );
  107. }
  108. if ( settings.guilds.notMember.size ) {
  109. $('<h2 id="without-wikibot">').text('Server without Wiki-Bot').appendTo('#text');
  110. $('<a class="channel">').attr('href', '#without-wikibot').append(
  111. $('<img>').attr('src', '/src/channel.svg'),
  112. $('<div>').text('Server without Wiki-Bot')
  113. ).appendTo('#channellist');
  114. $('<div class="server-selector" id="notMember">').appendTo('#text');
  115. settings.guilds.notMember.forEach( guild => {
  116. $('<a class="server">').attr('href', `/guild/${guild.id}`).append(
  117. ( guild.icon ?
  118. $('<img class="avatar">').attr('src', `${guild.icon}?size=256`).attr('alt', guild.name)
  119. : $('<div class="avatar noicon">').text(guild.acronym) ),
  120. $('<div class="server-name">').text(guild.name)
  121. ).appendTo('.server-selector#notMember');
  122. } );
  123. }
  124. $('#channellist:empty').remove();
  125. }
  126. let body = $.html();
  127. res.writeHead(200, {'Content-Length': body.length});
  128. res.write( body );
  129. return res.end();
  130. }
  131. module.exports = dashboard_guilds;