index.js 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. const Discord = require('discord.js');
  2. const client = new Discord.Client();
  3. const config = require('./config.json');
  4. var mysql = require('mysql');
  5. var urlRegex = /^(ftp|http|https):\/\/[^ "]+$/;
  6. client.on('ready', () => {
  7. if (config.playing !== "") {
  8. client.user.setPresence({ status: 'online', game: { name: config.playing } });
  9. }
  10. console.log(`Logged in as ${client.user.tag}!`);
  11. console.log(`To send missing messages run ${config.prefix}dump [quntity(default and limited to 99)]`);
  12. });
  13. client.on('message', message => {
  14. if (message.author.bot==true) return;
  15. var serverData = undefined;
  16. config.servers.forEach(function(server) {
  17. if (message.channel.id==server.channel) serverData = server;
  18. });
  19. if (serverData==undefined) return;
  20. if (message.content.startsWith(`${config.prefix}dump`)) {
  21. console.log('Warning, dump in progress! May cause slowdows.');
  22. number = message.content.slice(6);
  23. if (number=='') number = 99;
  24. console.log(number);
  25. message.delete(2);
  26. var channel = message.channel;
  27. async function run() {
  28. var fetched = await channel.fetchMessages({limit: number});
  29. //console.log(fetched);
  30. var connection = mysql.createConnection({
  31. host : serverData.dbHost,
  32. user : serverData.dbUser,
  33. password : serverData.dbPassword,
  34. database : serverData.db
  35. });
  36. var sql = 'SELECT * FROM `'+serverData.dbTable+'`';
  37. connection.connect();
  38. connection.query(sql, function (error, results, fields) {
  39. if (error) throw error;
  40. console.log('Data recived from db. Result: ', results);
  41. var messages = [];
  42. fetched.forEach(messageNow => {
  43. var found = false;
  44. var edited = false;
  45. results.forEach(function (msg){
  46. if (messageNow.id == msg.id || messageNow.id == message.id ) {
  47. found = true;
  48. //console.log('new');
  49. }
  50. //console.log('message:' + ((messageNow.editedTimestamp == null) ? "" : messageNow.editedTimestamp) + ' db: ' + JSON.stringify(msg));
  51. if (found != null && ((messageNow.editedTimestamp == null) ? "" : messageNow.editedTimestamp) != msg.timeEdit) {
  52. edited = true;
  53. //console.log('oh nvm edited');
  54. }
  55. });
  56. if (found==true && edited==true) {
  57. messages.push({"message":messageNow, "action":1});
  58. } else if (found==false) {
  59. messages.push({"message":messageNow, "action":0});
  60. }
  61. });
  62. //console.log(messages);
  63. sendLoop(messages, serverData, 1000);
  64. });
  65. connection.end();
  66. }
  67. run();
  68. } else {
  69. sendToDB(message, serverData);
  70. }
  71. });
  72. client.on('messageUpdate', (messageOld, messageNew) => {
  73. if (messageNew.author.bot==true) return;
  74. var serverData = undefined;
  75. config.servers.forEach(function(server) {
  76. if (messageNew.channel.id==server.channel) serverData = server;
  77. });
  78. if (serverData==undefined) return;
  79. var channel = messageNew.channel;
  80. var connection = mysql.createConnection({
  81. host : serverData.dbHost,
  82. user : serverData.dbUser,
  83. password : serverData.dbPassword,
  84. database : serverData.db
  85. });
  86. var sql = 'SELECT * FROM `'+serverData.dbTable+'`';
  87. connection.connect();
  88. connection.query(sql, function (error, results, fields) {
  89. if (error) throw error;
  90. //console.log('Data recived from db. Result: ', results);
  91. var messages = [];
  92. results.forEach(messageNow => {
  93. if (messageNow.id == messageNew.id) {
  94. messages.push({"message":messageNew, "action":1});
  95. }
  96. });
  97. sendLoop(messages, serverData, 1000);
  98. });
  99. connection.end();
  100. });
  101. client.login(config.token);
  102. function sendLoop(messages, serverData, delay) {
  103. if (messages.length == 0) {
  104. return;
  105. }
  106. if (messages[0].action == 0) {
  107. sendToDB(messages[0].message, serverData);
  108. } else if (messages[0].action == 1) {
  109. updateDB(messages[0].message, serverData);
  110. }
  111. messages.shift();
  112. setTimeout(sendLoop, delay, messages, serverData, delay);
  113. }
  114. function updateDB(message, serverData) {
  115. var connection = mysql.createConnection({
  116. host : serverData.dbHost,
  117. user : serverData.dbUser,
  118. password : serverData.dbPassword,
  119. database : serverData.db
  120. });
  121. var l = [];
  122. var msgCopy = message.content;
  123. msgCopy.replace(urlRegex, function(url) {
  124. l.push(url);
  125. });
  126. var i = [];
  127. message.attachments.forEach(attachment => {
  128. i.push(attachment.url);
  129. });
  130. var mentions = [];
  131. message.mentions.users.forEach(user => {
  132. mentions.push({"userId": user.id, "username": user.username, "discriminator": user.discriminator});
  133. });
  134. var messageContent = message.content;
  135. for (mention of mentions) {
  136. if(messageContent.includes(mention.userId)) {
  137. if (serverData.mentionsMode == 0) {
  138. messageContent = messageContent.replace(new RegExp("<@"+mention.userId+">", 'g'), "@"+mention.userId);
  139. messageContent = messageContent.replace(new RegExp("<@!"+mention.userId+">", 'g'), "@"+mention.userId);
  140. } else if (serverData.mentionsMode == 1) {
  141. messageContent = messageContent.replace(new RegExp("<@"+mention.userId+">", 'g'), "@"+mention.username);
  142. messageContent = messageContent.replace(new RegExp("<@!"+mention.userId+">", 'g'), "@"+mention.username);
  143. } else {
  144. messageContent = messageContent.replace(new RegExp("<@"+mention.userId+">", 'g'), "@"+mention.username+"#"+mention.discriminator);
  145. messageContent = messageContent.replace(new RegExp("<@!"+mention.userId+">", 'g'), "@"+mention.username+"#"+mention.discriminator);
  146. }
  147. }
  148. }
  149. if (serverData.authorMode == 0) {
  150. var author = message.author.id;
  151. } else if (serverData.authorMode == 1) {
  152. var author = message.author.username;
  153. } else {
  154. var author = message.author.tag;
  155. }
  156. var post = {message:messageContent, id:message.id, time:message.createdTimestamp, timeEdit:message.editedTimestamp, user:author, links:JSON.stringify(l), images:JSON.stringify(i)};
  157. var sql = 'UPDATE '+serverData.dbTable+' SET ? WHERE id='+message.id;
  158. connection.connect();
  159. connection.query(sql, post, function (error, results, fields) {
  160. if (error) throw error;
  161. console.log('Data updated in db. Result: ', results);
  162. });
  163. connection.end();
  164. }
  165. function sendToDB(message, serverData) {
  166. var connection = mysql.createConnection({
  167. host : serverData.dbHost,
  168. user : serverData.dbUser,
  169. password : serverData.dbPassword,
  170. database : serverData.db
  171. });
  172. var l = [];
  173. var msgCopy = message.content;
  174. msgCopy.replace(urlRegex, function(url) {
  175. l.push(url);
  176. });
  177. var i = [];
  178. message.attachments.forEach(attachment => {
  179. i.push(attachment.url);
  180. });
  181. var mentions = [];
  182. message.mentions.users.forEach(user => {
  183. mentions.push({"userId": user.id, "username": user.username, "discriminator": user.discriminator});
  184. });
  185. var messageContent = message.content;
  186. for (mention of mentions) {
  187. if(messageContent.includes(mention.userId)) {
  188. if (serverData.mentionsMode == 0) {
  189. messageContent = messageContent.replace(new RegExp("<@"+mention.userId+">", 'g'), "@"+mention.userId);
  190. messageContent = messageContent.replace(new RegExp("<@!"+mention.userId+">", 'g'), "@"+mention.userId);
  191. } else if (serverData.mentionsMode == 1) {
  192. messageContent = messageContent.replace(new RegExp("<@"+mention.userId+">", 'g'), "@"+mention.username);
  193. messageContent = messageContent.replace(new RegExp("<@!"+mention.userId+">", 'g'), "@"+mention.username);
  194. } else {
  195. messageContent = messageContent.replace(new RegExp("<@"+mention.userId+">", 'g'), "@"+mention.username+"#"+mention.discriminator);
  196. messageContent = messageContent.replace(new RegExp("<@!"+mention.userId+">", 'g'), "@"+mention.username+"#"+mention.discriminator);
  197. }
  198. }
  199. }
  200. if (serverData.authorMode == 0) {
  201. var author = message.author.id;
  202. } else if (serverData.authorMode == 1) {
  203. var author = message.author.username;
  204. } else {
  205. var author = message.author.tag;
  206. }
  207. var post = {message:messageContent, id:message.id, time:message.createdTimestamp, timeEdit:((message.editedTimestamp == null) ? "" : message.editedTimestamp), user:author, links:JSON.stringify(l), images:JSON.stringify(i)};
  208. var sql = 'INSERT INTO '+serverData.dbTable+' SET ?';
  209. connection.connect();
  210. connection.query(sql, post, function (error, results, fields) {
  211. if (error) throw error;
  212. console.log('Data sent to db. Result: ', results);
  213. });
  214. connection.end();
  215. }