|
Joined: Oct 2005
Posts: 827
Hoopy frood
|
OP
Hoopy frood
Joined: Oct 2005
Posts: 827 |
i got this code here to log nicknames
on *:JOIN:#: {
if (!$read(nicks.txt, sn, $address) { write nicks.txt $address $nick }
else { write -l $+ $readn nicks.txt $address $read(nicks.txt, sn, $address) $nick }
}
but how would i make it so that if the user already has 15 logs for him, then it will put his new nickname to the beginning so basically the maximum nicknames it will log for users is 15 keeping the list the most up to date nicks
|
|
|
|
Joined: Dec 2002
Posts: 2,962
Hoopy frood
|
Hoopy frood
Joined: Dec 2002
Posts: 2,962 |
on *:JOIN:#: {
if ($read(nicks.txt, sn, $address)) { write -l $+ $readn nicks.txt $address $gettok($v1,-14-,32) $nick }
else { write nicks.txt $address $nick }
} I switched the condition checks around to make it more logical to read.
Spelling mistakes, grammatical errors, and stupid comments are intentional.
|
|
|
|
Joined: Oct 2005
Posts: 827
Hoopy frood
|
OP
Hoopy frood
Joined: Oct 2005
Posts: 827 |
thanks starbuck i tested it, works very well!
it removes the first nickname from the line and pushes the entry back 1 slot to add the latest nickname to the end!! thanks
|
|
|
|
Joined: Oct 2005
Posts: 827
Hoopy frood
|
OP
Hoopy frood
Joined: Oct 2005
Posts: 827 |
no i found a problem, sorry
if the address doesnt exist, it writes the new nickname once
then if the user changed their nickname again, it overwrites that first slot, wherehas it should be
nick1 nick2
but it just shows nick2
|
|
|
|
Joined: Feb 2005
Posts: 342
Fjord artisan
|
Fjord artisan
Joined: Feb 2005
Posts: 342 |
In order for this to work the way you want, you'd have to loop the file, for the $address, and delete the 15th nick, then insert the new nick at the top. This is a pretty dirty process. alias addnick {
var %a = $1 , %n = $2 , %i = 1 , %count = 1
while ($read(nicks.txt,nw,%a *,%i)) {
var %i = $readn + 1 , %r = $readn
inc %count
}
if (%count > 14) { write $+(-dl,%r) nicks.txt }
write -il1 nicks.txt %a %n
} /addnick $address $nick Of course, you could do it the cleaner way with an ini file: alias addnick2 {
var %a = $1 , %n = $2 , %nicks = $readini(nicks.ini,nicks,%a)
if (!$istok(%nicks,%n,32)) {
if ($numtok(%nicks,32) > 14) { var %nicks = $deltok(%nicks,15,32) }
writeini nicks.ini nicks %a $instok(%nicks,%n,1,32)
}
else { writeini nicks.ini nicks %a %n $remtok(%nicks,%n,1,32) }
} or with hash tables: alias addnick2 {
var %a = $1 , %n = $2 , %nicks = $hget(nicks,%a)
if (!$istok(%nicks,%n,32)) {
if ($numtok(%nicks,32) > 14) { var %nicks = $deltok(%nicks,15,32) }
hadd -m nicks %a $instok(%nicks,%n,1,32)
}
else { hadd -m nicks %a %n $remtok(%nicks,%n,1,32) }
} Hope that helps. Edit: Changed the above last two examples to reflect a better way of handling the nicks. This makes it so that if a nick was towards the bottom, and the person joined with it, it'd move the nick to the first position.
Last edited by Rand; 04/10/07 02:32 AM.
|
|
|
|
Joined: Dec 2002
Posts: 2,962
Hoopy frood
|
Hoopy frood
Joined: Dec 2002
Posts: 2,962 |
Right. $gettok() isn't as forgiving with negative indices as I thought. on *:JOIN:#: {
if ($read(nicks.txt, sn, $address)) {
var %oldnicks = $v1, %starttok = $iif($numtok(%oldnicks, 32) >= 14, -14, 1)
write -l $+ $readn nicks.txt $address $gettok(%oldnicks,$+(%starttok, -), 32) $nick
}
else { write nicks.txt $address $nick }
} If you want it to store each nick only once: on *:JOIN:#: {
if ($read(nicks.txt, sn, $address)) {
var %nicks = $addtok($v1, $nick, 32), %starttok = $iif($numtok(%nicks, 32) >= 15, -15, 1)
write -l $+ $readn nicks.txt $address $gettok(%nicks,$+(%starttok, -), 32)
}
else { write nicks.txt $address $nick }
}
Last edited by starbucks_mafia; 04/10/07 03:07 AM.
Spelling mistakes, grammatical errors, and stupid comments are intentional.
|
|
|
|
Joined: Feb 2005
Posts: 342
Fjord artisan
|
Fjord artisan
Joined: Feb 2005
Posts: 342 |
If you want it to store each nick only once: on *:JOIN:#: {
if ($read(nicks.txt, sn, $address)) {
var %nicks = $addtok($v1, $nick, 32), %starttok = $iif($numtok(%nicks, 32) >= 14, -14, 1)
write -l $+ $readn nicks.txt $address $gettok(%nicks,$+(%starttok, -), 32)
}
else { write nicks.txt $address $nick }
} Not trying to nag you, but, that won't actually work the way you intend it to. If the nick exists, it'll only give you 14 of the nicks (not 15). Also, lets say that "Bob" is in position 1 ($gettok(%nicks,1,32)), if the person joins as "Bob" and you use $addtok(), it won't add the nick since it's already there, and, it will remove Bob from the list since it's using -14.
|
|
|
|
Joined: Dec 2002
Posts: 2,962
Hoopy frood
|
Hoopy frood
Joined: Dec 2002
Posts: 2,962 |
OK, I've edited the original to use 15 instead of 14. If the order is an issue it can easily be resolved with $remtok(). on *:JOIN:#: {
if ($read(nicks.txt, sn, $address)) {
var %nicks = $addtok($remtok($v1, $nick, 1, 32), $nick, 32), %starttok = $iif($numtok(%nicks, 32) >= 15, -15, 1)
write -l $+ $readn nicks.txt $address $gettok(%nicks,$+(%starttok, -), 32)
}
else { write nicks.txt $address $nick }
} Point being $read()'s search capability is perfect for this particular usage and there's no need to loop anything. Edited: Did it wrong again. Should use $remtok(), not $instok(), to get right behaviour.
Last edited by starbucks_mafia; 04/10/07 07:47 AM.
Spelling mistakes, grammatical errors, and stupid comments are intentional.
|
|
|
|
Joined: Feb 2005
Posts: 342
Fjord artisan
|
Fjord artisan
Joined: Feb 2005
Posts: 342 |
OK, I've edited the original to use 15 instead of 14. If the order is an issue it can easily be resolved with $instok().
Point being $read()'s search capability is perfect for this particular usage and there's no need to loop anything. Right. My first alias was made under the assumption that he wanted them on different lines since I didn't see any useage of $gettok() on his behalf in his original file. Hence the reason I supplied the second and third alias (which contain no loops). Your new code now does the same thing my last two aliases do. I used $readini() and $hget() for the examples. I figured you had $read() covered well enough to begin with.
|
|
|
|
|