-
Notifications
You must be signed in to change notification settings - Fork 21
/
Copy pathOpenAiChatApp.ts
130 lines (127 loc) · 4.3 KB
/
OpenAiChatApp.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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import {
IAppAccessors,
IConfigurationExtend,
IHttp,
ILogger,
IModify,
IPersistence,
IRead,
} from "@rocket.chat/apps-engine/definition/accessors";
import { App } from "@rocket.chat/apps-engine/definition/App";
import {
IMessage,
IPostMessageSent,
} from "@rocket.chat/apps-engine/definition/messages";
import { IAppInfo } from "@rocket.chat/apps-engine/definition/metadata";
import { RoomType } from "@rocket.chat/apps-engine/definition/rooms";
import {
IUIKitResponse,
UIKitActionButtonInteractionContext,
UIKitViewSubmitInteractionContext,
} from "@rocket.chat/apps-engine/definition/uikit";
import { OpenAIChatCommand } from "./commands/OpenAIChatCommand";
import { buttons } from "./config/Buttons";
import { settings } from "./config/Settings";
import { ActionButtonHandler } from "./handlers/ActionButtonHandler";
import { ViewSubmitHandler } from "./handlers/ViewSubmit";
import { OpenAiCompletionRequest } from "./lib/RequestOpenAiChat";
import { sendDirect } from "./lib/SendDirect";
import { sendMessage } from "./lib/SendMessage";
import { sendNotification } from "./lib/SendNotification";
export class OpenAiChatApp extends App implements IPostMessageSent {
constructor(info: IAppInfo, logger: ILogger, accessors: IAppAccessors) {
super(info, logger, accessors);
}
public async extendConfiguration(configuration: IConfigurationExtend) {
await configuration.slashCommands.provideSlashCommand(
new OpenAIChatCommand(this)
);
// Providing persistant app settings
await Promise.all(
settings.map((setting) =>
configuration.settings.provideSetting(setting)
)
);
// Registering Action Buttons
await Promise.all(
buttons.map((button) => configuration.ui.registerButton(button))
);
}
// register ActionButton Handler
public async executeActionButtonHandler(
context: UIKitActionButtonInteractionContext,
read: IRead,
http: IHttp,
persistence: IPersistence,
modify: IModify
): Promise<IUIKitResponse> {
// lets just move this execution to another file to keep DemoApp.ts clean.
return new ActionButtonHandler().executor(
this,
context,
read,
http,
persistence,
modify,
this.getLogger()
);
}
// register SubmitView Handler
public async executeViewSubmitHandler(
context: UIKitViewSubmitInteractionContext,
read: IRead,
http: IHttp,
persistence: IPersistence,
modify: IModify
) {
// same for View SubmitHandler, moving to another Class
return new ViewSubmitHandler().executor(
this,
context,
read,
http,
persistence,
modify,
this.getLogger()
);
}
// register hook to answer directs
public async executePostMessageSent(
message: IMessage,
read: IRead,
http: IHttp,
persistence: IPersistence,
modify: IModify
): Promise<void> {
const { text, editedAt, room, sender } = message;
// we only want direct with the app username
var bot_user = await read.getUserReader().getAppUser();
if (
bot_user &&
message.room.type == RoomType.DIRECT_MESSAGE && // direct messages
message.room.userIds?.includes(bot_user?.id) && // that has bot_user id
bot_user?.id !== sender.id // and was not sent by the bot itself
) {
const result = await OpenAiCompletionRequest(
this,
http,
read,
[{"role": "user", "content": message.text}],
sender
);
if (result.success) {
var markdown_message = result.content.choices[0].message.content;
sendDirect(sender, read, modify, markdown_message);
} else {
sendNotification(
modify,
room,
sender,
`**Error!** Could not Request Completion:\n\n` +
result.content.error.message
);
}
}
return;
}
}