; https://dev.adiirc.com/boards/5/topics/308 ; Hackjob full-palette Random Nick Color script for AdiIRC ; Generate consistent but random, full-palette colors for nicks & set custom colors as you please ; ; Version 1.2 - Fork v0.1.3 by Pereba ; ; ; *Now allows storage of custom colors! ; Usage: /setCustomColor - Example: /setCustomColor JohnDoe F854A7 ; /delCustomColor - Example: /delCustomColor JohnDoe ; ; *Colors are now calculated once and stored as needed for both random and custom colors ; This decreases CPU time (especially on bouncer playback) for each line displayed ; Custom colors persist between sessions (stored as rcolorscustom in your AdiIRC folder) ; ; *Buffer playback from bouncers is now properly supported without mangling output ; ; **NOTE: The built-in "Use Random Nick Colors" (Options -> Nick Colors) must be disabled for this script to work ; **NOTE: Any nick colors set in the AdiIRC options menu override random or custom colors set by this script ; ; Thanks to pereba for the original inspiration script and kr0n for troubleshooting help, as well as ; introducing me to hashtables :) ; ; For any of the output strings, if you don't want to show usermodes, you can replace $nick($chan, $nick).pnick ; with just plain $nick ; ; If you're curious, $chr(61442) is a special AdiIRC character that interprets the following string as a hex ; color code and allows for colorizing text ; ; If the script is acting weird for you, consider updating to the latest release or beta of AdiIRC; ; some of this code relies on features or bufixes in later versions ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; This is the initialization section, it handles actions to take when the script is loaded for ; the first time or reloaded, ; ; ; whenever the script is loaded for the first time or reloaded, call /savereload, ; which saves the rcolors and rcolorscustom hashtables to disk, clears them from memory, ; then reloads them--this also handles reloading them from disk when AdiIRC first starts ; on *:LOAD:savereload on *:START:{ hadd -m rcolors 0bgcolor $color(34) savereload } ; ; save & overwrite the rcolors & rcolorscustom hashtables to disk on exit ; on *:Exit:{ hsave -o rcolors rcolors hsave -o rcolorscustom rcolorscustom } ; dump all cached colors when the options screen is loaded; this ensures no stale colors are used ; if the background color is changed, since they might not be easy enough to see on *:OPTIONS:{ if ($hget(rcolors,0bgcolor) != $color(34)) { reset } if ($readini($adiircini,n,NickColors,NickColorsEntireLine) == True) { set -e %rcolors_ColorEntireLine True } else { unset %rcolors_ColorEntireLine } } ; ; This section responds to normal in-channel text events ; on &^*:TEXT:*:#:{ ; ; Stop here if user turned off script ; if (%rcolors_disabled) return ; ; Disable script on blacklisted networks/channels ; if ($network $+ . $+ # isin %rcolors_blacklist) return ; ; Check if message is ZNC buffer playback and use values accordingly ; ZNC buffer playback has different message content than a normal message and needs different handling ; var %time $spacefix($asctime($iif($msgstamp, $v1, $ctime), $timestampfmt)) var %pnick $iif($nick(#,$nick).cnick, $v1, $nick) ;;$nick($chan, $nick).pnick ; build the echo string ;;;echo -vrlmbfw2 # %time $replace($replace($prefixuser, $chr(32), $chr(160)), $ $+ pnick, $+($chr(61442), $getcolor, %pnick, $chr(3))) $1- var %linecolor $chr(3) $+ $chr(61442) $+ $getcolor var %prefixuser $replace($prefixuser,$!pnick,%pnick,$chr(32),$chr(160)) var %msg $msgx ; Color entire prefixuser or just the nick? follow user preference: if (%rcolors_ColorEntirePrefixUser) { var %prefixuser %linecolor $+ $replace($prefixuser,$!pnick,%pnick,$chr(32),$chr(160)) $+ $chr(3) } else { var %prefixuser $replace($prefixuser,$!pnick,%linecolor $+ %pnick $+ $chr(3),$!nick,%linecolor $+ %pnick $+ $chr(3),$chr(32),$chr(160)) } ; If Options -> Nick Colors -> Color entire line is enabled: if (%rcolors_ColorEntireLine) { %prefixuser = %prefixuser $+ %linecolor %msg = $regsubex(%msg,$patLine,%linecolor) if (%rcolors_ColorTimestamp) { %time = %linecolor $+ $regsubex(%time,$patLine,%linecolor) $+ $chr(3) } } %msg = %time %prefixuser %msg echox -vrlmbfw2 # %msg halt } ; ; This section handles ACTIONs, like /me or /emote commands ; Mostly the same as PRIVMSG but with the output string adjusted to properly display these types of messages ; on &^*:ACTION:*:#:{ ; ; Stop here if user turned off script ; if (%rcolors_disabled) return var %time $spacefix($asctime($iif($msgstamp, $v1, $ctime), $timestampfmt)) var %pnick $iif($nick(#,$nick).cnick, $v1, $nick) var %msg %time $replace($replace($prefixemote, $chr(32), $chr(160)), $ $+ pnick, $+($chr(61442), $getcolor, %pnick, $chr(3))) $msgx ;build the echo string echox -vrlmbfw2c action # %msg halt } ; ; User own text ; on *:INPUT:#: { ; ; Stop here if user turned off script ; if (%rcolors_disabled) return if (($left($1,1) != /) || ($ctrlenter) || ($regex($1,/^(\/{1,4})(me|action)/i)) && ($status == connected) { var %time $spacefix($asctime($iif($msgstamp, $v1, $ctime), $timestampfmt)) var %pnick $iif($nick(#,$nick).cnick, $v1, $nick) var %linecolor $chr(3) $+ $chr(61442) $+ $getcolor var %msgxraw $replacex($iif($regml(1), $iif($len($regml(1)) > 1,$($mid($msgx,$calc($len($1) +2)),2),$mid($msgx,$calc($len($1) +2))), $msgx),$chr(9),$chr(160)) var %msg %msgxraw ; Color entire prefixuser or just the nick? follow user preference: if (%rcolors_ColorEntirePrefixUser) { var %prefixuser %linecolor $+ $replace($iif($regml(2),$prefixemote,$prefixuser),$!pnick,%pnick,$chr(32),$chr(160)) $+ $chr(3) } else { var %prefixuser $replace($iif($regml(2),$prefixemote,$prefixuser),$!pnick,%linecolor $+ %pnick $+ $chr(3),$!nick,%linecolor $+ %pnick $+ $chr(3),$chr(32),$chr(160)) } ; If Options -> Nick Colors -> Color entire line is enabled: (except /action msg) if (%rcolors_ColorEntireLine && !$regml(2)) { %prefixuser = %prefixuser $+ %linecolor %msg = $regsubex(new,%msgxraw,$patLine,%linecolor) if (%rcolors_ColorTimestamp) { %time = %linecolor $+ $regsubex(time,%time,$patLine,%linecolor) $+ $chr(3) } } ; Action VS regular message if ($regml(2)) { var %msgx %time %prefixuser $+ $chr(3) %msgxraw, %text PRIVMSG $active : $+ $chr(1) $+ ACTION %msgxraw $+ $chr(1) echox -vw2c action # %msgx } else { var %msgx %time %prefixuser %msg, %text PRIVMSG $active : $+ %msgxraw echox -vw2c own # %msgx } .rawx %text halt } } ; ; Coloring nicklist ; on me:*:join:#:{ ; If enabled continue if (%rcolors_nicklist) { .timer 1 3 clinergb # } } on *:JOIN:#:{ ; If enabled continue if (%rcolors_nicklist) { cline -b $rgb( [ $hex2rgb($iif(%rcolors_nicklistbg == 1, $getDarkColor($nick), $getBrightColor($nick))) ] ) $nick } } ; credits @ http://forums.mirc.com/ubbthreads.php/topics/153480/HEX_=%3E_RGB? alias hex2rgb { $iif($isid,return,echo -a) $+($base($left($1,2),16,10),$chr(44),$base($mid($1,3,2),16,10),$chr(44),$base($right($1,2),16,10)) } alias -l clinergb { if ($istok(%rcolors_blacklist,$network $+ . $+ $1,32)) { var %rcolors_disabled 1 } var %n $nick($1,0) while (%n) { cline $iif(%rcolors_nicklist && %rcolors_disabled != 1,-b $rgb( [ $hex2rgb($iif(%rcolors_nicklistbg == 1, $getDarkColor($nick($1,%n)), $getBrightColor($nick($1,%n)))) ] ), -r) $1 $nick($1,%n) dec %n } } alias -l resetNicklist { tokenize 32 $regsubex($str(x,$chan(0)),/x/g,\n $chr(32)) clinergb $chan($*) } ; credits Kin @ GeekShed alias -l patLine return /\co|(\cc(?!\d(?:\d(?:,\d\d?)?)?))/gu alias -l spacefix { return $replacex($1,$chr(32),$chr(160)) } alias -l getcolor { ; Initialize %color as neutral grey in case we end up with nothing else to return var %color = 888888 ; Check if nick has a custom color set in AdiIRC options; if it does, return that color if ($nick(#, $nick).color > 1) { var %color = $getHexOfColor($nick(#, $nick).color)) return %color } ; Check if nick has a script-custom color; if it does, return that color else if ($hget(rcolorscustom, $nick)) { var %color = $hget(rcolorscustom, $nick) return %color } ; Check if nick has a cached color, if it does, return that color else if ($hget(rcolors, $nick)) { var %color = $hget(rcolors, $nick) return %color } ; If no cached or custom colors are found, roll for a new color and add it to the cache else { var %color $iif(%rcolors_bg == 1, $getDarkColor, $getBrightColor) hadd -m rcolors $nick %color return %color } ; If something fails, return %color as originally set to 888888 return %color } ; ; ; ; This is the alias for generating bright colors ; alias -l getBrightColor { ; ; Generate a unique seed number by calculating the MD5 hash of a nick, interpreting the last 8 characters as a hex number, then converting that to decimal ; ;;;var %nickSeedNum = $base($right($md5($nick),8),16,10) var %nickSeedNum = $base($right($md5($iif($1,$1,$nick)),8),16,10) ; ; Multiply by a high prime number, then take the modulus of a prime number < 255 to get 3 values for R,G,B color; this induces a bit more variety in the colors, and ; for whatever reason (I'm not a mathematician) tends to "favor" returning numbers close to 255 (brighter colors) ; var %dec1 = $calc((%nickSeedNum * 7793) % 251) var %dec2 = $calc((%nickSeedNum * 5153) % 241) var %dec3 = $calc((%nickSeedNum * 3623) % 239) ; ; Take the average of the RGB values ; var %decaverage = $calc((%dec1 + %dec2 + %dec3)/3) ; ; Generate colors until you get one that is "bright" (average RGB value > 128) ; If you find these colors are too dark or bright, you can adjust the %decaverage <= 128 ; while (%decaverage <= 128) { var %dec1 = $calc((%dec1 * 7793) % 251) var %dec2 = $calc((%dec2 * 5153) % 241) var %dec3 = $calc((%dec3 * 3623) % 239) var %decaverage = $calc((%dec1 + %dec2 + %dec3)/3) } ; ; call $RGBToHex to turn the RGB Value into a hex color code and return that code ; var %brightColorReturn = $RGBToHex(%dec1,%dec2,%dec3) return %brightColorReturn } ; ; This is the alias for generating dark colors ; It's the same as $getBrightColor but looks for colors that are "dark", or have ; average RGB value < 128 - Again you can tweak the %decaverage <= 128 if they're too dark or bright ; alias -l getDarkColor { ;var %nickSeedNum = $base($right($md5($nick),8),16,10) var %nickSeedNum = $base($right($md5($iif($1,$1,$nick)),8),16,10) var %dec1 = $calc((%nickSeedNum * 7793) % 113) var %dec2 = $calc((%nickSeedNum * 5153) % 127) var %dec3 = $calc((%nickSeedNum * 3623) % 131) var %decaverage = $calc((%dec1 + %dec2 + %dec3)/3) while (%decaverage >= 128) { var %dec1 = $calc((%dec1 * 7793) % 113) var %dec2 = $calc((%dec2 * 5153) % 127) var %dec3 = $calc((%dec3 * 3623) % 131) var %decaverage = $calc((%dec1 + %dec2 + %dec3)/3) } var %darkColorReturn = $RGBToHex(%dec1,%dec2,%dec3) return %darkColorReturn } ; ; This is the alias for converting RGB values to Hex, used here for getting hex strings to put ; after $chr(61442) - see top if you're not sure what this character is ; ; it takes in 3 numbers from 0-255, converts them to hex numbers, ; then returns them as a single string, EG $RGBToHex(255,255,255) or "White" returns FFFFFF ; alias -l RGBToHex { var %RtoHex = $base($1,10,16,2) var %GtoHex = $base($2,10,16,2) var %BtoHex = $base($3,10,16,2) var %HexCodeReturn = %RToHex $+ %GToHex $+ %BToHex return %HexCodeReturn } ; ; This is the alias for determining if your background is bright ; ; Average RGB of 100 seems to work well for determining if background is light or dark, ; but if you find the script is using colors that aren't showing well you might want to ; adjust this ; alias -l isBackgroundBright { ; ; get the backgound color ; var %bgRGB = $rgb($iif($1,$color(27),$color(34))) ; ; strip out the commas and replace them with the + sign ; var %bgRGB = $replace(%bgRGB,$chr(44),$chr(43)) ; ; evaluate the string from above ; var %bgRGBAverage = $calc((%bgRGB)/3) ; ; check if the average RGB value of the background is > 100; ; return 1 if it is (bright) or 0 if it isn't (dark) ; if (%bgRGBAverage >= 100) { return 1 } else return 0 } ; ; This is the alias that gets the hex value of numbered config colors ; https://dev.adiirc.com/projects/adiirc/wiki/Extra_Colors ; ; It is used in this script only to keep nicks with custom colors set using ; those colors instead of picking random colors ; alias -l getHexOfColor { ; ; get the specified color's R,G,B value var %colorToGet = $rgb($color($1)) ; ; tokenize the string returned above with commas ($chr(44)) as delimiter; pass those values into the $RGBToHex alias and return the value tokenize 44 %colorToGet return $RGBToHex($1,$2,$3) } ; ; This is the alias for setting custom nick colors, it takes a Nick and a hex color code as arguments ; EXAMPLE /setCustomColor JohnDoe f854a7 ; alias setCustomColor { ; typing just /setcustomcolor returns rudimentary help ; otherwise write the nick+color to hash table rcolorscustom and save to disk $iif($1, /echo -at $+($chr(61442),$2) Set this color for nick $1, /echo -at Usage: /setCustomColor Example: /setCustomColor JohnDoe F854A7) hadd -m rcolorscustom $1 $2 hsave -o rcolorscustom rcolorscustom } ; ; This is the alias for deleting custom nick colors, it takes only a nick as an argument ; EXAMPLE /delCustomColor JohnDoe alias delCustomColor { ; typing just /delcustomcolor returns rudimentary help ; otherwise remove nick+color from hash table rcolorscustom and save to disk $iif($1, echo -at Trying to remove custom color for $1, /echo -at Usage: /delCustomColor Example: /delCustomColor JohnDoe) hdel rcolorscustom $1 hsave -o rcolorscustom rcolorscustom } ; ; This is the alias for clearing all cached random colors ; It empties the rcolors hashtable, then saves the empty table back to the disk ; It is generally used in this script for ensuring that colors adjust accordingly to background color changes ; alias -l reset { ; Remove all cached colors if ($hget(rcolors)) { .hdel -w rcolors * savereload } ; Check if background is light or dark and set %rcolors_bg accordingly ;;;set %rcolors_bg $isBackgroundBright set %rcolors_bg $iif($var(%rcolors_forcestyle,1).value != $null,$v1,$isBackgroundBright) rcolors_resetnicklist } alias -l rcolors_resetnicklist { set %rcolors_nicklistbg $iif($var(%rcolors_nickliststyle,1).value != $null,$v1,$isBackgroundBright(nicklist)) } ; ; This is the alias for saving & reloading cached & custom colors to disk. It is primarily used on first run, or when ; settings are changed and need to be stored ; alias savereload { ; check if the rcolors hashtable exists, if it does, save it to disk, purge all entries from memory and reload it. ; it also checks if the hashtable is too large (more than 1000 entries) and purges it if that's the case ; if the hashtable is purged, colors will be recalculated and entered the next time a person speaks if ($hget(rcolors)) { if ($hget(rcolors,0).item > 1000) { .hdel -w rcolors * } hsave -o rcolors rcolors .hdel -w rcolors * hload rcolors rcolors } else { hmake rcolors 100 } ; same as above, but with rcolorscustom ; rcolorscustom will also never be auto-cleared if ($hget(rcolorscustom)) { hsave -o rcolorscustom rcolorscustom .hdel -w rcolorscustom * hload rcolorscustom rcolorscustom } else { hmake rcolorscustom 100 } } menu channel { RGB Random Nick Colors .Disable in # ..$iif($network $+ . $+ # isin %rcolors_blacklist,$style(1)) Yes:set %rcolors_blacklist $addtok(%rcolors_blacklist,$network $+ . $+ #,32) | clinergb # ..$iif($network $+ . $+ # !isin %rcolors_blacklist,$style(1)) No:set %rcolors_blacklist $deltok(%rcolors_blacklist,1,$network $+ . $+ #) | clinergb # } menu menubar { RGB Random Nick Colors .$iif(!%rcolors_disabled,$style(1)) Enabled:$iif(%rcolors_disabled,unset %rcolors_disabled,set %rcolors_disabled 1) | scid -a resetNicklist .- .Color messages style ..$iif(%rcolors_forcestyle == $null,$style(1)) Auto:unset %rcolors_forcestyle | reset ..$iif(%rcolors_forcestyle == 0,$style(1)) Bright:set %rcolors_forcestyle 0 | reset ..$iif(%rcolors_forcestyle == 1,$style(1)) Dark:set %rcolors_forcestyle 1 | reset .Color entire prefix user ..$iif(%rcolors_ColorEntirePrefixUser,$style(1)) Yes:set %rcolors_ColorEntirePrefixUser True ..$iif(%rcolors_ColorEntirePrefixUser != True,$style(1)) No:unset %rcolors_ColorEntirePrefixUser .Color entire message ..$iif(%rcolors_ColorEntireLine,$style(1)) Yes:.setconfig NickColors NickColorsEntireLine True | set %rcolors_ColorEntireLine True ..$iif(%rcolors_ColorEntireLine != True,$style(1)) No:.setconfig NickColors NickColorsEntireLine False | unset %rcolors_ColorEntireLine False .└ Including timestamp ..$iif(%rcolors_ColorTimestamp,$style(1)) Yes:set %rcolors_ColorTimestamp True ..$iif(%rcolors_ColorTimestamp != True,$style(1)) No:unset %rcolors_ColorTimestamp .- .$iif(%rcolors_nicklist,$style(1)) Enable nicklist colors:$iif(%rcolors_nicklist,unset %rcolors_nicklist,set %rcolors_nicklist True) | scid -a resetNicklist .Color nicklist style ..$iif(%rcolors_nickliststyle == $null,$style(1)) Auto:unset %rcolors_nickliststyle | rcolors_resetnicklist | scid -a resetNicklist ..$iif(%rcolors_nickliststyle == 0,$style(1)) Bright:set %rcolors_nickliststyle 0 | rcolors_resetnicklist | scid -a resetNicklist ..$iif(%rcolors_nickliststyle == 1,$style(1)) Dark:set %rcolors_nickliststyle 1 | rcolors_resetnicklist | scid -a resetNicklist }