index.js 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  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 [quantity(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. console.log(message.content);
  21. if (message.content.startsWith(`${config.prefix}dump`)) {
  22. console.log('Warning, dump in progress! May cause slowdows.');
  23. number = message.content.slice(6);
  24. if (number=='') number = 99;
  25. //console.log(number);
  26. message.delete(2);
  27. var channel = message.channel;
  28. async function run() {
  29. var fetched = await channel.fetchMessages({limit: number});
  30. //console.log(fetched);
  31. var connection = mysql.createConnection({
  32. host : serverData.dbHost,
  33. user : serverData.dbUser,
  34. password : serverData.dbPassword,
  35. database : serverData.db
  36. });
  37. var sql = 'SELECT * FROM `'+serverData.dbTable+'`';
  38. connection.connect();
  39. connection.query(sql, function (error, results, fields) {
  40. if (error) throw error;
  41. //console.log('Data recived from db. Result: ', results);
  42. var messages = [];
  43. fetched.forEach(messageNow => {
  44. var found = false;
  45. var edited = true;
  46. results.forEach(function (msg){
  47. if (messageNow.id == msg.id || messageNow.id == message.id ) {
  48. found = true;
  49. }
  50. //console.log('message:' + ((messageNow.editedTimestamp == null) ? "nope" : messageNow.editedTimestamp) + ' db: ' + msg.timeEdit);
  51. if (found == true && (messageNow.editedTimestamp || "") == msg.timeEdit) {
  52. edited = false;
  53. }
  54. });
  55. if (found==true && edited==true) {
  56. messages.push({"message":messageNow, "action":1});
  57. } else if (found==false) {
  58. messages.push({"message":messageNow, "action":0});
  59. }
  60. });
  61. //console.log(messages);
  62. results.forEach(function (msg){
  63. var id = msg.id;
  64. var found = false;
  65. fetched.forEach(messageNow => {
  66. if (id == messageNow.id) {
  67. found = true;
  68. }
  69. });
  70. if (found == false) {
  71. messages.push({"message":msg, "action":2});
  72. }
  73. });
  74. sendLoop(messages, serverData, 1000);
  75. });
  76. connection.end();
  77. }
  78. run();
  79. } else {
  80. sendToDB(message, serverData);
  81. }
  82. });
  83. client.on('messageUpdate', (messageOld, messageNew) => {
  84. if (messageNew.author.bot==true) return;
  85. var serverData = undefined;
  86. config.servers.forEach(function(server) {
  87. if (messageNew.channel.id==server.channel) serverData = server;
  88. });
  89. if (serverData==undefined) return;
  90. var channel = messageNew.channel;
  91. var connection = mysql.createConnection({
  92. host : serverData.dbHost,
  93. user : serverData.dbUser,
  94. password : serverData.dbPassword,
  95. database : serverData.db
  96. });
  97. var sql = 'SELECT * FROM `'+serverData.dbTable+'`';
  98. connection.connect();
  99. connection.query(sql, function (error, results, fields) {
  100. if (error) throw error;
  101. //console.log('Data recived from db. Result: ', results);
  102. var messages = [];
  103. results.forEach(messageNow => {
  104. if (messageNow.id == messageNew.id) {
  105. messages.push({"message":messageNew, "action":1});
  106. }
  107. });
  108. sendLoop(messages, serverData, 1000);
  109. });
  110. connection.end();
  111. });
  112. client.on('messageDelete', message => {
  113. if (message.author.bot==true) return;
  114. var serverData = undefined;
  115. config.servers.forEach(function(server) {
  116. if (message.channel.id==server.channel) serverData = server;
  117. });
  118. if (serverData==undefined) return;
  119. deleteFromDB(message, serverData);
  120. });
  121. client.login(config.token);
  122. function sendLoop(messages, serverData, delay) {
  123. if (messages.length == 0) {
  124. return;
  125. }
  126. if (messages[0].action == 0) {
  127. sendToDB(messages[0].message, serverData);
  128. } else if (messages[0].action == 1) {
  129. updateDB(messages[0].message, serverData);
  130. } else if (messages[0].maction == 2) {
  131. deleteFromDB(messages[0].message, serverData);
  132. }
  133. messages.shift();
  134. setTimeout(sendLoop, delay, messages, serverData, delay);
  135. }
  136. function updateDB(message, serverData) {
  137. var connection = mysql.createConnection({
  138. host : serverData.dbHost,
  139. user : serverData.dbUser,
  140. password : serverData.dbPassword,
  141. database : serverData.db
  142. });
  143. var l = [];
  144. var msgCopy = message.content;
  145. msgCopy.replace(urlRegex, function(url) {
  146. l.push(url);
  147. });
  148. var i = [];
  149. message.attachments.forEach(attachment => {
  150. i.push(attachment.url);
  151. });
  152. var mentions = [];
  153. message.mentions.users.forEach(user => {
  154. mentions.push({"userId": user.id, "username": user.username, "discriminator": user.discriminator});
  155. });
  156. var messageContent = message.content;
  157. for (mention of mentions) {
  158. if(messageContent.includes(mention.userId)) {
  159. if (serverData.mentionsMode == 0) {
  160. messageContent = messageContent.replace(new RegExp("<@"+mention.userId+">", 'g'), "@"+mention.userId);
  161. messageContent = messageContent.replace(new RegExp("<@!"+mention.userId+">", 'g'), "@"+mention.userId);
  162. } else if (serverData.mentionsMode == 1) {
  163. messageContent = messageContent.replace(new RegExp("<@"+mention.userId+">", 'g'), "@"+mention.username);
  164. messageContent = messageContent.replace(new RegExp("<@!"+mention.userId+">", 'g'), "@"+mention.username);
  165. } else {
  166. messageContent = messageContent.replace(new RegExp("<@"+mention.userId+">", 'g'), "@"+mention.username+"#"+mention.discriminator);
  167. messageContent = messageContent.replace(new RegExp("<@!"+mention.userId+">", 'g'), "@"+mention.username+"#"+mention.discriminator);
  168. }
  169. }
  170. }
  171. if (serverData.authorMode == 0) {
  172. var author = message.author.id;
  173. } else if (serverData.authorMode == 1) {
  174. var author = message.author.username;
  175. } else {
  176. var author = message.author.tag;
  177. }
  178. var post = {message:messageContent, id:message.id, time:message.createdTimestamp, timeEdit:(message.editedTimestamp || ""), user:author, links:JSON.stringify(l), images:JSON.stringify(i)};
  179. var sql = 'UPDATE '+serverData.dbTable+' SET ? WHERE id='+message.id;
  180. connection.connect();
  181. connection.query(sql, post, function (error, results, fields) {
  182. if (error) throw error;
  183. console.log('Data updated in db. Result: ', results);
  184. });
  185. connection.end();
  186. }
  187. function sendToDB(message, serverData) {
  188. var connection = mysql.createConnection({
  189. host : serverData.dbHost,
  190. user : serverData.dbUser,
  191. password : serverData.dbPassword,
  192. database : serverData.db
  193. });
  194. var l = [];
  195. var msgCopy = message.content;
  196. msgCopy.replace(urlRegex, function(url) {
  197. l.push(url);
  198. });
  199. var i = [];
  200. message.attachments.forEach(attachment => {
  201. i.push(attachment.url);
  202. });
  203. var mentions = [];
  204. message.mentions.users.forEach(user => {
  205. mentions.push({"userId": user.id, "username": user.username, "discriminator": user.discriminator});
  206. });
  207. var messageContent = message.content;
  208. for (mention of mentions) {
  209. if(messageContent.includes(mention.userId)) {
  210. if (serverData.mentionsMode == 0) {
  211. messageContent = messageContent.replace(new RegExp("<@"+mention.userId+">", 'g'), "@"+mention.userId);
  212. messageContent = messageContent.replace(new RegExp("<@!"+mention.userId+">", 'g'), "@"+mention.userId);
  213. } else if (serverData.mentionsMode == 1) {
  214. messageContent = messageContent.replace(new RegExp("<@"+mention.userId+">", 'g'), "@"+mention.username);
  215. messageContent = messageContent.replace(new RegExp("<@!"+mention.userId+">", 'g'), "@"+mention.username);
  216. } else {
  217. messageContent = messageContent.replace(new RegExp("<@"+mention.userId+">", 'g'), "@"+mention.username+"#"+mention.discriminator);
  218. messageContent = messageContent.replace(new RegExp("<@!"+mention.userId+">", 'g'), "@"+mention.username+"#"+mention.discriminator);
  219. }
  220. }
  221. }
  222. if (serverData.authorMode == 0) {
  223. var author = message.author.id;
  224. } else if (serverData.authorMode == 1) {
  225. var author = message.author.username;
  226. } else {
  227. var author = message.author.tag;
  228. }
  229. var post = {message:messageContent, id:message.id, time:message.createdTimestamp, timeEdit:(message.editedTimestamp || ""), user:author, links:JSON.stringify(l), images:JSON.stringify(i)};
  230. var sql = 'INSERT INTO '+serverData.dbTable+' SET ?';
  231. connection.connect();
  232. connection.query(sql, post, function (error, results, fields) {
  233. if (error) throw error;
  234. console.log('Data sent to db. Result: ', results);
  235. });
  236. connection.end();
  237. }
  238. function deleteFromDB(message, serverData) {
  239. var connection = mysql.createConnection({
  240. host : serverData.dbHost,
  241. user : serverData.dbUser,
  242. password : serverData.dbPassword,
  243. database : serverData.db
  244. });
  245. var sql = 'DELETE FROM '+serverData.dbTable+' WHERE id='+message.id;
  246. connection.connect();
  247. connection.query(sql, function (error, results, fields) {
  248. if (error) throw error;
  249. console.log('Data deleted in db. Result: ', results);
  250. });
  251. connection.end();
  252. }