diff --git a/lib/telegram.rb b/lib/telegram.rb
index b5d34ce88..3f0a09a3b 100644
--- a/lib/telegram.rb
+++ b/lib/telegram.rb
@@ -176,6 +176,14 @@ returns
message_id = params[key][:message_id]
break
}
+ if message_id
+ [:message, :edited_message].each { |key|
+ next if !params[key]
+ next if !params[key][:chat]
+ next if !params[key][:chat][:id]
+ message_id = "#{message_id}.#{params[key][:chat][:id]}"
+ }
+ end
if !message_id
message_id = params[:update_id]
end
@@ -265,29 +273,54 @@ returns
Rails.logger.debug user.inspect
Rails.logger.debug group_id.inspect
+ # prepare title
+ title = '-'
+ [:text, :caption].each { |area|
+ next if !params[:message]
+ next if !params[:message][area]
+ title = params[:message][area]
+ break
+ }
+ if title == '-'
+ [:sticker, :photo, :document, :voice].each { |area|
+ begin
+ next if !params[:message]
+ next if !params[:message][area]
+ next if !params[:message][area][:emoji]
+ title = params[:message][area][:emoji]
+ break
+ rescue
+ # just go ahead
+ title
+ end
+ }
+ end
+ if title.length > 60
+ title = "#{title[0, 60]}..."
+ end
+
# find ticket or create one
state_ids = Ticket::State.where(name: %w(closed merged removed)).pluck(:id)
ticket = Ticket.where(customer_id: user.id).where.not(state_id: state_ids).order(:updated_at).first
if ticket
- new_state = Ticket::State.find_by(name: 'new')
+
+ # check if title need to be updated
+ if ticket.title == '-'
+ ticket.title = title
+ end
+ new_state = Ticket::State.find_by(default_create: true)
if ticket.state_id != new_state.id
- ticket.state = Ticket::State.find_by(name: 'open')
+ ticket.state = Ticket::State.find_by(default_follow_up: true)
end
ticket.save!
return ticket
end
- # prepare title
- title = params[:message][:text]
- if title.length > 60
- title = "#{title[0, 60]}..."
- end
-
ticket = Ticket.new(
group_id: group_id,
title: title,
- state_id: Ticket::State.find_by(name: 'new').id,
- priority_id: Ticket::Priority.find_by(name: '2 normal').id,
+ state_id: Ticket::State.find_by(default_create: true).id,
+ priority_id: Ticket::Priority.find_by(default_create: true).id,
customer_id: user.id,
preferences: {
channel_id: channel.id,
@@ -384,12 +417,12 @@ returns
# add document
if params[:message][:document]
- thump = params[:message][:document][:thumb]
+ thumb = params[:message][:document][:thumb]
body = ' '
- if thump
- width = thump[:width]
- height = thump[:height]
- result = download_file(thump['file_id'])
+ if thumb
+ width = thumb[:width]
+ height = thumb[:height]
+ result = download_file(thumb['file_id'])
if !result.success? || !result.body
raise "Unable for download image from telegram: #{result.code}"
end
@@ -441,6 +474,45 @@ returns
return article
end
+ if params[:message][:sticker]
+ emoji = params[:message][:sticker][:emoji]
+ thumb = params[:message][:sticker][:thumb]
+ body = ' '
+ if thumb
+ width = thumb[:width]
+ height = thumb[:height]
+ result = download_file(thumb['file_id'])
+ if !result.success? || !result.body
+ raise "Unable for download image from telegram: #{result.code}"
+ end
+ body = ""
+ article.content_type = 'text/html'
+ elsif emoji
+ article.content_type = 'text/plain'
+ body = emoji
+ end
+ article.body = body
+ article.save!
+
+ if params[:message][:sticker][:file_id]
+ document_result = download_file(params[:message][:sticker][:file_id])
+ Store.remove(
+ object: 'Ticket::Article',
+ o_id: article.id,
+ )
+ Store.add(
+ object: 'Ticket::Article',
+ o_id: article.id,
+ data: document_result.body,
+ filename: params[:message][:sticker][:file_name] || 'sticker',
+ preferences: {
+ 'Mime-Type' => params[:message][:sticker][:mime_type],
+ },
+ )
+ end
+ return article
+ end
+
# text
if params[:message][:text]
article.content_type = 'text/plain'
@@ -520,10 +592,10 @@ returns
return ticket.state
end
- state = Ticket::State.find_by(name: 'new')
+ state = Ticket::State.find_by(default_create: true)
return state if !ticket
- return ticket.state if ticket.state.name == 'new'
- Ticket::State.find_by(name: 'open')
+ return ticket.state if ticket.state.id == state.id
+ Ticket::State.find_by(default_follow_up: true)
end
def download_file(file_id)
diff --git a/test/fixtures/telegram/personal4_message_content1.json b/test/fixtures/telegram/personal4_message_content1.json
new file mode 100644
index 000000000..820e0550a
--- /dev/null
+++ b/test/fixtures/telegram/personal4_message_content1.json
@@ -0,0 +1,31 @@
+{
+ "update_id":40000,
+ "message":{
+ "message_id":273,
+ "from":{
+ "id":3310000,
+ "first_name":"Roberto",
+ "last_name":"Blanco"
+ },
+ "chat":{
+ "id":3310000,
+ "first_name":"Roberto",
+ "last_name":"Blanco",
+ "type":"private"
+ },
+ "date":1487161566,
+ "sticker":{
+ "width":512,
+ "height":512,
+ "emoji":"💻",
+ "thumb":{
+ "file_id":"AAQDABO3-e4qAASs6ZOjJUT7tQ4lAAIC",
+ "file_size":4584,
+ "width":128,
+ "height":128
+ },
+ "file_id":"BQADAwAD0QIAAqbJWAAB8OkQqgtDQe0C",
+ "file_size":25974
+ }
+ }
+}
\ No newline at end of file
diff --git a/test/fixtures/telegram/personal5_message_content1.json b/test/fixtures/telegram/personal5_message_content1.json
new file mode 100644
index 000000000..cd44ed58b
--- /dev/null
+++ b/test/fixtures/telegram/personal5_message_content1.json
@@ -0,0 +1,50 @@
+{
+ "update_id":50000,
+ "message":{
+ "message_id":15,
+ "from":{
+ "id":294302174,
+ "first_name":"Martin",
+ "username":"martini42"
+ },
+ "chat":{
+ "id":294302174,
+ "first_name":"Martin",
+ "username":"martini42",
+ "type":"private"
+ },
+ "date":1487295982,
+ "photo":[
+ {
+ "file_id":"AgADAgADwacxGxk5MUmim45lijOwsKk1Sw0ABFq_5qQydQSuAAFkBQABAg",
+ "file_size":1265,
+ "width":90,
+ "height":79
+ },
+ {
+ "file_id":"AgADAgADwacxGxk5MUmim45lijOwsKk1Sw0ABEvfeiPeNricAWQFAAEC",
+ "file_size":17208,
+ "width":320,
+ "height":282
+ },
+ {
+ "file_id":"AgADAgADwacxGxk5MUmim45lijOwsKk1Sw0ABG1U3brRukt_AmQFAAEC",
+ "file_size":62404,
+ "width":800,
+ "height":705
+ },
+ {
+ "file_id":"AgADAgADwacxGxk5MUmim45lijOwsKk1Sw0ABNQoaI8BwR_z_2MFAAEC",
+ "file_size":122459,
+ "width":1280,
+ "height":1128
+ },
+ {
+ "file_id":"AgADAgADwacxGxk5MUmim45lijOwsKk1Sw0ABPxEqfVm-QlI_mMFAAEC",
+ "file_size":171271,
+ "width":2000,
+ "height":1762
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/test/fixtures/telegram/personal5_message_content2.json b/test/fixtures/telegram/personal5_message_content2.json
new file mode 100644
index 000000000..d1aa6873f
--- /dev/null
+++ b/test/fixtures/telegram/personal5_message_content2.json
@@ -0,0 +1,19 @@
+{
+ "update_id":50001,
+ "message":{
+ "message_id":16,
+ "from":{
+ "id":294302174,
+ "first_name":"Martin",
+ "username":"martini42"
+ },
+ "chat":{
+ "id":294302174,
+ "first_name":"Martin",
+ "username":"martini42",
+ "type":"private"
+ },
+ "date":1487295982,
+ "text":"Hello, I need your Help"
+ }
+}
\ No newline at end of file
diff --git a/test/integration/telegram_controller_test.rb b/test/integration/telegram_controller_test.rb
index 45128bfcb..2acc4496b 100644
--- a/test/integration/telegram_controller_test.rb
+++ b/test/integration/telegram_controller_test.rb
@@ -14,6 +14,7 @@ class TelegramControllerTest < ActionDispatch::IntegrationTest
Setting.set('http_type', 'https')
Setting.set('fqdn', 'me.zammad.com')
Channel.where(area: 'Telegram::Bot').destroy_all
+ UserInfo.current_user_id = 1
@channel = Telegram.create_or_update_channel(token, { group_id: group_id, welcome: 'hi!' })
groups = Group.where(name: 'Users')
@@ -27,9 +28,8 @@ class TelegramControllerTest < ActionDispatch::IntegrationTest
active: true,
roles: roles,
groups: groups,
- updated_by_id: 1,
- created_by_id: 1,
)
+ UserInfo.current_user_id = nil
end
@@ -184,10 +184,44 @@ class TelegramControllerTest < ActionDispatch::IntegrationTest
assert_equal('Can you help me with my feature?', ticket.title)
assert_equal('new', ticket.state.name)
assert_equal(4, ticket.articles.count)
- #assert_match(/ /i, ticket.articles.last.body)
assert_equal('text/html', ticket.articles.last.content_type)
assert_equal(1, ticket.articles.last.attachments.count)
+ # start communication #4 - with sticker
+ post callback_url, read_messaage('personal4_message_content1'), @headers
+ assert_response(200)
+ assert_equal(4, Ticket.count)
+ ticket = Ticket.last
+ assert_equal('💻', ticket.title)
+ assert_equal('new', ticket.state.name)
+ assert_equal(1, ticket.articles.count)
+ assert_match(/