tglogo.png
0 LIKES

Snippet


Channel Top10 Script by Nienqster

In Category General IRC Posted by Snippets On 12/04/23

This script is to view a monthly and daily Top10 chatters of a channel.

Still struggling with the auto disconnection at midnight and reconnection to clear the daily stats (If anyone has a better script for that please comment it below :P )

Enjoy!
; =======================================
; Nienqster - 03 May 2021
; Top10 Channel Stats Script
; =======================================

/*
Commands:
!stats [nick] => Overall stats for $nick|$2 in $network@#Channel
!top10 => Overall top 10 chatters in $network@channel
!tstats [nick] => Today's stats about $nick|$2
!ttop10 => Today's top 10 chatters in $network@#Channel
!delstats <nick> => Removing statistics about $2 in $network@#Channel
!clearstats => Removing all statistics collected for $network@#Channel
*/

; Binding all channel text to the parsing routine
; NB! No more "on text" events

/*
Version history:
21.02.2007 v1.2 bugfix release. (Fixed output bug resulting top9 instead of top10)
*/

ON *:TEXT:*:#: {
  if %stats_module == On {
    IF ($1 == %c $+ top10) {
      IF (%stats_floodpro >= 3) {
        halt
      }
      inc -u30 %stats_floodpro 1
      msg $chan $maketop10($network $+ @ $+ $chan)
      unset %stats_top10_*
      window -c @top10source
    }
    IF ($1 == %c $+ ttop10) {
      IF (%stats_floodpro >= 3) {
        halt
      }
      inc -u30 %stats_floodpro 1
      msg $chan $maketodaytop10($network $+ @ $+ $chan)
      unset %stats_top10_*
      window -c @top10source
    }
    IF ($1 == %c $+ stats) {
      IF (%stats_floodpro >= 3) {
        halt
      }
      inc -u30 %stats_floodpro 1
      IF ($2) {
        msg $chan $getstats($network $+ @ $+ $chan $+ @ $+ $2)
      }
      IF (!$2) {
        msg $chan $getstats($network $+ @ $+ $chan $+ @ $+ $nick)
      }
    }
    IF ($1 == %c $+ tstats) {
      IF (%stats_floodpro >= 3) {
        halt
      }
      inc -u30 %stats_floodpro 1
      IF ($2) {
        msg $chan $gettodaystats($network $+ @ $+ $chan $+ @ $+ $2)
      }
      IF (!$2) {
        msg $chan $gettodaystats($network $+ @ $+ $chan $+ @ $+ $nick)
      }
    }
    IF ($1 == %c $+ delstats) && ($2) &&  ($level($address($nick,2)) == 500) {
      remove-stats-nick $network $+ @ $+ $chan $+ @ $+ $2
      .msg $chan Erasing entries for nick $2
    }
    IF ($1 == %c $+ clearstats) &&  ($level($address($nick,2)) == 500) {
      remove-stats-channel $network $+ @ $+ $chan
      .msg $chan Channelstats erased.
    }
    IF ($left($1,1) == %c) {

      hinc -m totalcommands $network $+ @ $+ $chan $+ @ $+ $nick 1
      hinc -m todaytotalcommands $network $+ @ $+ $chan $+ @ $+ $nick 1
    }
    hinc -m totalwords $network $+ @ $+ $chan $+ @ $+ $nick $numtok($1-,32)
    hinc -m totalletters $network $+ @ $+ $chan $+ @ $+ $nick $len($1-)
    hinc -m totallines $network $+ @ $+ $chan $+ @ $+ $nick 1

    hinc -m todaytotalwords $network $+ @ $+ $chan $+ @ $+ $nick $numtok($1-,32)
    hinc -m todaytotalletters $network $+ @ $+ $chan $+ @ $+ $nick $len($1-)
    hinc -m todaytotallines $network $+ @ $+ $chan $+ @ $+ $nick 1
  }
}
; Action counting
; Will add all used words in action to the total spoken words as well

ON *:ACTION:*:#: {
  if %stats_module == on {
    hinc -m totalactions $network $+ @ $+ $chan $+ @ $+ $nick 1
    hinc -m totalwords $network $+ @ $+ $chan $+ @ $+ $nick $numtok($1-,32)
    hinc -m totalletters $network $+ @ $+ $chan $+ @ $+ $nick $len($1-)
    ;--
    hinc -m todaytotalactions $network $+ @ $+ $chan $+ @ $+ $nick 1
    hinc -m todaytotalwords $network $+ @ $+ $chan $+ @ $+ $nick $numtok($1-,32)
    hinc -m todaytotalletters $network $+ @ $+ $chan $+ @ $+ $nick $len($1-)
  }
}
ALIAS statsave {
  hsave -i totalwords chanstats.dat totalwords
  hsave -i totalletters chanstats.dat totalletters
  hsave -i totalcommands chanstats.dat totalcommands
  hsave -i totalactions chanstats.dat totalactions
  hsave -i totallines chanstats.dat totallines
}

ALIAS todaystatclear {
  hfree -w todaytotal*
  hmake todaytotalwords 10
  hmake todaytotalletters 10
  hmake todaytotalcommands 10
  hmake todaytotalactions 10
  hmake todaytotallines 10
}

ALIAS statload {
  hmake totalwords 10
  hmake totalletters 10
  hmake totalcommands 10
  hmake totalactions 10
  hmake totallines 10
  hload -i totalwords chanstats.dat totalwords
  hload -i totalletters chanstats.dat totalletters
  hload -i totalcommands chanstats.dat totalcommands
  hload -i totalactions chanstats.dat totalactions
  hload -i totallines chanstats.dat totallines
}

alias clearstats {
  var %stats_clearconfirm = $input(Are you sure you want to completely clear the statistics database?,yvqd,Channelstats :: Dreambot 5.6)
  IF (%stats_clearconfirm == $yes) {
    hfree -sw total*
    hmake totalwords 10
    hmake totalletters 10
    hmake totalcommands 10
    hmake totalactions 10
    hmake totallines 10
    todaystatclear
  }
}

ALIAS remove-stats-nick {
  var %stats-remnick = $1 $+ *
  hdel -w totalwords %stats-remnick
  hdel -w totalletters %stats-remnick
  hdel -w totalcommands %stats-remnick
  hdel -w totalactions %stats-remnick
  hdel -w totallines %stats-remnick
  hdel -w todaytotalwords %stats-remnick
  hdel -w todaytotalletters %stats-remnick
  hdel -w todaytotalcommands %stats-remnick
  hdel -w todaytotalactions %stats-remnick
  hdel -w todaytotallines %stats-remnick
  statsave
}

ALIAS remove-stats-channel {
  var %stats-remchan = $1 $+ *
  hdel -w totalwords %stats-remchan
  hdel -w totalletters %stats-remchan
  hdel -w totalcommands %stats-remchan
  hdel -w totalactions %stats-remchan
  hdel -w totallines %stats-remchan
  hdel -w todaytotalwords %stats-remchan
  hdel -w todaytotalletters %stats-remchan
  hdel -w todaytotalcommands %stats-remchan
  hdel -w todaytotalactions %stats-remchan
  hdel -w todaytotallines %stats-remchan
  statsave
}

ALIAS getstats {
  IF ($hget(totalwords, $1) != $null) {
    IF ($hget(totalwords, $1) != $null) {
      var %t.words = $hget(totalwords, $1)
    }
    ELSE {
      var %t.words = 0
    }
    IF ($hget(totalletters, $1) != $null) {
      var %t.letters = $hget(totalletters, $1)
    }
    ELSE {
      var %t.letters = 0
    }
    IF ($hget(totalcommands, $1) != $null) {
      var %t.commands = $hget(totalcommands, $1)
    }
    ELSE {
      var %t.commands = 0
    }
    IF ($hget(totallines, $1) != $null) {
      var %t.lines = $hget(totallines, $1)
    }
    ELSE {
      var %t.lines = 0
    }
    IF ($hget(totalactions, $1)) {
      var %t.actions = $hget(totalactions, $1)
    }
    ELSE {
      var %t.actions = 0
    }
    return [ $+ $gettok($1,3,64) $+ ] Spoken words: %t.words ( $+ %t.letters letters) Commands used %t.commands $+ . %t.lines lines and %t.actions actions.
    halt
  }
  return I have no stats about $gettok($1,3,64)
  halt
}

ALIAS gettodaystats {
  IF ($hget(todaytotalwords, $1) != $null) {
    IF ($hget(todaytotalwords, $1) != $null) {
      var %t.words = $hget(todaytotalwords, $1)
    }
    ELSE {
      var %t.words = 0
    }
    IF ($hget(todaytotalletters, $1) != $null) {
      var %t.letters = $hget(todaytotalletters, $1)
    }
    ELSE {
      var %t.letters = 0
    }
    IF ($hget(todaytotalcommands, $1) != $null) {
      var %t.commands = $hget(todaytotalcommands, $1)
    }
    ELSE {
      var %t.commands = 0
    }
    IF ($hget(todaytotallines, $1) != $null) {
      var %t.lines = $hget(todaytotallines, $1)
    }
    ELSE {
      var %t.lines = 0
    }
    IF ($hget(todaytotalactions, $1)) {
      var %t.actions = $hget(todaytotalactions, $1)
    }
    ELSE {
      var %t.actions = 0
    }
    return [ $+ $gettok($1,3,64) $+ ] Spoken words today: %t.words ( $+ %t.letters letters) Commands used today %t.commands $+ . %t.lines lines and %t.actions actions.
    halt
  }
  return I have no stats about $gettok($1,3,64)
  halt
}

ALIAS maketop10 {
  ; Save the hash table into .dat
  ; I know that this will make answer delayed especially in bigger channels... but well.... i dont care.
  ; This is about the best way to ensure that we will get the most recent result and also to ensure that we have backup of the hashtables.
  statsave
  ; Loading total spoken words into window
  window -hk0n @top10source
  clear @top10source
  var %stats_findbegin = $read(chanstats.dat, s, [totalwords])
  var %stats_looppoint = $calc($readn + 1 )
  WHILE (!%stats_loophalt) {
    var %stats_putline = $read(chanstats.dat, %stats_looppoint)
    IF ($left(%stats_putline,1) != $chr(91)) && ($left(%stats_putline,$len($1)) == $1) {
      var %statscleanline = $gettok($read(chanstats.dat, %stats_looppoint),3,64)
      aline @top10source %statscleanline
    }
    ELSEIF ($left(%stats_putline,1) == $chr(91)) {
      var %stats_loophalt = true
    }
    inc %stats_looppoint
  }
  ; Filtering the window
  filter -cetuww 2 61 @top10source @top10source *
  ; Now lets read the first 10 lines and store it to variables (%stats_top10_xx)
  ; Thats it if we have 10 lines of course
  ; If we have less then we will output only existing numbers of lines.
  var %stats_loop10 = 1
  WHILE (!%statssecondloophalt) {
    IF ($line(@top10source, %stats_loop10)) {
      set -e %stats_top10_ [ $+ [ %stats_loop10 ] ] $gettok($line(@top10source, %stats_loop10),1,61) ( $+ $gettok($line(@top10source, %stats_loop10),2,61) $+ )
      inc %stats_loop10
    }
    IF (!$line(@top10source, %stats_loop10)) || (%stats_loop10 >= 11) {
      var %statssecondloophalt = true
    }
  }
  IF (%stats_loop10 != 12) {
    var %stats_loop10 = $calc(%stats_loop10 - 1)
  }
  return Top %stats_loop10 chatters by total spoken words: %stats_top10_1 %stats_top10_2 %stats_top10_3 %stats_top10_4 %stats_top10_5 %stats_top10_6 %stats_top10_7 %stats_top10_8 %stats_top10_9 %stats_top10_10
}

ALIAS maketodaytop10 {
  window -hk0n @top10source
  clear @top10source
  hsave -i todaytotalwords tempstats.dat totalwords
  var %stats_loopline = 1
  WHILE (%stats_loopline <= $lines(tempstats.dat)) {
    IF ($gettok($read(tempstats.dat,%stats_loopline),1,64) == $gettok($1,1,64)) && ($gettok($read(tempstats.dat,%stats_loopline),2,64) == $gettok($1,2,64)) {
      aline -p @top10source $gettok($read(tempstats.dat,%stats_loopline),3,64)
    }
    inc %stats_loopline
  }
  filter -cetuww 2 61 @top10source @top10source *
  var  %stats_loop10 = 1
  WHILE (!%statssecondloophalt) {
    IF ($line(@top10source, %stats_loop10)) {
      set -e %stats_top10_ [ $+ [ %stats_loop10 ] ] $gettok($line(@top10source, %stats_loop10),1,61) ( $+ $gettok($line(@top10source, %stats_loop10),2,61) $+ )
      inc  %stats_loop10
    }
    IF (!$line(@top10source, %stats_loop10)) || (%stats_loop10 >= 11) {
      var  %statssecondloophalt = true
    }
  }
  IF (%stats_loop10 != 12) {
    var %stats_loop10 = $calc(%stats_loop10 - 1)
  }
  .remove tempstats.dat
  return Todays top %stats_loop10 chatters by total spoken words: %stats_top10_1 %stats_top10_2 %stats_top10_3 %stats_top10_4 %stats_top10_5 %stats_top10_6 %stats_top10_7 %stats_top10_8 %stats_top10_9 %stats_top10_10
}

ON *:CONNECT: timerresettodaystats -o {
  statload
  if %stats_module == $null { set %stats_module on }
  timerresettodaystats 23:59 1 60 dailystatsflush}

  ON *:EXIT: {
    echo -a ::: Stats ::: Storing stats.
    statsave
  }

  ALIAS dailystatsflush: disconnect server {
    timerresettodaystats 23:59 0 60 /todaystatclear
    todaystatclear
    /MSG $chan todaystats cleared when the bot resets
}


Comments 0


Please note that on our website we use cookies necessary for the functioning of our website, cookies that optimize the performance. To learn more about our cookies, how we use them and their benefits, please read our Cookie Policy.
I Understand