@@ -14,9 +14,21 @@ const user = require.main.require('./src/user');
14
14
const messaging = require . main . require ( './src/messaging' ) ;
15
15
const api = require . main . require ( './src/api' ) ;
16
16
const privileges = require . main . require ( './src/privileges' ) ;
17
+ const groups = require . main . require ( './src/groups' ) ;
18
+ const sockets = require . main . require ( './src/socket.io' ) ;
17
19
18
20
const plugin = module . exports ;
19
21
22
+ const defaults = {
23
+ apikey : '' ,
24
+ 'chatgpt-username' : '' ,
25
+ enablePrivateMessages : 'off' ,
26
+ model : 'gpt-3.5-turbo' ,
27
+ minimumReputation : 0 ,
28
+ allowedGroups : '[]' ,
29
+ } ;
30
+
31
+
20
32
plugin . init = async ( params ) => {
21
33
const { router /* , middleware , controllers */ } = params ;
22
34
const settings = await meta . settings . get ( 'openai' )
@@ -29,14 +41,23 @@ plugin.init = async (params) => {
29
41
routeHelpers . setupAdminPageRoute ( router , '/admin/plugins/openai' , controllers . renderAdminPage ) ;
30
42
} ;
31
43
44
+ async function getSettings ( ) {
45
+ const settings = await meta . settings . get ( 'openai' )
46
+ return { ...defaults , ...settings } ;
47
+ }
48
+
32
49
plugin . actionMentionsNotify = async function ( hookData ) {
33
50
try {
34
51
const { notification } = hookData ;
35
52
if ( ! notification ) {
36
53
return ;
37
54
}
38
55
39
- const settings = ( await meta . settings . get ( 'openai' ) ) || { } ;
56
+ const settings = await getSettings ( ) ;
57
+ if ( ! await canUseOpenAI ( notification . from , settings ) ) {
58
+ return ;
59
+ }
60
+
40
61
const chatgptusername = settings [ 'chatgpt-username' ] ;
41
62
const chatgptUid = await user . getUidByUsername ( chatgptusername ) ;
42
63
if ( ! chatgptUid ) {
@@ -79,7 +100,11 @@ plugin.actionMessagingSave = async function (hookData) {
79
100
if ( message . system ) {
80
101
return ;
81
102
}
82
- const settings = ( await meta . settings . get ( 'openai' ) ) || { } ;
103
+ const settings = await getSettings ( ) ;
104
+ if ( ! await canUseOpenAI ( message . fromuid , settings ) ) {
105
+ return ;
106
+ }
107
+
83
108
const chatgptusername = settings [ 'chatgpt-username' ] ;
84
109
const chatgptUid = await user . getUidByUsername ( chatgptusername ) ;
85
110
const { roomId, content, fromuid } = message ;
@@ -140,6 +165,55 @@ plugin.actionMessagingSave = async function (hookData) {
140
165
}
141
166
} ;
142
167
168
+ async function canUseOpenAI ( uid , settings ) {
169
+ if ( ! await checkReputation ( uid , settings ) ) {
170
+ return false ;
171
+ }
172
+ if ( ! await checkGroupMembership ( uid , settings ) ) {
173
+ return false ;
174
+ }
175
+ return true ;
176
+ }
177
+
178
+ async function checkReputation ( uid , settings ) {
179
+ const reputation = await user . getUserField ( uid , 'reputation' ) ;
180
+ const hasEnoughRep = parseInt ( settings . minimumReputation , 10 ) === 0 || parseInt ( reputation , 10 ) >= parseInt ( settings . minimumReputation , 10 ) ;
181
+
182
+ if ( ! hasEnoughRep ) {
183
+ sockets . server . in ( `uid_${ uid } ` ) . emit ( 'event:alert' , {
184
+ type : 'danger' ,
185
+ title : '[[global:alert.error]]' ,
186
+ message : `[[openai:error.need-x-reputation-to-mention, ${ settings . minimumReputation } ]]` ,
187
+ } ) ;
188
+ }
189
+ return hasEnoughRep ;
190
+ }
191
+
192
+ async function checkGroupMembership ( uid , settings ) {
193
+ let allowedGroups = [ ] ;
194
+ try {
195
+ allowedGroups = JSON . parse ( settings . allowedGroups ) || [ ] ;
196
+ } catch ( err ) {
197
+ console . error ( err ) ;
198
+ allowedGroups = [ ] ;
199
+ }
200
+
201
+ if ( ! allowedGroups . length ) {
202
+ return true ;
203
+ }
204
+
205
+ const isMembers = await groups . isMemberOfGroups ( uid , allowedGroups ) ;
206
+ const memberOfAny = isMembers . includes ( true ) ;
207
+ if ( ! memberOfAny ) {
208
+ sockets . server . in ( `uid_${ uid } ` ) . emit ( 'event:alert' , {
209
+ type : 'danger' ,
210
+ title : '[[global:alert.error]]' ,
211
+ message : `[[error:no-privileges]]` ,
212
+ } ) ;
213
+ }
214
+ return memberOfAny ;
215
+ }
216
+
143
217
async function getMessageIds ( roomId , uid , start , stop ) {
144
218
const isPublic = await db . getObjectField ( `chat:room:${ roomId } ` , 'public' ) ;
145
219
if ( parseInt ( isPublic , 10 ) === 1 ) {
0 commit comments