hubot-matrix/src/matrix.coffee
David A Roberts 7b83cbc5d7 image upload
2015-12-05 14:02:04 +10:00

72 lines
2.5 KiB
CoffeeScript

try
{Robot,Adapter,TextMessage,User} = require 'hubot'
catch
prequire = require('parent-require')
{Robot,Adapter,TextMessage,User} = prequire 'hubot'
sdk = require 'matrix-js-sdk'
request = require 'request'
class Matrix extends Adapter
constructor: ->
super
@robot.logger.info "Constructor"
send: (envelope, strings...) ->
for str in strings
@robot.logger.info "Sending to #{envelope.room}: #{str}"
if /^(f|ht)tps?:\/\//i.test(str)
@sendImage envelope, str
else
@client.sendTextMessage envelope.room, str
reply: (envelope, strings...) ->
for str in strings
@send envelope, "#{envelope.user.name}: #{str}"
sendImage: (envelope, url) ->
@client.uploadContent(stream: request url, name: url).done (murl) =>
@client.sendMessage envelope.room, {
msgtype: "m.image",
body: url,
url: JSON.parse(murl).content_uri
}
run: ->
@robot.logger.info "Run #{@robot.name}"
client = sdk.createClient('https://matrix.org')
client.login 'm.login.password', {
user: @robot.name
password: process.env.HUBOT_MATRIX_PASSWORD
}, (err, data) =>
if err
@robot.logger.error err
return
@user_id = data.user_id
@access_token = data.access_token
@robot.logger.info "Logged in #{@user_id}"
@client = sdk.createClient
baseUrl: 'https://matrix.org'
accessToken: @access_token
userId: @user_id
@client.on 'syncComplete', =>
@robot.logger.info "Synced #{@client.getRooms().length} rooms"
@emit 'connected'
@client.on 'Room.timeline', (event, room, toStartOfTimeline) =>
if event.getType() == 'm.room.message' and toStartOfTimeline == false
message = event.getContent().body
name = event.getSender()
user = @robot.brain.userForId name
user.room = room.roomId
if user.name != @user_id
@robot.logger.info "Received message: '#{message}' in room: #{user.room}, from: #{user.name}."
@receive new TextMessage user, message
@client.on 'RoomMember.membership', (event, member) =>
if member.membership == 'invite' and member.userId == @user_id
@client.joinRoom(member.roomId).done =>
@robot.logger.info "Auto-joined #{member.roomId}"
@client.startClient 0
exports.use = (robot) ->
new Matrix robot