Commit 5d54d2e3d78bead628ba794d8dcbe2c2f84588fd
1 parent
fac58c4980
Exists in
master
Add config.custom_ping.add_buddies_on_init
Showing 2 changed files with 24 additions and 0 deletions Inline Diff
config.sample.json
1 | { | 1 | { |
2 | "origin": "PLEASE_CHANGE_ME", | 2 | "origin": "PLEASE_CHANGE_ME", |
3 | "username": "PLEASE_CHANGE_ME", | 3 | "username": "PLEASE_CHANGE_ME", |
4 | "password": "PLEASE_CHANGE_ME", | 4 | "password": "PLEASE_CHANGE_ME", |
5 | "warming_up_ms": 1000, | 5 | "warming_up_ms": 1000, |
6 | "messaging_url": "http://localhost:32979/", | 6 | "messaging_url": "http://localhost:32979/", |
7 | "listen_port": 32989, | 7 | "listen_port": 32989, |
8 | "ping_interval_ms": 60000, | 8 | "ping_interval_ms": 60000, |
9 | "do_not_terminate_on_error": false, | 9 | "do_not_terminate_on_error": false, |
10 | "custom_ping": { | 10 | "custom_ping": { |
11 | "verbose": false, | 11 | "verbose": false, |
12 | "disable_pong": false, | 12 | "disable_pong": false, |
13 | "allowed_from_all": false, | 13 | "allowed_from_all": false, |
14 | "add_buddies_on_init": false, | ||
14 | "allowed_from_partners": [], | 15 | "allowed_from_partners": [], |
15 | "send_to": [] | 16 | "send_to": [] |
16 | }, | 17 | }, |
17 | "kill_on_idle": { | 18 | "kill_on_idle": { |
18 | "disable": false, | 19 | "disable": false, |
19 | "max_idle_ms": 60000 | 20 | "max_idle_ms": 60000 |
20 | } | 21 | } |
21 | } | 22 | } |
22 | 23 |
lib/custom-ping.js
1 | const MODULE_NAME = 'CUSTOM-PING'; | 1 | const MODULE_NAME = 'CUSTOM-PING'; |
2 | 2 | ||
3 | const uniqid = require('uniqid'); | 3 | const uniqid = require('uniqid'); |
4 | const config = require('komodo-sdk/config'); | 4 | const config = require('komodo-sdk/config'); |
5 | const logger = require('tektrans-logger'); | 5 | const logger = require('tektrans-logger'); |
6 | 6 | ||
7 | const sender = require('./sender'); | 7 | const sender = require('./sender'); |
8 | 8 | ||
9 | const isVerbose = !!(config.custom_ping && config.custom_ping.verbose); | 9 | const isVerbose = !!(config.custom_ping && config.custom_ping.verbose); |
10 | logger.verbose(`${MODULE_NAME} CE44F47F: Verbosity initialized`, { | 10 | logger.verbose(`${MODULE_NAME} CE44F47F: Verbosity initialized`, { |
11 | isVerbose, | 11 | isVerbose, |
12 | }); | 12 | }); |
13 | 13 | ||
14 | let bot; | 14 | let bot; |
15 | 15 | ||
16 | const allowedFromPartnerList = ( | 16 | const allowedFromPartnerList = ( |
17 | (config.custom_ping && config.custom_ping.allowed_from_partners) || [] | 17 | (config.custom_ping && config.custom_ping.allowed_from_partners) || [] |
18 | ) | 18 | ) |
19 | .filter((item) => typeof item === 'string') | 19 | .filter((item) => typeof item === 'string') |
20 | .map((item) => (item || '').trim().toUpperCase()) | 20 | .map((item) => (item || '').trim().toUpperCase()) |
21 | .filter((item) => item); | 21 | .filter((item) => item); |
22 | 22 | ||
23 | const isPingMessage = (msg) => { | 23 | const isPingMessage = (msg) => { |
24 | if (!msg) return false; | 24 | if (!msg) return false; |
25 | if (typeof msg !== 'string') return false; | 25 | if (typeof msg !== 'string') return false; |
26 | 26 | ||
27 | return ((msg || '').trim().toUpperCase().search(/^PING($| )/) === 0); | 27 | return ((msg || '').trim().toUpperCase().search(/^PING($| )/) === 0); |
28 | }; | 28 | }; |
29 | exports.isPingMessage = isPingMessage; | 29 | exports.isPingMessage = isPingMessage; |
30 | 30 | ||
31 | const isPongMessage = (msg) => { | 31 | const isPongMessage = (msg) => { |
32 | if (!msg) return false; | 32 | if (!msg) return false; |
33 | if (typeof msg !== 'string') return false; | 33 | if (typeof msg !== 'string') return false; |
34 | 34 | ||
35 | return ((msg || '').trim().toUpperCase().search(/^PONG($| )/) === 0); | 35 | return ((msg || '').trim().toUpperCase().search(/^PONG($| )/) === 0); |
36 | }; | 36 | }; |
37 | exports.isPongMessage = isPongMessage; | 37 | exports.isPongMessage = isPongMessage; |
38 | 38 | ||
39 | const isAllowedPartner = (partner) => { | 39 | const isAllowedPartner = (partner) => { |
40 | if (!config.custom_ping) return false; | 40 | if (!config.custom_ping) return false; |
41 | if (config.custom_ping.disable_pong) return false; | 41 | if (config.custom_ping.disable_pong) return false; |
42 | 42 | ||
43 | if (config.custom_ping.allowed_from_all) return true; | 43 | if (config.custom_ping.allowed_from_all) return true; |
44 | return allowedFromPartnerList.indexOf((partner || '').trim().toUpperCase()) >= 0; | 44 | return allowedFromPartnerList.indexOf((partner || '').trim().toUpperCase()) >= 0; |
45 | }; | 45 | }; |
46 | exports.isAllowedPartner = isAllowedPartner; | 46 | exports.isAllowedPartner = isAllowedPartner; |
47 | 47 | ||
48 | const sendPong = (xid, partner, pingMessage) => { | 48 | const sendPong = (xid, partner, pingMessage) => { |
49 | if (!bot) return; | 49 | if (!bot) return; |
50 | if (!partner || typeof partner !== 'string' || !partner.trim()) return; | 50 | if (!partner || typeof partner !== 'string' || !partner.trim()) return; |
51 | 51 | ||
52 | const tokens = pingMessage.trim().split(/ +/); | 52 | const tokens = pingMessage.trim().split(/ +/); |
53 | 53 | ||
54 | const pongMessage = [ | 54 | const pongMessage = [ |
55 | 'PONG', | 55 | 'PONG', |
56 | (tokens && tokens[1]) || null, | 56 | (tokens && tokens[1]) || null, |
57 | ].filter((item) => item) | 57 | ].filter((item) => item) |
58 | .join(' '); | 58 | .join(' '); |
59 | 59 | ||
60 | if (isVerbose) { | 60 | if (isVerbose) { |
61 | logger.verbose(`${MODULE_NAME} F0D18EF4: Responding PING message`, { | 61 | logger.verbose(`${MODULE_NAME} F0D18EF4: Responding PING message`, { |
62 | xid, partner, pongMessage, | 62 | xid, partner, pongMessage, |
63 | }); | 63 | }); |
64 | } | 64 | } |
65 | 65 | ||
66 | sender.send(partner.trim(), pongMessage, null, !isVerbose); | 66 | sender.send(partner.trim(), pongMessage, null, !isVerbose); |
67 | }; | 67 | }; |
68 | exports.sendPong = sendPong; | 68 | exports.sendPong = sendPong; |
69 | 69 | ||
70 | const sleepMs = (ms) => new Promise((resolve) => { | 70 | const sleepMs = (ms) => new Promise((resolve) => { |
71 | setTimeout(() => { | 71 | setTimeout(() => { |
72 | resolve(true); | 72 | resolve(true); |
73 | }, ms); | 73 | }, ms); |
74 | }); | 74 | }); |
75 | 75 | ||
76 | const pingSender = async () => { | 76 | const pingSender = async () => { |
77 | const xid = uniqid(); | 77 | const xid = uniqid(); |
78 | 78 | ||
79 | if (bot) { | 79 | if (bot) { |
80 | const msg = `PING ${xid}`; | 80 | const msg = `PING ${xid}`; |
81 | 81 | ||
82 | sender.send(config.username, msg, xid, !isVerbose); | 82 | sender.send(config.username, msg, xid, !isVerbose); |
83 | 83 | ||
84 | if ( | 84 | if ( |
85 | config.custom_ping | 85 | config.custom_ping |
86 | && config.custom_ping.send_to | 86 | && config.custom_ping.send_to |
87 | && Array.isArray(config.custom_ping.send_to) | 87 | && Array.isArray(config.custom_ping.send_to) |
88 | ) { | 88 | ) { |
89 | const partnerCount = config.custom_ping.send_to.length; | 89 | const partnerCount = config.custom_ping.send_to.length; |
90 | for (let i = 0; i < partnerCount; i += 1) { | 90 | for (let i = 0; i < partnerCount; i += 1) { |
91 | const additionalDelay = Math.random() * 1000; | 91 | const additionalDelay = Math.random() * 1000; |
92 | 92 | ||
93 | // eslint-disable-next-line no-await-in-loop | 93 | // eslint-disable-next-line no-await-in-loop |
94 | await sleepMs(1000 + additionalDelay); | 94 | await sleepMs(1000 + additionalDelay); |
95 | 95 | ||
96 | const partner = config.custom_ping.send_to[i]; | 96 | const partner = config.custom_ping.send_to[i]; |
97 | 97 | ||
98 | if (isVerbose) { | 98 | if (isVerbose) { |
99 | logger.verbose(`${MODULE_NAME} 21358F45: Sending custom ping`, { | 99 | logger.verbose(`${MODULE_NAME} 21358F45: Sending custom ping`, { |
100 | xid, | 100 | xid, |
101 | partner, | 101 | partner, |
102 | msg, | 102 | msg, |
103 | }); | 103 | }); |
104 | } | 104 | } |
105 | 105 | ||
106 | sender.send(partner, msg, xid, !isVerbose); | 106 | sender.send(partner, msg, xid, !isVerbose); |
107 | } | 107 | } |
108 | } | 108 | } |
109 | } | 109 | } |
110 | 110 | ||
111 | await sleepMs(3 * 1000); | 111 | await sleepMs(3 * 1000); |
112 | pingSender(); | 112 | pingSender(); |
113 | }; | 113 | }; |
114 | 114 | ||
115 | const addBuddiesOnInit = () => { | ||
116 | if ( | ||
117 | !config.custom_ping || !config.custom_ping.send_to | ||
118 | || !Array.isArray(config.custom_ping.send_to) | ||
119 | || !config.custom_ping.send_to.length | ||
120 | ) { | ||
121 | return; | ||
122 | } | ||
123 | |||
124 | logger.verbose(`${MODULE_NAME} 3BBD9A02: Adding custom ping targets as buddies`, { | ||
125 | targets: config.custom_ping.send_to, | ||
126 | }); | ||
127 | |||
128 | config.custom_ping.send_to.forEach((target) => { | ||
129 | bot.subscribe(target); | ||
130 | }); | ||
131 | }; | ||
132 | |||
115 | const setBot = (botFromCaller) => { | 133 | const setBot = (botFromCaller) => { |
116 | logger.verbose(`${MODULE_NAME} A063F39F: Bot registered for custom ping`); | 134 | logger.verbose(`${MODULE_NAME} A063F39F: Bot registered for custom ping`); |
117 | bot = botFromCaller; | 135 | bot = botFromCaller; |
136 | |||
137 | if (config.custom_ping && config.custom_ping.add_buddies_on_init) { | ||
138 | addBuddiesOnInit(); | ||
139 | } | ||
140 | |||
118 | pingSender(); | 141 | pingSender(); |
119 | }; | 142 | }; |
120 | exports.setBot = setBot; | 143 | exports.setBot = setBot; |
121 | 144 |