mIRC Homepage

ZNC Query Buffer Self-Message Support

Posted By: Mouse

ZNC Query Buffer Self-Message Support - 08/05/15 06:35 PM

I wrote a tiny script to support CAP znc.in/self-message so that playback of query buffers displays the full conversation, not just messages from the remote party.

It prints messages to the appropriate query window, in the correct color, and with the correct timestamp (format).

ACTIONs are also formatted properly so they can be differentiated from normal messages.

It seems to work well with one caveat: I can't get mIRC to stop opening a blank query window to myself ($me) despite using halt.

Any ideas on how to correct the issue and feedback/suggestions on the code in general would be appreciated.

Code:
; mIRC znc.in/self-message CAP support script by Mouse
; http://forums.mirc.com/ubbthreads.php/topics/252752
; v0.2 2015-05-08

; If server offers znc.in/self-message capability then request it.
raw CAP:*LS*znc.in/self-message*:{ .raw CAP REQ :znc.in/self-message }

; Process all private messages delivered to $me for which $me is not the target/recipient AND
; when no window for $me exists.
on ^*:OPEN:?:{
  if ($target != $me) {
    ; Make sure we have a query window to print to.
    if (!$window($target)) { query $target }
    ; Print message with proper formatting after checking if it's an ACTION.
    if ($gettok($rawmsg,4,32) == : $+ $chr(1) $+ ACTION) {
      echo $color(own text) -bfmt $+ $msgstamp $target * $nick $1-
    }
    else { echo $color(own text) -bfmt $+ $msgstamp $target < $+ $nick $+ > $1- }
    ; Halt further processing.
    halt
  }
}

; Process all private messages delivered to $me for which $me is not the target/recipient AND
; when a window for $me exists.
on ^*:TEXT:*:?:{
  if ($target != $me) {
    ; Make sure we have a query window to print to.
    if (!$window($target)) { query $target }
    ; Print message with proper formatting after checking if it's an ACTION.
    if ($gettok($rawmsg,4,32) == : $+ $chr(1) $+ ACTION) {
      echo $color(own text) -bfmt $+ $msgstamp $target * $nick $1-
    }
    else { echo $color(own text) -bfmt $+ $msgstamp $target < $+ $nick $+ > $1- }
    ; Halt further processing.
    halt
  }
}


This was tested with mIRC v7.41 and ZNC 1.6.0
Posted By: Wims

Re: ZNC Query Buffer Self-Message Support - 08/05/15 07:13 PM

You must use the on open event with ^ + halt to prevent a query window from openeing
Posted By: Mouse

Re: ZNC Query Buffer Self-Message Support - 08/05/15 10:02 PM

Thanks for the tip. I updated the script to include both an 'on OPEN' and 'on TEXT' trigger. Since a user may already have a query window open to themselves (unusual but allowed) when a self-message arrives it seems there's no way to do it with just one of the two triggers and both are required.

Seems to be working perfectly so far. grin
Posted By: webhead

Re: ZNC Query Buffer Self-Message Support - 02/09/16 11:58 PM

Hey I logged in just to say thanks. This works perfectly. I just setup my own ZNC server a while ago and this really was the last thing to click into place. laugh
Posted By: Mouse

Re: ZNC Query Buffer Self-Message Support - 03/09/16 08:31 PM

Glad to hear this was useful to someone! smile

Since I'm no longer actively using mIRC I'll also add the following while I'm here...

Be advised that this script may stop functioning in the future if:
* ZNC deprecates znc.in/self-message in favor of IRCv3.2 echo-message
* CTCP is deprecated in favor of IRCv3.3 intents
* Capability handling in mIRC changes in a manner incompatible with this script
Posted By: eahm

Re: ZNC Query Buffer Self-Message Support - 01/06/21 10:31 PM

I modded this script to make my nick look orange like it's set in $me but, there is an automatic way to do that for every color set in $me or the color number always needs to be changed for $nick?

Code
; mIRC znc.in/self-message CAP support script by Mouse
; http://forums.mirc.com/ubbthreads.php/topics/252752
; v0.2 2015-05-08

; If server offers znc.in/self-message capability then request it.
raw CAP:*LS*znc.in/self-message*:{ .raw CAP REQ :znc.in/self-message }

; Process all private messages delivered to $me for which $me is not the target/recipient AND
; when no window for $me exists.
on ^*:OPEN:?:{
  if ($target != $me) {
    ; Make sure we have a query window to print to.
    if (!$window($target)) { query $target }
    ; Print message with proper formatting after checking if it's an ACTION.
    if ($gettok($rawmsg,4,32) == : $+ $chr(1) $+ ACTION) {
      echo $color(own text) -bfmt $+ $msgstamp $target * $nick $1-
    }
    else { echo $color(own text) -bfmt $+ $msgstamp $target < $+ $chr(3) $+ 7 $+ $nick $+ $chr(3) $+ > $1- }
    ; Halt further processing.
    halt
  }
}

; Process all private messages delivered to $me for which $me is not the target/recipient AND
; when a window for $me exists.
on ^*:TEXT:*:?:{
  if ($target != $me) {
    ; Make sure we have a query window to print to.
    if (!$window($target)) { query $target }
    ; Print message with proper formatting after checking if it's an ACTION.
    if ($gettok($rawmsg,4,32) == : $+ $chr(1) $+ ACTION) {
      echo $color(own text) -bfmt $+ $msgstamp $target * $nick $1-
    }
    else { echo $color(own text) -bfmt $+ $msgstamp $target < $+ $chr(3) $+ 7 $+ $nick $+ $chr(3) $+ > $1- }
    ; Halt further processing.
    halt
  }
}
Posted By: maroon

Re: ZNC Query Buffer Self-Message Support - 02/06/21 05:55 PM

Not clear what you mean by "set in $me".

If you refer to a 'rule' for $me in 'nick colors', you can get that color like

//echo -a $cnick($me).color or $cnick($me,1).color

which might not be the same as your color in the nicklist if /cline were used to override that

//echo -a $nick($chan,$me).color

If you don't mean this, please be more clear what you did to set the 'in $me'
Posted By: eahm

Re: ZNC Query Buffer Self-Message Support - 02/06/21 06:52 PM

Yes sorry I mean the $me from alt+b settings, it's set to orange 7 for messages (or nicklist).
Posted By: eahm

Re: ZNC Query Buffer Self-Message Support - 02/06/21 08:02 PM

This one works perfectly thank you maroon:

Code
; mIRC znc.in/self-message CAP support script by Mouse
; http://forums.mirc.com/ubbthreads.php/topics/252752
; v0.2 2015-05-08

; Mod with $nick color same as $me color.

; If server offers znc.in/self-message capability then request it.
raw CAP:*LS*znc.in/self-message*:{ .raw CAP REQ :znc.in/self-message }

; Process all private messages delivered to $me for which $me is not the target/recipient AND
; when no window for $me exists.
on ^*:OPEN:?:{
  if ($target != $me) {
    ; Make sure we have a query window to print to.
    if (!$window($target)) { query $target }
    ; Print message with proper formatting after checking if it's an ACTION.
    if ($gettok($rawmsg,4,32) == : $+ $chr(1) $+ ACTION) {
      echo $color(own text) -bfmt $+ $msgstamp $target * $nick $1-
    }
    else { echo $color(own text) -bfmt $+ $msgstamp $target < $+ $chr(3) $+ $cnick($me).color $+ $nick $+ $chr(3) $+ > $1- }
    ; Halt further processing.
    halt
  }
}

; Process all private messages delivered to $me for which $me is not the target/recipient AND
; when a window for $me exists.
on ^*:TEXT:*:?:{
  if ($target != $me) {
    ; Make sure we have a query window to print to.
    if (!$window($target)) { query $target }
    ; Print message with proper formatting after checking if it's an ACTION.
    if ($gettok($rawmsg,4,32) == : $+ $chr(1) $+ ACTION) {
      echo $color(own text) -bfmt $+ $msgstamp $target * $nick $1-
    }
    else { echo $color(own text) -bfmt $+ $msgstamp $target < $+ $chr(3) $+ $cnick($me).color $+ $nick $+ $chr(3) $+ > $1- }
    ; Halt further processing.
    halt
  }
}
Posted By: Mouse

Re: ZNC Query Buffer Self-Message Support - 02/06/21 08:02 PM

As mentioned above it's not entirely clear what you mean by colors "set in $me" however if you're referring to a Nick Colors rule for $me then the updated script below should work. I've also fixed a bug in the script so that it properly applies mIRC's coloring rules when it comes to own actions: the "own text" color overrides the "action text" color only when "own text" is not the same color as "normal text".

Note that when it comes to coloring your nickname it may not be 100% accurate as you can apply other match requirements to a color nick entry beyond simply the nickname and here we're not checking anything beyond whether an entry for $me exists and what its color is, however for the purposes of this script it should be good enough or if not you may edit the owncolor alias to be more stringent.

Code
; mIRC znc.in/self-message CAP support script by Mouse
; http://forums.mirc.com/ubbthreads.php/topics/252752
; v0.3 2021-06-02

; If server offers znc.in/self-message capability then request it.
raw CAP:*LS*znc.in/self-message*:{ .raw CAP REQ :znc.in/self-message }

; Local alias to get correct "own" action and nick colors
alias -l owncolor {
  if ($1 == action) {
    if ($color(own text) == $color(normal text)) { return $color(action text) }
    else { return $color(own text) }
  }
  if ($1 == nick && $cnick($me) > 0) {
    return $cnick($me).color
  }
}

; Process all private messages delivered to $me for which $me is not the target/recipient AND
; when no window for $me exists.
on ^*:OPEN:?:{
  if ($target != $me) {
    ; Make sure we have a query window to print to.
    if (!$window($target)) { query $target }
    ; Print message with proper formatting after checking if it's an ACTION.
    if ($gettok($rawmsg,4,32) == : $+ $chr(1) $+ ACTION) {
      echo $owncolor(action) -bfmt $+ $msgstamp $target * $nick $1-
    }
    else { echo $color(own text) -bfmt $+ $msgstamp $target < $+ $chr(3) $+ $owncolor(nick) $+ $nick $+ $chr(3) $+ > $1- }
    ; Halt further processing.
    halt
  }
}

; Process all private messages delivered to $me for which $me is not the target/recipient AND
; when a window for $me exists.
on ^*:TEXT:*:?:{
  echo -a result $owncolor(action)
  if ($target != $me) {
    ; Make sure we have a query window to print to.
    if (!$window($target)) { query $target }
    ; Print message with proper formatting after checking if it's an ACTION.
    if ($gettok($rawmsg,4,32) == : $+ $chr(1) $+ ACTION) {
      echo $owncolor(action) -bfmt $+ $msgstamp $target * $nick $1-
    }
    else { echo $color(own text) -bfmt $+ $msgstamp $target < $+ $chr(3) $+ $owncolor(nick) $+ $nick $+ $chr(3) $+ > $1- }
    ; Halt further processing.
    halt
  }
}


Tested on mIRC 7.65 and ZNC 1.8.2
Posted By: eahm

Re: ZNC Query Buffer Self-Message Support - 03/06/21 12:52 PM

Thank you Mouse for the mod, this one though prints two
Quote
result 6
result 6
in the channel, not sure why. Action and nick colors are perfect in queries other than that small issue.
Posted By: maroon

Re: ZNC Query Buffer Self-Message Support - 04/06/21 03:00 PM

The script has a debugging line in it, which causes those echoes:

echo -a result $owncolor(action)

The result goes into whichever is your active window, which in your case happened to be the channel. It could have been the actual query window, a different query window, the status window, or even could be at a different network.
Posted By: Mouse

Re: ZNC Query Buffer Self-Message Support - 04/06/21 05:44 PM

I just missed a debugging line in the code as the person above mentioned. I can't go back and edit that post so I'll post the corrected code below so other people can copy/paste:

Code
; mIRC znc.in/self-message CAP support script by Mouse
; http://forums.mirc.com/ubbthreads.php/topics/252752
; v0.4 2021-06-04

; If server offers znc.in/self-message capability then request it.
raw CAP:*LS*znc.in/self-message*:{ .raw CAP REQ :znc.in/self-message }

; Local alias to get correct "own" action and nick colors
alias -l owncolor {
  if ($1 == action) {
    if ($color(own text) == $color(normal text)) { return $color(action text) }
    else { return $color(own text) }
  }
  if ($1 == nick && $cnick($me) > 0) {
    return $cnick($me).color
  }
}

; Process all private messages delivered to $me for which $me is not the target/recipient AND
; when no window for $me exists.
on ^*:OPEN:?:{
  if ($target != $me) {
    ; Make sure we have a query window to print to.
    if (!$window($target)) { query $target }
    ; Print message with proper formatting after checking if it's an ACTION.
    if ($gettok($rawmsg,4,32) == : $+ $chr(1) $+ ACTION) {
      echo $owncolor(action) -bfmt $+ $msgstamp $target * $nick $1-
    }
    else { echo $color(own text) -bfmt $+ $msgstamp $target < $+ $chr(3) $+ $owncolor(nick) $+ $nick $+ $chr(3) $+ > $1- }
    ; Halt further processing.
    halt
  }
}

; Process all private messages delivered to $me for which $me is not the target/recipient AND
; when a window for $me exists.
on ^*:TEXT:*:?:{
  if ($target != $me) {
    ; Make sure we have a query window to print to.
    if (!$window($target)) { query $target }
    ; Print message with proper formatting after checking if it's an ACTION.
    if ($gettok($rawmsg,4,32) == : $+ $chr(1) $+ ACTION) {
      echo $owncolor(action) -bfmt $+ $msgstamp $target * $nick $1-
    }
    else { echo $color(own text) -bfmt $+ $msgstamp $target < $+ $chr(3) $+ $owncolor(nick) $+ $nick $+ $chr(3) $+ > $1- }
    ; Halt further processing.
    halt
  }
}
© 2022 mIRC Discussion Forums