Coders-IRC
IRC for Coders
Access control in Chat, how to keep an eye on JOIN and PART
Being part of the user support of the ircIRCgate.it network and being simultaneously present in many chan, I often happen to "not" notice when some user enters the support channel #IRChelp, to overcome this inconvenience I used two simple but effective stratagems, the first consists of a script that, when a user joins in the support chan, it says me in echo (so I read it only me, in any channel or pvt I find ..) " IRChelp records a JOIN by TIZIO and the second, if I am not physically in front of the PC, and then there was the possibility that deto message escapes me, brings me back in a separate @ window, all the JOIN on the support channel with a lot of nick time and user address .. (also useful as "access statistics".. but let's come to the code:
on *:JOIN:#irchelp: {
window @irchelp
/echo @irchelp [ 9 $asctime(HH:nn:ss) ] [ 9 #IRChelp ] Register a [ 9 JOIN ] by [ 9 $nick - $address($nick,2) ]
}
on *:P ART:#irchelp: {
window @irchelp
/echo @irchelp [ 9 $asctime(HH:nn:ss) ] [ 4 #IRChelp ] Record a [ 4 PART ] by [ 4 $nick - $address($nick,2) }
on *:JOIN:#IRChelp: {
/echo -a [ 9 $asctime(HH:nn:ss) ] [ 9 #IRChelp ] Register a [ 9 JOIN ] by [ 9 $nick - $address($nick,2) ]
}
on *:P ART:#IRCHelp: {
/echo -a [ 9 $asctime(HH:nn:ss) ] [ 4 #IRChelp ] Records a [ 4 PART ] by [ 4 $nick - $address($nick,2) ]
}Query Manager - Accept or Reject messages in private!
on 1:OPEN:?:*:{
set %query.nick $nick
set %query.address $address($nick,1)
set %query.text $1-
close -m $nick
.msg $nick Query Manager: Wait, I have to decide whether or not to accept your Pvt...
query.decide
}
alias -l query.decide {
dialog -m Query Query
}
dialog Query {
title "Query"
size 300 250 200 50
option dbu
text "Nick:", 2, 5 12 12 10, nowrap
text "Text:", 3, 5 22 12 10, nowrap
edit %query.nick %query.address, 4, 20 10 170 10, read
edit %query.text, 5, 20 20 170 10, read
button "Accept", 6, 25 32 40 15
button "Reject", 7, 75 32 40 15
button "Ignore", 8, 125 32 40 15
}
on 1:dialog:Query:*:* {
if ($devent == sclick) {
if ($did == 6) {
dialog -x Query Query
query %query.nick
echo -t %query.nick < $+ %query.nick $+ > %query.text
.msg %query.nick Query Manager : Your Pvt Has Been Accepted!
unset %query.*
}
if ($did == 7) {
dialog -x Query Query
.msg %query.nick Query Manager : Your Pvt Was Rejected!
unset %query.*
}
if ($did == 8) {
dialog -x Query Query
ignore -p %query.nick
.msg %query.nick Query Manager : Your Pvt was Rejected and I Put You in Ignore!
unset %query.*
}
}
}
KeepMyNick.mrc
****************************************************************
;
; KeepMyNick ver 1.5 by Czuz (https://github.com/Czuz)
; To install just type: /load -rs KeepMyNick.mrc
;
;****************************************************************
;
; Help:
; KEEPNICK
; Syntax: /keepnick [<nick>] [<network>|default]
; Assigns <nick> to <network> (Or current network.) W/o argument
; disables grabbing until reconnection.
;
; LISTNICK
; Syntax: /listnick [-all]
; Displays list of nicks.
;
; DELNICK
; Syntax: /delnick [<network>|default]
; Remove nick associated with <network> (Or current network) from
; list
;
;****************************************************************
; ChangeLog:
; ver 1.5 (08.05.2021)
; - published on GitHub
; ver 1.4 (23.03.2005)
; - better handling of nick collisions on IRCnet
; ver 1.3 (15.03.2005)
; - new download link
; - better handling of ERR_RESTRICTED on IRCnet
; ver 1.2 (28.08.2004)
; - new download link
; ver 1.1 (04.06.2004)
; - spelling checked
; - fixed handling of raw events
; - default nick
; - /keepnick <nick> default, /delnick default
; - some GUI changes
; ver 1.0 (30.05.2004)
; - setup dialog (Commands->KeepMyNick v1.0)
; - minor changes in functions
; - extended syntax of commands
; - configurable timer delay
; ver 1.0-pre3 (13.05.2004)
; - added support for raw events:
; ERR_ERRONEUSNICKNAME, ERR_NICKNAMEINUSE, ERR_UNAVAILRESOURCE and ERR_RESTRICTED
; ver 1.0-pre2 (25.12.2003)
; - fixed disappearing timer bug
; - $comchan() instead of $ial()
; - minor bugs fixed
; ver 1.0-pre1 (22.12.2003)
; - keeping different nicks in multi-server mode
; - /keepnick, /listnick and /delnick commands
; - saving settings to file on exit and reading them on first connect
; - three states of nick grabbing:
; 0 - disabled
; 1 - passive (on events only, when we are on the same channel as nickstealer)
; 2 - active (periodically nick checking with timer)
;
; ver 0.9 (a long time ago)
; - simple on-event nick keeping for a single network
;
;****************************************************************
;--------------------------[ E V E N T S ]--------------------------
on *:LOAD: {
%KMN.Version = KeepMyNick v1.5
echo -st [KeepMyNick] Loading %KMN.Version ...
if ($version < 6.03) {
echo -st [KeepMyNick] Script NOT installed. Upgrade your mIRC version to 6.03+.
timer 1 2 unload -rs " $+ $script $+ "
halt
}
if (%KeepMyNickDelay) {
%KMN.Delay = %KeepMyNickDelay
unset %KeepMyNickDelay
}
else { %KMN.Delay = 10 }
if ($hget(MyNicks) == $null) {
hmake MyNicks 10
if ($scon(0) > 0 && $isfile(KeepMyNick.dat)) {
hload -b MyNicks KeepMyNick.dat
}
}
echo -st [KeepMyNick] - DONE! -
echo -st [KeepMyNick]
echo -st [KeepMyNick] Available commands:
echo -st [KeepMyNick] /keepnick [<nick>] [<network>|default]
echo -st [KeepMyNick] /listnick [-all]
echo -st [KeepMyNick] /delnick [<network>|default]
echo -st [KeepMyNick]
echo -st [KeepMyNick] For graphic setup, go to Menu->Commands-> $+ %KMN.Version
}
on *:UNLOAD: {
.timerKeepMyNick off
if ($hget(MyNicks)) {
hsave -ob MyNicks KeepMyNick.dat
hfree MyNicks
}
unset %KMN.Delay
unset %KMN.Version
unset %KMN.Default
unset %KMN.Options
echo -st [KeepMyNick] Bye...
}
on *:CONNECT: {
if ($scon(0) == 1) {
if ($isfile(KeepMyNick.dat)) {
if ($hget(MyNicks) == $null) { hmake MyNicks 10 }
hload -b MyNicks KeepMyNick.dat
}
}
if ($KMN.MyNick) { KMN.ChangeNickState 2 }
elseif (%KMN.Options == KMN.AddDef) { hadd -m MyNicks $KMN.FindNetwork 2 %KMN.Default }
elseif (%KMN.Options == KMN.KeepDef) { hadd -m MyNicks $KMN.FindNetwork 2 %KMN.Default 1 }
KMN.GetMyNick
}
on *:DISCONNECT: {
if ($nick == $me && $KMN.NickIsHidden) { hdel MyNicks $KMN.FindNetwork }
}
on *:EXIT: {
if ($hget(MyNicks)) {
hsave -ob MyNicks KeepMyNick.dat
hfree MyNicks
}
}
on *:KICK:#: {
if ($nick == $me || $nick == $KMN.MyNick) {
if ( $KMN.NickState > 0 ) {
KMN.ChangeNickState 2
}
}
}
on *:PART:#: {
if ($nick == $me || $nick == $KMN.MyNick) {
if ( $KMN.NickState > 0 ) {
KMN.ChangeNickState 2
}
}
}
on *:NICK: {
if ($nick != $me && $nick == $KMN.MyNick) {
if ( $KMN.NickState > 0 ) {
tnick $KMN.MyNick
}
}
elseif ($nick == $me && $nick == $KMN.MyNick && $KMN.NickState > 0) {
echo -at [KeepMyNick] Disabled for network $KMN.FindNetwork
KMN.ChangeNickState 0
}
}
on *:QUIT: {
if ($nick != $me && $nick == $KMN.MyNick) {
if ( $KMN.NickState > 0 ) {
tnick $KMN.MyNick
}
}
}
;----------------------[ R A W E V E N T S ]----------------------
; ERR_ERRONEUSNICKNAME
raw 432:*: {
if ($KMN.MyNick && $2 == $KMN.MyNick) {
echo -st [KeepMyNick] $2 - Erroneous Nickname
echo -st [KeepMyNick] Disabling for network $KMN.FindNetwork
KMN.ChangeNickState 0
halt
}
}
; ERR_NICKNAMEINUSE
raw 433:*: {
if ($KMN.MyNick && $2 == $KMN.MyNick) {
halt
}
}
; ERR_UNAVAILRESOURCE
raw 437:*: {
if ($KMN.MyNick && $2 == $KMN.MyNick) {
halt
}
}
; ERR_RESTRICTED
raw 484:*: {
if ($KMN.FindNetwork != IRCnet || $left($me, 1) !isin 0123456789) {
if ($KMN.NickState && $KMN.NickState != 0) {
echo -st [KeepMyNick] Your connection is restricted!
echo -st [KeepMyNick] Disabling for network $KMN.FindNetwork
KMN.ChangeNickState 0
halt
}
}
}
;---------------------[From OmenServe 1.42-b08]---------------------
; This should compensate for NewNet's lack of $network issues
alias KMN.FindNetwork {
if ( $network != $null ) { return $network }
if ( $server == irc.aohell.org ) { return NewNet }
if ( $server == irc.d0t.net ) { return NewNet }
if ( $server == irc.dividedspace.com ) { return NewNet }
if ( $server == irc.dragonskeep.com ) { return NewNet }
if ( $server == irc.eskimo.com ) { return NewNet }
if ( $server == irc.feartomorrow.com ) { return NewNet }
if ( $server == irc.firex.org ) { return NewNet }
if ( $server == irc.josephbarnhart.net ) { return NewNet }
if ( $server == irc.linux-friendly-56k.com ) { return NewNet }
if ( $server == irc.phantomshitter.net ) { return NewNet }
if ( $server == irc.sweatnet.net ) { return NewNet }
if ( $server == irc.moo.me.uk ) { return NewNet }
if ( $server == olympic.olympos-net.gr ) { return NewNet }
if ( $server != $null ) { return $server }
return Offline
}
;------------------------------[END]--------------------------------
;-----------------------[ F U N C T I O N S ]-----------------------
alias KMN.MyNick {
if ($1) {
return $gettok($hget(MyNicks, $1), 2, 32)
}
else {
return $gettok($hget(MyNicks, $KMN.FindNetwork), 2, 32)
}
}
alias KMN.NickState {
if ($1) {
return $gettok($hget(MyNicks, $1), 1, 32)
}
else {
return $gettok($hget(MyNicks, $KMN.FindNetwork), 1, 32)
}
}
alias KMN.NickIsHidden {
if ($1) {
return $gettok($hget(MyNicks, $1), 3, 32)
}
else {
return $gettok($hget(MyNicks, $KMN.FindNetwork), 3, 32)
}
}
alias KMN.ChangeNickState {
hadd -m MyNicks $KMN.FindNetwork $1 $mid($hget(MyNicks, $KMN.FindNetwork), 3)
}
alias KMN.GetMyNick {
var %currentserver = $cid
var %i = 1
while ($scon(%i)) {
scid $scon(%i)
if ( $server != $null && $me != $KMN.MyNick && $KMN.NickState > 1 ) {
if ($comchan($KMN.MyNick,0) != 0) {
KMN.ChangeNickState 1
}
else {
tnick $KMN.MyNick
}
}
inc %i
}
scid %currentserver
.timerKeepMyNick -i 1 %KMN.Delay KMN.GetMyNick
}
alias KMN.GetNetworkFromLine {
return $gettok($did(KMN.Setup, 11).seltext, 2, $asc(@))
}
alias KMN.CheckDelay {
if ($1 !isnum) { return 10 }
elseif ($1 < 5 ) { return 5 }
elseif ($1 > 600) { return 600 }
else { return $1 }
}
alias KMN.UpdateNicks {
var %currentserver = $cid
var %i = 1
while ($scon(%i)) {
scid $scon(%i)
if ((!$KMN.MyNick || $KMN.NickIsHidden) && %KMN.Options == KMN.AddDef) {
hadd -m MyNicks $KMN.FindNetwork 2 %KMN.Default
}
elseif ((!$KMN.MyNick || $KMN.NickIsHidden) && %KMN.Options == KMN.KeepDef) {
hadd -m MyNicks $KMN.FindNetwork 2 %KMN.Default 1
}
elseif ($KMN.NickIsHidden && %KMN.Options != KMN.KeepDef) {
hdel MyNicks $KMN.FindNetwork
}
inc %i
}
scid %currentserver
KMN.GetMyNick
}
alias KMN.DialogDelNick {
if ($1) {
hdel MyNicks $1
did -d KMN.Setup 11 $did(KMN.Setup, 11, 1).sel
}
}
alias KMN.DialogAddNick {
if ($1) { hdel MyNicks $1 }
hadd -m MyNicks $did(KMN.AddEdit,101) 2 $did(KMN.AddEdit,102)
if ($1) { did -o KMN.Setup 11 $did(KMN.Setup, 11, 1).sel $did(KMN.AddEdit,102) $+ @ $+ $did(KMN.AddEdit,101) }
else { did -a KMN.Setup 11 $did(KMN.AddEdit,102) $+ @ $+ $did(KMN.AddEdit,101) }
KMN.GetMyNick
}
alias KMN.DialogCheckBox {
if ($1 == 23) { var %i = 24 }
else { var %i = 23 }
if ($did(KMN.setup, $1).state == 0) {
if ($1 == 23) { var %i = 24 }
else { var %i = 23 }
%KMN.Options = $null
did -e KMN.setup %i
}
else {
if ($1 == 23) {
var %i = 24
%KMN.Options = KMN.AddDef
}
else {
var %i = 23
%KMN.Options = KMN.KeepDef
}
did -b KMN.setup %i
}
}
;------------------------[ C O M M A N D S ]------------------------
alias keepnick {
if ($2 == $null && $server == $null) {
echo -st [KeepMyNick] Connect to a server first.
halt
}
if ($1) {
if ($2 && $2 != default) { hadd -m MyNicks $2 2 $1 }
elseif ($2 && $2 == default) { %KMN.Default = $1 | %KMN.Options = KMN.KeepDef }
else { hadd -m MyNicks $KMN.FindNetwork 2 $1 }
KMN.GetMyNick
}
else {
echo -st [KeepMyNick] Disabled for network $KMN.FindNetwork
KMN.ChangeNickState 0
}
}
alias listnick {
echo -at [KeepMyNick] List of nicks:
var %i = 1
if ($1 == -all) {
var %max.servers = $hget(MyNicks,0).item
while (%i <= %max.servers) {
var %tmpserver = $hget(MyNicks,%i).item
if (!$KMN.NickIsHidden(%tmpserver)) {
echo -at [KeepMyNick] $KMN.MyNick(%tmpserver) $+ @ $+ %tmpserver
}
inc %i
}
}
else {
var %currentserver = $cid
while ($scon(%i)) {
scid $scon(%i)
if ($server && $KMN.MyNick && !$KMN.NickIsHidden) {
echo -at [KeepMyNick] $KMN.MyNick $+ @ $+ $KMN.FindNetwork $iif(($KMN.NickState == 0),(disabled),(enabled))
}
inc %i
}
scid %currentserver
}
}
alias delnick {
if ($1 && $1 == default && %KMN.Options = KMN.KeepDef) {
echo -st [KeepMyNick] Default nick disabled.
%KMN.Options = $null
KMN.UpdateNicks
}
elseif ($1 && $KMN.MyNick($1)) {
echo -st [KeepMyNick] Nick for $1 deleted.
hdel MyNicks $1
}
elseif ($1 == $null && $KMN.MyNick) {
echo -st [KeepMyNick] Nick for $KMN.FindNetwork deleted.
hdel MyNicks $KMN.FindNetwork
}
else { echo -st [KeepMyNick] No nick for that network. }
}
;----------------------------[ M E N U ]----------------------------
menu menubar {
%KMN.Version { dialog -m KMN.setup KMN.SetupDialog }
}
;-------------------------[ D I A L O G S ]-------------------------
dialog -l KMN.SetupDialog {
title %KMN.Version
size -1 -1 210 155
option dbu
box "Setup", 10, 2 2 206 130
list 11, 30 19 165 65, size, sort, vsbar
button "Add", 12, 6 19 20 15
button "Edit", 13, 6 36 20 15
button "Del", 14, 6 53 20 15
text "Nicks:", 15, 31 10 25 8
text %KMN.Version by Czuz, 16, 125 90 80 8
link "Latest version", 17, 125 98 80 8
text "Timer delay:", 18, 30 87 30 8
edit %KMN.Delay, 19, 63 86 35 10, right, limit 4
text "sec.", 20, 100 87 10 8
text "Default nick:", 21, 30 99 30 8
edit %KMN.Default, 22, 63 98 35 10, right
check "Add default nick to undefined networks", 23, 30 111 200 8
check "Keep default nick on undefined networks", 24, 30 121 200 8
button "Done", 99, 85 135 40 15, ok
}
dialog -l KMN.AddEditDialog {
title "KeepMyNick - Add/Edit"
size -1 -1 145 60
option dbu
combo 101, 15 15 60 10, edit, vsbar, drop
edit "", 102, 90 15 40 10
text "Network:", 103, 17 5 58 8
text "Nick:", 104, 92 5 38 8
button "Ok", 109, 30 35 30 15, ok
button "Cancel", 110, 85 35 30 15, cancel
}
on *:dialog:KMN.setup:init:0 {
var %max.servers = $hget(MyNicks,0).item
var %i = 1
while (%i <= %max.servers) {
var %tmpserver = $hget(MyNicks,%i).item
if (!$KMN.NickIsHidden(%tmpserver)) {
did -a KMN.setup 11 $KMN.MyNick(%tmpserver) $+ @ $+ %tmpserver
}
inc %i
}
if (%KMN.Options == KMN.AddDef) { did -c KMN.setup 23 | did -b KMN.setup 24 }
elseif (%KMN.Options == KMN.KeepDef) { did -c KMN.setup 24 | did -b KMN.setup 23 }
}
on *:dialog:KMN.setup:sclick:12 {
did -u KMN.Setup 11 $did(KMN.Setup, 11, 1).sel
$dialog(KMN.AddEdit, KMN.AddEditDialog, -4)
}
on *:dialog:KMN.setup:sclick:13 { $dialog(KMN.AddEdit, KMN.AddEditDialog, -4) }
on *:dialog:KMN.setup:sclick:14 { $KMN.DialogDelNick($KMN.GetNetworkFromLine) }
on *:dialog:KMN.setup:sclick:17 { run https://github.com/Czuz/KeepMyNick }
on *:dialog:KMN.setup:edit:19 { %KMN.Delay = $KMN.CheckDelay($did(KMN.setup,19)) }
on *:dialog:KMN.setup:edit:22 { %KMN.Default = $did(KMN.setup, 22)) }
on *:dialog:KMN.setup:sclick:23,24 { $KMN.DialogCheckBox($did) }
on *:dialog:KMN.setup:sclick:99 { $KMN.UpdateNicks }
on *:dialog:KMN.AddEdit:init:0 {
var %sel.network = $KMN.GetNetworkFromLine
if (%sel.network) { did -a KMN.AddEdit 101 %sel.network }
var %currentserver = $cid
var %i = 1
while ($scon(%i)) {
scid $scon(%i)
if ($server != $null && $network != $did(KMN.AddEdit,101,1)) {
did -a KMN.AddEdit 101 $KMN.FindNetwork
}
inc %i
}
scid %currentserver
did -c KMN.AddEdit 101 1
did -i KMN.AddEdit 102 1 $KMN.MyNick($did(KMN.AddEdit,101,1))
}
on *:dialog:KMN.AddEdit:sclick:109 { $KMN.DialogAddNick($KMN.GetNetworkFromLine) }
;----------------------------[ E N D ]------------------------------