# Examples of implementing notificaiton plugins

Reference

The examples of notification plugins given in this document are for informational purposes only and can be changed to fit your needs.

# Plugin "E-mail"

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

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

local from = { title = "<Sender Name>", address = 
 "<Sender address>"}

local result = smtp({
  host = "<Mail server>", --string
  port = <Port>, --int
  useSsl = true, --bool
  username = "<Login>", --string
  password = "<Password>", --string
  subject = subject,
  body = body,
  mailType = "plain",
  from = from,
  recipients = recipients
})

if (result.err ~= nil) then
  print(result.err)
  return -- Exit the script early if an error occurs
end
 
print("result:".. tostring(result.data))

In this example change the following parameters to your own:

  • <Mail server> - address of your SMTP server
  • <Port> - SMTP server port
  • <Login> - login to access the mailbox
  • <Password> - mailbox access password
  • <Sender name> - name of the sender
  • <Sender address> - address of the sender

# Plugin 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 -- Exit the script early if an error occurs
  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

In this example, you need to change <BotToken> to a token that belongs to your Telegram bot.

# Plugin 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 -- Exit the script early if an error occurs
  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 -- Exit the script early if an error occurs
  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 -- Exit the script early if an error occurs
  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
    -- if the recipient is email
    local userId = getUserId(recipient)
    local chatId = openDirectChat(userId)
    sendMessage(chatId)
  else
    -- if the recipient is channel 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("The recipient list is empty")
end

print("Number of recipients: " .. tablelength(recipients))

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

For this example, change the <SlackToken> to your own. How to get a token for Slack (opens new window)

# Plugin Zulip

-- Variables section 
local botEmail = "someemail@mail.com" 
local botToken = "some_token"
local zulipUri = "http://some.uri" 
local defaultTopic = "someTopic" 

-- Function for sending message  
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 -- Exit the script early if an error occurs
  end

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

-- Checking for a topic
if (string.len(subject) > 0) then
  topic = subject
else
  topic = defaultTopic
end

-- Cycle of sending alert to all recipients 
for k, stream in pairs(recipients) do
  sendMessage(stream, topic, body)
end

In this example, change the variables to your own:

  • botEmail - Email of the bot from which notifications will be sent.
  • botToken - Bot token from which notifications will be sent.
  • zulipUri - URI where your zulip instance is available (for example:https://user.zulipchat.com (opens new window))
  • defaultTopic - Default topic, messages without a subject will be sent with the default topic.

# Plugin msTeams

The full webhookUri is used as the recipient.

Instructions for creating it are here (opens new window).

The plugin implements the functionality for selecting the format of the notification text: Plaintext or AdaptiveCard:

  • Plaintext: You don't need to do anything to send in this format, just fill in the template as you like.
  • AdaptiveCard: specify AdaptiveCard in the subject field, In the body, place the JSON describing the Adaptive Card.

Description of cards is here (opens new window).

Tip

Since the notification constructor does not allow sending json, the curly braces have been replaced: { -> ```, } -> '''

Documentation about the methods used is here (opens new window).

-- Function for sending 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 -- Exit the script early if an error occurs
  end

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

-- Function of sending a plaintext message 
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 -- Exit the script early if an error occurs
  end

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

-- Check for the "AdaptiveCard" flag in the message subject
-- If the flag is present, then we send as AdaptiveCard 
if (subject == "AdaptiveCard") then
  for k, v in pairs(recipients) do
    sendAdaptiveCard(v)
  end
-- Otherwise as text 
else
  for k, v in pairs(recipients) do
    sendMessage(v)
  end
end