2018-01-31 22:05:04 +03:00
package ru.bvn13.jircbot.listeners ;
2018-02-01 21:55:37 +03:00
import org.pircbotx.hooks.events.JoinEvent ;
2018-04-09 15:17:11 +03:00
import org.pircbotx.hooks.events.MessageEvent ;
2018-02-02 12:05:02 +03:00
import org.pircbotx.hooks.events.NoticeEvent ;
2018-01-31 22:05:04 +03:00
import org.pircbotx.hooks.types.GenericMessageEvent ;
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-01-31 22:05:04 +03:00
import ru.bvn13.jircbot.database.entities.DeferredMessage ;
2018-02-01 11:28:28 +03:00
import ru.bvn13.jircbot.database.services.ChannelSettingsService ;
2018-01-31 22:05:04 +03:00
import ru.bvn13.jircbot.database.services.DeferredMessageService ;
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-01-31 22:05:04 +03:00
import java.text.SimpleDateFormat ;
import java.util.List ;
2018-10-30 06:53:42 +03:00
import static ru.bvn13.jircbot.documentation.ListenerDescription.CommandDescription ;
2018-01-31 22:05:04 +03:00
/ * *
* Created by bvn13 on 31.01 .2018 .
* /
@Component
2018-10-30 06:53:42 +03:00
public class DeferredMessagesListener extends ImprovedListenerAdapter implements DescriptionProvided {
2018-01-31 22:05:04 +03:00
private static final String COMMAND = "?tell" ;
2018-04-09 15:27:14 +03:00
private static final String COMMAND_FORGET = "?forget" ;
2018-04-09 15:30:54 +03:00
private static final String COMMAND_READ = "?read" ;
2018-01-31 22:05:04 +03:00
private static SimpleDateFormat dt = new SimpleDateFormat ( "yyyy-MM-dd HH:mm:ss" ) ;
2018-02-01 11:28:28 +03:00
@Autowired
private ChannelSettingsService channelSettingsService ;
2018-01-31 22:05:04 +03:00
@Autowired
private DeferredMessageService deferredMessageService ;
2018-10-30 06:53:42 +03:00
@Autowired
public DeferredMessagesListener ( DocumentationProvider documentationProvider ) {
registerDescription ( documentationProvider ) ;
}
@Override
public ListenerDescription getDescription ( ) {
return ListenerDescription . create ( )
. setModuleName ( "DeferredMessagesListener" )
. setModuleDescription ( "This module is like answerphone - it stores your speech to any opponent into bot's database and when your opponent becomes online (joins channel and starts to speak) the bot notice him/her with your deferred messages." )
. addCommand ( CommandDescription . builder ( )
. command ( "tell" )
. description ( "Let the bot keep in mind your message to any opponent" )
. example ( "?tell [YOUR_FRIEND] [YOUR MESSAGE]" )
. build ( )
)
. addCommand ( CommandDescription . builder ( )
. command ( "forget" )
. description ( "If you do not want to read all messages deferred to you this command tells the bot do not disturb you this time" )
. example ( "?forget" )
. build ( )
)
. addCommand ( CommandDescription . builder ( )
. command ( "read" )
. description ( "Let the bot send you all the messages deferred to you this time in private dialogue" )
. example ( "?read" )
. build ( )
)
;
}
2018-01-31 22:05:04 +03:00
@Override
2018-04-09 15:17:11 +03:00
public void onMessage ( final MessageEvent event ) throws Exception {
2018-01-31 22:05:04 +03:00
2018-03-28 20:47:13 +03:00
if ( ! channelSettingsService . getChannelSettings ( JircBot . extractServer ( event . getBot ( ) . getServerHostname ( ) ) , getChannelName ( event ) ) . getDeferredMessagesEnabled ( ) ) {
2018-02-01 11:28:28 +03:00
return ;
}
2018-01-31 22:05:04 +03:00
if ( event . getUser ( ) . getUserId ( ) . equals ( event . getBot ( ) . getUserBot ( ) . getUserId ( ) ) ) {
return ;
}
2018-04-09 15:27:14 +03:00
String userName = event . getUser ( ) . getNick ( ) ;
String channelName = this . getChannelName ( event ) ;
2018-08-02 10:37:19 +03:00
String userIdent = event . getUser ( ) . getNick ( ) + "!" + event . getUser ( ) . getLogin ( ) + "@" + event . getUser ( ) . getHostname ( ) ;
2018-01-31 22:05:04 +03:00
2018-04-09 15:27:14 +03:00
if ( event . getMessage ( ) . startsWith ( COMMAND ) ) {
String message = event . getMessage ( ) . replace ( COMMAND , "" ) . trim ( ) ;
String commands [ ] = message . split ( " " , 2 ) ;
2018-01-31 22:05:04 +03:00
2018-04-09 15:27:14 +03:00
if ( commands . length ! = 2 ) {
2018-08-02 10:37:19 +03:00
event . respond ( "Deferred messages usage: ?tell <UserNick/ME/Ident> your message here" ) ;
2018-04-09 15:27:14 +03:00
return ;
}
2018-10-27 21:52:47 +03:00
if ( commands [ 0 ] . equalsIgnoreCase ( "me" ) | | userName . equalsIgnoreCase ( commands [ 0 ] ) ) {
2018-04-09 15:27:14 +03:00
// deferred to myself
deferredMessageService . saveDeferredMessage ( channelName , userName , userName . toLowerCase ( ) , commands [ 1 ] ) ;
2018-08-02 10:37:19 +03:00
event . respond ( "Saved message to " + userName ) ;
2018-02-01 12:19:05 +03:00
} else {
2018-04-09 15:27:14 +03:00
if ( commands [ 0 ] . equalsIgnoreCase ( event . getBot ( ) . getUserBot ( ) . getNick ( ) ) ) {
2018-08-02 10:37:19 +03:00
event . respond ( "Sorry, message cannot be deferred to me." ) ;
2018-04-09 15:27:14 +03:00
} else {
// deferred to somebody
2018-10-27 22:15:27 +03:00
if ( isUserOnline ( event , commands [ 0 ] ) ) {
2018-10-27 21:52:47 +03:00
event . respond ( String . format ( "%s is online, tell him/her directly, please." , commands [ 0 ] ) ) ;
} else {
deferredMessageService . saveDeferredMessage ( channelName , userName , commands [ 0 ] . toLowerCase ( ) , commands [ 1 ] ) ;
event . respond ( "Saved message to " + commands [ 0 ] ) ;
}
2018-04-09 15:27:14 +03:00
}
2018-02-01 12:19:05 +03:00
}
2018-04-09 15:30:54 +03:00
} else if ( event . getMessage ( ) . startsWith ( COMMAND_FORGET ) ) {
2018-07-31 17:47:52 +03:00
int count = deferredMessageService . forgetAllMessages ( channelName , userName , userIdent ) ;
2018-08-02 10:37:19 +03:00
event . respond ( "All " + count + " messages to " + userName + " were deleted" ) ;
2018-04-09 15:30:54 +03:00
} else if ( event . getMessage ( ) . startsWith ( COMMAND_READ ) ) {
2018-07-31 17:47:52 +03:00
List < DeferredMessage > deferredMessages = deferredMessageService . getDeferredMessagesForUser ( channelName , userName , userIdent ) ;
2018-04-09 15:30:54 +03:00
deferredMessages . forEach ( msg - > {
event . respondPrivateMessage ( "User " + msg . getSender ( ) + " at " + dt . format ( msg . getDtCreated ( ) ) + " told you: " + msg . getMessage ( ) ) ;
2018-04-09 15:49:46 +03:00
deferredMessageService . markMessageWasSent ( msg ) ;
2018-04-09 15:30:54 +03:00
} ) ;
2018-04-09 15:38:45 +03:00
} else {
this . sendDeferredMessage ( event ) ;
2018-01-31 22:05:04 +03:00
}
}
2018-04-09 15:17:11 +03:00
private void sendDeferredMessage ( final MessageEvent event ) {
2018-02-02 12:05:02 +03:00
2018-08-02 10:37:19 +03:00
String userIdent = event . getUser ( ) . getNick ( ) + "!" + event . getUser ( ) . getLogin ( ) + "@" + event . getUser ( ) . getHostname ( ) ;
List < DeferredMessage > deferredMessages = deferredMessageService . getDeferredMessagesForUser ( this . getChannelName ( event ) , event . getUser ( ) . getNick ( ) . toLowerCase ( ) , userIdent ) ;
2018-02-01 12:29:58 +03:00
if ( deferredMessages ! = null & & deferredMessages . size ( ) > 0 ) {
DeferredMessage msg = deferredMessages . get ( 0 ) ;
2018-02-01 12:35:28 +03:00
String more = "" + ( deferredMessages . size ( ) > 1 ? " (" + ( deferredMessages . size ( ) - 1 ) + " message/-s more)" : "" ) ;
2018-02-04 18:59:36 +03:00
event . respond ( "User " + msg . getSender ( ) + " at " + dt . format ( msg . getDtCreated ( ) ) + " told you" + more + ": " + msg . getMessage ( ) ) ;
2018-02-01 12:29:58 +03:00
deferredMessageService . markMessageWasSent ( msg ) ;
2018-01-31 22:05:04 +03:00
}
}
2018-02-02 10:50:19 +03:00
@Override
2018-02-01 21:55:37 +03:00
public void onJoin ( JoinEvent event ) throws Exception {
if ( event . getUser ( ) . getUserId ( ) . equals ( event . getBot ( ) . getUserBot ( ) . getUserId ( ) ) ) {
return ;
}
2018-08-02 10:37:19 +03:00
String userIdent = event . getUser ( ) . getNick ( ) + "!" + event . getUser ( ) . getLogin ( ) + "@" + event . getUser ( ) . getHostname ( ) ;
List < DeferredMessage > deferredMessages = deferredMessageService . getDeferredMessagesForUser ( this . getChannelName ( event ) , event . getUser ( ) . getNick ( ) . toLowerCase ( ) , userIdent ) ;
2018-02-01 21:55:37 +03:00
if ( deferredMessages ! = null & & deferredMessages . size ( ) > 0 ) {
2018-02-02 12:05:02 +03:00
event . respond ( "You have " + deferredMessages . size ( ) + " unread message(-s)" ) ;
2018-02-01 21:55:37 +03:00
}
}
2018-01-31 22:05:04 +03:00
}