@@ -14,9 +14,21 @@ const user = require.main.require('./src/user');
1414const messaging = require . main . require ( './src/messaging' ) ;
1515const api = require . main . require ( './src/api' ) ;
1616const privileges = require . main . require ( './src/privileges' ) ;
17+ const groups = require . main . require ( './src/groups' ) ;
18+ const sockets = require . main . require ( './src/socket.io' ) ;
1719
1820const plugin = module . exports ;
1921
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+
2032plugin . init = async ( params ) => {
2133 const { router /* , middleware , controllers */ } = params ;
2234 const settings = await meta . settings . get ( 'openai' )
@@ -29,14 +41,23 @@ plugin.init = async (params) => {
2941 routeHelpers . setupAdminPageRoute ( router , '/admin/plugins/openai' , controllers . renderAdminPage ) ;
3042} ;
3143
44+ async function getSettings ( ) {
45+ const settings = await meta . settings . get ( 'openai' )
46+ return { ...defaults , ...settings } ;
47+ }
48+
3249plugin . actionMentionsNotify = async function ( hookData ) {
3350 try {
3451 const { notification } = hookData ;
3552 if ( ! notification ) {
3653 return ;
3754 }
3855
39- const settings = ( await meta . settings . get ( 'openai' ) ) || { } ;
56+ const settings = await getSettings ( ) ;
57+ if ( ! await canUseOpenAI ( notification . from , settings ) ) {
58+ return ;
59+ }
60+
4061 const chatgptusername = settings [ 'chatgpt-username' ] ;
4162 const chatgptUid = await user . getUidByUsername ( chatgptusername ) ;
4263 if ( ! chatgptUid ) {
@@ -79,7 +100,11 @@ plugin.actionMessagingSave = async function (hookData) {
79100 if ( message . system ) {
80101 return ;
81102 }
82- const settings = ( await meta . settings . get ( 'openai' ) ) || { } ;
103+ const settings = await getSettings ( ) ;
104+ if ( ! await canUseOpenAI ( message . fromuid , settings ) ) {
105+ return ;
106+ }
107+
83108 const chatgptusername = settings [ 'chatgpt-username' ] ;
84109 const chatgptUid = await user . getUidByUsername ( chatgptusername ) ;
85110 const { roomId, content, fromuid } = message ;
@@ -140,6 +165,55 @@ plugin.actionMessagingSave = async function (hookData) {
140165 }
141166} ;
142167
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+
143217async function getMessageIds ( roomId , uid , start , stop ) {
144218 const isPublic = await db . getObjectField ( `chat:room:${ roomId } ` , 'public' ) ;
145219 if ( parseInt ( isPublic , 10 ) === 1 ) {
0 commit comments