mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-04-01 05:16:00 +00:00
* nodejs: addon
* rename
* changes
* change lib name
* package
* lib path
* simplex-chat-nodejs: fix library paths
* simplex-chat-nodejs: change addon name
* simplex-chat-nodejs: install libs, adjust package and installation
* simplex-chat-nodejs: add npmignore
* gitignore: add additional nodejs path
* simplex-chat-nodejs: fix shim name
* gitignore: ignore nodejs package lock
* simplex-chat-nodejs: rename shim to underscore
* simplex-chat-nodejs: fix library loading on Mac
* simplex-chat-nodejs: expose low-level functions, move tests
* simplex-chat-nodejs: expose shim fucntions
* simplex-chat-nodejs: fixed libs version
* simplex-chat-nodejs: switch to official repository
* simpelx-chat-nodejs: adjust release tag
* async addon, tests
* refactor, fixes
* high level chat api
* simplify cpp add-on - move logic to JS, fix API
* api for events, api test
* update @simplex-chat/types
* Revert "update @simplex-chat/types"
This reverts commit da3f89866f.
* change @simplex-chat/types version
* receiver for any events, wait with timeout
* low-level bot example
* typedoc
* network connection events
* declarative bot api
* readme, docs
* update docs
* update readme
* add liveMessage support
* allow passing welcome message as string
* @simplex-chat/webrtc-client 6.5.0-beta.3
* bot test
* concurrent connection in tests
* nodejs/download-libs: cleanup on version mismatch
* nodejs/download-libs: bump libs version
* do not handle signals in Haskell
* update bot examples
* flatten docs and use local links to code
* update readme
* 6.5.0-beta.4
* include more files in npm package, 6.5.0-beta.4.2
* .gitignore
---------
Co-authored-by: Avently <7953703+avently@users.noreply.github.com>
Co-authored-by: shum <github.shum@liber.li>
93 lines
3.2 KiB
TypeScript
93 lines
3.2 KiB
TypeScript
import {T} from "@simplex-chat/types"
|
|
import {BotAddressSettings} from "./api"
|
|
|
|
export function chatInfoRef(cInfo: T.ChatInfo): T.ChatRef | undefined {
|
|
switch (cInfo.type) {
|
|
case T.ChatType.Direct: return {chatType: T.ChatType.Direct, chatId: cInfo.contact.contactId}
|
|
case T.ChatType.Group: {
|
|
const chatScope: T.GroupChatScope | undefined =
|
|
cInfo.groupChatScope?.type == "memberSupport"
|
|
? {type: "memberSupport", groupMemberId_: cInfo.groupChatScope.groupMember_?.groupMemberId}
|
|
: undefined
|
|
return {chatType: T.ChatType.Group, chatId: cInfo.groupInfo.groupId, chatScope}
|
|
}
|
|
default: return undefined
|
|
}
|
|
}
|
|
|
|
export function chatInfoName(cInfo: T.ChatInfo): string {
|
|
switch (cInfo.type) {
|
|
case "direct": return `@${cInfo.contact.profile.displayName}`
|
|
case "group": {
|
|
const scope = cInfo.groupChatScope
|
|
const scopeName = scope?.type === "memberSupport"
|
|
? `(support${scope.groupMember_ ? ` ${scope.groupMember_.memberProfile.displayName}` : ""})`
|
|
: ""
|
|
return `#${cInfo.groupInfo.groupProfile.displayName}${scopeName}`
|
|
}
|
|
case "local": return "private notes"
|
|
case "contactRequest": return `request from @${cInfo.contactRequest.profile.displayName}`
|
|
case "contactConnection": {
|
|
const alias = cInfo.contactConnection.localAlias
|
|
return `pending connection${alias ? ` (@${alias})` : ""}`
|
|
}
|
|
}
|
|
}
|
|
|
|
export function senderName(cInfo: T.ChatInfo, chatDir: T.CIDirection) {
|
|
const sender = chatDir.type === "groupRcv"
|
|
? ` @${chatDir.groupMember.memberProfile.displayName}`
|
|
: ""
|
|
return chatInfoName(cInfo) + sender
|
|
}
|
|
|
|
export function contactAddressStr(link: T.CreatedConnLink): string {
|
|
return link.connShortLink || link.connFullLink
|
|
}
|
|
|
|
export function botAddressSettings({addressSettings}: T.UserContactLink): BotAddressSettings {
|
|
return {
|
|
autoAccept: addressSettings.autoAccept ? true : false,
|
|
welcomeMessage: addressSettings.autoReply,
|
|
businessAddress: addressSettings.businessAddress
|
|
}
|
|
}
|
|
|
|
export function fromLocalProfile({displayName, fullName, shortDescr, image, contactLink, preferences, peerType}: T.LocalProfile): T.Profile {
|
|
const profile = {displayName, fullName, shortDescr, image, contactLink, preferences, peerType}
|
|
for (const key in profile) {
|
|
if (typeof (profile as any)[key] === "undefined") delete (profile as any)[key]
|
|
}
|
|
return profile
|
|
}
|
|
|
|
export function ciContentText({content}: T.ChatItem): string | undefined {
|
|
switch (content.type) {
|
|
case "sndMsgContent": return content.msgContent.text;
|
|
case "rcvMsgContent": return content.msgContent.text;
|
|
default: return undefined;
|
|
}
|
|
}
|
|
|
|
export interface BotCommand {
|
|
keyword: string
|
|
params: string
|
|
}
|
|
|
|
// returns command (without /) and trimmed parameters
|
|
export function ciBotCommand(chatItem: T.ChatItem): BotCommand | undefined {
|
|
const msg = ciContentText(chatItem)?.trim()
|
|
if (msg) {
|
|
const r = msg.match(/\/([^\s]+)(.*)/)
|
|
if (r && r.length >= 3) {
|
|
return {keyword: r[1], params: r[2].trim()}
|
|
}
|
|
}
|
|
return undefined
|
|
}
|
|
|
|
export function reactionText(reaction: T.ACIReaction): string {
|
|
const r = reaction.chatReaction
|
|
return r.reaction.type === "emoji" ? r.reaction.emoji : r.reaction.tag
|
|
}
|