index.js 11 KB

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