/
telegram.coffee
116 lines (92 loc) · 4.22 KB
/
telegram.coffee
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
{Robot, Adapter, TextMessage, EnterMessage, LeaveMessage, TopicMessage} = require 'hubot'
class Telegram extends Adapter
constructor: ->
super
@token = process.env.TELEGRAM_BOT_TOKEN
@refreshRate = process.env.TELEGRAM_BOT_REFRESH or 1500
@webhook = process.env.TELEGRAM_BOT_WEBHOOK or false
@apiURL = "https://api.telegram.org/bot"
@telegramBot = null
@offset = 0
@robot.logger.info "hubot-telegram-bot: Adapter loaded."
_telegramRequest: (method, params = {}, handler) ->
@robot.http("#{@apiURL}#{@token}/#{method}")
.header("Accept", "application/json")
.query(params)
.get() (err, httpRes, body) =>
if err or httpRes.statusCode isnt 200
return @robot.logger.error "hubot-telegram-bot: #{body} (#{err})"
payload = JSON.parse body
handler payload.result
_getMe: (handler) ->
@_telegramRequest "getMe", null, (res) ->
handler res
_createUser: (user, chatId) ->
_userName = user.username or user.first_name + " " + user.last_name
@robot.brain.userForId user.id, name: _userName, room: chatId
_processMsg: (msg) ->
_chatId = msg.message.chat.id
# Text message
_text = msg.message.text
if _text
# Group privacy mode
if _text.charAt(0) is "/"
_text = _text.substr(1)
if msg.message.chat.type is "group"
_text = @robot.name + " " + _text
# PM
if _chatId is msg.message.from.id
_text = @robot.name + " " + _text
# Create user
user = @_createUser msg.message.from, _chatId
message = new TextMessage user, _text.trim(), msg.message.message_id
# Enter message
else if msg.message.new_chat_participant
user = @_createUser msg.message.new_chat_participant, _chatId
message = new EnterMessage user, null, msg.message.message_id
# Leave message
else if msg.message.left_chat_participant
user = @_createUser msg.message.left_chat_participant, _chatId
message = new LeaveMessage user, null, msg.message.message_id
# Topic change
else if msg.message.new_chat_title
user = @_createUser msg.message.from, _chatId
message = new TopicMessage user, msg.message.new_chat_title, msg.message.message_id
@receive(message) if message?
@offset = msg.update_id
send: (envelope, strings...) ->
message =
chat_id: envelope.room
text: strings.join "\n"
@_telegramRequest "sendMessage", message, (res) =>
@robot.logger.debug "hubot-telegram-bot: Send -> #{res}"
reply: (envelope, strings...) ->
message =
chat_id: envelope.room
text: strings.join "\n"
reply_to_message_id: envelope.message.id
@_telegramRequest "sendMessage", message, (res) =>
@robot.logger.debug "hubot-telegram-bot: Reply -> #{res}"
run: ->
unless @token
@emit "error", new Error "You must configure the TELEGRAM_BOT_TOKEN environment variable."
@_getMe (res) =>
@telegramBot = res
@robot.logger.info "hubot-telegram-bot: Hello, I'm #{res.first_name}!"
if @webhook
@_telegramRequest "setWebhook", url: @webhook, (res) =>
@robot.logger.info "hubot-telegram-bot: Using webhook method (`#{@webhook}`) for receiving updates."
@robot.router.post "/telegram", (httpReq, httpRes) =>
payload = httpReq.body.result
@_processMsg obj for obj in payload
else
@_telegramRequest "setWebhook", url: "", (res) =>
@robot.logger.info "hubot-telegram-bot: Using long polling method. Disabling webhook."
setInterval =>
@_telegramRequest "getUpdates", offset: @offset + 1, (res) =>
@_processMsg obj for obj in res
, @refreshRate
@robot.logger.info "hubot-telegram-bot: Adapter running."
@emit "connected"
exports.use = (robot) ->
new Telegram robot