index.js
3.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
var http = require('http');
var url = require('url');
var winston = require('winston');
var strftime = require('strftime');
var strptime = require('micro-strptime').strptime;
var request = require('request');
var striptags = require('striptags');
var fs = require('fs');
var ini = require('ini');
var config = ini.parse(fs.readFileSync(__dirname + '/config.ini', 'utf-8'));
var last_message_hash;
var logger = new (winston.Logger)({
transports: [
new (winston.transports.Console)({
timestamp: function() {
return strftime('%F %T', new Date());
}
}),
new (winston.transports.DailyRotateFile)({
filename: __dirname + '/logs/log',
timestamp: function() {
return strftime('%F %T', new Date());
}
})
]
});
var ym = require('yahoomessenger');
ym.newInstance();
function onReady(){
ym.login(config.globals.username, config.globals.password);
}
function onLoginSuccessful(data) {
logger.info('Login successful as ' + data.firstname + ' ' + data.lastname + ' (' + data.user_id + ')', {data: data});
}
function sendIgnoreResponse(destination, message) {
ym.sendPM(destination, "Pesan anda diabaikan, silahkan diulang beberapa saat lagi jika diperlukan: " + message);
}
function onPm(data) {
logger.info('onPM()', {data: data});
var message = striptags(data.message);
/*
var new_message_hash = data.sender + ': ' + message;
if (last_message_hash == new_message_hash) {
return;
}
*/
var greeting_suffix = "Pesan anda telah diterima dan akan segera diproses:";
if (config.globals.greeting_suffix) {
greeting_suffix = config.globals.greeting_suffix;
}
last_message_hash = new_message_hash;
ym.sendPM(data.sender, greeting_suffix + ' ' + message);
forwardMessageToEvo(data.sender, message, formatTimestamp(data.time));
}
function onOfflinePM(data) {
logger.info('onOfflinePM()', {data: data});
sendIgnoreResponse(data.sender, data.message);
}
function onBuddyAddRequest(data) {
logger.info('onBuddyAddRequest()', {data: data});
ym.acceptAddBuddy(data.username);
logger.info('Accept buddy add request: ' + data.username, {data: data});
}
function onHttpIncomingMessage(request, response) {
var qs = url.parse(request.url, true).query;
logger.info("onHttpIncomingMessage()", {qs: qs});
var destination = qs.to.replace(config.globals.msisdn_suffix, '');
logger.info('Sending message to ' + destination + ': ' + qs.msg);
ym.sendPM(destination, qs.msg);
response.end('OK');
}
function formatTimestamp(ts) {
var _ts = strptime(ts, '%A %b %d %Y %H:%M:%S GMT%z');
return strftime('%F %T', _ts);
}
function forwardMessageToEvo(sender, message, ts) {
var msisdn = sender + config.globals.msisdn_suffix;
var opts = {
url: config.globals.evo_url,
qs: {
msg: message,
msisdn: msisdn,
smsc: config.globals.smsc,
ts: ts
}
};
logger.info("Forwarding message to evo", {request_opts: opts});
request(opts, function(err, response, body) {
if (err) {
logger.warn('Error forwarding to evo: ' + err);
return;
}
});
}
function createHttpServer() {
logger.verbose('createHttpServer()');
var httpServer = http.createServer(onHttpIncomingMessage);
httpServer.listen(config.globals.listen_port, function(){
logger.info("HTTP server listening on " + config.globals.listen_port);
});
}
createHttpServer();
ym.on('ready', onReady);
ym.on('loginSuccessful', onLoginSuccessful);
ym.on('pm', onPm);
ym.on('buddyAddRequest', onBuddyAddRequest);