What I am trying to do is to stop adding the nickname more than once to the file by looking for the nickname and if it exists, to not write it. If it does to write it. (And no writing to files is not one of my strong points if you haven't already guessed.)
if ($did == 5) {
if ($did(4).text isin test.txt) {
.echo $did(4).text is already listed!
halt
}
else {
.write files\test.txt $did(4).text
}
}
Thanks in advance.
The "isin" statement is to check whether a partial string is inside a full string, i.e. if (a isin abc)..
To check whether a string is in a file you can use $read
for example..
if ($read(files\test.txt,w,$+(*,$did(4).text,*)) { Your Command }
Will return the first result in a search for *STRING* in a file however a better parameter than 'w' to use might be 's' depending on whether you have 1 nickname per line, if so use..
if ($read(files\test.txt,s,$did(4).text) { Your Command }
If 'w' or 's' parameter isnt to your liking you may have to loop the file looking for an exact match in which case..
var %i $lines(C:\test.txt) | var %t 0 | while (%i) { if ($read(C:\test.txt,%i) == $did(4).text) { var %t 1 } | dec %i } | if (%t == 1) { echo ALREADY EXISTS } | else { echo DOESNT EXIST }
Replacing echo ALREADY EXISTS and echo DOESNT EXIST with whatever you may.
For more information /help $read if you require it.
Hope this Helps.
Eamonn.
Hi,
to know if there is an exact string in that file, I wouldn't loop through each line.
Perhaps this alias can be handy:
alias isinfile filter -ff test.txt nul $$1 | return $filtered
Usage: $isinfile(nick)
I'm assuming here that test.txt is a file located in the main mIRC folder, and that each line represents 1 nick.
Greets @Coolkill and The Game
Hi,
I've added some more functionality and error checking to the isinfile alias.
alias isinfile {
if !$isfile($$1) { echo -a Error: File $1 missing. | return }
if $2 == $null { echo -a Error: Matchtext missing. | return }
filter -ff " $+ $1" nul $2-
return $filtered
}
Usage: $isinfile(file,string)
Examples:
$isinfile(test.txt,The_Game)
$isinfile(c:\program files\mirc\text files\test.txt,bleh blah)
$isinfile(test.txt,The_*me and F*OPt*)
The file can be put without a path if it is located in your main mIRC folder. It supports spaces in the path, as you can see. Thanks to the /filter you can also use wildcards in your search string. The matchtext can be multiple text now, instead of 1 word.
So "string" for exact matching, and "*string*", "*str?ng*" etc. for wildcard matching.
Hope you find this useful,
Greets
It is very simpel
type it 10 times
/write -stsoglanos29 test.txt tsoglanos29
just use the -s switch
The -s switch scans a file for the line beginning with the specified text and performs the operation on that line.
Don`t call me baby,...
Just to do it how the game wanted it: write -s $+ $did(4).text test.txt $did(4).text
Ah yes,
I assumed that "-s scans file beginning with string" meant the following:
Suppose you have a text file with:
mirc
mir
mi
m
I assumed if you did $read(test.txt,s,m) that it would return the line beginning with an "m" which would be mirc. However, mirc scans as stated for a "word" which i should literaly translate to a string followed by a space. In this case, if there is only 1 word on each line, then the $read and -s switch are the way to go.
In the case of having multiple words on 1 line, then -s is useless.
Consider:
this is a test
this is a
this is
then $read(test.txt,s,this is) is useless to check if the string "this is" is somewhere in the file as a stand alone string, because it will match on the "this is a test" line.
Anyway, the $isinfile alias is redundant in The_Game's case, though it can prove to be handy in other situations.
Greets
You miss the point
The -s switch scans a file for the line beginning with the (specified text)
now make you test and see
/write -stsoglanos29 test.txt tsoglanos29
/write -stso test.txt tso
/write -stsoglanos293 test.txt tsoglanos293
and you will realise one more nick is just add and not
replaced, I holp u accept this becuse it is a fact ...
There is always one more bug...
Hi,
I did not miss the point lol. Read my post again.
Ah yes,
I assumed that "-s scans file beginning with string" meant the following:
Suppose you have a text file with:
mirc
mir
mi
m
I showed you first what I wrongfully assumed with an example.
I also said:
In this case, if there is only 1 word on each line, then the $read and -s switch are the way to go.
Then I showed you in a second example where -s is useless.
So to summarize so everyone understands:
-s is useful if we are talking about lines starting with single words, not with multiple words. I'm very aware that nicknames do not consist of spaces, however there might be other occasions where there CAN be strings with multiple spaces, and in THOSE cases, -s is useless.
he, the are no spaces in nicknames =) try yourself and post again.
I do not recall myself saying that nicknames consist of spaces.
Seriously, read carefully before writing.
write a nickname to a file.txt nickname if it exists, to not write it again
/write -sSomenick test.txt Somenick
is the simpel way to do this , no need to use if-then-else and filter end of discusion.
Hi,
I'm very aware of that since you've posted it the first time. I've explained to you how I assumed (wrongfully) that -s works differently in case of single words.
I also tried to explain to you, that in a case where there are multiple words on a line (this example has nothing to do with what The_Game requested) that the -s is useless.
Am I getting through here? Hello?
So once again:
1. Yes, indeed, as you stated, and as I have acknowledged, the read -s switch is the right way to go in the case of The_Game's request , because he just wants to scan a string without spaces (nicknames, indeed). Note how I'm saying that the -s switch is the right way here, and it workx, and I wrongfully assumed in my very first post that it didn't work like that.
2. Now the part that doesn't seem to get through to you:
In a case where we are talking about lines in a text file which consist of multiple words (that's right, multiple words, so not nicknames, so not the example by The_Game, so a completely different situation), THEN -s is useless, as I showed you with an example.
Now, to summarize everything once again (just making sure):
In this case where the text is only nicknames, the -s thing is the RIGHT way. (<-- did you see it? Did you read it? Is it getting through?)
In other cases with multiple words, the -s thing is NOT the right way.
Well, enough of this thread for me, if I still don't get through to you, then there is nothing I can do anymore for you. I should not even have bothered to try to explain, but I couldn't help it. In the future, I'll just let things as is, and try not to worry too much about the fact that I'm being misunderstood.
Edit: After reading this whole thread again: Lol, here's where tsoglanos and me got mixed up, because he is talking about /write -s and I wrongfully thought he was talking about $read with s. And vice versa: I was talking about $read with s switch, while he wrongfully thought I was talking about the /write with s switch. Damn, text based communication can be frustrating at times :tongue: (/me grabs a beer)
Mensch meir!
I realy have nothing against you but why are trying to help somone at simpel at posibel
The question is not what dose the -s switch if we have multi lines begins with the same text , but how to store nicknames to a txt Once, it would be not very smarth
to add nicknames twice and more and then trying to filter doubel text out.
First write -stsoglanos29 test.txt tsoglanos29 will never allow
add the same nick twice
also your explain about
multi lines is in this situasion not valid.
anyway even if u use multi lines and the first word is difrent
then -s is still valid
/write -stsoglanos29 test.txt tsoglanos29 this is the 1st
/write -stsoglanos293 test.txt tsoglanos293 this is the 2nd
/write -stso test.txt tso this is the 3rd
It would not be valid like you post if the first word in the line
would ecxist twice and more
/write -stsoglanos29 test.txt tsoglanos29 this is the 1th
/write -stsoglanos29 test.txt tsoglanos29 this is the 2nd
/write -stsoglanos29 test.txt tsoglanos29 this is the 3rd
But this is inposibel in my explain
sory for my bad english
and i realy not tring to atack you Fiberoptic, I only tring to give a quick and efective help easy to Understend even for newbies
I am talking about multiple words on the same line.
Have you still not read my example:
Text file:
this is a test
this is a
this is
You see 3 lines with MULTIPLE words on each line, and the $read(test.txt,s,this is) will match on the FIRST line on the text "this is a test" which we do not want.
How many times am I going to have to tell you, that this issue has NOTHING to do with The_Game's example. Again: this has NOTHING to do with The_Game's example, I am talking about $read in a different situation than The_Game's situation, where it is a /write. Do you get the difference?
The $read is just something I said aside from this thing that The_Game is requesting. Have you not read in my previous post, that I said that it is working the right way that you proposed?
So do you understand now that I'm talking about reading from a file and that the -s switch will be useless, and that i'm NOT talking about writing with the -s switch, where it is working perfectly as you suggested.
Just to clarify, I have nothing against you, I just really get stressed when people are misunderstanding what I'm saying.
Oh well, atleast we kept it civil. Cya on some other thread!
For the last time you post makes no sense how asked ? about -s don`t work if you have 10 times the same line in a txt?
first read the post the game made, and then think about your post and the -s switch....
By using one of the examples and doing a little reading, I did seem to find what I was looking for. By using the below example, I was able to add a nickname to this list. If the nickname was already there, it would echo something that notified you that the nickname existed and would stop. If the nickname didn't exist, it would write it. So far it seems to have worked cause its not adding the same nickname to the file more than once.
if ($did == 5) {
if ($read(files\test.txt,w,$+(*,$did(4).text,*))) {
.echo -a $did(4).text is already listed.
halt
}
else {
.write files\test.txt $did(4).text
.timer 1 1 echo -a $did(4).text was added to the list.
}
}
By the way I just wanted to say thanks for the help thus far. If there's anything else I may be overlooking feel free to point it out.
That's because you are talking about /write -s in this example of The_Game,
and because I am talking about $read with the s flag in an examle NOT of The_Game, but for a general example. An example where a script needs to check if a certain string is in a text file or not.
Well it's very clear to me now, I should have been even more specific that I was talking about $read with -s switch, whilst you were trying to convince me of /write -s, where I know that /write -s works well even with multiple words, its just that $read doesn't work well with it.
Anyway, because this thread is becoming ridiculous (I'm ashamed of it), I've pm'd you so let's keep it private.
Oh well, we got carried away, it happens, no offence intended, cya around.
Ok now I need something to work with the above script I last posted. Something that works for the pm as an example.
on ^1:OPEN:?:*: {
; if statement that allows mIRC to open private message windows only nicknames from test.txt
;
; if user is not on this list, no window will popup at all. and will echo the following to my active window
; .echo -a $+ $nick just tried messaging you $+ : 12 $+ $1-
}
If you haven't guessed, its sort of a private message blocker that im trying to make for my girlfriend. And since I know hardly a thing about read/write commands, it has been quite a pain in my ass
If you can help with this one too, I would appreciate it.
Actuali do the same you did before only replace $did(4).text
with $nick,...
on ^1:OPEN:?:*: { var %m = $read(test.txt,w,$+(*,$nick,*)) | if (%m == $null) { echo -at * $nick just tried messaging you $+ : 12 $+ $1- | halt } }
Hi,
there are many ways to create a pm blocker. Personally I would go with a Hash Table, or perhaps the User List.
However, it's your script so I'll give you a solution that is closest to the way you like it.
Now, your test.txt file consists of lines with on each line 1 nickname, no spaces.
An altered $isinfile alias using $read instead of filter works great for your script, since it's single words, not multiple words on each line. The filter solution is preferable in the case of multiple words on one line.
Example code:
alias isinfile {
if !$isfile($$1) { echo -a Error: File $1 missing. | return }
if $2 == $null { echo -a Error: Matchtext missing. | return }
.echo -q $read($1,s,$2)
return $readn
}
[color:red] [/color]
on ^*:OPEN:?:*:{
if !$isinfile(test.txt,$nick) { echo -a $+ $nick just tried messaging you : 12 $+ $1- | halt }
}
Hope it is to your likings,
Greets
Edit: added the ^ in front of the event thanks to tsoglanos.
hi Fiberoptics =)
first you forgot to add on text the (^) so the halt or haltdef can work
second i it halts all querys even from users/nicks are in test.txt listed.
Dont`t call me baby,..
Hi tsoglanos,
you have not carefully read my script.
1. You are right, i forgot to add it. When you need to use ^ with halt or not isn't really well defined in mIRC. For example in the ON INPUT you don't need it to halt something. Good remark.
2. Right now it only halts the script if a user is not in the script. Because i put if !$isinfile(...
Note the negating !, that means only people who are not in the file will be halted. The halt is within the braces { } that follow the !$isinfile, which means that the halt will only be triggered when the person is not in the file, which is what The_Game wants. He wants only people who are in the file to be able to pm.
3. Your script is BAD, and I'll try to explain to my best why it is. Be sure to do some tests this time before responding, ok?
-->
Ok $read(test.txt,w,$+(*,$nick,*)) will search in the text file looking for *nickname*.
If it doesn't find a match, %m will be $null and that means that person isn't in the text file, and that the pm should be blocked.
So far so good.
Now, suppose in your text file you have:
TheOne
TheBigOne
Gooney
and a person with the nick "One" wants to message. Then your script will search for *one* and it will trigger on TheOne. So %m will be filled with TheOne, and the script will not block the pm. But as you can see this is not the good result, because we want to check if that nickname "One" is in the text file. One isnt in the text file, so he should be blocked, but in your script he is allowed.
4. Well tsoglanos, it seems that you are not as experienced in scripting yet, so please really from now on, try to test the code first, try to read it, try to learn from it, and then, when your postive that somethign is mistaken, let me know. But right now, you're making a fool out of yourself :tongue:
Greets
Well this is not a big deal it was just a typo
Ignore the * *
here again
on ^1:OPEN:?:*: { var %m = $read(test.txt,w,$nick) | if (%m == $null) { echo -at * $nick just tried messaging you $+ : 12 $+ $1- | halt } }
why you think if somone has a question you must make a scripting tutorial.,about my scripting expirience I have enouth so i can give a simpel and worket explain
somthing i mising in your explains =) don`t private anymore i just Ignore you and you post bye!
I'm sure putting $+(*,$nick,*) was a typo. *cough cough*
What you are missing is the ability to properly read and write in the English language.
Not only confusing me, but also confusing yourself when you're trying to interpret other people's posts.
And the reason that I have almost been giving scripting tutorials is because of this confusement. I had to wheigh my every word, because you could interpret it wrong because of your lack in English.
and before you post again of course you can replace w with s
you sould realy change this: In theory, there is no difference between theory and practice. But, in practice, there is
Becuse the code you post is anithing else then what the game asked for,.., put the foul code if you now how so everone can easy test and Understend what you are posting
You cant' replace w with s in this case, because when doing $read(test.txt,s,$nick) the script will read from the text file, and scan for that word ($nick) and it will return what is following that first word on the line.
Example (here I go again giving you a scripting tutorial, because you obviously need one):
In your text file:
tsoglanos
fiberoptics this is the text that will be returned
//echo -a Result: $read(test.txt,s,tsoglanos)
--> Returns: Result:
//echo -a Result: $read(test.txt,s,fiberoptics)
--> Returns: Result: this is the text that will be returned
In other words, your %m will always be empty even if it did find a match in the text file, because in The_Game's text file it is only nicknames, with nothing following it.
Lol,
that code works perfect for what The_Game is requesting, and everybody except you is not understanding it. But I can't blame you really, your too busy confusing yourself.
-General Reply-
I don't think it's necessary to pick at each other's code. It's not a competition. Obviously, the best code, 'cleanest' and so on is preferred but if you have a suggestion to someone who is helping about how they could improve then, in general, it would be better to PM the person. I believe FibreOptics opted to do this and tsoglanos started again.
This "check what you said before you post again" attitude is not necessary and it's rude. I think getting rude with each other is going to start an argument and is not productive to this thread! Picking at forum signatures is even less so and completely unnecessary.
Regards,
this tsoglanos stardet again I realy dont like it if you read all post you will realise i stardet nothing i just posted somthing thes all and Fiberoptics stardet, not me and Mentality you are are moderator in this formum so you now we have in the past fight , but this has nothing to do with my post or this room also act like a moderator and keep you private fight or probleams you have with me out of this formum , we are all intrsting to Help with mIRC becuse we are all mIRCers nothing more.,..
greats.
Ah and Mentality if you are public post you think Fiberoptics
Is the best way why you are not just test fibers code first.,
alias isinfile {
if !$isfile($$1) { echo -a Error: File $1 missing. | return }
if $2 == $null { echo -a Error: Matchtext missing. | return }
.echo -q $read($1,s,$2) return $readn
}
on ^*:OPEN:?:*:{
if !$isinfile(test.txt,$nick) { echo -a $+ $nick just tried messaging you : 12 $+ $1- | halt } }
after you test this code post the results!
I ensure you I am being
completely objective and ensuring this does not go into an argument, and at the same time I will not participate in one with you.
If you have further questions, comments or queries about my post, please private message me. Thank you
Regards,
the best way to do what the game want is a while loop with $read(test.txt,N)
on ^*:OPEN:?:*:{ var %t = 1 | while ($read(test.txt,%t)) { inc %t | if ($read(test.txt,%t) == $nick) { return } | else { echo -a $+ $nick just tried messaging you : 12 $+ $1- | halt } } }
on ^*:open:?:{
if (!$read(test.txt,r,/^ $+ $nick $+ $/i)) { halt }
}
The above is the simplest way i can think of.
Edit: if you want case-sensitive nicks in the test.txt file, remove the
i in /i
he i tring the r before you postedt but this wrong
if you have in test.txt write
tso
tsoglanos
tsoglanos29
and somone with the nick tsog pm you it you will not block him
Yes you will, the ^ and $ make sure of that:
//write -c nicks.txt tso | write nicks.txt tsoglanos | write nicks.txt tsoglanos29 | if (!$read(nicks.txt,r,/^tsog$/i)) { echo -a this will be halted }
Well tidy sory but it your fall
you used wrong the on open
^*:open:?:{
it can only be on :OPEN:?:*:{
and second this is my test.txt
tso
tsoglanos29
tsoglanos293
this is the nick i using tsog
and this is the code
on ^*:open:?:*:{ if (!$read(test.txt,r,/^ $+ $nick $+ $/)) { halt } }
it is the same like ,w,*nick*
when i type with the nick tsog /msg XXX-0758282137692 ela re
it still open a query
I using mIRC 6.15
and now debug you script
add this echo -a $read(test.txt,r,/^ $+ $nick $+ $/))
i using the nick tsog and i get the nick tsoglanos29
you see?
I realy don`t try to make a scripting chalenger with you
I only try to help but there are always some guys the want to prove how good the are
why ?
First of all, the on open event doesn't need *, regardless of what the help file says.
Second, w,*nick* would be ,r,.*nick.*, mine will only match the complete nickname, if you actually type the example i gave you, you will see that it says "this will be halted", and it will be halted.
again debug your script
my nick is tsog
in test.txt
i have
tsoglanos
tsoglanos29
and only becuse tsog is in tsoglanos or tsoglanos29
you script dont halt
here is an expalin how to debug your script, if you are to tiredt to test the script why you are posting?
on ^*:open:?:*:{ echo -a $read(test.txt,r,/^ $+ $nick $+ $/) }
It seems you are the one who isn't testing it, tsog may be in tsoglanos, but the ^ and $ means it will only match tsog, nothing else, it will not match tsoglanos and it will not match tsoglanos29, it will only match tsog, nothing else.
I believe The_Game has been answered. This thread has turned into picking at each other's code and it isn't productive nor necessary as I have already said once.
Use the PM feature for further discussion with each other as I've also said.
Regards,