@@ -10,12 +10,15 @@ const controllers = require('./lib/controllers');
1010const routeHelpers = require . main . require ( './src/routes/helpers' ) ;
1111const socketHelpers = require . main . require ( './src/socket.io/helpers' ) ;
1212const topics = require . main . require ( './src/topics' ) ;
13+ const posts = require . main . require ( './src/posts' ) ;
1314const user = require . main . require ( './src/user' ) ;
1415const messaging = require . main . require ( './src/messaging' ) ;
1516const api = require . main . require ( './src/api' ) ;
1617const privileges = require . main . require ( './src/privileges' ) ;
1718const groups = require . main . require ( './src/groups' ) ;
1819const sockets = require . main . require ( './src/socket.io' ) ;
20+ const socketPlugins = require . main . require ( './src/socket.io/plugins' ) ;
21+ const summary = require ( './lib/summary' ) ;
1922
2023const plugin = module . exports ;
2124
@@ -166,21 +169,21 @@ plugin.actionMessagingSave = async function (hookData) {
166169 }
167170} ;
168171
169- async function canUseOpenAI ( uid , settings ) {
170- if ( ! await checkReputation ( uid , settings ) ) {
172+ async function canUseOpenAI ( uid , settings , silent = false ) {
173+ if ( ! await checkReputation ( uid , settings , silent ) ) {
171174 return false ;
172175 }
173- if ( ! await checkGroupMembership ( uid , settings ) ) {
176+ if ( ! await checkGroupMembership ( uid , settings , silent ) ) {
174177 return false ;
175178 }
176179 return true ;
177180}
178181
179- async function checkReputation ( uid , settings ) {
182+ async function checkReputation ( uid , settings , silent ) {
180183 const reputation = await user . getUserField ( uid , 'reputation' ) ;
181184 const hasEnoughRep = parseInt ( settings . minimumReputation , 10 ) === 0 || parseInt ( reputation , 10 ) >= parseInt ( settings . minimumReputation , 10 ) ;
182185
183- if ( ! hasEnoughRep ) {
186+ if ( ! hasEnoughRep && ! silent ) {
184187 sockets . server . in ( `uid_${ uid } ` ) . emit ( 'event:alert' , {
185188 type : 'danger' ,
186189 title : '[[global:alert.error]]' ,
@@ -190,7 +193,7 @@ async function checkReputation(uid, settings) {
190193 return hasEnoughRep ;
191194}
192195
193- async function checkGroupMembership ( uid , settings ) {
196+ async function checkGroupMembership ( uid , settings , silent ) {
194197 let allowedGroups = [ ] ;
195198 try {
196199 allowedGroups = JSON . parse ( settings . allowedGroups ) || [ ] ;
@@ -205,7 +208,7 @@ async function checkGroupMembership(uid, settings) {
205208
206209 const isMembers = await groups . isMemberOfGroups ( uid , allowedGroups ) ;
207210 const memberOfAny = isMembers . includes ( true ) ;
208- if ( ! memberOfAny ) {
211+ if ( ! memberOfAny && ! silent ) {
209212 sockets . server . in ( `uid_${ uid } ` ) . emit ( 'event:alert' , {
210213 type : 'danger' ,
211214 title : '[[global:alert.error]]' ,
@@ -262,3 +265,29 @@ plugin.addAdminNavigation = (header) => {
262265 return header ;
263266} ;
264267
268+ plugin . filterTopicThreadTools = async ( hookData ) => {
269+ if ( ! await canUseOpenAI ( hookData . uid , await getSettings ( ) , true ) ) {
270+ return hookData ;
271+ }
272+ hookData . tools . push ( {
273+ class : 'openai-summarize-topic' ,
274+ icon : 'fa-wand-magic-sparkles' ,
275+ title : '[[openai:summarize-topic]]' ,
276+ } ) ;
277+ return hookData ;
278+ } ;
279+
280+ socketPlugins . openai = { } ;
281+
282+ socketPlugins . openai . summarizeTopic = async function ( socket , data ) {
283+ const { tid } = data ;
284+ if ( ! await privileges . topics . can ( 'topics:read' , tid , socket . uid ) ) {
285+ throw new Error ( '[[error:no-privileges]]' ) ;
286+ }
287+ const settings = await getSettings ( ) ;
288+ if ( ! await canUseOpenAI ( socket . uid , settings ) ) {
289+ return ;
290+ }
291+
292+ return summary . summarizeTopic ( tid , openai , settings ) ;
293+ } ;
0 commit comments