index.js 10.0 KB

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