2014-05-25 23:16:28 +02:00
var _ = require ( 'underscore' ) . _ ,
2015-04-25 12:27:22 +02:00
moment = require ( 'moment' ) ,
async = require ( 'async' ) ;
2013-10-21 17:40:45 +02:00
var commands = function ( dbot ) {
var commands = {
2014-05-25 22:47:30 +02:00
'~ncount' : function ( event ) {
var chanCounts = { } ,
2015-01-02 22:38:37 +01:00
typeCounts = { } ,
2014-05-25 23:16:28 +02:00
total = 0 ,
offString = event . params [ 1 ] || null ;
offset = moment ( ) . subtract ( offString , 1 ) . valueOf ( ) || null ;
/ * i f ( ! o f f s e t | | ! o f f s e t . i s V a l i d ( ) ) {
event . reply ( 'Invalid timescale. Try \'week\'' ) ;
return ;
} * /
2014-05-25 22:47:30 +02:00
this . db . scan ( 'notifies' , function ( notify ) {
if ( notify . user == event . rUser . id ) {
2014-05-25 23:16:28 +02:00
if ( ! offString ) {
if ( ! _ . has ( chanCounts , notify . channel ) ) chanCounts [ notify . channel ] = 0 ;
2015-01-02 22:38:37 +01:00
if ( ! _ . has ( typeCounts , notify . type ) ) typeCounts [ notify . type ] = 0 ;
2014-05-25 23:16:28 +02:00
chanCounts [ notify . channel ] ++ ;
2015-01-02 22:38:37 +01:00
typeCounts [ notify . type ] ++ ;
2014-05-25 23:16:28 +02:00
total ++ ;
} else {
if ( notify . time > offset ) {
if ( ! _ . has ( chanCounts , notify . channel ) ) chanCounts [ notify . channel ] = 0 ;
2015-01-02 22:38:37 +01:00
if ( ! _ . has ( typeCounts , notify . type ) ) typeCounts [ notify . type ] = 0 ;
2014-05-25 23:16:28 +02:00
chanCounts [ notify . channel ] ++ ;
2015-01-02 22:38:37 +01:00
typeCounts [ notify . type ] ++ ;
2014-05-25 23:16:28 +02:00
total ++ ;
}
}
2014-05-25 22:47:30 +02:00
}
} , function ( ) {
var cCounts = _ . chain ( chanCounts )
. pairs ( )
. sortBy ( function ( p ) { return p [ 1 ] ; } )
. reverse ( )
. first ( 10 )
. value ( ) ;
var cString = '' ;
for ( var i = 0 ; i < cCounts . length ; i ++ ) {
cString += cCounts [ i ] [ 0 ] + " (" + cCounts [ i ] [ 1 ] + "), " ;
}
cString = cString . slice ( 0 , - 2 ) ;
2015-01-02 22:38:37 +01:00
var tCounts = _ . chain ( typeCounts )
. pairs ( )
. sortBy ( function ( p ) { return p [ 1 ] ; } )
. reverse ( )
. first ( 10 )
. value ( ) ;
2015-01-02 22:39:45 +01:00
var tString = '' ;
2015-01-02 22:38:37 +01:00
for ( var i = 0 ; i < tCounts . length ; i ++ ) {
tString += tCounts [ i ] [ 0 ] + " (" + tCounts [ i ] [ 1 ] + "), " ;
}
tString = tString . slice ( 0 , - 2 ) ;
2014-05-25 23:16:28 +02:00
if ( offString ) {
event . reply ( dbot . t ( 'timed_notifies' , {
'user' : event . user ,
'count' : total ,
'offString' : offString ,
2015-01-02 22:38:37 +01:00
'cString' : cString ,
'tString' : tString
2014-05-25 23:16:28 +02:00
} ) ) ;
} else {
event . reply ( dbot . t ( 'total_notifies' , {
'user' : event . user ,
'count' : total ,
2015-01-02 22:38:37 +01:00
'cString' : cString ,
'tString' : tString
2014-05-25 23:16:28 +02:00
} ) ) ;
}
2014-05-25 22:47:30 +02:00
} ) ;
} ,
2015-01-15 03:41:11 +01:00
'~sustatus' : function ( event ) {
var user = event . input [ 1 ] ;
dbot . api . users . resolveUser ( event . server , user , function ( err , user ) {
if ( user ) {
2015-04-25 12:42:30 +02:00
dbot . api . users . getUserAliases ( user . id , function ( err , aliases ) {
var ban = 0 ,
latest _ban = { 'time' : 0 } ,
latest _unban = { 'time' : 0 } ,
unban = 0 ,
quiet = 0 ,
warn = 0 ,
report = 0 ,
items = { } ;
aliases . push ( user . primaryNick ) ;
2015-01-15 03:41:11 +01:00
2015-04-25 12:42:30 +02:00
dbot . modules . report . db . search ( 'notifies' , {
'server' : event . server
} , function ( notify ) {
_ . each ( aliases , function ( alias ) {
if ( notify . message . match ( 'banned ' + alias ) ||
notify . message . match ( alias + ' has been unbanned' ) ||
notify . message . match ( 'issued a warning to ' + alias ) ||
notify . message . match ( 'has quieted ' + alias ) ||
notify . message . match ( 'has reported ' + alias ) ) {
if ( notify . type == 'ban' ) {
ban ++ ;
if ( notify . time > latest _ban . time ) {
latest _ban = notify ;
}
} else if ( notify . type == 'unban' ) {
unban ++ ;
if ( notify . time > latest _unban . time ) {
latest _unban = notify ;
}
} else if ( notify . type == 'quiet' ) {
quiet ++ ;
} else if ( notify . type == 'warn' ) {
warn ++ ;
} else if ( notify . type == 'report' ) {
report ++ ;
}
items [ notify . time ] = notify . message ;
2015-03-14 14:45:15 +01:00
}
2015-01-19 23:30:04 +01:00
} ) ;
2015-04-25 12:42:30 +02:00
} , function ( ) {
if ( quiet != 0 || warn != 0 || report != 0 ) {
event . reply ( user . primaryNick + ' has been warned ' + warn + ' times, quieted ' + quiet + ' times, and reported ' + report + ' times.' ) ;
var sTimes = _ . keys ( items ) . sort ( function ( a , b ) {
return parseInt ( a ) - parseInt ( b ) ;
} ) ;
_ . each ( sTimes , function ( time ) {
event . reply ( '[' + moment ( parseInt ( time ) ) . format ( 'DD/MM/YYYY' ) + '] ' + items [ time ] ) ;
} ) ;
2015-01-19 23:06:33 +01:00
2015-04-25 12:42:30 +02:00
if ( latest _ban . time != 0 ) {
if ( latest _unban . time == 0 || ( latest _unban . time < latest _ban . time ) ) {
event . reply ( 'Current Ban Status: \u00034Banned\u000f since ' + moment ( latest _ban . time ) . fromNow ( ) + ' (' + moment ( parseInt ( latest _ban . time ) ) . format ( 'DD/MM/YYYY' ) + ')' ) ;
event . reply ( 'Reason: ' + latest _ban . message ) ;
} else {
var a = moment ( latest _ban . time ) ;
var b = moment ( latest _unban . time ) ;
event . reply ( 'Current Ban Status: \u00037Unbanned\u000f since ' + moment ( parseInt ( latest _unban . time ) ) . format ( 'DD/MM/YYYY' ) + ' after being banned for ' + b . diff ( a , 'days' ) + ' days' ) ;
event . reply ( 'Most recent ban reason: ' + latest _ban . message ) ;
}
2015-03-14 14:45:15 +01:00
} else {
2015-04-25 12:42:30 +02:00
event . reply ( 'Current Ban Status: \u00033Never banned (\u00037probably\u00033)\u000f' ) ;
2015-03-14 14:45:15 +01:00
}
} else {
2015-04-25 12:42:30 +02:00
event . reply ( user . primaryNick + ' has no record.' ) ;
2015-01-19 22:57:27 +01:00
}
2015-04-25 12:42:30 +02:00
} ) ;
} . bind ( this ) ) ;
2015-01-15 03:41:11 +01:00
} else {
event . reply ( 'never heard of em' ) ;
}
} . bind ( this ) ) ;
} ,
2014-12-16 03:50:03 +01:00
'~ustatus' : function ( event ) {
var user = event . input [ 1 ] ;
dbot . api . users . resolveUser ( event . server , user , function ( err , user ) {
if ( user ) {
var ban = null ,
quiet = 0
warn = 0 ;
// i'll fix it later
dbot . modules . report . db . search ( 'notifies' , {
'server' : event . server
} , function ( notify ) {
if ( notify . message . match ( 'banned ' + user . primaryNick ) || notify . message . match ( 'issued a warning to ' + user . primaryNick ) || notify . message . match ( 'has quieted ' + user . primaryNick ) ) {
if ( notify . type == 'ban' ) {
ban = notify . time ;
} else if ( notify . type == 'quiet' ) {
quiet ++ ;
} else if ( notify . type == 'warn' ) {
warn ++ ;
}
}
} , function ( ) {
if ( ban ) {
event . reply ( user . primaryNick + ' was banned on ' + new Date ( ban ) . toUTCString ( ) ) ;
} else if ( quiet != 0 || warn != 0 ) {
event . reply ( user . primaryNick + ' has been warned ' + warn + ' times, and quieted ' + quiet + ' times.' ) ;
} else {
event . reply ( user . primaryNick + ' has no record.' ) ;
}
} ) ;
} else {
event . reply ( 'never heard of em' ) ;
}
} . bind ( this ) ) ;
} ,
2013-10-21 17:40:45 +02:00
'~clearmissing' : function ( event ) {
if ( _ . has ( this . pending , event . rUser . id ) ) {
var count = this . pending [ event . rUser . id ] . length ;
delete this . pending [ event . rUser . id ] ;
event . reply ( dbot . t ( 'cleared_notifies' , { 'count' : count } ) ) ;
} else {
event . reply ( dbot . t ( 'no_missed_notifies' ) ) ;
}
} ,
'~report' : function ( event ) {
2014-09-04 17:25:21 +02:00
var channelName = ( event . input [ 1 ] || event . channel . toString ( ) ) ,
2013-10-21 17:40:45 +02:00
nick = event . input [ 2 ] ,
reason = event . input [ 3 ] . trim ( ) ;
2014-09-04 17:25:21 +02:00
channelName = channelName . trim ( ) ;
2013-10-21 17:40:45 +02:00
2014-02-04 01:58:09 +01:00
if ( channelName == event . user ) {
channelName = dbot . config . servers [ event . server ] . admin _channel ;
}
2013-10-21 17:40:45 +02:00
if ( reason . charAt ( reason . length - 1 ) != '.' ) reason += '.' ;
2014-09-04 16:54:49 +02:00
dbot . api . users . resolveUser ( event . server , nick , function ( err , reportee ) {
2013-10-21 17:40:45 +02:00
if ( _ . has ( event . allChannels , channelName ) ) {
if ( reportee ) {
this . api . notify ( 'report' , event . server , event . rUser ,
channelName , dbot . t ( 'report' , {
'reporter' : event . rUser . primaryNick ,
'reportee' : nick ,
'reason' : reason
} ) ) ;
event . reply ( dbot . t ( 'reported' , { 'reported' : nick } ) ) ;
} else {
event . reply ( dbot . t ( 'user_not_found' , {
'reported' : nick ,
'channel' : channelName
} ) ) ;
}
} else {
event . reply ( dbot . t ( 'not_in_channel' , { 'channel' : channelName } ) ) ;
}
} . bind ( this ) ) ;
} ,
'~notify' : function ( event ) {
var channelName = event . input [ 1 ] ,
message = event . input [ 2 ] ;
if ( _ . has ( event . allChannels , channelName ) ) {
if ( this . config . firstHost ) {
var first = message . split ( ' ' ) [ 0 ] ;
2014-09-04 16:54:49 +02:00
dbot . api . users . resolveUser ( event . server , first , function ( err , user ) {
2014-01-06 19:05:44 +01:00
if ( user && _ . include ( this . config . host _lookup , channelName ) ) {
2013-10-21 17:40:45 +02:00
dbot . api . nickserv . getUserHost ( event . server , first , function ( host ) {
message = message . replace ( first , first + ' [' + host + ']' ) ;
2015-03-14 10:24:51 +01:00
this . api . notify ( 'notify' , event . server , event . rUser , channelName , message , host ) ;
2013-10-21 17:40:45 +02:00
} . bind ( this ) ) ;
} else {
this . api . notify ( 'notify' , event . server , event . rUser , channelName , message ) ;
}
} . bind ( this ) ) ;
} else {
this . api . notify ( 'notify' , event . server , event . rUser , channelName , message ) ;
}
event . reply ( dbot . t ( 'notified' , {
'user' : event . user ,
'channel' : channelName
} ) ) ;
} else {
event . reply ( dbot . t ( 'not_in_channel' , { 'channel' : channelName } ) ) ;
}
} ,
'~nunsub' : function ( event ) {
2014-09-15 23:12:30 +02:00
var cName = event . input [ 1 ] ,
cId = event . input [ 1 ] + '.' + event . server ;
2013-10-21 17:40:45 +02:00
2014-09-15 23:12:30 +02:00
if ( _ . has ( dbot . instance . connections [ event . server ] . channels , cName ) ) {
this . db . read ( 'nunsubs' , cId , function ( err , nunsubs ) {
if ( ! nunsubs ) {
var nunsubs = {
'id' : cId ,
'users' : [ ]
2013-10-21 17:40:45 +02:00
}
2014-09-15 23:12:30 +02:00
}
if ( ! _ . include ( nunsubs , event . rUser . id ) ) {
nunsubs . users . push ( event . rUser . id ) ;
this . db . save ( 'nunsubs' , cId , nunsubs , function ( ) {
var reply = dbot . t ( 'nunsubbed' , { 'cName' : cName } )
if ( _ . has ( this . config . chan _redirs , cName ) ) {
reply += dbot . t ( 'n_also_found' , { 'afaName' : this . config . chan _redirs [ cName ] } ) ;
}
event . reply ( reply ) ;
} . bind ( this ) ) ;
} else {
event . reply ( dbot . t ( 'already_nunsubbed' , { 'cName' : cName } ) ) ;
}
} . bind ( this ) ) ;
} else {
event . reply ( 'Channel not known.' ) ;
}
2013-10-21 17:40:45 +02:00
} ,
'~ununsub' : function ( event ) {
2014-09-15 23:12:30 +02:00
var cName = event . input [ 1 ] ,
cId = event . input [ 1 ] + '.' + event . server ;
if ( _ . has ( dbot . instance . connections [ event . server ] . channels , cName ) ) {
this . db . read ( 'nunsubs' , cId , function ( err , nunsubs ) {
if ( ! _ . isUndefined ( nunsubs ) && _ . include ( nunsubs . users , event . rUser . id ) ) {
nunsubs . users = _ . without ( nunsubs . users , event . rUser . id ) ;
this . db . save ( 'nunsubs' , cId , nunsubs , function ( ) {
event . reply ( dbot . t ( 'ununsubbed' , { 'cName' : cName } ) ) ;
} ) ;
} else {
event . reply ( dbot . t ( 'not_nunsubbed' , { 'cName' : cName } ) ) ;
}
} . bind ( this ) ) ;
} else {
event . reply ( 'Channel not known.' ) ;
}
2015-03-14 10:42:13 +01:00
} ,
'~concerning' : function ( event ) {
var nick = event . params [ 1 ] . trim ( ) ;
dbot . api . nickserv . getUserHost ( event . server , nick , function ( host ) {
if ( host ) {
var results = [ ] ;
this . db . scan ( 'notifies' , function ( notify ) {
2015-03-14 10:59:16 +01:00
if ( notify && _ . has ( notify , 'host' ) && ( notify . host == host || notify . message . split ( ' ' ) [ 0 ] == nick ) ) {
2015-03-14 11:16:17 +01:00
results . push ( notify ) ;
2015-03-14 10:54:41 +01:00
}
2015-03-14 10:42:13 +01:00
} , function ( ) {
2015-03-14 10:59:16 +01:00
event . reply ( nick + ' has sought help ' + results . length + ' times under the host ' + host + ' or nick ' + nick ) ;
2015-03-14 10:42:13 +01:00
_ . each ( results , function ( n ) {
2015-03-14 11:17:19 +01:00
event . reply ( '[' + moment ( parseInt ( n . time ) ) . format ( 'DD/MM/YYYY' ) + '][' + n . user . split ( '.' ) [ 0 ] + '] ' + n . message ) ;
2015-03-14 10:42:13 +01:00
} ) ;
} ) ;
} else {
dbot . api . quotes . getQuote ( 'deal with it' , function ( quote ) {
var out = 'Couldn\'t find user\'s host, but that doesn\'t necessarily mean they don\'t exist. This is the lazy way of doing it for now... ' ;
if ( quote ) {
out += quote ;
}
event . reply ( out ) ;
} ) ;
}
2015-03-14 10:54:41 +01:00
} . bind ( this ) ) ;
2013-10-21 17:40:45 +02:00
}
} ;
2014-02-04 01:58:09 +01:00
commands [ '~report' ] . regex = /^report (#[^ ]+ )?([^ ]+) (.*)$/ ;
2013-12-29 19:38:24 +01:00
commands [ '~notify' ] . regex = [ /^notify ([^ ]+) (.+)$/ , 3 ] ;
commands [ '~nunsub' ] . regex = [ /^nunsub ([^ ]+)$/ , 2 ] ;
commands [ '~ununsub' ] . regex = [ /^ununsub ([^ ]+)$/ , 2 ] ;
2014-12-16 03:50:03 +01:00
commands [ '~ustatus' ] . regex = [ /^ustatus ([^ ]+)$/ , 2 ] ;
2015-01-15 03:41:11 +01:00
commands [ '~sustatus' ] . regex = [ /^sustatus ([^ ]+)$/ , 2 ] ;
2015-01-15 03:46:02 +01:00
commands [ '~ustatus' ] . access = 'power_user' ;
commands [ '~sustatus' ] . access = 'power_user' ;
2015-03-14 10:42:13 +01:00
commands [ '~sustatus' ] . access = 'concerning' ;
2013-10-21 17:40:45 +02:00
return commands ;
} ;
exports . fetch = function ( dbot ) {
return commands ( dbot ) ;
} ;