handlers.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. const requestlib = require ( 'request' );
  2. const formidable = require ( 'formidable' );
  3. const util = require ( 'util' );
  4. const Config = require ( './config.json' );
  5. const WebServer = require ( './index.js' );
  6. const fileutil = require ( './fileutil.js' );
  7. const logger = require ( './logger.js' );
  8. const MusicBot = require ( './musicbot.js' );
  9. function verifyUserCredentials ( access_token, token_type, success, failure )
  10. {
  11. requestlib.get ( {
  12. url: 'https://discordapp.com/api/users/@me',
  13. headers: { authorization: token_type + ' ' + access_token }
  14. }, function ( error, res, body )
  15. {
  16. if ( !error )
  17. {
  18. success ( JSON.parse ( body ) );
  19. }
  20. else failure ( error );
  21. } );
  22. }
  23. function displayApiError ( request, response, code, message )
  24. {
  25. response.writeHead ( code, { 'Content-Type': 'application/json' } );
  26. response.write ( JSON.stringify ( { success: false, message: message } ) );
  27. response.end ( );
  28. }
  29. WebServer.registerRequestHandler ( '/process', function ( request, response, requestData, cookies, session )
  30. {
  31. if ( request.method.toLowerCase ( ) == 'post' )
  32. {
  33. if ( !session.variables.discordAuth && Config.auth_required )
  34. {
  35. displayApiError ( request, response, 403, 'authentication required' );
  36. return;
  37. }
  38. let form = new formidable.IncomingForm ( );
  39. form.uploadDir = './uploads';
  40. form.maxFileSize = 10 * 1024 * 1024;
  41. form.parse ( request, function ( error, fields, files )
  42. {
  43. if ( error ) return displayApiError ( request, response, 400, 'invalid request' );
  44. if ( !files.song )
  45. {
  46. response.writeHead ( 400, { 'Content-Type': 'application/json' } );
  47. response.write ( JSON.stringify ( { success: false, message: 'no files uploaded' } ) );
  48. response.end ( );
  49. return;
  50. }
  51. let path = files.song.path;
  52. fileutil.handleUploadedFile ( path, function ( songname )
  53. {
  54. MusicBot.musicQueueInsert ( songname + '.mp3' );
  55. // success
  56. response.writeHead ( 200, { 'Content-Type': 'application/json' } );
  57. response.write ( JSON.stringify ( { success: true, message: 'upload complete' } ) );
  58. response.end ( );
  59. }, function ( )
  60. {
  61. return displayApiError ( request, response, 400, 'invalid file format' );
  62. } );
  63. } );
  64. }
  65. else displayApiError ( request, response, 405, 'method not allowed' );
  66. } );
  67. WebServer.registerRequestHandler ( '/upload', function ( request, response, requestData, cookies, session )
  68. {
  69. if ( session.variables.discordAuth )
  70. {
  71. response.writeHead ( 200, { 'Content-Type': 'text/html' } );
  72. let userdata = session.variables.discordAuth.userdata;
  73. WebServer.renderTemplate ( 'uploadform', request, response,
  74. {
  75. username: userdata.username,
  76. useravatar: 'https://cdn.discordapp.com/avatars/' + userdata.id + '/' + userdata.avatar + '.png',
  77. discriminator: userdata.discriminator
  78. } );
  79. response.end ( );
  80. }
  81. else
  82. {
  83. return WebServer.redirect ( request, response, '/' );
  84. }
  85. } );
  86. WebServer.registerRequestHandler ( '/auth', function ( request, response, requestData, cookies, session )
  87. {
  88. if ( session.variables.discordAuth ) return WebServer.redirect ( request, response, '/upload' );
  89. if ( requestData.query && requestData.query.code && !session.variables.discordAuth )
  90. {
  91. let code = requestData.query.code;
  92. requestlib.post ( {
  93. url: 'https://discordapp.com/api/oauth2/token',
  94. form:
  95. {
  96. client_id: Config.client_id,
  97. client_secret: Config.client_secret,
  98. grant_type: 'authorization_code',
  99. code: code,
  100. redirect_uri: Config.discord_auth.redirect_uri,
  101. scope: 'identify'
  102. }
  103. }, function ( error, res, body )
  104. {
  105. if ( !error )
  106. {
  107. let json = JSON.parse ( body );
  108. if ( json.access_token )
  109. {
  110. // return WebServer.redirect ( request, response, 'https://localhost:3000/upload' );
  111. verifyUserCredentials ( json.access_token, json.token_type, function ( userdata )
  112. {
  113. logger.log ( '[Info/WebServer] Authenticated discord user ' + userdata.id );
  114. session.variables.discordAuth = { };
  115. session.variables.discordAuth.data = json;
  116. session.variables.discordAuth.userdata = userdata;
  117. return WebServer.redirect ( request, response, 'upload' );
  118. }, function ( )
  119. {
  120. response.writeHead ( 200, { 'Content-Type': 'text/html' } );
  121. response.write ( '<h1>Auth Failed</h1>' );
  122. response.end ( );
  123. } );
  124. }
  125. else return WebServer.redirect ( request, response, '/' );
  126. }
  127. else throw new Error ( error );
  128. } );
  129. }
  130. else
  131. {
  132. logger.log ( '[Info/WebServer] Invalid Auth, no code provided. Redirecting...' );
  133. return WebServer.redirect ( request, response, Config.discord_auth.redirect );
  134. }
  135. } );
  136. WebServer.registerRequestHandler ( '/template_test', function ( request, response, requestData, cookies, session )
  137. {
  138. response.writeHead ( 200, { 'Content-Type': 'text/html' } );
  139. WebServer.renderTemplate ( 'uploadform', request, response,
  140. {
  141. username: 'huj',
  142. useravatar: 'https://cdn.discordapp.com/avatars/276791868141076480/4a3736a3aa445bec61dde599040d0ec7.png',
  143. discriminator: '6969'
  144. } );
  145. response.end ( );
  146. } );
  147. WebServer.registerRequestHandler ( '/session_test', function ( request, response, requestData, cookies, session )
  148. {
  149. if ( !session.variables.testRandomNumber ) session.variables.testRandomNumber = Math.floor ( Math.random ( ) * 2000 );
  150. response.writeHead ( 200, { 'Content-Type': 'text/html' } );
  151. response.write ( '<h1>Session Data</h1>' );
  152. response.write ( '<p>Session ID: ' + session.id + '</p>' );
  153. response.write ( '<p>Session Started: ' + session.started + '</p>' );
  154. response.write ( '<p>Session Expires: ' + session.expires + '</p>' );
  155. response.write ( '<p>Lifetime Remaining: ' + ( session.expires - Date.now ( ) ) + '</p>' );
  156. response.write ( '<p>Secret Number: ' + session.variables.testRandomNumber + '</p>' );
  157. response.write ( '<p>Variables: ' + JSON.stringify ( session.variables ) + '</p>' )
  158. response.end ( );
  159. } );