mIRC Home    About    Download    Register    News    Help

Print Thread
Joined: Nov 2009
Posts: 295
P
pball Offline OP
Fjord artisan
OP Offline
Fjord artisan
P
Joined: Nov 2009
Posts: 295
I made a script to add a delay between lines when pasting multiple lines. There is one problem and it's that anything pasted gets evaluated.

I found something weird when trying to $eval() to stop that.

//echo -a $eval($version,0)
$version
//.timer 1 1 echo -a $eval($version,0)
7.19

The timer evaluates $version even though $eval(,0) was used. How can I get the timer to not evaluate $1- and would this be a bug?


http://scripting.pball.win
My personal site with some scripts I've released.
Joined: Jan 2007
Posts: 1,156
D
Hoopy frood
Offline
Hoopy frood
D
Joined: Jan 2007
Posts: 1,156
Don't know if it's a bug, but try:

.timer 1 1 echo -a $!eval($version,0)

Joined: Nov 2006
Posts: 1,559
H
Hoopy frood
Offline
Hoopy frood
H
Joined: Nov 2006
Posts: 1,559
I'd rather not use $eval (what about a space-separated string, or a line containing brackets).

I suggest to use either one of the "safe"- (i.e.: non-eval) aliases you can find on these boards, for example:
Code:
alias safe2 bset -tc &a 1 $1 | return $!regsubex(safe, $bvar(&a,1-) ,/(\d+)(?: |$)/g,$chr(\1))


...or to not use any timer at all but the /play command.

Joined: Nov 2009
Posts: 295
P
pball Offline OP
Fjord artisan
OP Offline
Fjord artisan
P
Joined: Nov 2009
Posts: 295
DJ_Sol:
That'd work except I'm using $1- so that will be null when the timer goes off and it evals it then.

Horstl:
Using the play command would mean I'd have to write stuff to file and stuff which I'm just gonna stay away from for something like this.

I'll check out those aliases though.


http://scripting.pball.win
My personal site with some scripts I've released.
Joined: Feb 2006
Posts: 546
J
Fjord artisan
Offline
Fjord artisan
J
Joined: Feb 2006
Posts: 546
Originally Posted By: Horstl
I'd rather not use $eval (what about a space-separated string, or a line containing brackets).

I suggest to use either one of the "safe"- (i.e.: non-eval) aliases you can find on these boards, for example:
Code:
alias safe2 bset -tc &a 1 $1 | return $!regsubex(safe, $bvar(&a,1-) ,/(\d+)(?: |$)/g,$chr(\1))


...or to not use any timer at all but the /play command.


since this alias is so common, might i suggest a new and straight forward method? since mIRC 7's release, we have many new characters to play with and since the line length limit of 4,150 chars is considerably less than the number of Unicode code points available with $chr(), a simple character replacement is no longer unreasonable.

Code:
alias safe {
  return $!desafe(( $+ $replace($1, $chr(32), $chr(57344), $chr(40), $chr(57345), $chr(41), $chr(57346)) $+ )) 

}

alias desafe {
  return $replace($mid($1, 2, -1), $chr(57344), $chr(32), $chr(57345), $chr(40), $chr(57346), $chr(41))
}


used in much the same way as existing methods, //timer 1 3 echo -a $safe($1-) and such.

all spaces and parentheses are replaced by the first 3 characters of the BMP's Private Use Area (U+E000 - U+F8FF) - a range of Unicode code points that are hitherto unassigned - and commas as well as leading identifiers within $1- are handled by enclosing the encoded string in '(' and ')', rendering them plaintext.

the replacements + padding makes the string safe without multiplying its length as in $encode( , m) or the above $bvar() method.

and just in case it is actually too bold to assume that the absence of certain characters can never be predicted, and we wanted a fully capable alias, we can use this instead:

Code:
alias safe {
  var %chr1, %chr2, %chr3, %chrs

  if ($chr(32) isin $1) {
    while ($chr($rand(256, 65535)) isin $1) /
    %chr1 = $v1
  }

  if ($chr(40) isin $1) {
    while ($chr($rand(256, 65535)) isin $1) /
    %chr2 = $v1
  }

  if ($chr(41) isin $1) {
    while ($chr($rand(256, 65535)) isin $1) /
    %chr3 = $v1
  }

  %chrs = , %chr1 , %chr2 , %chr3

  return $!desafe(( $+ $replace($1, $chr(32), %chr1, $chr(40), %chr2, $chr(41), %chr3) ) %chrs ) 

}

alias desafe {
  return $replace($mid($1, 2, -1), $2, $chr(32), $3, $chr(40), $4, $chr(41))
}


those loops are guaranteed to terminate, and quickly too, due to mIRC's line length limit being almost 20 times less than the number of characters in those $rand ranges. it still isn't perfectly optimal with regards to the length of the output string (could still add a few more $+s, shorten the name 'desafe', etc.) but it's better than existing methods.


"The only excuse for making a useless script is that one admires it intensely" - Oscar Wilde

Link Copied to Clipboard