This is the new home of the egghelp.org community forum.
All data has been migrated (including user logins/passwords) to a new phpBB version.


For more information, see this announcement post. Click the X in the top right-corner of this box to dismiss this message.

multi lines max text length within time frame

Requests for complete scripts or modifications/fixes for scripts you didn't write. Response not guaranteed, and no thread bumping!
s
simo
Revered One
Posts: 1069
Joined: Sun Mar 22, 2015 2:41 pm

Post by simo »

does spaces get counted as well ? and if so could we take out all spaces ?
User avatar
CrazyCat
Revered One
Posts: 1200
Joined: Sun Jan 13, 2002 8:00 pm
Location: France
Contact:

Post by CrazyCat »

caesar gives you the solution in another thread (detect nicks with excessive digits in it)

Code: Select all

set length [string length [regsub -all {\ } $text ""]]
s
simo
Revered One
Posts: 1069
Joined: Sun Mar 22, 2015 2:41 pm

Post by simo »

excellent thanks CrazyCat
User avatar
caesar
Mint Rubber
Posts: 3776
Joined: Sun Oct 14, 2001 8:00 pm
Location: Mint Factory

Post by caesar »

Your regsub should be:

Code: Select all

regsub -all {[\s]} $text ""
because that will substitute all white spaces not just space with nothing:

Code: Select all

% set text "some        tab space"
some    tab space
% regsub -all {\ } $text ""
some    tabspace

% regsub -all {[\s]} $text ""
sometabspace
% string lengt [regsub -all {[\s]} $text ""]
12
You could go with a string map instead:

Code: Select all

% set length [string length [string map {" " "" "     " ""} $text]]
12
or another cleaner approach with regexp:

Code: Select all

% regexp -all -- {[^\s]} $text ""
12
that returns the length without the white space characters.

Edit: Speaking of the topic CrazyCat mentioned, here's another regexp I didn't think of last time:

Code: Select all

% set text "fa24a22"
fa24a22
% regexp -all -- {[0-9]} $text
4
% time { regexp -all -- {[0-9]} $text } 100
3.82 microseconds per iteration
so that line turns from:

Code: Select all

if {[string length [regsub -all {[^0-9]} $nick ""]] > 6} {
   # do whatever
}
into:

Code: Select all

if {[regexp -all -- {[0-9]} $nick] > 6} {
   # do whatever
}
as you tried and for some reason i failed to see the proper results. :roll:
Once the game is over, the king and the pawn go back in the same box.
s
simo
Revered One
Posts: 1069
Joined: Sun Mar 22, 2015 2:41 pm

Post by simo »

tnx ceasar

would that be like this?

Code: Select all

set length [regexp -all -- {[^\s]} $text ""]
User avatar
caesar
Mint Rubber
Posts: 3776
Joined: Sun Oct 14, 2001 8:00 pm
Location: Mint Factory

Post by caesar »

Yes, as I was testing stuff and kept editing the text i posted forgot to leave that as well.
Once the game is over, the king and the pawn go back in the same box.
s
simo
Revered One
Posts: 1069
Joined: Sun Mar 22, 2015 2:41 pm

Post by simo »

Tnx caesar
s
simo
Revered One
Posts: 1069
Joined: Sun Mar 22, 2015 2:41 pm

Post by simo »

i used this code on dalnet for few days now and it doesnt seem to count all chars from multiple lines it seems to count 1 line only to match against the threshold of 250

this is what i work with at the moment

Code: Select all

set bflood(maxlength) 250
set bflood(unsettime) 2

bind pubm - * pubm:byteflood



proc pubm:byteflood {nick host hand chan text} {

 global bflood 

 if {(![botisop $chan]) || ([isop $nick $chan]) ||  ([ishalfop $nick $chan]) || ([validuser $hand] && [matchattr $hand +bfmo|fmo $chan])} {return}

 set nick [string tolower $nick]
 set chan [string tolower $chan]

 set text [stripcodes * $text]

 set length [string length $text]
 set length [regexp -all -- {[^\s]} $text ""]

 if {[info exists bflood($chan:$nick)]} {  incr length $bflood($chan:$nick)  }


 if {($length > $bflood(maxlength))} {

   if {[isvoice $nick $chan]} {  pushmode $chan -v $nick  }



			if {[set chost [getchanhost $nick $chan]] ne ""} {
				switch -glob -- $chost {
					{*.irccloud.com} - {*.mibbit.com} - {*.kiwiirc.com} - {*2001*67c*2f08*} - {*192.184.8.*} - {*192.184.9.*} - {*192.184.9.*} - {*192.184.10.*} {
 
				}
					{default} {
                                  set banmask [maskhost $nick!$chost 4]
       				          pushmode $chan +b $banmask
					}
				}
   }
   flushmode $chan
   array unset bflood $chan:$nick
   return 0
 }

 if {![info exists bflood($chan:$nick)]} {
   utimer $bflood(unsettime) [list array unset bflood $chan:$nick]
 }

 set bflood($chan:$nick) $length
 return 0
}


bind ctcp - action pubmaction:byteflood 
proc pubmaction:byteflood { nick uhost hand chan key arg } {
 if {[isbotnick $chan]} return 
 pubm:byteflood $nick $uhost $hand $chan $arg 
}

Last edited by simo on Sat Dec 17, 2022 6:36 pm, edited 1 time in total.
s
simo
Revered One
Posts: 1069
Joined: Sun Mar 22, 2015 2:41 pm

Post by simo »

i also tried using instead of
if {($length > $bflood(maxlength))} {


this instead
if {($bflood($chan:$nick) > $bflood(maxlength))} {



but it didnt seem to do either
s
simo
Revered One
Posts: 1069
Joined: Sun Mar 22, 2015 2:41 pm

Post by simo »

im still having issues with this code it doesnt seem accurate as it triggers when user didnt exceed threshold i suspect it not unset with the added timer : bflood(unsettime)
s
simo
Revered One
Posts: 1069
Joined: Sun Mar 22, 2015 2:41 pm

Post by simo »

what i also discovered with nicknames like:
[N]espresso


it doesnt seem to store well as it doesnt seem to unset the var properly it only keeps increasing text length and doesnt unset it:
if {[info exists bflood($chan:$nick)]} { incr length $bflood($chan:$nick) }

utimer $bflood(unsettime) [list array unset bflood $chan:$nick]

set bflood($chan:$nick) $length
anyway to fix this ?
s
simo
Revered One
Posts: 1069
Joined: Sun Mar 22, 2015 2:41 pm

Post by simo »

with the help of SpiKe^^ so far the fixed and working version incase anyone needs it to enable in channel

Syntax: !byte on/off

Code: Select all


bind PUB -|- !byte bytes:checker
 
setudef flag byteschecker

proc bytes:checker {nick uhost hand chan arg} {
   if {![isop $nick $chan] && ![ishalfop $nick $chan] && ![matchattr $hand n|n $chan]} {return}

  switch -nocase -- [lindex [split $arg] 0] {
    on {
      if {[channel get $chan byteschecker]} {
        putserv "NOTICE $nick :byteschecker is already enabled on $chan."
      } else { 
        channel set $chan +byteschecker
        putserv "NOTICE $nick :byteschecker is now enabled."
}
    }
    off {
      if {![channel get $chan byteschecker]} {
        putserv "NOTICE $nick :byteschecker is already disabled on $chan."
      } else {
        channel set $chan -byteschecker
        putserv "NOTICE $nick :byteschecker is now disabled."
     }
    }    
  }
}



set bflood(maxlength) 350
set bflood(unsettime) 3


bind pubm - * pubm:byteflood

 


proc pubm:byteflood {nick host hand chan text} {
 if {![channel get $chan byteschecker]} { return }
 if {[validuser $hand] && [matchattr $hand +bfmo|fmo $chan]} {  return 0  }
 if {(![botisop $chan]) || ([isop $nick $chan]) ||  ([ishalfop $nick $chan]) || ([validuser $hand] && [matchattr $hand +bfmo|fmo $chan])} {return}
 global bflood

 set text [regsub -all -- {\s{2,}} [string trim [stripcodes * $text]] { }]
 set lengthXZ [regexp -all -- {[^\s]} $text ""]

 if {[info exists bflood($chan:$nick)]} {  incr lengthXZ $bflood($chan:$nick)  }

 if {($lengthXZ > $bflood(maxlength))} {

   if {[isvoice $nick $chan]} {  pushmode $chan -v $nick  }

   if {[string match -nocase "*@*irccloud*" $host]} {
                           regsub -all -- ~ $host "" host
                                    set ident  [lindex [split $host @] 0]
                                    set xbmaskx [string map {sid id uid id} $ident]
                                    set bmask  *!*[string tolower $xbmaskx ]@*
                                  if {![ischanban $bmask $chan]} {  pushmode $chan +b $bmask }

    } else {
                               set bmask "[maskhost $nick!$host 2]"
                               if {![ischanban $bmask $chan]} { pushmode $chan +b $bmask }
    }
           if {[onchan $nick $chan]} { putkick $chan $nick "Excess Characters Flood" }
   after [expr {30*1000*60}] [list Qtimed:banQ $chan $bmask]

   if {[info exists bflood($chan:$nick)]} { unset bflood($chan:$nick) }
   return 0
 }
  if {![info exists bflood($chan:$nick)]} { set bflood($chan:$nick) $lengthXZ ; utimer $bflood(unsettime) [list unset:byteflood $chan $nick]}
   
 return 0
}


proc Qtimed:banQ {chan banmask} {
  if {[ischanban $banmask $chan]} {
    pushmode2 $chan -b  $banmask 
  } 
}

proc unset:byteflood {chan nick} {
 global bflood
if {[info exists bflood($chan:$nick)]} { unset bflood($chan:$nick) }
}


Post Reply