lakeel-messenger-apis
TypeScript icon, indicating that this package has built-in type declarations

0.1.19 • Public • Published

Lakeel Messenger APIs

npm Status ts Status

Table of Contents

Getting Started

This package is built for Lakeel Messenger API ver1.0 in TypeScript. Any questions regarding set up and API management, please visit here. Detailed documentation is also up on the website above.

This API simplifies the process of setting up headers and string manipulations required for executing Lakeel Messenger API. Authentication set up is only needed once, and the type checks are featured to reduce any invalid requests to the server. Response type is not modified but passed as Promise object for easier error handling.

Install

npm

npm install --save lakeel-messenger-apis

And start using the API:

const lakeel = require("lakeel-messenger-apis");

const messenger = new lakeel.LM("apikey", "secretkey", "example.hostname.com");

Usage

JID is a unique identification code given to every user and room. Most functions require to input a JID and invalid code will result in an error.

All functions use the asynchronous method to process data and return value of these functions are in Promise object. Use then() and catch() to process their callbacks.

Send/Receive messages

Send

This function will send a message to the specified JID. If the API account is a bot, it must already exist in the room to post messages. Otherwise, use a user API to send messages to rooms without joining.

The API account status will change to online during the process.

messenger.sendMessage("target_JID", "Hello World!");

Request

Type Parameter Content Required
string jid Target JID
string message Message to send
string[] mentionJids Target mention JIDs
bool isFormatted Whether message formatting in markdown notation is rendered on the receiving client

Response

Type Name Content
string timestamp Time of message sent in ISO 8601 format
string messageId Message ID

Receive

This function will download sent messages between an API account and a target user or room. The messages are marked as read once downloaded.

Optional settings
force: False (default) will download new messages since the last time this function is called. Setting it True will result in downloading any past 1000 messages.
include: False (default) will not download messages sent by this account.

messenger.receiveMessage("target_JID", true, false);

Request

Type Parameter Content Required
string jid Target JID
bool force Setting for only receiving new messages
bool include Include messages sent by youself

Response

Type Name Content
array messages Message Objects

Message Object

Type Name Content Required
string type Message type
"text" : normal message
"broadcast" : broadcast message
"file" : file message

System message
"system.replyrequest" : reply request
"system.chatmail.success" : successful transmission of chat mail
"system.chatmail.failure" : failed to send chat mail
"system.room.enter" : participate in room
"system.room.invite" : inviting room
"system.room.refuse" : room refusal
"system.room.disinvite" : room invitation cancellation
"system.room.leave" : room exit
"system.room.rename" : room name change
"system.room.invite.failure" : invitation failed
User Object user User Object
string body Message
string timestamp Time of message sent in ISO 8601 format
string messageId Message ID
File Object file File Object

User Object

Type Parameter Content Required
string jid Target JID
string name User name
Organization Object organization Organization Object

Organization Object

Type Parameter Content Required
string id Organization ID
string name Organization name

File Object

Type Parameter Content Required
string id File ID
string name File name

Send message with buttons

User API account will be required to join the room before posting messages. Bot API account can send messages to rooms without joining. However, the bot will join the room after sending a message.

The API account status will change to online during the process.

An array of button objects are required. Use the button() function to create the objects.

let button1 = lakeel.button("message", "Clicked!", "Button One", "success");
...

messenger.sendButton("target_JID", "It's a message!", "horizontal", [button1, button2...]);

Request

Type Parameter Content Required
string jid Target JID
string message Message to send
string type Button arrangement
"horizontal"
"vertical"
"dropdown"
array buttons Button objects
bool isFormatted Whether message formatting in markdown notation is rendered on the receiving client

Response

Type Name Required
string timestamp Time of message sent in ISO 8601 format
string messageId Message ID

Button Object

Type Name Content Required
string type Button types
"message"
"message_argument"
"dialog"
"url"
"postback"
"postback_argument"
"password"
"location"
"datetimepicker"
"datetimepicker_range"
string value Value sent on click
string label Button label
string style Button color
"default"
"info"
"success"
"danger"
string hint Tips displayed in the input dialog
※Valid only when type is "message_argument" or "postback_argument"
string token Value added to the request header sent by the postback
※Valid only when type is "postback", "postback_argument" or "password"
string data Value added to the request body sent by the postback
※Valid only when type is "postback"
string mode Date format selectable in datepicker
※Required if type is "datetimepicker" or "datetimepicker_range"

"date_calendar" (Format: yyyy-MM-dd)
"date_drumroll" (Frormat: yyyy-MM-dd)
"datetime" (Format: yyyy-MM-ddThh:mm, yyyy-MM-dd)
"time" (Format: hh:mm)
"year_month" (Format: yyyy-MM)
string min The minimum date or time value that can be selected in the datepicker
※Valid only when type is "datetimepicker" or "datetimepicker_range"
string max The maximum date or time value that can be selected in the datepicker
※Valid only when type is "datetimepicker" or "datetimepicker_range"
string init Default date or time value that can be selected in the datepicker
※Valid only when type is "datetimepicker" or "datetimepicker_range"
string textAlign Specifies the horizontal alignment of the text displayed on the button.
"center"
"left"
"right"
※If not specified, it's automatically set to center.
※Support for windows client only. Centred on iOS and Android.

Send carousel message

Send a carousel message to a specified user or room.

User API account will be required to join the room before posting messages. Bot API account can send messages to rooms without joining. However, the bot will join the room after sending a message.

The API account status will change to online during the process.

An array of panel objects are required. Use the panel() function to create the objects. The panel itself will act as a button, and its behaviour is defined by a panel button object using panelButton(). Within the panel, custom buttons can be placed using an array of the button objects.

let button1 = lakeel.button("message", "Button Clicked!", "Button One");
var panelButton1 = lakeel.panelButton("message", "Panel Clicked!");
var panel = lakeel.panel("It's a panel!", panelButton1, [button1...]);

let buttonMsg = messenger.sendCarousel("target_JID", "It's a message!", [panel]);

Request

Type Parameter Content Required
string jid Target JID
string message Message to send
array panels Panel Objects
bool isFormatted Whether message formatting in markdown notation is rendered on the receiving client

Response

Type Name Content
string timestamp Time of message sent in ISO 8601 format
string messageId Message ID

Panel Object

Type Name Content Required
string body Body message for a panel
object action Panel Button Object
array actions Button Objects
string imageUrl Image URL
string title Panel Title
string type Panel arrangement
"horizontal"
"vertical"
"dropdown"

Panel Button Object

Type Name Content Required
string type Panel Button types
"message"
"message_argument"
"dialog"
"url"
"postback"
"postback_argument"
"password"
"datetimepicker"
"datetimepicker_range"
string value Value sent on click
string label Button label
string hint Tips displayed in the input dialog
※Valid only when type is "message_argument" or "postback_argument"
string token Value added to the request header sent by the postback
※Valid only when type is "postback", "postback_argument" or "password"
string data Value added to the request body sent by the postback
※Valid only when type is "postback"
string mode Date format selectable in datepicker
※Required if type is "datetimepicker" or "datetimepicker_range"

"date_calendar" (Format: yyyy-MM-dd)
"date_drumroll" (Frormat: yyyy-MM-dd)
"datetime" (Format: yyyy-MM-ddThh:mm, yyyy-MM-dd)
"time" (Format: hh:mm)
"year_month" (Format: yyyy-MM)
string min The minimum date or time value that can be selected in the datepicker
※Valid only when type is "datetimepicker" or "datetimepicker_range"
string max The maximum date or time value that can be selected in the datepicker
※Valid only when type is "datetimepicker" or "datetimepicker_range"
string init Default date or time value that can be selected in the datepicker
※Valid only when type is "datetimepicker" or "datetimepicker_range"

Button Object

Type Name Content Required
string type Button types
"message"
"message_argument"
"dialog"
"url"
"postback"
"postback_argument"
"password"
"datetimepicker"
"datetimepicker_range"
string value Value sent on click
string label Button label
string style Button color
"default"
"info"
"success"
"danger"
string hint Tips displayed in the input dialog
※Valid only when type is "message_argument" or "postback_argument"
string token Value added to the request header sent by the postback
※Valid only when type is "postback", "postback_argument" or "password"
string data Value added to the request body sent by the postback
※Valid only when type is "postback"
string mode Date format selectable in datepicker
※Required if type is "datetimepicker" or "datetimepicker_range"

"date_calendar" (Format: yyyy-MM-dd)
"date_drumroll" (Frormat: yyyy-MM-dd)
"datetime" (Format: yyyy-MM-ddThh:mm, yyyy-MM-dd)
"time" (Format: hh:mm)
"year_month" (Format: yyyy-MM)
string min The minimum date or time value that can be selected in the datepicker
※Valid only when type is "datetimepicker" or "datetimepicker_range"
string max The maximum date or time value that can be selected in the datepicker
※Valid only when type is "datetimepicker" or "datetimepicker_range"
string init Default date or time value that can be selected in the datepicker
※Valid only when type is "datetimepicker" or "datetimepicker_range"
string textAlign Specifies the horizontal alignment of the text displayed on the button.
"center"
"left"
"right"
※If not specified, it's automatically set to center.
※Support for windows client only. Centred on iOS and Android.

File

There are three ways to send a file using this API. Local file path method , binary method and base64 method.

Send file method #1 FILE PATH

Send a file to a specified user or room.

User API account will be required to join the room before sending files. Bot API account can send files to rooms without joining. However, the bot will join the room after sending a file.

The API account status will change to online during the process.

The file path must include the target file name and its file extension.

messenger.sendFileByPath("target_JID", "file_path/abc.jpg");

Request

Type Parameter Content Required
string jid Target JID
string filePath File Path

Response

Type Name Content
string timestamp Time of message sent in ISO 8601 format
string fileId File ID

Send file method #2 Row

Send a file to a specified user or room.

User API account will be required to join the room before sending files. Bot API account can send files to rooms without joining. However, the bot will join the room after sending a file.

The API account status will change to online during the process.

const imgData = fs.readFilesync("file_path/abc.jpg");

messenger.sendFileByRow("target_JID", imgData, "abc.jpg");

Request

Type Parameter Content Required
string jid Target JID
Buffer data File buffer
Buffer name File name

Response

Type Name Content
string timestamp Time of message sent in ISO 8601 format
string fileId File ID

Send file method #3 base64 encoded string

Send a file to a specified user or room.

User API account will be required to join the room before sending files. Bot API account can send files to rooms without joining. However, the bot will join the room after sending a file.

The API account status will change to online during the process.

const imgDataStr = "img_encoded_in_base64_string";

messenger.sendFileByBase64("target_JID", imgDataStr, "abc.jpg");

Request

Type Parameter Content Required
string jid Target JID
string base64Str File content encoded in base64 string form
string name File name

Response

Type Name Content
string timestamp Time of message sent in ISO 8601 format
string fileId File ID

Receive file

Download a file sent in a chat using File ID.

File ID can be obtained from receiveMessage() function or from the sendFile function's receipt. This function will return a File object containing a filename and binary data.

let receive = messenger.receiveFile("target_JID", "file_id");

Request

Type Parameter Content Required
string jid Target JID
string fileId File ID

Response

Type Name Content
string fileName File Name
Buffer body File in binary data

Make File

Input the response of receiveFile() function and an output file path. This will rebuild the file from downloaded binary data.

messenger.makeFile("./output", receive);

Request

Type Parameter Content Required
string filePath File Path
File Object file File Object

Response

Type Name Content
string message Completion message "OK"

Get talks

Get your own talk. (Up to 1000 cases)

If the force parameter is not specified or set to false, only the talks updated since the last call of this function is downloaded.

messenger.getTalks(false);

Request

Type Parameter Content Required
bool force Include updated talks

Response

Type Name Content
array talks Talk Objects
integer totalUnreadCount Total number of unread messages

Talk Object

Type Name Content
string jid Target JID
string type Type
"chat"
"room"
"invitation"
string lastUpdateTime Last update data
string name Name
integer unreadCount Unread messages

Presence

Get a presence of a specified user.

messenger.getPresence("target_JID");

Request

Type Parameter Content Required
string jid Target JID

Response

Type Name Content
string presence Presence state
"Online": Presence
"Away": Leave temporarily
"Do Not Disturb": Busy
"ExtendedAway": Extended Away
"Mobile": Logged in from mobile device
"Offline": Not logged in
string imageUrl The URL of the image showing the state of presence

Room

Get room

Get information about a specified room.

messenger.getRoom("target_roomJID");

Request

Type Parameter Content Required
string jid Target room JID

Response

Type Name Content
string name Room name
string comment Description
Owner Object owner Owner Object
array users User Objects
bool canWithdraw Whether user can withdraw from this room.
true: possible
false: impossioble

Owner Object

Type Name Content Required
string jid Owner JID

User Object

Type Name Content Required
string jid User JID
string status Status for room
"enter": participating
"leave": withdraw
"invite": inviting
"refuse": participation refused
"disinvite": invitation canceled

Create room

Use to create a room with specified owner and users.

Use makeOwner() and makeUser() to create Owner and User objects.

※ Do not include the owner in the User array

let owner = lakeel.makeOwner("owner_JID");
let user1 = lakeel.makeUser("user_JID");

messenger.createRoom(owner, [user1...], "Room One", true);

Request

Type Parameter Content Required
Owner Object owner Owner Object
array users User Objects
string name Room name
bool canWithdraw Whether user can withdraw from this room.
true: possible
false: impossioble

Response

Type Name Content
string timestamp Time of message sent in ISO 8601 format
string roomJid Room JID

User Object

Type Name Content Content
string jid User JID

Edit room

Edit an existing room.

There are two statuses for User object. Set as "enter" when adding a new user and "leave" when withdrawing an existing member.
When changing the owner, be sure to designate the member whose status is "enter".

Use makeOwner() and makeUser() to create Owner and User objects.

Previously makeUser() did not require a user status when creating a room. However, user status is required when editing room.

let owner = lakeel.makeOwner("owner_JID");
let user1 = lakeel.makeUser("user_JID", "enter");
let user2 = lakeel.makeUser("user_JID", "leave");

let room = messenger.editRoom("target_roomJID", owner, [user1, user2], "New Name", true);

Request

Type Parameter Content Required
string jid Target room JID
Owner Object owner Owner Object
array users User Objects
string name Room name
bool canWithdraw Whether users can withdraw from this room.
true: possible
false: impossioble

Response

Type Name Content
string timestamp Time of message sent in ISO 8601 format
string roomJid Room JID

User Object

Type Name Content Required
string jid User JID
string status Status for room
"enter": participating
"leave": withdraw

User

Get user info

Get user info by specifying single or multiple conditions. Use UserSearchCondition class to create condition object.

const condition = new lakeel.UserSearchCondition();
condition.setIsAdmin(true)
            .setLastAccessAtAfter("2020-09-01T00:00:00.000Z")
            .setLastAccessAtBefore("2020-09-09T00:00:00.000Z")
            .setPage(2)
            .setPerPage(5);

messenger.getUsers(condition);

If you omit to pass in condition, this method will return the result with pagination of page 1 and perPage 1000.

messenger.getUsers();

Request(UserSearchCondition object)

Argument Type Method Name Description Required
string setJid Add a condition of jid. ※2
string setId Add a condition of id. ※2
string setUniqueKey Add a condition of uniqueKey. ※2
string setName Add a condition of user name. Partial match.※1 ※2
string setPhoneticName Add a condition of user's Japanese kana name. Partial match.※1 ※2
string setMainOrganizationName Add a condition of main organization name to which a user belongs. Partial match.※1 ※2
bool setIsAdmin Add a condition of administrator flag. ※2
bool setIsMailLocked Add a condition of chat mail lock flag. ※2
bool setIsAccountLocked Add a condition of account lock flag. ※2
bool setIsExpired Add a condition of logical deletion flag. ※2
string(ISO8601, UTC) setLastAccessAtAfter Return users who accessed to LaKeel Messenger after the time that specified in this parameter. The specified time is included. Both short-form and long-form are valid as in code above. ※2
string(ISO8601, UTC) setLastAccessAtBefore Return users who accessed to LaKeel Messenger before the time that specified in this parameter. The specified time is included. Both short-form and long-form are valid as in code above. ※2
string[] setTags Add a condition of tags. ※2
number setPage Page number. If you don't indicate this, default value 0 will be applied. ※2
number setPerPage The number of user data per page. If you don't specify this, default value 1000 will be applied. ※2

※1 'jo' will hit 'joe', 'john', 'johnson', 'jordan'. ※2 All conditions are optional. If you omit them all, you get first 1000 user data out of all data.

Response

Type Name Description
array users User Data Objects.
number total The number of matched user data.
string prev URI to get user data set from the previous page. If no prev URI exists, this property will be omitted.
string next URI to get user data set from next page. If no next URI exists, this property will be omitted.

User Data Object

Type Name Description
string jid jid
string id id
string uniqueKey unique key
string name name
string phoneticName phonetic name (japanese kana)
string mainOrganizationId main organization id
string mainOrganizationName main organization name
array affiliationInfo Affiliation info objects
bool isAdmin admin flag
string adminRoleId admin role id. If user does not have any admin role, this will be an empty string.
string adminRoleName admin role name. If user does not have any admin role, this will be an empty string.
bool isMailLocked mail lock flag
bool isAccountLocked account lock flag
bool isExpired logical deletion flag
string(ISO8601, UTC) lastAccessAt last access date. If user has never accessed before, this property does not be shown.
string(ISO8601, UTC) passwordChangedAt date when password was changed
string[] tags user’s tags

Affiliation Info Object

Type Name Description
string organizationId organization id
string organizationName organization name
string description job title in this organization
bool isMainOrganization main organization flag
bool isDisplayOrganization display organization flag
number sortOrder sort order

Account lock status

Update an account lock status of a specified user.

messenger.changeLock("target_JID", true);

Request

Type Parameter Content Required
string jid Target JID
bool locked Lock status
true: Lock
false: Unlock

Response

Type Name Content
string message Completion message "OK"

Change password

Change a password of a specified user.

messenger.changePassword("target_JID", "newpass", true);

Request

Type Parameter Content Required
string jid Target JID
string password New password
bool forced Set whether to change the password the next time you sign in forcibly.
true : force
false : Don’t force.
If not specified, false is set.

Response

Type Name Content
string message Completion message "OK"

Reset password

Reset an existing password of a specified user to a character string created with random number.

messenger.resetPassword("target_JID");

Request

Type Parameter Content Required
string jid Target JID

Response

Type Name Content
string password 8 digit new password

Csv

There are two ways of uploading csv data. One is updating the whole DB data with uploaded csv data(uploadCsvAll) and another is only updating DB data with differential one(uploadCsvDiff).

Suppose we have user data A and B on DB. A's id is 1 and B's 2. You have your own user csv file, in which there's only A's data and it says its id is 3. Here you want to update user A's id from 1 to 3.

This time, you can't use uploadCsvAll because it'll result in losing B's data and not being able to keep data consistency. uploadCsvAll replace the whole DB data with uploaded one. But you can use uploadCsvDiff instead. It only updates A's data and B's doesn't change at all.

Upload Csv (All)

Select file paths and their encodings.

messenger.uploadCsvAll("some/organization/csv/file/path", "utf8", "some/user/csv/file/path", "utf8", "some/affiliation/csv/path", "utf8", "", "")

Request

Type Name Description Required
string orgPath Path to your organization csv file. ※1
string orgEncd Encoding of your organization csv file. ※2
string userPath Path to your user csv file. ※1
string userEncd Encoding of your user csv file. ※2
string affPath Path to your affiliation csv file. ※1
string affEncd Encoding of your affiliation csv file. ※2
string orgPubPath Path to your organization publicity csv file. ※1
string orgPubEncd Encoding of your organization publicity csv file. ※2

※1 You have to select at least one file. ※2 If you select a file, you must also specify its encoding. If not, just leave it an empty string.

Response

Type Name Description
string[] messages Messages that describe the result.

Upload Csv (Diff)

Select file paths and their encodings.

messenger.uploadCsvDiff("some/organization/csv/file/path", "utf8", "some/user/csv/file/path", "utf8", "some/affiliation/csv/path", "utf8", "", "")

Request

Type Name Description Required
string orgPath Path to your organization csv file. ※1
string orgEncd Encoding of your organization csv file. ※2
string userPath Path to your user csv file. ※1
string userEncd Encoding of your user csv file. ※2
string affPath Path to your affiliation csv file. ※1
string affEncd Encoding of your affiliation csv file. ※2
string orgPubPath Path to your organization publicity csv file. ※1
string orgPubEncd Encoding of your organization publicity csv file. ※2

※1 You have to select at least one file. ※2 If you select a file, you must also specify its encoding. If not, just leave it an empty string.

Response

Type Name Description
string[] messages Messages that describe the result.

Movie

Send movie

Send a movie to a specified user or room.

User API account will be required to join the room before sending a movie. Bot API account can send a movie to rooms without joining. However, the bot will join the room after sending a file.

The API account status will change to online during the process.

The file path must include the target file name and its file extension.

messenger.sendMovie("target_JID", "some/file/path");

Request

Type Parameter Content Required
String jid Your file is sent to someone or some room that has this jid.
String filePath Path that indicates your movie file.

Response

Type Name Content
string id Your file id that is used in LM system.
string name Your file name.
string mimeType Your file mime type.

Browserify

How to use it in HTML and web page using Browserify

Install Browserify globally

npm install -g browserify

Create an empty project and install Lakeel Messenger APIs.

Make sure "lakeel-messenger-apis" exists in your node_module folder.

Create a main.js at the project directory.

//main.js
'use strict';
console.log("Module Loaded");
const lakeel = require('lakeel-messenger-apis');

window.lakeel = lakeel;

Save and run

browserify main.js -o bundle.js

Now take the bundle.js and place it in your web folder. Import and done.

Sample

//index.html
<script type="text/javascript" src="bundle.js"></script>
<script type="text/javascript">
    const apiKey = "api";
    const secretKey = "secret";
    const hostname = "example.hostname.com";
    const messenger = new lakeel.LM(apiKey, secretKey, hostname);
    const jid ="target@example.hostname.com";
</script>

<form>
<h1>Message test</h1><br>
<input type="text" value="Hi" id="msg"><br>
<input type="submit" onclick="messenger.sendMessage(jid,document.getElementById('msg').value)">
</form>

Error handling

Errors can be caught using catch().

Sample

Failed to send a message.

const send = messenger.sendMessage("target_JID", "Hi!")

.then((success) => console.log("Success"))
.catch((err) => console.log(err));

Error response is in the following format

{
    "error": {
        "code": 400,
        "message": "Missing parameters.",
        "function": "sendMessage",
        "err": Error
    }
}
{
    "error": {
        "code": 400,
        "message": "Posted data has problems.",
        "invalidData": {
            "users": [
                {
                    "jid": "userxxx@example.lakeel.com",
                    "cause": "Non-existent user."
                },
                {
                    "jid": "useryyy@example.lakeel.com",
                    "cause": "Duplicated user."
                }
            ]
        }
    }
}

Help

Bugs

Known bugs

  • Error 503 page is returned when calling a receieveFile with an invalid file ID
  • Editing room does not return room JID after a successful process

Example

What does it do?

  • Sends an image
  • Downloads the sent image
  • Rebuilds the downloaded data to an output folder as an image

All using a Promise chain

const lakeel = require('lakeel-messenger-apis');

const apiKey = "api";
const secretKey = "secret";
const hostname = "example.hostname.com";
const img = fs.readFilesync("file_path/abc.jpg");
const messenger = new lakeel.LM(apiKey, secretKey, hostname);

const jid ="target@example.hostname.com";

//Send the file
messenger.sendFileByRow(jid, img, "abc.jpg")
.then((data) => {
    let fileId = data['fileId']; //Extract the file ID
    return messenger.receiveFile(jid, fileId); //Download the image
})
.then((result) => {
    //Rebuild the image to the output folder
    return messenger.makeFile("./output", result);
})
.finally(() => {
    console.log("Success :)");
})
.catch((err) => {
    console.log("Something went wrong :( " , err);
});

Author

Kamata Takashi, Ryoei Shimaura

License

ISC

Package Sidebar

Install

npm i lakeel-messenger-apis

Weekly Downloads

2

Version

0.1.19

License

ISC

Unpacked Size

195 kB

Total Files

43

Last publish

Collaborators

  • lakeel