-
Notifications
You must be signed in to change notification settings - Fork 1
/
BroadcastApp.ts
108 lines (86 loc) · 3.79 KB
/
BroadcastApp.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import {
IAppAccessors,
IConfigurationExtend,
IConfigurationModify,
IEnvironmentRead,
IHttp,
ILogger,
IModify,
IPersistence,
IRead,
} from '@rocket.chat/apps-engine/definition/accessors';
import { App } from '@rocket.chat/apps-engine/definition/App';
import { IAppInfo } from '@rocket.chat/apps-engine/definition/metadata';
import { IRoom } from '@rocket.chat/apps-engine/definition/rooms';
import { ISetting } from '@rocket.chat/apps-engine/definition/settings';
import { UIKitViewSubmitInteractionContext } from '@rocket.chat/apps-engine/definition/uikit';
import { IUser } from '@rocket.chat/apps-engine/definition/users';
import { BroadcastCommand } from './commands/Broadcast';
import { AppSetting, settings } from './config/Settings';
import { sendMessage } from './lib/sendMessage';
export class BroadcastApp extends App {
constructor(info: IAppInfo, logger: ILogger, accessors: IAppAccessors) {
super(info, logger, accessors);
}
public static BroadCastChannels;
public bc;
protected async extendConfiguration(configuration: IConfigurationExtend, environmentRead: IEnvironmentRead): Promise<void> {
await Promise.all(settings.map((setting) => configuration.settings.provideSetting(setting)));
this.bc = new BroadcastCommand(this);
await configuration.slashCommands.provideSlashCommand(this.bc);
}
public async onSettingUpdated(setting: ISetting, configurationModify: IConfigurationModify, read: IRead, http: IHttp): Promise<void>
{
// -------------------------------------
// Value mapping
// -------------------------------------
if(setting.id == AppSetting.broadcastChannels)
{
BroadcastApp.BroadCastChannels = setting.value;
this.bc.modalChannels = setting.value;
}
return super.onSettingUpdated(setting, configurationModify, read, http);
}
public async executeViewClosedHandler()
{
return;
}
// ---------------------------------------------
// Click on create button in modal
// ---------------------------------------------
public async executeViewSubmitHandler(context: UIKitViewSubmitInteractionContext, read: IRead, http: IHttp, persistence: IPersistence, modify: IModify) {
const data = context.getInteractionData();
const { state } = data.view as any;
const sender = data.user; // the user calling the slashcommand
if(!state)
{
return;
}
const channelsArray = state.broadcast_channels.channels.split(",");
const headline = state.broadcast_headline.headline;
const text = state.broadcast_message.message;
const message = `### ${headline}\n ${text}`;
channelsArray.map(async (roomName) => {
if(roomName!= "")
{
const room = await read.getRoomReader().getByName(roomName.trim()) ;
if(!room)
{
return;
}
return await sendMessage(sender, room, read, modify, message);
}
});
if(this.bc.useRoom)
{
return await this.sendNotifyMessage(sender,this.bc.useRoom,read,`You send a broadcast message to this channels: ${state.broadcast_channels.channels}`);
}
}
private async sendNotifyMessage(sender: IUser,room: IRoom, read: IRead, text: string): Promise<void> {
const msg = read.getNotifier().getMessageBuilder().setText(text)
.setUsernameAlias("Broadcaster").setEmojiAvatar(':loud_sound:')
.setRoom(room)
.setSender(sender).getMessage();
return await read.getNotifier().notifyUser(sender, msg);
}
}