2018-03-27 13:55:54 +03:00
package ru.bvn13.jircbot.listeners ;
import org.pircbotx.hooks.events.JoinEvent ;
2018-04-09 13:49:13 +03:00
import org.pircbotx.hooks.events.MessageEvent ;
2018-03-27 13:55:54 +03:00
import org.pircbotx.hooks.events.PrivateMessageEvent ;
2018-04-09 13:49:13 +03:00
import org.pircbotx.hooks.types.GenericMessageEvent ;
2018-03-28 11:31:24 +03:00
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
2018-03-27 13:55:54 +03:00
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.stereotype.Component ;
import ru.bvn13.jircbot.bot.ImprovedListenerAdapter ;
2018-03-27 16:43:42 +03:00
import ru.bvn13.jircbot.bot.JircBot ;
2018-03-27 13:55:54 +03:00
import ru.bvn13.jircbot.config.JircBotConfiguration ;
import ru.bvn13.jircbot.database.entities.ChannelSettings ;
import ru.bvn13.jircbot.database.services.ChannelSettingsService ;
2018-10-30 06:53:42 +03:00
import ru.bvn13.jircbot.documentation.DescriptionProvided ;
import ru.bvn13.jircbot.documentation.DocumentationProvider ;
import ru.bvn13.jircbot.documentation.ListenerDescription ;
2018-03-27 13:55:54 +03:00
import ru.bvn13.jircbot.model.Config ;
import java.util.concurrent.atomic.AtomicReference ;
2018-10-30 06:53:42 +03:00
import static ru.bvn13.jircbot.documentation.ListenerDescription.CommandDescription ;
2018-03-27 13:55:54 +03:00
/ * *
* Created by bvn13 on 27.03 .2018 .
* /
@Component
2018-10-30 06:53:42 +03:00
public class AdminListener extends ImprovedListenerAdapter implements DescriptionProvided {
2018-03-27 13:55:54 +03:00
2018-03-28 11:31:24 +03:00
private static final Logger logger = LoggerFactory . getLogger ( AdminListener . class ) ;
2018-03-27 13:55:54 +03:00
private static final String COMMAND = "?" ;
@Autowired
private JircBotConfiguration configuration ;
@Autowired
private ChannelSettingsService channelSettingsService ;
2018-10-30 06:53:42 +03:00
@Autowired
public AdminListener ( DocumentationProvider documentationProvider ) {
this . registerDescription ( documentationProvider ) ;
}
@Override
public ListenerDescription getDescription ( ) {
return ListenerDescription . create ( )
. setModuleName ( "AdminListener" )
. setModuleDescription ( "Admin commands of the bot\nMust be send in private dialog\nYou must be the owner of the bot (config.json) and your nick must be registered and verified at server" )
. addCommand ( CommandDescription . builder ( )
. command ( "join" )
. description ( "joins given channel on current server" )
. example ( "?join [#CHANNEL_NAME]" )
. build ( )
)
. addCommand ( CommandDescription . builder ( )
. command ( "leave" )
. description ( "joins given channel on current server" )
. example ( "?leave [#CHANNEL_NAME]" )
. build ( )
)
. addCommand ( CommandDescription . builder ( )
. command ( "restart" )
. description ( "trying to restart the bot on current server" )
. example ( "?restart" )
. build ( )
)
. addCommand ( CommandDescription . builder ( )
. command ( "privmsg" )
. description ( "send private message" )
. example ( "?privmsg [YOUR_FRIEND_NICK]" )
. build ( )
)
. addCommand ( CommandDescription . builder ( )
. command ( "cmd" )
. description ( "send RAW command to server (be careful with that shit!)" )
. example ( "?cmd [ANY COMMAND WITH PARAMS]" )
. build ( )
)
. addCommand ( CommandDescription . builder ( )
. command ( "op|deop" )
. description ( "give / take away OP user status" )
. example ( "?op [#CHANNEL_NAME] [YOUR_FRIEND_NICK]\n?deop [#CHANNEL_NAME] [YOUR_HOSTILE_NICK]" )
. build ( )
)
. addCommand ( CommandDescription . builder ( )
. command ( "kick" )
. description ( "kick user from channel" )
. example ( "?kick [#CHANNEL_NAME] [YOUR_HOSTILE_NICK]" )
. build ( )
)
. addCommand ( CommandDescription . builder ( )
. command ( "set" )
. description ( "set ON|OFF any of bot opportunity for channel\n\n" +
"Opportunities: \n\n" +
"autorejoin | auto-rejoin - auto rejoin channel on kicking\n" +
"bash | bashorg - bach.org quoting\n" +
"deferredmessages | deferred-messages | tell - saving and delivering deferred messages\n" +
"gs | googlesearch | google-search - search in Google\n" +
"grammar | grammarcorrection | grammar-correction - grammar checker (does not work in current version)\n" +
"hello | helloonjoin | hello-on-join - sending your phrase on user joins\n" +
"links | linkpreview | links-preview - sending titles of web pages by given URL\n" +
"logging | log - logging for channel\n" +
"regex | regexp | regexchecker | regexpchecker | regex-checker | regexp-checker - regular expression checker\n" +
"advice | advices - give yor friend advices\n" +
"calc | calculator - calculator\n" +
"quiz - quiz\n" )
. example ( "?set [#CHANNEL_NAME] [OPPORTUNITY] [ON|OFF]" )
. build ( )
)
;
}
2018-03-27 13:55:54 +03:00
@Override
public void onJoin ( JoinEvent event ) throws Exception {
if ( event . getChannel ( ) . getName ( ) . startsWith ( "#" ) ) {
2018-03-28 11:31:24 +03:00
if ( event . getUser ( ) . getNick ( ) . equals ( event . getBot ( ) . getNick ( ) ) ) {
event . getBot ( ) . sendRaw ( ) . rawLineNow ( "MODE " + event . getBot ( ) . getUserBot ( ) . getNick ( ) + " +B" ) ;
try {
2018-03-28 20:47:13 +03:00
channelSettingsService . createChannelSettings ( JircBot . extractServer ( event . getBot ( ) . getServerHostname ( ) ) , event . getChannel ( ) . getName ( ) ) ;
2018-03-28 11:31:24 +03:00
} catch ( Exception e ) {
2018-03-28 20:47:13 +03:00
logger . error ( "Could not create channel settings for channel " + event . getChannel ( ) . getName ( ) + " at " + event . getBot ( ) . getServerHostname ( ) , e ) ;
2018-03-28 11:31:24 +03:00
}
}
2018-03-27 13:55:54 +03:00
}
}
@Override
2018-04-09 13:49:13 +03:00
public void onMessage ( MessageEvent event ) throws Exception {
Config config = getBotConfig ( event ) ;
if ( config = = null ) {
return ;
}
2018-03-27 13:55:54 +03:00
2018-04-09 13:49:13 +03:00
if ( event . getUser ( ) . isVerified ( )
& & ! config . getMasterNick ( ) . isEmpty ( )
& & config . getMasterNick ( ) . equals ( event . getUser ( ) . getNick ( ) ) ) {
2018-03-27 13:55:54 +03:00
2018-04-09 13:49:13 +03:00
if ( event . getMessage ( ) . startsWith ( COMMAND ) ) {
String command = event . getMessage ( ) . substring ( COMMAND . length ( ) ) ;
String commands [ ] = command . trim ( ) . split ( " " , 2 ) ;
if ( commands [ 0 ] . startsWith ( "+" ) | | commands [ 0 ] . startsWith ( "-" ) ) {
boolean isApply = commands [ 0 ] . startsWith ( "+" ) ;
command = commands [ 0 ] . substring ( 1 ) ;
switch ( command . toLowerCase ( ) ) {
case "op" :
if ( commands . length = = 1 ) {
event . getBot ( ) . sendRaw ( ) . rawLine ( "PRIVMSG chanserv :" + ( ! isApply ? "deop" : "op" ) + " " + event . getChannel ( ) . getName ( ) + " " + event . getUser ( ) . getNick ( ) ) ;
} else {
event . getBot ( ) . sendRaw ( ) . rawLine ( "PRIVMSG chanserv :" + ( ! isApply ? "deop" : "op" ) + " " + event . getChannel ( ) . getName ( ) + " " + commands [ 1 ] ) ;
}
break ;
case "v" :
case "voice" :
if ( commands . length = = 1 ) {
event . getBot ( ) . sendRaw ( ) . rawLine ( "MODE " + event . getChannel ( ) . getName ( ) + " " + ( isApply ? "+" : "-" ) + "v " + event . getUser ( ) . getNick ( ) ) ;
} else {
event . getBot ( ) . sendRaw ( ) . rawLine ( "MODE " + event . getChannel ( ) . getName ( ) + " " + ( isApply ? "+" : "-" ) + "v " + commands [ 1 ] ) ;
}
break ;
}
} else {
switch ( command . toLowerCase ( ) ) {
case "inv" :
case "invite" :
if ( command . length ( ) > 1 ) {
event . getBot ( ) . sendRaw ( ) . rawLine ( "INVITE " + event . getChannel ( ) . getName ( ) + " " + commands [ 1 ] ) ;
}
break ;
case "kick" :
if ( command . length ( ) > 1 ) {
event . getBot ( ) . sendRaw ( ) . rawLine ( "KICK " + event . getChannel ( ) . getName ( ) + " " + commands [ 1 ] + ( commands . length > 2 ? " " + commands [ 2 ] : "" ) ) ;
}
break ;
}
}
2018-03-27 13:55:54 +03:00
}
2018-04-09 13:49:13 +03:00
}
}
2018-03-27 13:55:54 +03:00
2018-04-09 13:49:13 +03:00
@Override
public void onPrivateMessage ( PrivateMessageEvent event ) throws Exception {
Config config = getBotConfig ( event ) ;
if ( config = = null ) {
2018-03-27 13:55:54 +03:00
return ;
}
if ( event . getUser ( ) . isVerified ( )
& & ! config . getMasterNick ( ) . isEmpty ( )
& & config . getMasterNick ( ) . equals ( event . getUser ( ) . getNick ( ) ) ) {
if ( event . getMessage ( ) . startsWith ( COMMAND ) ) {
String command = event . getMessage ( ) . substring ( COMMAND . length ( ) ) ;
String commands [ ] = command . trim ( ) . split ( " " , 2 ) ;
if ( commands . length ! = 2 ) {
event . respondPrivateMessage ( "Wrong command" ) ;
return ;
}
2018-03-28 20:47:13 +03:00
String args [ ] = null ;
2018-03-27 13:55:54 +03:00
switch ( commands [ 0 ] . toLowerCase ( ) ) {
2018-03-29 10:22:09 +03:00
case "restart" :
event . getBot ( ) . stopBotReconnect ( ) ; break ;
2018-03-27 13:55:54 +03:00
case "join" :
event . getBot ( ) . sendIRC ( ) . joinChannel ( commands [ 1 ] ) ; event . respondPrivateMessage ( "done" ) ; break ;
case "leave" :
event . getBot ( ) . sendRaw ( ) . rawLine ( "PART " + commands [ 1 ] ) ; event . respondPrivateMessage ( "done" ) ; break ;
2018-03-29 10:22:09 +03:00
case "privmsg" :
event . getBot ( ) . sendRaw ( ) . rawLine ( "PRIVMSG " + commands [ 1 ] ) ; event . respondPrivateMessage ( "done" ) ; break ;
2018-03-27 13:55:54 +03:00
case "cmd" :
2018-06-15 17:16:02 +03:00
//args = commands[1].split(" ", 2);
event . getBot ( ) . sendRaw ( ) . rawLine ( commands [ 1 ] ) ; event . respondPrivateMessage ( "done" ) ; break ;
2018-03-27 13:55:54 +03:00
case "set" :
try {
2018-06-15 17:16:02 +03:00
args = commands [ 1 ] . split ( " " , 3 ) ; // set, channel, mode/hello-message
if ( args . length = = 3 ) {
2018-10-27 21:52:47 +03:00
changeSettings ( JircBot . extractServer ( event . getBot ( ) . getServerHostname ( ) ) , args [ 0 ] , args [ 1 ] , args [ 2 ] ) ; //server, channel, settings, mode
2018-04-09 15:17:11 +03:00
event . respondPrivateMessage ( "done" ) ;
} else {
event . respondPrivateMessage ( "SYNTAX: ?set <channel> <option> on/off" ) ;
}
2018-03-27 13:55:54 +03:00
} catch ( Exception e ) {
2018-03-29 22:48:09 +03:00
event . respondPrivateMessage ( e . toString ( ) ) ;
logger . error ( "ERROR" , e ) ;
2018-03-27 13:55:54 +03:00
}
break ;
2018-03-29 10:22:09 +03:00
case "op" :
case "deop" :
String cmd = commands [ 0 ] . toLowerCase ( ) ;
args = commands [ 1 ] . split ( " " , 2 ) ;
if ( args . length = = 1 ) {
event . getBot ( ) . sendRaw ( ) . rawLine ( "PRIVMSG chanserv :" + cmd + " " + args [ 0 ] + " " + event . getUser ( ) . getNick ( ) ) ;
event . respondPrivateMessage ( "done" ) ;
} else if ( args . length = = 2 ) {
event . getBot ( ) . sendRaw ( ) . rawLine ( "PRIVMSG chanserv :" + cmd + " " + args [ 0 ] + " " + args [ 1 ] ) ;
event . respondPrivateMessage ( "done" ) ;
} else {
event . respondPrivateMessage ( "wrong arguments" ) ;
}
break ;
case "kick" :
args = commands [ 1 ] . split ( " " , 3 ) ;
if ( args . length = = 2 ) {
event . getBot ( ) . sendRaw ( ) . rawLine ( "KICK " + args [ 0 ] + " " + args [ 1 ] ) ;
event . respondPrivateMessage ( "done" ) ;
} else if ( args . length = = 3 ) {
event . getBot ( ) . sendRaw ( ) . rawLine ( "KICK " + args [ 0 ] + " " + args [ 1 ] + " " + args [ 2 ] ) ;
event . respondPrivateMessage ( "done" ) ;
} else {
event . respondPrivateMessage ( "wrong arguments" ) ;
}
break ;
2018-03-27 13:55:54 +03:00
default :
event . respondPrivateMessage ( "Command not supported" ) ;
}
}
}
}
private boolean sameServer ( String s1 , String s2 ) {
String d1 [ ] = s1 . split ( "[\\.]" ) ;
String d2 [ ] = s2 . split ( "[\\.]" ) ;
if ( d1 . length > = 2 & & d2 . length > = 2 ) {
if ( d1 [ d1 . length - 1 ] . equals ( d2 [ d2 . length - 1 ] )
& & d1 [ d1 . length - 2 ] . equals ( d2 [ d2 . length - 2 ] ) ) {
return true ;
}
}
return false ;
}
2018-04-09 13:49:13 +03:00
private Config getBotConfig ( GenericMessageEvent event ) {
AtomicReference < Config > aConfig = new AtomicReference < > ( null ) ;
configuration . getConnections ( ) . forEach ( c - > {
2018-03-27 16:43:42 +03:00
2018-04-09 13:49:13 +03:00
if ( sameServer ( event . getBot ( ) . getServerHostname ( ) , c . getServer ( ) ) ) {
aConfig . set ( c ) ;
}
} ) ;
if ( aConfig . get ( ) = = null ) {
event . respondPrivateMessage ( "sorry, bot not found!" ) ;
return null ;
}
Config config = aConfig . get ( ) ;
return config ;
}
2018-03-27 16:43:42 +03:00
private void changeSettings ( String serverHost , String channelName , String set , String modeStr ) {
2018-03-27 13:55:54 +03:00
if ( set . equals ( "hello-message" ) | | set . equals ( "hello-msg" ) ) {
2018-03-27 16:43:42 +03:00
ChannelSettings settings = channelSettingsService . getChannelSettings ( serverHost , channelName ) ;
2018-03-27 13:55:54 +03:00
settings . setOnJoinMessage ( modeStr ) ;
channelSettingsService . save ( settings ) ;
} else {
if ( ! modeStr . equals ( "off" ) & & ! modeStr . equals ( "on" ) ) {
throw new RuntimeException ( "Wrong mode. Variants: on, off" ) ;
}
Boolean mode = modeStr . equals ( "on" ) ;
2018-03-27 16:43:42 +03:00
ChannelSettings settings = channelSettingsService . getChannelSettings ( serverHost , channelName ) ;
2018-03-27 13:55:54 +03:00
switch ( set . toLowerCase ( ) ) {
case "autorejoin" :
case "auto-rejoin" :
settings . setAutoRejoinEnabled ( mode ) ;
break ;
case "bash" :
case "bashorg" :
settings . setBashOrgEnabled ( mode ) ;
break ;
2018-10-30 06:53:42 +03:00
case "deferredmessages" :
case "deferred-messages" :
2018-04-09 15:17:11 +03:00
case "tell" :
2018-03-27 13:55:54 +03:00
settings . setDeferredMessagesEnabled ( mode ) ;
break ;
case "gs" :
case "googlesearch" :
case "google-search" :
settings . setGoogleSearchEnabled ( mode ) ;
break ;
case "grammar" :
case "grammarcorrection" :
case "grammar-correction" :
settings . setGrammarCorrectionEnabled ( mode ) ;
break ;
case "hello" :
case "helloonjoin" :
case "hello-on-join" :
settings . setHelloOnJoinEnabled ( mode ) ;
break ;
case "links" :
case "linkpreview" :
case "links-preview" :
settings . setLinkPreviewEnabled ( mode ) ;
break ;
case "logging" :
case "log" :
settings . setLoggingEnabled ( mode ) ;
break ;
case "regex" :
case "regexp" :
case "regexchecker" :
case "regexpchecker" :
case "regex-checker" :
case "regexp-checker" :
settings . setRegexCheckerEnabled ( mode ) ;
break ;
case "advice" :
case "advices" :
settings . setAdvicesEnabled ( mode ) ;
break ;
case "calc" :
case "calculator" :
settings . setCalculatorEnabled ( mode ) ;
break ;
case "quiz" :
settings . setQuizEnabled ( mode ) ;
break ;
default :
throw new RuntimeException ( "Setting " + set + " not exist" ) ;
}
channelSettingsService . save ( settings ) ;
}
}
2018-10-30 06:53:42 +03:00
2018-03-27 13:55:54 +03:00
}