# Примеры реализации Методов оповещения

Справка

Приведенные в данном документе примеры методов оповещений, несут ознакомительный характер, и могут быть изменены под свои нужды.

# Метод оповещения E-mail

print("subject:" .. subject)
print("body:" .. body)
print("")
print("recipients: ")

for k,v in pairs(recipients) do
  print(v)
end

local from = { title = "<Отображаемое имя отправителя>", address = 
 "<Отображаемый адрес отправителя>"}

local result = smtp({
  host = "<Почтовый сервер>", --string
  port = <Порт>, --int
  useSsl = true, --bool
  username = "<Логин>", --string
  password = "<Пароль>", --string
  subject = subject,
  body = body,
  mailType = "plain",
  from = from,
  recipients = recipients
})

if (result.err ~= nil) then
  print(result.err)
  return -- Ранний выход из скрипта, если возникла ошибка.
end
 
print("result:".. tostring(result.data))

В данном примере измените следующие параметры на свои:

  • <Почтовый сервер> - адрес вашего SMTP сервера
  • <Порт> - порт SMTP сервера
  • <Логин> - логин доступа к почтовому ящику
  • <Пароль> - пароль доступа к почтовому ящику
  • <Отображаемое имя отправителя> - From: Имя <адрес>
  • <Отображаемый адрес отправителя> - From: Имя <адрес>

# Метод оповещения Telegram

local botId = "<BotToken>"

local function sendMessage(recipient)
  local requestBody = {
    chat_id = recipient,
    text = subject .. "\n" .. body
  }

  local args = {
    uri = "https://api.telegram.org/bot" .. botId .. "/sendMessage",
    method = "POST",
    mediaType = "application/json",
    body = json.encode(requestBody)
  }
  local response = curl(args)
  if (response.err ~= nil) then
    print(response.err)
    return -- Ранний выход из скрипта, если возникла ошибка.
  end

  if (response.data.isSuccessStatusCode) == true then
    print(response.data.content)
  else
    print(":( status code " .. response.data.statusCode)
  end
end

for k, v in pairs(recipients) do
  sendMessage(v)
end

В данном примере необходимо изменить <BotToken> на токен который принадлежит вашему боту Telegram

# Метод оповещения Slack

local botToken = "<SlackToken>"

local function getUserId(email)
  local args = {
    uri = "https://slack.com/api/users.lookupByEmail",
    method = "POST",
    mediaType = "application/x-www-form-urlencoded",
    headers =  { authorization = "Bearer " ..  botToken },
    body = "email=" .. email
  }

  local response = curl(args)
  if (response.err ~= nil) then
    print(response.err)
    return -- Ранний выход из скрипта, если возникла ошибка.
  end

  if (response.data.isSuccessStatusCode) == true then
    local responseJsonTable =  json.decode(response.data.content)
    local userId =responseJsonTable["user"]["id"]
    print("Got user Id for " .. email .. " : " .. userId)
    return userId
  else
    print(":( status code " .. response.data.statusCode)
  end
end

local function openDirectChat(userId)
  local requestBody = {
    users = userId,
    return_im = true
  }

  local args = {
    uri = "https://slack.com/api/conversations.open",
    method = "POST",
    mediaType = "application/json",
    headers =  { authorization = "Bearer " ..  botToken },
    body = json.encode(requestBody)
  }

  local response = curl(args)
  if (response.err ~= nil) then
    print(response.err)
    return -- Ранний выход из скрипта, если возникла ошибка.
  end

  if (response.data.isSuccessStatusCode) == true then
    local responseJsonTable =  json.decode(response.data.content)
    local channelId =responseJsonTable["channel"]["id"]
    print("Created direct chat with user " .. userId .. ". ChannelId: " .. channelId)
    return channelId
  else
    print(":( status code " .. response.data.statusCode)
  end
end

local function sendMessage(conversation)
  local requestBody = {
    channel = conversation,
    text= "*" .. subject .. "*" .. "\n" .. body
  }

  local args = {
    uri = "https://slack.com/api/chat.postMessage",
    method = "POST",
    mediaType = "application/json",
    headers =  { authorization = "Bearer " ..  botToken },
    body = json.encode(requestBody)
  }

  local response = curl(args)
  if (response.err ~= nil) then
    print(response.err)
    return -- Ранний выход из скрипта, если возникла ошибка.
  end

  if (response.data.isSuccessStatusCode) == true then
    local responseJsonTable =  json.decode(response.data.content)
    local sentOk=responseJsonTable["ok"]
    if (sentOk == true) then
      print("Message sent successfully.")
      end
    print(response.data.content)
  else
    print(":( status code " .. response.data.statusCode)
  end
end

local function processNotify(recipient)
  if (recipient:match('[%w]*[%p]*%@+[%w]*[%.]?[%w]*')) then
    -- если получатель - email
    local userId = getUserId(recipient)
    local chatId = openDirectChat(userId)
    sendMessage(chatId)
  else
    -- получатель - Id канала
    sendMessage(recipient)
  return true
  end
end

local function tablelength(T)
  local count = 0
  for _ in pairs(T) do count = count + 1 end
  return count
end

if (recipients == nil or recipients == "") then
  print("Список получателей пуст")
end

print("Количество получателей: " .. tablelength(recipients))

for k, v in pairs(recipients) do
  local status, retval = pcall(processNotify, v)
end

В данном примере измените <SlackToken> на свой. Как получить токен для Slack (opens new window)

# Метод оповещения Zulip

-- Секция переменных
local botEmail = "someemail@mail.com" 
local botToken = "some_token"
local zulipUri = "http://some.uri" 
local defaultTopic = "someTopic" 

-- Функция отправки сообщения
local function sendMessage(stream, topic, body)
  local args = {
    uri = zulipUri .. "/api/v1/messages",
    method = "POST",
    mediaType = "application/x-www-form-urlencoded",
    basicAuth = {
      login = botEmail,
      password = botToken
    },
    body = "type=stream&to=" .. stream .. "&topic=" .. topic .. "&content=" .. body

  }
  local response = curl(args)
  if (response.err ~= nil) then
    print(response.err)
    return -- Ранний выход из скрипта, если возникла ошибка.
  end

  if (response.data.isSuccessStatusCode) == true then
    print(response.data.content)
  else
    print(":( status code " .. response.data.statusCode .. ". " .. response.data.content)
  end
end

-- Проверка наличия значения topic
if (string.len(subject) > 0) then
  topic = subject
else
  topic = defaultTopic
end

-- Цикл отправки оповещения всем получателям
for k, stream in pairs(recipients) do
  sendMessage(stream, topic, body)
end

В данном примере измените переменные под свои:

  • botEmail - Email бота от которого будет производится отправка оповещений
  • botToken - Токен бота от которого будет производиться отправка оповещений
  • zulipUri - URI по которому доступен ваш инстанс zulip (например: https://user.zulipchat.ru (opens new window))
  • defaultTopic - Тема по умолчанию, сообщения без указания темы будут отправлены с темой по умолчанию.

# Метод оповещения msTeams

В качестве получателя используется полный webhookUri.

Инструкция по его созданию здесь (opens new window).

В методе реализован функционал выбора формата текста оповещений: Plaintext или AdaptiveCard:

  • Plaintext: Для отправки в этом формате ничего делать не нужно, просто заполняете шаблон как Вам нравится.
  • AdaptiveCard: в поле темы указать AdaptiveCard, В теле разместить JSON описывающий Adaptive Card.

Описание карточек здесь (opens new window).

ПОДСКАЗКА

Так как конструктор оповещений не позволяет отправлять json, выполнена замена фигурных скобок: { -> ```, } -> '''

Документация по используемым методам здесь (opens new window).

-- Функция отправки adaptive card
local function sendAdaptiveCard(webhookUri)
  local requestBody = '{"type":"message","attachments":[{"contentType":"application/vnd.microsoft.card.adaptive","contentUrl":null,"content":' .. string.gsub(string.gsub(body,"```","{"),"'''","}") ..'}]}'
  local args = {
    uri = webhookUri,
    method = "POST",
    mediaType = "application/json",
    body = requestBody
  }
  local response = curl(args)
  if (response.err ~= nil) then
    print(response.err)
    return -- Ранний выход из скрипта, если возникла ошибка.
  end

  if (response.data.isSuccessStatusCode) == true then
    print(response.data.content)
  else
    print(":( status code " .. response.data.statusCode)
  end
end

-- Функция отправки plaintext сообщения
local function sendMessage(webhookUri)
  local requestBody = {
    text = subject .. " " .. body
  }

  local args = {
    uri = webhookUri,
    method = "POST",
    mediaType = "application/json",
    body = json.encode(requestBody)
  }
  local response = curl(args)
  if (response.err ~= nil) then
    print(response.err)
    return -- Ранний выход из скрипта, если возникла ошибка.
  end

  if (response.data.isSuccessStatusCode) == true then
    print(response.data.content)
  else
    print(":( status code " .. response.data.statusCode)
  end
end

-- Проверяем наличие флага "AdaptiveCard" в теме сообщения
-- Если флаг присутствует, то выполняем отправку как AdaptiveCard
if (subject == "AdaptiveCard") then
  for k, v in pairs(recipients) do
    sendAdaptiveCard(v)
  end
-- Иначе как текст
else
  for k, v in pairs(recipients) do
    sendMessage(v)
  end
end