Seb

RegFix.mrc

Seb
Aug 9th, 2026
12,132
0
Never
2
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
mIRC 11.55 KB | None | 0 0
  1. ;; ============================================================================
  2. ;;  RegFix  -  regular-voicer for AdiIRC / mIRC
  3. ;;  Auto +v's channel regulars on join, scored by DISTINCT DAYS SEEN.
  4. ;;  Multi-channel. Per-channel right-click enable/disable. Per-channel logging.
  5. ;;  Disabled = keeps scoring + logging, just stops auto-voicing.
  6. ;;  Data: <mircdir>\RegFix\   (one .hsh file per channel + regfix.ini config)
  7. ;;
  8. ;;  Quick start:
  9. ;;    1) Load this script.
  10. ;;    2) Right-click in a channel  -> RegFix -> "Start tracking here".
  11. ;;    3) Right-click               -> RegFix -> "Set log channel..."
  12. ;;    4) (optional) set the voice threshold; default is 7 distinct days.
  13. ;; ============================================================================
  14.  
  15. ;; ----- storage / config helpers --------------------------------------------
  16.  
  17. alias -l rf.dir {
  18.   var %d = $+($mircdir,RegFix\)
  19.   if (!$isdir(%d)) mkdir %d
  20.   return %d
  21. }
  22. alias -l rf.cfg return $+($rf.dir,regfix.ini)
  23. alias -l rf.safe return $regsubex($1,/[^a-z0-9]/gi,$null)
  24. alias -l rf.datafile return $+($rf.dir,data-,$rf.safe($1),.hsh)
  25. alias -l rf.table return $+(rf.tbl.,$rf.safe($1))
  26.  
  27. alias -l rf.open {
  28.   var %t = $rf.table($1)
  29.   if (!$hget(%t)) {
  30.     hmake %t 100
  31.     if ($isfile($rf.datafile($1))) hload %t $rf.datafile($1)
  32.   }
  33.   return %t
  34. }
  35. alias -l rf.saveone {
  36.   if ($hget($rf.table($1))) hsave $rf.table($1) $rf.datafile($1)
  37. }
  38. alias -l rf.saveall {
  39.   var %i = 1
  40.   while (%i <= $ini($rf.cfg,0)) {
  41.     rf.saveone $ini($rf.cfg,%i)
  42.     inc %i
  43.   }
  44. }
  45.  
  46. ;; ----- per-channel config getters ------------------------------------------
  47.  
  48. alias -l rf.tracked return $iif($readini($rf.cfg,n,$1,tracked) == 1,1,0)
  49. alias -l rf.enabled return $iif($readini($rf.cfg,n,$1,enabled) == 1,1,0)
  50. alias -l rf.logchan return $readini($rf.cfg,n,$1,logchan)
  51. alias -l rf.threshold {
  52.   var %v = $readini($rf.cfg,n,$1,threshold)
  53.   return $iif(%v isnum,%v,7)
  54. }
  55.  
  56. ;; ----- record field helpers (tab-delimited) --------------------------------
  57. ;;  1 nick | 2 ident@host | 3 ip(or -) | 4 days | 5 firstday | 6 lastday
  58. ;;  7 lastseen(ctime) | 8 flag(normal/force/never)
  59.  
  60. alias -l rf.fld return $gettok($1,$2,9)
  61. alias -l rf.setfld return $puttok($1,$3,$2,9)
  62. alias -l rf.mkrec return $+($1,$chr(9),$2,$chr(9),$3,$chr(9),$4,$chr(9),$5,$chr(9),$6,$chr(9),$7,$chr(9),$8)
  63. alias -l rf.today return $int($calc($ctime / 86400))
  64.  
  65. alias -l rf.idh {
  66.   var %u = $ial($1).user, %h = $ial($1).host
  67.   if (%h != $null) return $+(%u,@,%h)
  68.   var %a = $address($1,6)
  69.   if (%a) return $gettok(%a,2,33)
  70.   return $null
  71. }
  72. alias -l rf.isip {
  73.   if ($regex($1,/^(\d{1,3}\.){3}\d{1,3}$/)) return $true
  74.   if ($regex($1,/^[0-9a-f:]+:[0-9a-f:]+$/i)) return $true
  75.   return $false
  76. }
  77. alias -l rf.nextid {
  78.   var %t = $rf.open($1), %id = $hget(%t,nextid)
  79.   if (%id == $null) %id = 1
  80.   hadd %t nextid $calc(%id + 1)
  81.   return %id
  82. }
  83.  
  84. ;; ----- find an existing record by nick OR host OR ip (exact) ----------------
  85.  
  86. alias -l rf.find {
  87.   ; $1 chan  $2 nick  $3 ident@host  $4 ip(optional)
  88.   var %t = $rf.open($1), %i = 1, %tot = $hget(%t,0).item
  89.   while (%i <= %tot) {
  90.     var %k = $hget(%t,%i).item
  91.     if (%k != nextid) {
  92.       var %rec = $hget(%t,%k)
  93.       if (($2 != $null) && ($rf.fld(%rec,1) == $2)) return %k
  94.       if (($3 != $null) && ($rf.fld(%rec,2) == $3)) return %k
  95.       if (($4 != $null) && ($rf.fld(%rec,3) != -) && ($rf.fld(%rec,3) == $4)) return %k
  96.     }
  97.     inc %i
  98.   }
  99.   return $null
  100. }
  101.  
  102. ;; ----- credit a day (create or update). Returns record id ------------------
  103.  
  104. alias -l rf.credit {
  105.   ; $1 chan  $2 nick  $3 ident@host  $4 ip(optional)
  106.   if (!$rf.tracked($1)) return
  107.   var %t = $rf.open($1), %ip = $iif($4 != $null,$4,-)
  108.   var %id = $rf.find($1,$2,$3,$iif(%ip != -,%ip,$null)), %today = $rf.today
  109.   if (%id == $null) {
  110.     %id = $rf.nextid($1)
  111.     hadd %t %id $rf.mkrec($2,$3,%ip,1,%today,%today,$ctime,normal)
  112.     rf.saveone $1
  113.     rf.log $1 New entry: $2 ( $+ $3 $+ ) - day 1
  114.     return %id
  115.   }
  116.   var %rec = $hget(%t,%id)
  117.   %rec = $rf.setfld(%rec,1,$2)
  118.   %rec = $rf.setfld(%rec,2,$3)
  119.   if (%ip != -) %rec = $rf.setfld(%rec,3,%ip)
  120.   %rec = $rf.setfld(%rec,7,$ctime)
  121.   if (%today > $rf.fld(%rec,6)) {
  122.     var %days = $calc($rf.fld(%rec,4) + 1)
  123.     %rec = $rf.setfld(%rec,4,%days)
  124.     %rec = $rf.setfld(%rec,6,%today)
  125.     hadd %t %id %rec
  126.     rf.saveone $1
  127.     if (%days == $rf.threshold($1)) rf.log $1 $2 reached %days days - now a regular (threshold $rf.threshold($1))
  128.   }
  129.   else hadd %t %id %rec
  130.   return %id
  131. }
  132.  
  133. ;; ----- logging to the per-channel back-channel ------------------------------
  134.  
  135. alias -l rf.log {
  136.   var %lc = $rf.logchan($1)
  137.   if (%lc == $null) return
  138.   if ($me ison %lc) msg %lc [RegFix $1] $2-
  139.   else echo -a [RegFix $1] (log %lc offline) $2-
  140. }
  141.  
  142. ;; ----- events ---------------------------------------------------------------
  143.  
  144. on *:JOIN:#: {
  145.   if ($nick == $me) return
  146.   if (!$rf.tracked($chan)) return
  147.   var %idh = $rf.idh($nick)
  148.   if (%idh == $null) return
  149.   var %host = $gettok(%idh,2,64)
  150.   var %ip = $iif($rf.isip(%host),%host,$null)
  151.   var %id = $rf.credit($chan,$nick,%idh,%ip)
  152.   var %rec = $hget($rf.table($chan),%id), %flag = $rf.fld(%rec,8)
  153.   if (%flag == never) return
  154.   if (!$rf.enabled($chan)) return
  155.   if (!$me isop $chan) return
  156.   if (%flag == force) || ($rf.fld(%rec,4) >= $rf.threshold($chan)) {
  157.     if ($left($nick($chan,$nick).pnick,1) !isin $+(~,&,@,%,+)) {
  158.       .timer 1 1 mode $chan +v $nick
  159.       rf.log $chan Voiced $nick ( $+ $rf.fld(%rec,4) days, flag %flag $+ )
  160.     }
  161.   }
  162. }
  163.  
  164. ;; periodic sweep: credits everyone currently present (catches users who were
  165. ;; here before the script loaded, and midnight roll-overs). Scoring only.
  166. alias -l rf.scan {
  167.   var %ci = 1
  168.   while (%ci <= $chan(0)) {
  169.     var %c = $chan(%ci)
  170.     if ($rf.tracked(%c)) {
  171.       var %ni = 1
  172.       while (%ni <= $nick(%c,0)) {
  173.         var %n = $nick(%c,%ni), %idh = $rf.idh(%n)
  174.         if (%idh != $null) {
  175.           var %host = $gettok(%idh,2,64)
  176.           rf.credit %c %n %idh $iif($rf.isip(%host),%host,$null)
  177.         }
  178.         inc %ni
  179.       }
  180.     }
  181.     inc %ci
  182.   }
  183. }
  184. alias -l rf.starttimer {
  185.   .timerRegFix off
  186.   .timerRegFix 0 1800 rf.scan
  187. }
  188.  
  189. on *:START:rf.starttimer
  190. on *:LOAD:{ rf.starttimer | echo -a [RegFix] Loaded. Right-click a channel -> RegFix -> Start tracking here. }
  191. on *:UNLOAD:rf.saveall
  192. on *:EXIT:rf.saveall
  193.  
  194. ;; ----- actions used by the menus -------------------------------------------
  195.  
  196. alias -l rf.track {
  197.   if ($2 == 1) {
  198.     writeini $rf.cfg $1 tracked 1
  199.     if ($readini($rf.cfg,n,$1,enabled) == $null) writeini $rf.cfg $1 enabled 1
  200.     if ($readini($rf.cfg,n,$1,threshold) == $null) writeini $rf.cfg $1 threshold 7
  201.     rf.open $1
  202.     echo -a [RegFix] Now tracking $1 $+ . Set a log channel via the menu.
  203.     rf.log $1 Tracking started by $me
  204.   }
  205.   else {
  206.     writeini $rf.cfg $1 tracked 0
  207.     echo -a [RegFix] Stopped tracking $1 (data kept).
  208.     rf.log $1 Tracking stopped by $me
  209.   }
  210. }
  211. alias -l rf.toggleenable {
  212.   if ($rf.enabled($1)) {
  213.     writeini $rf.cfg $1 enabled 0
  214.     echo -a [RegFix] Auto-voice DISABLED for $1 (still scoring).
  215.     rf.log $1 Auto-voice disabled by $me
  216.   }
  217.   else {
  218.     writeini $rf.cfg $1 enabled 1
  219.     echo -a [RegFix] Auto-voice ENABLED for $1 $+ .
  220.     rf.log $1 Auto-voice enabled by $me
  221.   }
  222. }
  223. alias -l rf.setlog {
  224.   var %c = $input(Log / back-channel for $1 (include the #):,e,RegFix Setup)
  225.   if (%c != $null) {
  226.     writeini $rf.cfg $1 logchan %c
  227.     echo -a [RegFix] Log channel for $1 set to %c
  228.     rf.log $1 Log channel set to %c by $me
  229.   }
  230. }
  231. alias -l rf.setthreshold {
  232.   var %v = $input(Distinct days seen before auto-voicing in $1 :,e,RegFix Setup,$rf.threshold($1))
  233.   if (%v isnum) {
  234.     writeini $rf.cfg $1 threshold $int(%v)
  235.     echo -a [RegFix] Voice threshold for $1 set to $int(%v) days.
  236.     rf.log $1 Voice threshold set to $int(%v) by $me
  237.   }
  238. }
  239. alias -l rf.showscore {
  240.   var %idh = $rf.idh($2), %host = $gettok(%idh,2,64)
  241.   var %id = $rf.find($1,$2,%idh,$iif($rf.isip(%host),%host,$null))
  242.   if (%id == $null) { echo -a [RegFix] No record for $2 in $1 $+ . | return }
  243.   var %rec = $hget($rf.table($1),%id)
  244.   echo -a [RegFix] $2 in $1 : $rf.fld(%rec,4) days | flag: $rf.fld(%rec,8) | last seen: $asctime($rf.fld(%rec,7),mmm d HH:nn) | host: $rf.fld(%rec,2)
  245. }
  246. alias -l rf.remove {
  247.   var %idh = $rf.idh($2), %host = $gettok(%idh,2,64)
  248.   var %id = $rf.find($1,$2,%idh,$iif($rf.isip(%host),%host,$null))
  249.   if (%id == $null) { echo -a [RegFix] No record for $2 in $1 $+ . | return }
  250.   hdel $rf.table($1) %id
  251.   rf.saveone $1
  252.   echo -a [RegFix] Removed $2 from $1 scores.
  253.   rf.log $1 Removed $2 from scores by $me
  254. }
  255. alias -l rf.setflag {
  256.   ; $1 chan  $2 nick  $3 flag(normal/force/never)
  257.   var %t = $rf.open($1), %idh = $rf.idh($2), %host = $gettok(%idh,2,64)
  258.   var %id = $rf.find($1,$2,%idh,$iif($rf.isip(%host),%host,$null))
  259.   if (%id == $null) {
  260.     %id = $rf.nextid($1)
  261.     var %today = $rf.today
  262.     hadd %t %id $rf.mkrec($2,%idh,$iif($rf.isip(%host),%host,-),0,%today,0,$ctime,$3)
  263.   }
  264.   else hadd %t %id $rf.setfld($hget(%t,%id),8,$3)
  265.   rf.saveone $1
  266.   echo -a [RegFix] $2 flag set to $3 in $1 $+ .
  267.   rf.log $1 $2 flag set to $3 by $me
  268. }
  269. alias -l rf.top {
  270.   var %t = $rf.open($1), %i = 1, %tot = $hget(%t,0).item, %list
  271.   while (%i <= %tot) {
  272.     var %k = $hget(%t,%i).item
  273.     if (%k != nextid) {
  274.       var %rec = $hget(%t,%k)
  275.       if (%list != $null) %list = %list $+ $chr(59)
  276.       %list = %list $+ $rf.fld(%rec,4) $rf.fld(%rec,1) [ $+ $rf.fld(%rec,8) $+ ]
  277.     }
  278.     inc %i
  279.   }
  280.   %list = $sorttok(%list,59,nr)
  281.   echo -a [RegFix] Top regulars in $1 (threshold $rf.threshold($1) days):
  282.   var %j = 1
  283.   while (%j <= 20) && (%j <= $numtok(%list,59)) {
  284.     echo -a [RegFix]  $+ $chr(32) $gettok(%list,%j,59) days
  285.     inc %j
  286.   }
  287. }
  288. alias -l rf.purge {
  289.   ; remove records whose lastseen is older than $2 days (force-flagged kept)
  290.   var %t = $rf.open($1), %cut = $calc($ctime - ($2 * 86400)), %i = 1, %tot = $hget(%t,0).item, %kill
  291.   while (%i <= %tot) {
  292.     var %k = $hget(%t,%i).item
  293.     if (%k != nextid) {
  294.       var %rec = $hget(%t,%k)
  295.       if (($rf.fld(%rec,7) < %cut) && ($rf.fld(%rec,8) != force)) %kill = $addtok(%kill,%k,59)
  296.     }
  297.     inc %i
  298.   }
  299.   var %j = 1
  300.   while (%j <= $numtok(%kill,59)) { hdel %t $gettok(%kill,%j,59) | inc %j }
  301.   rf.saveone $1
  302.   echo -a [RegFix] Purged $numtok(%kill,59) entries (inactive > $2 d) in $1 $+ .
  303.   if ($numtok(%kill,59) > 0) rf.log $1 Purged $numtok(%kill,59) inactive entries (> $2 d) by $me
  304. }
  305.  
  306. ;; ----- menus ----------------------------------------------------------------
  307.  
  308. menu channel {
  309.   -
  310.   RegFix
  311.   .$iif(!$rf.tracked($chan),Start tracking here):rf.track $chan 1
  312.   .$iif($rf.tracked($chan),$iif($rf.enabled($chan),$style(1)) Auto-voice regulars):rf.toggleenable $chan
  313.   .$iif($rf.tracked($chan),Set log channel...):rf.setlog $chan
  314.   .$iif($rf.tracked($chan),Set voice threshold...):rf.setthreshold $chan
  315.   .$iif($rf.tracked($chan),Show top regulars):rf.top $chan
  316.   .$iif($rf.tracked($chan),-)
  317.   .$iif($rf.tracked($chan),Save scores now):rf.saveall
  318.   .$iif($rf.tracked($chan),Purge inactive (90d+)):rf.purge $chan 90
  319.   .$iif($rf.tracked($chan),Stop tracking (keep data)):rf.track $chan 0
  320. }
  321.  
  322. menu nicklist {
  323.   -
  324.   RegFix
  325.   .$iif($rf.tracked($chan),Score for $1):rf.showscore $chan $1
  326.   .$iif($rf.tracked($chan),Voice now):mode $chan +v $1
  327.   .$iif($rf.tracked($chan),Remove from scores):rf.remove $chan $1
  328.   .$iif($rf.tracked($chan),-)
  329.   .$iif($rf.tracked($chan),Force voice (always)):rf.setflag $chan $1 force
  330.   .$iif($rf.tracked($chan),Never voice):rf.setflag $chan $1 never
  331.   .$iif($rf.tracked($chan),Clear flag (normal)):rf.setflag $chan $1 normal
  332. }
  333.  
Advertisement