mIRC Home    About    Download    Register    News    Help

Print Thread
Page 1 of 4 1 2 3 4
#159980 22/09/06 02:21 AM
Joined: Sep 2006
Posts: 31
S
Sukai Offline OP
Ameglian cow
OP Offline
Ameglian cow
S
Joined: Sep 2006
Posts: 31
im not sure if you guys are familiar with zbot (some irc networks have this script(?) in their chanservs

if you dont know what im talking about, basically what it does is

you type this:

!learn definition thedefinitiongoeshere

example:

!learn mIRC the site for mIRC is www.mirc.com

once thats done it saves it (somewhere) so whenever one of your channel's user do

? mIRC

the following happens

<bot> the site for mIRC is www.mirc.com

!learn is the command

mIRC is the keyword

"the site for mIRC is www.mirc.com" is the definition

..ok my question is ..i know its possible to make a script to do this in mIRC (instead of the networks chanserv) is there something like this out there ? (for download) if not, would it be too difficult to script? (i have very little scripting knowledge, i just started)

can someone help me out here? point me to the right direction?

thanks in advance

Last edited by Sukai; 22/09/06 02:24 AM.
#159981 22/09/06 02:53 AM
Joined: Mar 2004
Posts: 210
F
Fjord artisan
Offline
Fjord artisan
F
Joined: Mar 2004
Posts: 210
Quote:
can someone help me out here? point me to the right direction?
There are a few mIRC quote databases you might be able to adapt. (if you use Google, MIRC database and mIRC database aren't the same thing in the returns you get - MIRC is a medical database.)

#159982 22/09/06 03:22 AM
Joined: Sep 2006
Posts: 31
S
Sukai Offline OP
Ameglian cow
OP Offline
Ameglian cow
S
Joined: Sep 2006
Posts: 31
i guess i could try that smirk

dont know if i can do it tho

#159983 22/09/06 03:34 AM
Joined: Jan 2006
Posts: 108
F
Vogon poet
Offline
Vogon poet
F
Joined: Jan 2006
Posts: 108
A bit of googling explains what ZBOT is, Its an info bot module for Anope irc services. So I would search for an info bot script for mIRC. Must be thousands out there somewhere.
Good luck
Fire

#159984 22/09/06 04:24 AM
Joined: Sep 2006
Posts: 31
S
Sukai Offline OP
Ameglian cow
OP Offline
Ameglian cow
S
Joined: Sep 2006
Posts: 31
this is hard smirk

im reading up on mirc's help file ..to see if any variables/comands etc can help me out

#159985 22/09/06 07:25 AM
Joined: Sep 2003
Posts: 261
S
Fjord artisan
Offline
Fjord artisan
S
Joined: Sep 2003
Posts: 261
So in other words, it's an infobot. And yes it's possible, i've made something like that in the past. Virtually anything is possible when it comes to mIRC. smile

Simply message it: this is that, then have it write the information to a file something like
we'll assume $1- is "this entry is that info"
Code:
on *:text:*:#: {
  if ($findtok($1-,is,1,32)) {
    var %text = $1-
    %text = $reptok(%text,is,=&gt;,1,32)
    write learnt.txt %text
    ;write this to a file: this entry =&gt; that info
    ;after it's done writing verify that the data did write to the file and if so have it tell you "ok".
    if ($read(learnt.txt,w,%text)) { msg $chan ok }
    else { msg $chan I pooped my pants }
  }
}

the above method for finding is is a bit old, but it's fast and works.

Trigger it by using an on text event: or if your socketing, which you should be just having it match the first information on the left side of the =>.

Say in your file learnt.txt you have these lines.
this entry => that info
worms => live in dirt

Search the file for a beginning line that matches the string "this entry*".
If found return that line.

Assume you say in the room "this entry".
Code:
on *:text:*:#: {
  var %text = $read(learnt.txt, w,  $1- $+ *)
 ;if "this entry*" is found at the beginning of a line,
  if (%text) {
    var %split=&gt; = $calc($findtok(%text,=&gt;,1,32) +1)
    msg $chan hmm, $gettok(%text,%split=&gt; $+ -,32)
  }
}


Here's how the conversation would go:
<you> this entry
<bot> hmm, that info

Hope this info helps get you started. I didn't test any of this so if it doesn't work right, play with it some.


We don't just write the scripts, we put them to the test! (ScriptBusters)
#159986 22/09/06 01:31 PM
Joined: Sep 2006
Posts: 31
S
Sukai Offline OP
Ameglian cow
OP Offline
Ameglian cow
S
Joined: Sep 2006
Posts: 31
i used your code snippet with a few changes

it records the info just fine

but it doesnt respond back when i type the keyword, using your example

if i type "this entry"

it doesnt reply at all

#159987 22/09/06 01:36 PM
Joined: Oct 2004
Posts: 8,330
Hoopy frood
Offline
Hoopy frood
Joined: Oct 2004
Posts: 8,330
The fastest method would probably be hash tables:

Code:
alias -l CreateHelp {
  hmake Help 100
  if ($isfile(Help.hsh)) { hload Help Help.hsh }
}

on *:start: {
  CreateHelp
}

on *:text:*:#: {
  if ($1 == !learn) {
    if ($hget(Help) == $null) { CreateHelp }
    hadd Help $2-
    hsave Help Help.hsh
  }
  elseif ($1 == $chr(63)) {
    var %data = $hget(Help,test)
    if (%data == $null) { msg $chan No help available on that item. }
    else {
      msg $chan %data
    }
  }
}


Ok, this is not tested, but should work fine. If not, let me know and I'll see what is going on with it. It will be very fast and easy to use. As you asked, here are the uses of it:

!learn keyword description

? keyword

If you want it to respond to !help or something instead of ?, then replace $chr(63) in the script with !help or whatever you're going to use. I used ? since that was what you said the bot used.

Keep in mind that I did this for one-word keywords because that's what you were giving as an example. If you want multiple-word keywords, let me know and I can easily edit it.


Invision Support
#Invision on irc.irchighway.net
#159988 22/09/06 01:49 PM
Joined: Sep 2006
Posts: 31
S
Sukai Offline OP
Ameglian cow
OP Offline
Ameglian cow
S
Joined: Sep 2006
Posts: 31
the !learn keyword definitionhere

isnt working :~(

EDITED: ok nevermind, its making the keyword/definition ..it seems the problem is in the ? keyword portion of the code

i get the "No help available on that item." message everytime

Last edited by Sukai; 22/09/06 02:09 PM.
#159989 22/09/06 03:54 PM
Joined: Sep 2003
Posts: 261
S
Fjord artisan
Offline
Fjord artisan
S
Joined: Sep 2003
Posts: 261
Heh, Riamus2 you are obsessed with hash tables smile. There's only 1 drawback to the hash table item definition thing. the item can only be 1 word. frown

Sukai
When I gave you the examples I separated them, all in all they should be under the same on text event:

Code:
on *:text:*:#: {
  var %text = $read(learnt.txt, w,  $1- $+ *)
  ;if "this entry*" is found at the beginning of a line,
  if (%text) {
    var %split=&gt; = $calc($findtok(%text,=&gt;,1,32) +1)
    msg $chan hmm, $gettok(%text,%split=&gt; $+ -,32)
  }
  if ($findtok($1-,is,1,32)) {
    var %text = $1-
    %text = $reptok(%text,is,=&gt;,1,32)
    write learnt.txt %text
    ;write this to a file: this entry =&gt; that info
    ;after it's done writing verify that the data did write to the file and if so have it tell you "ok".
    if ($read(learnt.txt,w,%text)) { msg $chan ok }
    else { msg $chan I pooped my pants }
  }
}


If 2 of the same events exist inside of a remote script file, the first one is evaluated and the second is ignored.

K I just tested this myself and it works:

[11:03:32] <brandon> this is a test
[11:03:32] <@Scorpwanna> ok
[11:03:47] <brandon> this
[11:03:47] <@Scorpwanna> hmm, a test
[11:04:06] <brandon> this script is awesome
[11:04:06] <@Scorpwanna> ok
[11:04:09] <brandon> this script
[11:04:09] <@Scorpwanna> hmm, awesome


We don't just write the scripts, we put them to the test! (ScriptBusters)
#159990 22/09/06 04:13 PM
Joined: Sep 2003
Posts: 261
S
Fjord artisan
Offline
Fjord artisan
S
Joined: Sep 2003
Posts: 261
Code:
on *:text:*:#: {
  if ($1 == ?) {
    var %text = $2- =&gt;
    %text = $read(learnt.txt, w, %text $+ *)
    ;if "this entry*" is found at the beginning of a line,
    if (%text) {
      var %split=&gt; = $calc($findtok(%text,=&gt;,1,32) +1)
      msg $chan hmm, $gettok(%text,%split=&gt; $+ -,32)
    }
  }
  if ($1 == !learn) {
    if ($findtok($2-,is,1,32)) {
      var %text = $2-
      %text = $reptok(%text,is,=&gt;,1,32)
      write learnt.txt %text
      ;write this to a file: this entry =&gt; that info
      ;after it's done writing verify that the data did write to the file and if so have it tell you "ok".
      if ($read(learnt.txt,w,%text)) { msg $chan ok }
      else { msg $chan I pooped my pants }
    }
  }
}


[11:11:23] <brandon> !learn this bathroom is full
[11:11:23] <@Scorpwanna> ok
[11:11:28] <brandon> ? this bathroom
[11:11:28] <@Scorpwanna> hmm, full
[11:12:14] <brandon> !learn whoa whoa whoa whoa Lois this is not my drinking glass!
[11:12:14] <@Scorpwanna> ok
[11:12:27] <brandon> ? whoa whoa whoa whoa Lois this
[11:12:27] <@Scorpwanna> hmm, not my drinking glass!

Course this is just a sample. It will have flaws, but that's for you to figure out smile.

Last edited by Scorpwanna; 22/09/06 04:24 PM.

We don't just write the scripts, we put them to the test! (ScriptBusters)
#159991 22/09/06 04:22 PM
Joined: Sep 2006
Posts: 31
S
Sukai Offline OP
Ameglian cow
OP Offline
Ameglian cow
S
Joined: Sep 2006
Posts: 31
both versions work great

but instead of having the second event ignored cant it just be appended to the first event ( add a comma then have it follow afterwards) OR show both in two different sentences?

EDITED: i also found out what was wrong with the hash table version of this script

instead of having var %data = $hget(Help,test)

it should of been var %data = $hget(help,$2-)

that worked

Last edited by Sukai; 22/09/06 04:26 PM.
#159992 22/09/06 04:25 PM
Joined: Sep 2003
Posts: 261
S
Fjord artisan
Offline
Fjord artisan
S
Joined: Sep 2003
Posts: 261
Hi, I just edited the post to take out a var infront of a line. So check out what I just changed. Test it for your self. Yes append. I showed you an appended one up a few posts. smile


We don't just write the scripts, we put them to the test! (ScriptBusters)
#159993 22/09/06 04:31 PM
Joined: Sep 2006
Posts: 31
S
Sukai Offline OP
Ameglian cow
OP Offline
Ameglian cow
S
Joined: Sep 2006
Posts: 31
i entered several entries of "cool"

it doesnt show them all or append, only shows the first "cool" entry made

#159994 22/09/06 04:31 PM
Joined: Sep 2003
Posts: 261
S
Fjord artisan
Offline
Fjord artisan
S
Joined: Sep 2003
Posts: 261
Hrm, you've just inspired me to add something like this to a socketbot i have. smile Thanks. Yep, first come first serve. To append data, i'd say you'd need to have it take what's there already, and (if you use mine) addon to the nth line of text. Infobot use to have this "is also" trigger which if said would append the data to the already existing data.

Like:

<nick> cow tipping is fun
<bot> ok
<nick> cow tipping is also a way to be mean to cows
<bot> ok
<nick> cow tipping
<bot> hmm, cow tipping is fun or a way to be mean to cows


We don't just write the scripts, we put them to the test! (ScriptBusters)
#159995 22/09/06 04:38 PM
Joined: Sep 2006
Posts: 31
S
Sukai Offline OP
Ameglian cow
OP Offline
Ameglian cow
S
Joined: Sep 2006
Posts: 31
i see

hrmmz, i have no idea how to approach this to be honest

EDITED: the thing is with the is also trigger

people wont know if the keyword already has a definition so if add a new defintion to that keyword ..they would never notice it unless later on they did a ? keyword

Last edited by Sukai; 22/09/06 04:39 PM.
#159996 22/09/06 05:03 PM
Joined: Sep 2003
Posts: 261
S
Fjord artisan
Offline
Fjord artisan
S
Joined: Sep 2003
Posts: 261
I see, might be best to just have it go right ahead and append, and if it does update itself, have it message back to the channel. "Updated entry for blah." Question is, would you want it to overwrite the data completely, or add it to the data that already exists? I'll work with it smile. Not gunna leave you in the woods by yourself.


We don't just write the scripts, we put them to the test! (ScriptBusters)
#159997 22/09/06 05:12 PM
Joined: Sep 2006
Posts: 31
S
Sukai Offline OP
Ameglian cow
OP Offline
Ameglian cow
S
Joined: Sep 2006
Posts: 31
thank you laugh

to answer your question, why not both? ...something else came to mind, like ...what if we wanted to replace the whole entry itself? !replace keyword definitionhereblahblah

i think that would also be a good feature (im thinking ZBOT for anope irc servers)

if i remember correctly it was in this format

!<command> <keyword> <entrydefintion>

the commands for it was !append (to add something to an already existing entry), !replace (completely replaces the entry), !delete (deletes the entry), !learn (creates an entry), !set (view who edited or created the entry)

that would be awesome but a bit time consuming i would think

anyway thanks for taking the time to help me really appreciate it

#159998 22/09/06 05:26 PM
Joined: Sep 2003
Posts: 261
S
Fjord artisan
Offline
Fjord artisan
S
Joined: Sep 2003
Posts: 261
Sounds like great fun, I'll do it! heh

Edited: Try this out.
Code:
on *:text:*:#: {
  if ($1 == ?) {
    var %text = $2- =&gt;
    %text = $read(learnt.txt, w, %text $+ *)
    ;if "this entry*" is found at the beginning of a line,
    if (%text) {
      var %term = $reptok(%text,=&gt;,is,1,32)
      msg $chan hmm, %term
    }
  }
  if ($1 == !append) {
    var %islocation = $findtok($2-,is,1,32)
    if (%islocation) {
      var %text = $2-
      %text = $reptok(%text,is,=&gt;,1,32)
      var %newentry = $gettok(%text,1- $+ %islocation,32)
      var %findentry = $read(learnt.txt,w,%newentry $+ *)
      var %foundentry = $gettok(%findentry,1- $+ %islocation,32)
      if (%newentry == %foundentry) {
        var %append = $gettok(%text,$calc(%islocation +1) $+ -,32)
        write -l $+ $readn learnt.txt %findentry or %append
        msg $chan Appended data.
      }
    }
  }
  if ($1 == !replace) {
    var %islocation = $findtok($2-,is,1,32)
    if (%islocation) {
      var %text = $2-
      %text = $reptok(%text,is,=&gt;,1,32)
      write -l $+ $readn learnt.txt %text
      msg $chan Replaced entry.
    }
  }
  if ($1 == !learn) {
    var %islocation = $findtok($2-,is,1,32)
    if (%islocation) {
      var %text = $2-
      %text = $reptok(%text,is,=&gt;,1,32)
      var %newentry = $gettok(%text,1- $+ %islocation,32)
      var %findentry = $read(learnt.txt,w,%newentry $+ *)
      var %foundentry = $gettok(%findentry,1- $+ %islocation,32)
      if (%newentry == %foundentry) {
        msg $chan Already have something for that.
      }
      else {
        write learnt.txt %text
        ;write this to a file: this entry =&gt; that info
        ;after it's done writing verify that the data did write to the file and if so have it tell you "ok".
        if ($read(learnt.txt,w,%text)) { msg $chan ok }
        else { msg $chan I pooped my pants }
      }
    }
  }
}

[12:42:53] <Sporc> !learn variable is a percent
[12:42:53] <@Scorpwanna> ok
[12:43:13] <Sporc> !learn variable is yo momma
[12:43:13] <@Scorpwanna> Already have something for that.
[12:43:25] <Sporc> !replace variable is yo momma
[12:43:25] <@Scorpwanna> Replaced entry.
[12:43:50] <Sporc> !append variable is bringing down the house
[12:43:50] <@Scorpwanna> Appended data.
[12:43:57] <Sporc> ? variable
[12:43:57] <@Scorpwanna> hmm, variable is yo momma or bringing down the house

Last edited by Scorpwanna; 22/09/06 05:46 PM.

We don't just write the scripts, we put them to the test! (ScriptBusters)
#159999 22/09/06 05:43 PM
Joined: Sep 2006
Posts: 31
S
Sukai Offline OP
Ameglian cow
OP Offline
Ameglian cow
S
Joined: Sep 2006
Posts: 31
LOL

your too nice laugh

im reading over the /help file in mirc to better understand some of the stuff used in here

#160000 22/09/06 05:47 PM
Joined: Sep 2006
Posts: 31
S
Sukai Offline OP
Ameglian cow
OP Offline
Ameglian cow
S
Joined: Sep 2006
Posts: 31
shocked that seems to work pretty well

#160001 22/09/06 05:48 PM
Joined: Sep 2003
Posts: 261
S
Fjord artisan
Offline
Fjord artisan
S
Joined: Sep 2003
Posts: 261
I was once where you are, and never recieved the help I could of then. So I feel obligated to help you out smile.


We don't just write the scripts, we put them to the test! (ScriptBusters)
#160002 22/09/06 05:52 PM
Joined: Sep 2006
Posts: 31
S
Sukai Offline OP
Ameglian cow
OP Offline
Ameglian cow
S
Joined: Sep 2006
Posts: 31
haha your awesome

and whoever didnt help you sucks :~(

thanks you really helped me out but i wondering if its not too much trouble (so i can better understand what you did here ...i understand some of it) could you explain what each line does some what ?

#160003 22/09/06 06:00 PM
Joined: Sep 2003
Posts: 261
S
Fjord artisan
Offline
Fjord artisan
S
Joined: Sep 2003
Posts: 261
Sure I'll give it a shot in my next post. But right now i'm making the !delete function smile.


We don't just write the scripts, we put them to the test! (ScriptBusters)
#160004 22/09/06 06:06 PM
Joined: Sep 2003
Posts: 261
S
Fjord artisan
Offline
Fjord artisan
S
Joined: Sep 2003
Posts: 261
Code:
on *:text:*:#: {
  if ($1 == ?) {
    var %text = $2- =&gt;
    %text = $read(learnt.txt, w, %text $+ *)
    ;if "this entry*" is found at the beginning of a line,
    if (%text) {
      var %term = $reptok(%text,=&gt;,is,1,32)
      msg $chan hmm, %term
    }
  }
  if ($1 == !append) {
    var %islocation = $findtok($2-,is,1,32)
    if (%islocation) {
      var %text = $2-
      %text = $reptok(%text,is,=&gt;,1,32)
      var %newentry = $gettok(%text,1- $+ %islocation,32)
      var %findentry = $read(learnt.txt,w,%newentry $+ *)
      var %foundentry = $gettok(%findentry,1- $+ %islocation,32)
      if (%newentry == %foundentry) {
        var %append = $gettok(%text,$calc(%islocation +1) $+ -,32)
        write -l $+ $readn learnt.txt %findentry or %append
        msg $chan Appended data.
      }
    }
  }
  if ($1 == !replace) {
    var %islocation = $findtok($2-,is,1,32)
    if (%islocation) {
      var %text = $2-
      %text = $reptok(%text,is,=&gt;,1,32)
      var %newentry = $gettok(%text,1- $+ %islocation,32)
      var %findentry = $read(learnt.txt,w,%newentry $+ *)
      var %foundentry = $gettok(%findentry,1- $+ %islocation,32)
      if (%newentry == %foundentry) {
        var %replace = $gettok(%text,$calc(%islocation +1) $+ -,32)
        write -l $+ $readn learnt.txt %newentry %replace
        msg $chan Replaced entry.
      }
    }
  }
  if ($1 == !learn) {
    var %islocation = $findtok($2-,is,1,32)
    if (%islocation) {
      var %text = $2-
      %text = $reptok(%text,is,=&gt;,1,32)
      var %newentry = $gettok(%text,1- $+ %islocation,32)
      var %findentry = $read(learnt.txt,w,%newentry $+ *)
      var %foundentry = $gettok(%findentry,1- $+ %islocation,32)
      if (%newentry == %foundentry) {
        msg $chan Already have something for that.
      }
      else {
        write learnt.txt %text
        ;write this to a file: this entry =&gt; that info
        ;after it's done writing verify that the data did write to the file and if so have it tell you "ok".
        if ($read(learnt.txt,w,%text)) { msg $chan ok }
        else { msg $chan I pooped my pants }
      }
    }
  }
  if ($1 == !delete) {
    var %text = $2- =&gt;
    %text = $read(learnt.txt, w, %text $+ *)
    if (%text) {
      write -dl $+ $readn learnt.txt
      msg $chan Deleted entry.
    }
    else { msg $chan Info does not exist to delete }
  }
}

[13:04:12] <Sporc> !delete variable
[13:04:12] <@Scorpwanna> Deleted entry.
[13:04:19] <Sporc> !delete variable
[13:04:19] <@Scorpwanna> Info does not exist to delete


We don't just write the scripts, we put them to the test! (ScriptBusters)
#160005 22/09/06 06:07 PM
Joined: Sep 2003
Posts: 261
S
Fjord artisan
Offline
Fjord artisan
S
Joined: Sep 2003
Posts: 261
Ok, this may take me a while so I'm going to go ahead and post this here edit the post to then describe what each line does:

on *:text:*:#: {
on "anylevel" "text" "anytext" "anychannel"

if ($1 == ?) {
if the first word is a question mark

var %text = $2- =>
create the temporary variable %text which equals the second word to the end and add to it a =>

%text = $read(learnt.txt, w, %text $+ *)
reads learnt.txt for a line beginning with %text (plus our =>) and anything after it. using a => makes sure it finds the right line info because only 1 line will be exactly what it's looking for.

;if "this entry*" is found at the beginning of a line,
if (%text) {
if %text exists/is found/is not empty but is actually something

var %term = $reptok(%text,=>,is,1,32)
create the temporary variable %term and replace the first => found with the word "is". Since we added it to make sure it searched and found exactly what we wanted, we don't need it anymore so we change it back to "is". The tokens as they are called in this example separated by the character 32 (which is a space) so every word is a token because it's separated by a space

msg $chan hmm, %term
message to the active channel hmm, %term information it found
}
}
if ($1 == !append) {
if the first word is !append

var %islocation = $findtok($2-,is,1,32)
create temporary variable %islocation to find where "is" is we use $findtok to search the "second word to the end" for the word "is" only looking for the "first" one and separate the information using character 32/a space
When found returns it's position in the text.

if (%islocation) {
if %islocation is found, not empty etc...

var %text = $2-
create temporary varilable %text from the second word until the end of the sentance

%text = $reptok(%text,is,=>,1,32)
we update the %text variable into: replace "in the text" the first "is" with "=>" separating the text by a space character 32
that way we transform the %text with is, into the %text with =>

var %newentry = $gettok(%text,1- $+ %islocation,32)
create temporary variable %newentry, get the tokens (words in this case) in %text, from first word until where %islocation/"is" was found. Returns the text entry only until where is was found. "the information =>" (remembering we replaced is with => instead of "the information => found"

var %findentry = $read(learnt.txt,w,%newentry $+ *)
create temporary variable %findentry which reads learnt.txt searching for a line beginning with the data %newentry returns
So it searches for a line beginning with "the information =>" and returns "the information => found"

var %foundentry = $gettok(%findentry,1- $+ %islocation,32)
create temporary variable %foundentry get the tokens (words in this case) from the first word until where %islocation/"is" was found. Returns the text entry only until where is was found. "the information =>".

You may be saying that this looks familiar to %newentry, only difference is, one is reading text from the text you supply, one is reading from a file.

if (%newentry == %foundentry) {
if %newentry is equal to %foundentry (if "the information =>" is equal to "the information =>" use the functions within the { }'s

var %append = $gettok(%text,$calc(%islocation +1) $+ -,32)
create temporary variable %append, get the tokens (words in this case) starting from %islocation plus 1 (making it skip showing the => in the results all the way to the end of the new information. Separated by a space/character 32. so instead of returning "=> the new info" it returns "the new info"

write -l $+ $readn learnt.txt %findentry or %append
write "on line $readn" (the line read in a text file during this operation) to the file "learnt.txt" "%findentry" (which returned "the information => found") and add to the end of it "or %append" (which returned "the new info")
the updated line written is "the information => found or the new info"

msg $chan Appended data.
messages the active channel "Appended data."

}
}
}
if ($1 == !replace) {
if the first word is !replace

var %islocation = $findtok($2-,is,1,32)
again we search for the first is location in the text starting from the second word until the end

if (%islocation) {
if %islocation is found, not empty etc...

var %text = $2-
create temporary varilable %text from the second word until the end of the sentance

%text = $reptok(%text,is,=>,1,32)
we update the %text variable into: replace "in the text" the first "is" with "=>" separating the text by a space character 32
that way we transform the %text with is, into the %text with =>. Which returns "the information => the new info"

var %newentry = $gettok(%text,1- $+ %islocation,32)
var %findentry = $read(learnt.txt,w,%newentry $+ *)
var %foundentry = $gettok(%findentry,1- $+ %islocation,32)
if (%newentry == %foundentry) {
var %replace = $gettok(%text,$calc(%islocation +1) $+ -,32)
does the same as the above does for append but!

write -l $+ $readn learnt.txt %newentry %replace
instead of appending, it overwrites the entire line with the new data, without saving the old with it.

msg $chan Replaced entry.
messages the active channel Replaced entry.

}
}
}
if ($1 == !learn) {
if the first word is !learn

var %islocation = $findtok($2-,is,1,32)
again find the location of is

if (%islocation) {
yada yada yada

var %text = $2-
create temp variable %text using the second word until the end

%text = $reptok(%text,is,=>,1,32)
var %newentry = $gettok(%text,1- $+ %islocation,32)
var %findentry = $read(learnt.txt,w,%newentry $+ *)
var %foundentry = $gettok(%findentry,1- $+ %islocation,32)
if (%newentry == %foundentry) {
same as above but! if it's found it tells you it already exists rather than doing anything about it.

msg $chan Already have something for that.
messages active channel "Already have something for that.
}
else {
if the %newentry isn't %foundentry or default to using this

write learnt.txt %text
write to a new line in learnt.txt "the information => the info"

;write this to a file: this entry => that info
;after it's done writing verify that the data did write to the file and if so have it tell you "ok".
remark lines in mirc

if ($read(learnt.txt,w,%text)) { msg $chan ok }
reads learnt.txt for a line matching "the information => the info" if it exists and matches, messages active channel ok, verifying that it learned the information

else { msg $chan I pooped my pants }
if it failed to write the information successfully it messages the active channel that it pooped it's pants smile
}
}
}
if ($1 == !delete) {
if the first word is !delete

var %text = $2- =>
create the temporary variable %text which equals the second word to the end and add to it a =>

%text = $read(learnt.txt, w, %text $+ *)
update the variable %text with the information found from reading learnt.txt for a line beginning with "the information =>"

if (%text) {
if found/exists/is not empty...

write -dl $+ $readn learnt.txt
use write to delete the line read during the $read operation, removing the entry from the learnt.txt file.

msg $chan Deleted entry.
message active channel "Deleted entry.

}
else { msg $chan Info does not exist to delete }
if not found/edists/or is empty(nothing returned) message the active channel "Info does not exists to delete"
}
}


Hope that helps you understand more about mirc smile.

Last edited by Scorpwanna; 22/09/06 07:01 PM.

We don't just write the scripts, we put them to the test! (ScriptBusters)
#160006 22/09/06 06:12 PM
Joined: Sep 2006
Posts: 31
S
Sukai Offline OP
Ameglian cow
OP Offline
Ameglian cow
S
Joined: Sep 2006
Posts: 31
thanks alot

REALLY appreciate it

#160007 22/09/06 07:01 PM
Joined: Sep 2003
Posts: 261
S
Fjord artisan
Offline
Fjord artisan
S
Joined: Sep 2003
Posts: 261
You're welcome. smile


We don't just write the scripts, we put them to the test! (ScriptBusters)
#160008 22/09/06 07:37 PM
Joined: Sep 2006
Posts: 31
S
Sukai Offline OP
Ameglian cow
OP Offline
Ameglian cow
S
Joined: Sep 2006
Posts: 31
man you should teach web programming at college or something LOL

i thought of another idea to go along with this script

would it be possible to add a

!last 100

command or something? (to list the most recent 100 keywords added for easy reference)

and a !listall ? (to list all keyword entries)

Last edited by Sukai; 22/09/06 07:48 PM.
#160009 22/09/06 08:03 PM
Joined: Sep 2003
Posts: 261
S
Fjord artisan
Offline
Fjord artisan
S
Joined: Sep 2003
Posts: 261
Yes that could be possible. However, I can't work on it much more today, maybe later though. But, I'll give it a shot smile.
hrm a ("!last" 100), perhaps it would be good to use a hash table for this, or a separate file just for that info. "!listall ?" can be achieved by just having it return every line of text from the file before the separateor =>. Possibly using a whileloop, but depending on how much data there is, it would take a while to get the data ready. I'll look into it later this evening smile.

Nah I never could teach at a college. I had a good teacher when I first started learning mIRC. Once I got use to how it's coding worked it sort of caught on over the years. It gets easier once you've started projects. Best way to learn, is to get an idea of something to make happen, and go for it.


We don't just write the scripts, we put them to the test! (ScriptBusters)
#160010 22/09/06 08:32 PM
Joined: Sep 2006
Posts: 31
S
Sukai Offline OP
Ameglian cow
OP Offline
Ameglian cow
S
Joined: Sep 2006
Posts: 31
i say you can :P

thanks for all your help mannn i ll look into adding new stuff to this script (or at least try to x.x)

practice makes perfect right ? haha

cya later this evening then! thanks again

#160011 22/09/06 08:56 PM
Joined: Sep 2003
Posts: 261
S
Fjord artisan
Offline
Fjord artisan
S
Joined: Sep 2003
Posts: 261
I dunno if this is what you mean by a !listall command. But I like it.

Code:
  if ($1 == !listall) {
    if ($2 == stop) { play stop }
    else { play $chan learnt.txt }
  }


Will have the bot read back the learnt.txt file to the channel
typing !listall stop

stops it.


We don't just write the scripts, we put them to the test! (ScriptBusters)
#160012 22/09/06 09:10 PM
Joined: Sep 2006
Posts: 31
S
Sukai Offline OP
Ameglian cow
OP Offline
Ameglian cow
S
Joined: Sep 2006
Posts: 31
something like that

i was thinking making it show only the keyword (not the definition) in this format

example:

<bot> entry1, entry2, blah, it goes on, number2, chickens, entry1, entry2, blah, it goes on, number2, chickens, entry1, entry2, blah, it goes on, number2, chickens, entry1, entry2, blah, it goes on, number2, chickens, entry1, entry2, blah, it goes on, number2, chickens,

#160013 22/09/06 09:14 PM
Joined: Sep 2003
Posts: 261
S
Fjord artisan
Offline
Fjord artisan
S
Joined: Sep 2003
Posts: 261
Ahh, ok. So we wouldn't need the play option, play plays back a files contents to the chat. I had made this just now:
Code:
  if ($1 == !last) {
    var %last = $2
    if (%last isnum) {
      var %lines = $lines(learnt.txt)
      var %startat $calc(%lines - %last +1)
      play -f $+ %startat $chan learnt.txt
    }
    else { msg $chan no number specified }
  }


But I see where you're going with this.


We don't just write the scripts, we put them to the test! (ScriptBusters)
#160014 22/09/06 09:26 PM
Joined: Sep 2006
Posts: 31
S
Sukai Offline OP
Ameglian cow
OP Offline
Ameglian cow
S
Joined: Sep 2006
Posts: 31
that works better

but is there anyway to make it show only the keyword? in the format i showed in the previous post

#160015 22/09/06 09:31 PM
Joined: Sep 2003
Posts: 261
S
Fjord artisan
Offline
Fjord artisan
S
Joined: Sep 2003
Posts: 261
Code:
  if ($1 == !listall) {
    var %i = 1
    var %lines = $lines(learnt.txt)
    var %result
    while (%i &lt;= %lines) {
      var %line = $read(learnt.txt,%i)
      var %islocation = $findtok(%line,=&gt;,1,32)
      var %keyword = $gettok(%line,1- $+ $calc(%islocation -1),32)
      if (%result) { %result = %result $+ , %keyword }
      else { %result = %keyword }
      inc %i
    }
    msg $chan %result
  }


Explained:
if ($1 == !listall) {
if first word equals !listall

var %i = 1
create temporary variable %i equaling 1 (needed for the loop below)

var %lines = $lines(learnt.txt)
create temporary variable %lines which returns the total lines in the learnt.txt file
for this sample lets say %lines equals 12

var %result
create temporary variable %result for use later on

while (%i <= %lines) {
whileloop if %i (1) is less than or equal to %lines (12)

var %line = $read(learnt.txt,%i)
create temporary variable %line having it read learnt.txt line %i (1) to start

var %islocation = $findtok(%line,=>,1,32)
create temporary variable %islocation to get the location of =>

var %keyword = $gettok(%line,1- $+ $calc(%islocation -1),32)
create temporary variable %keyword to return just the keyword of the %line + %islocation results. Returns "word" and not "word =>"

if (%result) { %result = %result $+ , %keyword }
if %result is true/is something/not empty/etc... update the variable with the information it already has plus the new %keyword

else { %result = %keyword }
else if %result is false/is nothing update %result with %keyword

inc %i
increase the variable %i plus 1, %i was 1 now it's 2
the loop then goes back to the start and performs the same routine replacing %i = 1 with %i = 2

}
msg $chan %result
when the loop is completed message active channel the results
}

results will show as follows:
<nick> this entry, apple, grey matter, red, spoon, PIM, word, words, ammo, pistol

now to create the !last num thing


We don't just write the scripts, we put them to the test! (ScriptBusters)
#160016 22/09/06 09:40 PM
Joined: Sep 2003
Posts: 261
S
Fjord artisan
Offline
Fjord artisan
S
Joined: Sep 2003
Posts: 261
Code:
  if ($1 == !last) {
    var %last = $2
    if (%last isnum) {
      var %lines = $lines(learnt.txt)
      var %i = $calc(%lines - %last +1)
      var %result
      while (%i &lt;= %lines) {
        var %line = $read(learnt.txt,%i)
        var %islocation = $findtok(%line,=&gt;,1,32)
        var %keyword = $gettok(%line,1- $+ $calc(%islocation -1),32)
        if (%result) { %result = %result $+ , %keyword }
        else { %result = %keyword }
        inc %i
      }
      msg $chan Results: %result
    }
    else { msg $chan no number specified }
  }


The above will seem familiar to the !listall except all it does is start on a particular line smile.

I'll explain some:
var %last = $2
create a temporary variable for %last which is a number you provide after "!last"

var %i = $calc(%lines - %last +1)
create a temporary variable taking the total %lines minus the %last (the number you provide this gets us the remaining lines) and add 1 to it. Adding one shifts it down 1 line, to start on the line we want to begin at.


We don't just write the scripts, we put them to the test! (ScriptBusters)
#160017 22/09/06 09:46 PM
Joined: Sep 2006
Posts: 31
S
Sukai Offline OP
Ameglian cow
OP Offline
Ameglian cow
S
Joined: Sep 2006
Posts: 31
haha looks great so far, awesome

i think i just ran out of ideas o_o;;

#160018 22/09/06 09:58 PM
Joined: Sep 2003
Posts: 261
S
Fjord artisan
Offline
Fjord artisan
S
Joined: Sep 2003
Posts: 261
Well, that should be enough to get you started. Just review over it, and try things out yourself. Bug check it etc... Never hold back asking a question on here, there's always an answer smile.


We don't just write the scripts, we put them to the test! (ScriptBusters)
#160019 22/09/06 10:06 PM
Joined: Sep 2006
Posts: 31
S
Sukai Offline OP
Ameglian cow
OP Offline
Ameglian cow
S
Joined: Sep 2006
Posts: 31
thanks Scorpwanna i ll keep you updated if i make any changes, oh and let me know how your socketbot turns out

for now i go

bye and thanks again

Last edited by Sukai; 22/09/06 10:06 PM.
#160020 22/09/06 10:54 PM
Joined: Oct 2004
Posts: 8,330
Hoopy frood
Offline
Hoopy frood
Joined: Oct 2004
Posts: 8,330
Scorpwanna, hash tables are very easy to use with multiple words if needed. As I stated in my original post, I could easily add that if he wanted it added. They are definitely faster than reading the data and the script can be much smaller.

Sukai:
Ok, you're right that I forgot about the test I was doing and didn't change it. Here's the update including the other information you asked for. If you need anything else added, just let me know.

Code:
alias -l CreateHelp {
  hmake Help 100
  if ($isfile(Help.hsh)) { hload Help Help.hsh }
}

on *:start: {
  CreateHelp
}

on *:text:*:#: {
  if ($1 != !learn &amp;&amp; $1 != !replace &amp;&amp; $1 != !append &amp;&amp; $1 != !delete &amp;&amp; $1 != $chr(63)) { return }
  if (!$2) { msg $chan Please include a keyword with the command | return }
  if ($hget(Help) == $null) { CreateHelp }
  if ($1 == !learn) {
    if ($hget(Help,$2)) { msg $chan That keyword is already used.  Please choose another, or use !replace or !append. | return }
    msg $chan Learned $3-
    hadd Help $2-
  }
  elseif ($1 == $chr(63)) {
    var %data = $hget(Help,$2-)
    if (%data == $null) { msg $chan No help available on that item. }
    else {
      msg $chan %data
    }
  }
  elseif ($1 == !replace) {
    if ($hget(Help,$2)) {
      msg $chan Replaced $hget(Help,$2).data with $2-
      hadd Help $2-
    }
    else msg $chan No such keyword ( $+ $2 $+ ).
  }
  elseif ($1 == !append) {
    if ($hget(Help,$2)) {
      msg $chan Appended $3- to $hget(Help,$2).data
      hadd Help $2 $hget(Help,$2) $3-
    }
    else msg $chan No such keyword ( $+ $2 $+ ).
  }
  elseif ($1 == !delete) {
    if ($hget(Help,$2)) {
      msg $chan Deleted $2 -- $hget(Help,$2).data
      hdel Help $2
    }
    else msg $chan No such keyword ( $+ $2 $+ ).
  }
  hsave Help Help.hsh
}



USE:
!learn keyword description
!replace keyword new_description
!append keyword new_part_of_description
!delete keyword
? keyword

I didn't include !set as I'd have to redo a little of the hash table's data on the script. If you really want it, I can add it easily enough.

Scorpwanna did have a good idea of listing the keywords, though if there are too many of them, this can be a problem. If you want that feature, it is also really easy to add with a hash table.

Note that I would also recommend making these commands only available to certain people. Otherwise, some malicious person could come through and either add all kinds of fake stuff or delete everything you have.

And, feel free to edit or remove the msg lines that tell the channel what happened if you don't like them. And adding color would probably look good as well.


Invision Support
#Invision on irc.irchighway.net
#160021 22/09/06 11:22 PM
Joined: Sep 2003
Posts: 261
S
Fjord artisan
Offline
Fjord artisan
S
Joined: Sep 2003
Posts: 261
Quote:
Scorpwanna, hash tables are very easy to use with multiple words if needed.

Ahh, multiple words for item? Cool could you show me how that's done? I've always wanted to use hash tables but never could get it right. Yeah, hash from what i've seen is faster. Storing the information in memory is always a plus for speed. smile They should be aware that if using hash, they might need to save the hash to a file every so often incase mIRC or their computer crashes/gets shut off.
Yeah the listing, was what they wanted, that would really be a huge list over time, causing problems later on. I wouldn't use it myself, but hey it's what they wanted smile.

As far as hash tables I always had a problem with:

hadd "switch" item data

Item would always have to be 1 word. I tryed using quotes around the item area and everything and never was able to do it. I had always thought maybe the only way was to replace the spaces with . or _'s frown

How do I make it multiple? smile hadd "switch" "item with multiple words" "data"


We don't just write the scripts, we put them to the test! (ScriptBusters)
#160022 23/09/06 12:13 AM
Joined: Sep 2006
Posts: 31
S
Sukai Offline OP
Ameglian cow
OP Offline
Ameglian cow
S
Joined: Sep 2006
Posts: 31
LOL oiiii

now i dont know which one to use

both got its pros

x___x im so confused

#160023 23/09/06 12:35 AM
Joined: Oct 2004
Posts: 8,330
Hoopy frood
Offline
Hoopy frood
Joined: Oct 2004
Posts: 8,330
Scorpwanna,
Yes, you need to replace $chr(32) (spaces) with another character that you're not planning on using... usually you'd pick a character like -- $chr(222) -- as you're unlikely to ever use that in your commands. You can use _ or . if you like, but it could be an issue if you want to use those in your keywords.

It may seem like replacing isn't ideal, but it's really easy and works without a problem and the user doesn't need to do anything special if you automatically use $replace rather than make them do it when using the command.

One thing to keep in mind however you do it... if you want to use more than one word, then you really need to have some kind of character that designates what is the keyword and what isn't when using the commands...

!learn this is the keyword this is the description

That won't work because there isn't any way to know what is the keyword and what is the description.

!learn this is the keyword = this is the description

That would work because you have something to denote what the keyword is. But you have to use a character that will never be in the keyword, so again, it's good to choose something like to prevent that problem.

============

Sukai,
What would you like to include besides what I've already done? Do you want multiple words? You can do them already by using _'s or something else instead of spaces, or I can add it so you can do it with spaces. Just remember that you need a character in your commands between the keyword and the description (see above).

Do you want to list the keywords? Do you want the !set command? Is there anything else?

The nice thing with hash tables, besides speed, is that they are very easy to modify how they work.


Invision Support
#Invision on irc.irchighway.net
#160024 23/09/06 01:05 AM
Joined: Sep 2003
Posts: 261
S
Fjord artisan
Offline
Fjord artisan
S
Joined: Sep 2003
Posts: 261
Ahh yeah, I figured replacing would be needed. Hrm, I think a good char would be 160 the invisible space. Only accessible using alt+0160 or $chr(160) and I don't know many users that would use that. Thanks Riamus2


We don't just write the scripts, we put them to the test! (ScriptBusters)
#160025 23/09/06 01:10 AM
Joined: Sep 2006
Posts: 31
S
Sukai Offline OP
Ameglian cow
OP Offline
Ameglian cow
S
Joined: Sep 2006
Posts: 31
maybe something that tells you who was the last person who altered or created the specific keyword?

?whoset mirc
<bot>mirc was set by Sukai

or something

its not really necessary but it would be a cool feature to have

#160026 23/09/06 01:44 AM
Joined: Oct 2004
Posts: 8,330
Hoopy frood
Offline
Hoopy frood
Joined: Oct 2004
Posts: 8,330
Ok, here's an update to allow inclusion of who changed the keyword last. I'm going to use !whoset instead of ?whoset to keep it matching the rest of the commands. You can always change it if you want to.

Keep in mind that this will require you to clear your current hash file and start fresh if you've already used this script because it is now storing the nicks. To do so, you'll want to type:

/hfree Help
/remove Help.hsh

Then, you can use the updated script.

Code:
alias -l CreateHelp {
  hmake Help 100
  if ($isfile(Help.hsh)) { hload Help Help.hsh }
}

on *:start: {
  CreateHelp
}

on *:text:*:#: {
  if ($1 != !learn &amp;&amp; $1 != !replace &amp;&amp; $1 != !append &amp;&amp; $1 != !delete &amp;&amp; $1 != !whoset &amp;&amp; $1 != $chr(63)) { return }
  if (!$2) { msg $chan Please include a keyword with the command | return }
  if ($hget(Help) == $null) { CreateHelp }
  if ($1 == !learn) {
    if ($hget(Help,$2)) { msg $chan That keyword is already used.  Please choose another, or use !replace or !append. | return }
    msg $chan Learned $3-
    hadd Help $2 $nick $3-
  }
  elseif ($1 == $chr(63)) {
    var %data = $gettok($hget(Help,$2),2-,32)
    if (%data == $null) { msg $chan No help available on that item. }
    else {
      msg $chan %data
    }
  }
  elseif ($1 == !replace) {
    if ($hget(Help,$2)) {
      msg $chan Replaced $gettok($hget(Help,$2),2-,32) with $2-
      hadd Help $2 $nick $3-
    }
    else msg $chan No such keyword ( $+ $2 $+ ).
  }
  elseif ($1 == !append) {
    if ($hget(Help,$2)) {
      msg $chan Appended $3- to $hget(Help,$2)
      hadd Help $2 $nick $gettok($hget(Help,$2),2-,32) $3-
    }
    else msg $chan No such keyword ( $+ $2 $+ ).
  }
  elseif ($1 == !delete) {
    if ($hget(Help,$2)) {
      msg $chan Deleted $2 -- $gettok($hget(Help,$2),2-,32)
      hdel Help $2
    }
    else msg $chan No such keyword ( $+ $2 $+ ).
  }
  elseif ($1 == !whoset) {
    if ($hget(Help,$2)) {
      msg $chan $gettok($hget(Help,$2),1,32) was the last person to update $2 $+ .
    }
    else msg $chan No such keyword ( $+ $2 $+ ).
  }
  hsave Help Help.hsh
}


USE:
!learn keyword description
!replace keyword new_description
!append keyword new_part_of_description
!delete keyword
!whoset keyword
? keyword

Need anything else that I listed?

And I still would recommend limiting this to specific users. If you want to do that, let me know. The easiest way would be to add them to your user list and then set the on text to only trigger for that user level. Then we'd just pull the viewing trigger out of that on text and put it on its own. It's up to you.

*EDIT* Updated after realizing I forgot to change some things after adding !whoset support.

Last edited by Riamus2; 23/09/06 02:15 AM.

Invision Support
#Invision on irc.irchighway.net
#160027 23/09/06 01:47 AM
Joined: Oct 2004
Posts: 8,330
Hoopy frood
Offline
Hoopy frood
Joined: Oct 2004
Posts: 8,330
Oh, Scorpwanna, I am saving the hash file anytime it's updated... originally, it was saved inside the command's IF section and now it's saved at the very end to cut down on the number of lines. I always make sure to have hash files saved. laugh

And, I agree that $chr(160) is a really good character for replacing spaces with hash tables.


Invision Support
#Invision on irc.irchighway.net
#160028 23/09/06 02:07 AM
Joined: Sep 2006
Posts: 31
S
Sukai Offline OP
Ameglian cow
OP Offline
Ameglian cow
S
Joined: Sep 2006
Posts: 31
Quote:

And I still would recommend limiting this to specific users. If you want to do that, let me know. The easiest way would be to add them to your user list and then set the on text to only trigger for that user level. Then we'd just pull the viewing trigger out of that on text and put it on its own. It's up to you.


i dont think its necessary

the channel is private only a few of us in there lol, but the scripts looks awesome

i really dont know what else can be improved to be honest

#160029 23/09/06 02:12 AM
Joined: Oct 2004
Posts: 8,330
Hoopy frood
Offline
Hoopy frood
Joined: Oct 2004
Posts: 8,330
Ok, well let me know if you want something added or changed. Like I said, most hash table stuff is easy to modify when you know how to use them. Learning them can be confusing at first, but they are very powerful when you know them. laugh

BTW, I updated it above... I forgot to change some things after adding !whoset support. If you tried the above code, you'd have noticed the nick appearing where it shouldn't. That's fixed now.


Invision Support
#Invision on irc.irchighway.net
#160030 23/09/06 02:34 AM
Joined: Sep 2006
Posts: 31
S
Sukai Offline OP
Ameglian cow
OP Offline
Ameglian cow
S
Joined: Sep 2006
Posts: 31
AAHH sorry man but i just thought of one thing

the !listall and !last feature scorpwanna had

!listall ( lists every key word in this fashion <bot> entry1, entry2, entry3, etc it does not include the definitions only the keyword )

and !last N

replace N with 10 or 20 or 100 whatever, it ll list the (example) 10 most recently added keywords

hope thatd not to difficult to alter frown

#160031 23/09/06 02:52 AM
Joined: Oct 2004
Posts: 8,330
Hoopy frood
Offline
Hoopy frood
Joined: Oct 2004
Posts: 8,330
Code:
alias -l CreateHelp {
  hmake Help 100
  if ($isfile(Help.hsh)) { hload Help Help.hsh }
}

on *:start: {
  CreateHelp
}

on *:text:*:#: {
  if ($1 != !learn &amp;&amp; $1 != !replace &amp;&amp; $1 != !append &amp;&amp; $1 != !delete &amp;&amp; $1 != !whoset &amp;&amp; $1 != !listall &amp;&amp; $1 != !last &amp;&amp; $1 != $chr(63)) { return }
  if ($hget(Help) == $null) { CreateHelp }
  if ($1 == !listall) {
    var %list.cnt = 1
    var %line.cnt = 1
    while (%list.cnt &lt;= $hget(Help,0).item) {
      if ($len(%list [ $+ [ %line.cnt ] ]) &gt; 300) { inc %line.cnt }
      var %list. $+ %line.cnt = %list [ $+ [ %line.cnt ] ] $+ , $+ $hget(Help,%list.cnt).item
      inc %list.cnt
    }
    var %list.cnt = 1
    while (%list.cnt &lt;= %line.cnt) {
      msg $chan $right(%list [ $+ [ %line.cnt ] ],-1)
    }
    return
  }
  if (!$2) { msg $chan Please include a keyword with the command | return }
  if ($1 == !learn) {
    if ($hget(Help,$2)) { msg $chan That keyword is already used.  Please choose another, or use !replace or !append. | return }
    msg $chan Learned $3-
    hadd Help $2 $nick $3-
  }
  elseif ($1 == $chr(63)) {
    var %data = $gettok($hget(Help,$2),2-,32)
    if (%data == $null) { msg $chan No help available on that item. }
    else {
      msg $chan %data
    }
  }
  elseif ($1 == !replace) {
    if ($hget(Help,$2)) {
      msg $chan Replaced $gettok($hget(Help,$2),2-,32) with $2-
      hadd Help $2 $nick $3-
    }
    else msg $chan No such keyword ( $+ $2 $+ ).
  }
  elseif ($1 == !append) {
    if ($hget(Help,$2)) {
      msg $chan Appended $3- to $hget(Help,$2)
      hadd Help $2 $nick $gettok($hget(Help,$2),2-,32) $3-
    }
    else msg $chan No such keyword ( $+ $2 $+ ).
  }
  elseif ($1 == !delete) {
    if ($hget(Help,$2)) {
      msg $chan Deleted $2 -- $gettok($hget(Help,$2),2-,32)
      hdel Help $2
    }
    else msg $chan No such keyword ( $+ $2 $+ ).
  }
  elseif ($1 == !whoset) {
    if ($hget(Help,$2)) {
      msg $chan $gettok($hget(Help,$2),1,32) was the last person to update $2 $+ .
    }
    else msg $chan No such keyword ( $+ $2 $+ ).
  }
  elseif ($1 == !last) {
    if ($2 !isnum) { msg $chan You need to enter a number with that command. | return }
    var %list.cnt = $calc($hget(Help,0).item - $2)
    if (%list.cnt &lt; 1) { var %list.cnt = 1 }
    var %line.cnt = 1
    while (%list.cnt &lt;= $hget(Help,0).item) {
      if ($len(%list [ $+ [ %line.cnt ] ]) &gt; 300) { inc %line.cnt }
      var %list. $+ %line.cnt = %list [ $+ [ %line.cnt ] ] $+ , $+ $hget(Help,%list.cnt).item
      inc %list.cnt
    }
    var %list.cnt = 1
    while (%list.cnt &lt;= %line.cnt) {
      msg $chan $right(%list [ $+ [ %line.cnt ] ],-1)
      inc %list.cnt
    }
  }
  hsave Help Help.hsh
}


USE:
!learn keyword description
!replace keyword new_description
!append keyword new_part_of_description
!delete keyword
!whoset keyword
!listall
!last number
? keyword


Ok, I didn't test this, but it should work. If not, let me know. You may want to adjust the 300's for each of those commands to something higher or lower. That's the *approximate* number of characters you want per line when listing all of your commands. What will happen is that it will display about that many characters' worth of keywords, then go to the next line and keep doing more lines until it reaches the end of the keywords. Keep in mind that if you have enough keywords to send more than 5 or so lines, you'll get flooded off. This is done so you don't try displaying more characters than the network allows on a single line and also prevents you from making the variable length too long.


Invision Support
#Invision on irc.irchighway.net
#160032 23/09/06 03:56 AM
Joined: Sep 2006
Posts: 31
S
Sukai Offline OP
Ameglian cow
OP Offline
Ameglian cow
S
Joined: Sep 2006
Posts: 31
unfortunately the !last n and !listall isnt working :~(

#160033 23/09/06 02:52 PM
Joined: Oct 2004
Posts: 8,330
Hoopy frood
Offline
Hoopy frood
Joined: Oct 2004
Posts: 8,330
Sorry.. fixed the !listall. As for !last... I forgot that hash tables never put things in the right order unless you use numbers for the items. If you want a !last command, I can have it write the keywords to a file and then read in the last N keywords for you. Or, I can possibly set it up to work with /filter and put numbers in front of the item names and sort them. Up to you if you want that command.

Code:
alias -l CreateHelp {
  hmake Help 100
  if ($isfile(Help.hsh)) { hload Help Help.hsh }
}

on *:start: {
  CreateHelp
}

on *:text:*:#: {
  if ($1 != !learn &amp;&amp; $1 != !replace &amp;&amp; $1 != !append &amp;&amp; $1 != !delete &amp;&amp; $1 != !whoset &amp;&amp; $1 != !listall &amp;&amp; $1 != !last &amp;&amp; $1 != $chr(63)) { return }
  if ($hget(Help) == $null) { CreateHelp }
  if ($1 == !listall) {
    var %list.cnt = 1
    var %line.cnt = 1
    while (%list.cnt &lt;= $hget(Help,0).item) {
      if ($len(%list [ $+ [ %line.cnt ] ]) &gt; 300) { inc %line.cnt }
      var %list. $+ %line.cnt %list. [ $+ [ %line.cnt ] ] $+ , $+ $hget(Help, [ %list.cnt ] ).item
      inc %list.cnt
    }
    var %list.cnt = 1
    while (%list.cnt &lt;= %line.cnt) {
      msg $chan $right(%list. [ $+ [ %line.cnt ] ],-1)
      inc %list.cnt
    }
    return
  }
  if (!$2) { msg $chan Please include a keyword with the command | return }
  if ($1 == !learn) {
    if ($hget(Help,$2)) { msg $chan That keyword is already used.  Please choose another, or use !replace or !append. | return }
    msg $chan Learned $3-
    hadd Help $2 $nick $3-
  }
  elseif ($1 == $chr(63)) {
    var %data = $gettok($hget(Help,$2),2-,32)
    if (%data == $null) { msg $chan No help available on that item. }
    else {
      msg $chan %data
    }
  }
  elseif ($1 == !replace) {
    if ($hget(Help,$2)) {
      msg $chan Replaced $gettok($hget(Help,$2),2-,32) with $2-
      hadd Help $2 $nick $3-
    }
    else msg $chan No such keyword ( $+ $2 $+ ).
  }
  elseif ($1 == !append) {
    if ($hget(Help,$2)) {
      msg $chan Appended $3- to $hget(Help,$2)
      hadd Help $2 $nick $gettok($hget(Help,$2),2-,32) $3-
    }
    else msg $chan No such keyword ( $+ $2 $+ ).
  }
  elseif ($1 == !delete) {
    if ($hget(Help,$2)) {
      msg $chan Deleted $2 -- $gettok($hget(Help,$2),2-,32)
      hdel Help $2
    }
    else msg $chan No such keyword ( $+ $2 $+ ).
  }
  elseif ($1 == !whoset) {
    if ($hget(Help,$2)) {
      msg $chan $gettok($hget(Help,$2),1,32) was the last person to update $2 $+ .
    }
    else msg $chan No such keyword ( $+ $2 $+ ).
  }
  hsave Help Help.hsh
}


Invision Support
#Invision on irc.irchighway.net
#160034 23/09/06 06:34 PM
Joined: Sep 2006
Posts: 31
S
Sukai Offline OP
Ameglian cow
OP Offline
Ameglian cow
S
Joined: Sep 2006
Posts: 31
in the !listall

say if the amount of keywords is too much to be displayed in one line ( in mirc theres a limit to how much you can type in one line)

will it continue displaying into a second line ?

if the keyword/definition database grows (into the hundredths) it may not display it all, if its limited to one line only

Last edited by Sukai; 23/09/06 06:34 PM.
#160035 23/09/06 09:55 PM
Joined: Oct 2004
Posts: 8,330
Hoopy frood
Offline
Hoopy frood
Joined: Oct 2004
Posts: 8,330
Yes. Read what I wrote in the first post that included !listall. I mentioned possibly needing to change 300 to another number if it's too short of a line or too long of a line. I also mentioned that if you get too many (more than 5 lines or so), you'll probably be flooded off.


Invision Support
#Invision on irc.irchighway.net
#160036 23/09/06 11:59 PM
Joined: Sep 2003
Posts: 261
S
Fjord artisan
Offline
Fjord artisan
S
Joined: Sep 2003
Posts: 261
Riamus2 is right, to much text all at once and you could flood off a server. If your still wanting to keep the listall command, you might want to make it a dcc chat connection to a user and then have it send the information that way. In a dcc chat you're not bound by flooding off. Though I'm not saying the listall command is a bad one, but over time that could be a large amount of text to shell out all at once.

Oh and Riamus2 smile, now I know why you love hash tables so much, they are kick ass. I've been modifying an old socketbot to act more like an infobot using hash tables for the info. Very nice results.


We don't just write the scripts, we put them to the test! (ScriptBusters)
#160037 24/09/06 01:10 AM
Joined: Sep 2006
Posts: 31
S
Sukai Offline OP
Ameglian cow
OP Offline
Ameglian cow
S
Joined: Sep 2006
Posts: 31
sorry Riamus2 i must of overlooked it, but well what if its made to delay between the lines ? most networks kick you off because you typed too many lines too fast (at least thats what they do over at QuakeNet)

#160038 24/09/06 02:12 AM
Joined: Sep 2003
Posts: 261
S
Fjord artisan
Offline
Fjord artisan
S
Joined: Sep 2003
Posts: 261
Hrm, you could have it dump the learned keywords to a file (using some mirc magic) then have it use the play command to play back one line at a time using the play delay. Say for example, you want it only to put 10 keywords on a line at a time.
keyword, keyword, keyword etc... until 10

make a new line

keyword, keyword, keyword etc...

would use a while loop to start the 10 count over anyway. It would write the info to the file once it reaches 10, they use play to play it back without flooding. Course that could take some coding.

Code:
var %i = 1
var %i2 = 1
var %totalhash = $hget() etc.... for the number of total entries
var %writetoline

while (%i &lt;= %totalhash) {
  %writetoline = %writetoline $hget(table,%i).item
  if (%i2 == 10) { 
    write templistall.txt %writetoline
    %writetoline = ""
    %i2 = 0
  }
  inc %i 
  inc %i2
}


then use: play $chan/$nick templistall.txt


We don't just write the scripts, we put them to the test! (ScriptBusters)
#160039 24/09/06 03:10 AM
Joined: Oct 2004
Posts: 8,330
Hoopy frood
Offline
Hoopy frood
Joined: Oct 2004
Posts: 8,330
Good idea, Scorpwanna, but a hidden custom window would avoid the need for writing to a file and would allow you to /play from it.

I'll see about adding that to it maybe tomorrow. Remind me. laugh


Invision Support
#Invision on irc.irchighway.net
#160040 24/09/06 03:18 AM
Joined: Oct 2004
Posts: 8,330
Hoopy frood
Offline
Hoopy frood
Joined: Oct 2004
Posts: 8,330
Quote:
Oh and Riamus2 smile, now I know why you love hash tables so much, they are kick ass. I've been modifying an old socketbot to act more like an infobot using hash tables for the info. Very nice results.


Heh. Yeah, they really are useful. I have a nice card dealing hash table script that I made that deals out cards and include colors (white background and red/black based on suit). I made it for my Cribbage script I'm working on. I kind of put that on hold, though... along with my Scattergories script. I should finish those... My monopoly script is also on hold, but from much longer ago. Oh well.

I haven't released to many scripts... a few are on my site (Weather script, Dictionary script, $DateXpander (do a search here for info on that if you want)) and a few were released on the invision forum (Kick/Ban window, Playlist script for Invision, etc.), but otherwise I've not really released much.

Btw, you don't have to include "2" when saying my nick. It's only there because I forgot my password for Riamus and had a different e-mail, so couldn't retrieve it.


Invision Support
#Invision on irc.irchighway.net
#160041 24/09/06 07:55 AM
Joined: Sep 2006
Posts: 31
S
Sukai Offline OP
Ameglian cow
OP Offline
Ameglian cow
S
Joined: Sep 2006
Posts: 31
you guys are awesome!, really helped me out

how did you guys learn mirc scripting? played with it? any good tutorials or sites?

i only know of here and www.mircscripts.org

#160042 24/09/06 08:59 AM
Joined: Sep 2003
Posts: 261
S
Fjord artisan
Offline
Fjord artisan
S
Joined: Sep 2003
Posts: 261
Ahh I gotcha, yeah same deal with me and my nickname on the scifi.com board. Yeah, i've got scripts laying around almost done or half way done that I never finish. frown I think the only one i ever finished completely was the huge mp3player script I created with the help of a few people's ideas. But that was years ago, I took a break from mirc scripting to learn some perl and a bit of php. Just recently started back up with mirc stuff, all these languages can get confuseing at times.

Sukai I never could find a tutorial that would match the mirc help file. I got started by a friend I met in chat teaching me simple on text events. First thing i ever made myself was a bot. smile Best way to learn is just get an idea, and think about how each thing of that idea is going to work. If you can't figure it out ask questions. smile


We don't just write the scripts, we put them to the test! (ScriptBusters)
#160043 27/09/06 09:34 PM
Joined: Oct 2004
Posts: 8,330
Hoopy frood
Offline
Hoopy frood
Joined: Oct 2004
Posts: 8,330
Quote:
sorry Riamus2 i must of overlooked it, but well what if its made to delay between the lines ? most networks kick you off because you typed too many lines too fast (at least thats what they do over at QuakeNet)


Sorry I didn't get to this right away. This should give you your delay.

Apparently, I was wrong... you can't play a custom window. Well, you can by using an alias, but it still wants a filename. So, here's writing it to a file and playing that. Note that I changed the RED part from what it used to be and I added the GREEN part. Nothing else has changed.

Code:
alias -l CreateHelp {
  hmake Help 100
  if ($isfile(Help.hsh)) { hload Help Help.hsh }
}

on *:start: {
  CreateHelp
}

on *:text:*:#: {
  if ($1 != !learn &amp;&amp; $1 != !replace &amp;&amp; $1 != !append &amp;&amp; $1 != !delete &amp;&amp; $1 != !whoset &amp;&amp; $1 != !listall &amp;&amp; $1 != !last &amp;&amp; $1 != $chr(63)) { return }
  if ($hget(Help) == $null) { CreateHelp }
  if ($1 == !listall) {
    var %list.cnt = 1
    var %line.cnt = 1
    while (%list.cnt &lt;= $hget(Help,0).item) {
      if ($len(%list [ $+ [ %line.cnt ] ]) &gt; 300) { inc %line.cnt }
      var %list. $+ %line.cnt %list. [ $+ [ %line.cnt ] ] $+ , $+ $hget(Help, [ %list.cnt ] ).item
      inc %list.cnt
    }
    var %list.cnt = 1
    while (%list.cnt &lt;= %line.cnt) {
      [color:red]write list.tmp [/color]$right(%list. [ $+ [ %line.cnt ] ],-1)
      inc %list.cnt
    }
    [color:green]play $chan list.tmp 1500
    .remove list.tmp[/color]
    return
  }
  if (!$2) { msg $chan Please include a keyword with the command | return }
  if ($1 == !learn) {
    if ($hget(Help,$2)) { msg $chan That keyword is already used.  Please choose another, or use !replace or !append. | return }
    msg $chan Learned $3-
    hadd Help $2 $nick $3-
  }
  elseif ($1 == $chr(63)) {
    var %data = $gettok($hget(Help,$2),2-,32)
    if (%data == $null) { msg $chan No help available on that item. }
    else {
      msg $chan %data
    }
  }
  elseif ($1 == !replace) {
    if ($hget(Help,$2)) {
      msg $chan Replaced $gettok($hget(Help,$2),2-,32) with $2-
      hadd Help $2 $nick $3-
    }
    else msg $chan No such keyword ( $+ $2 $+ ).
  }
  elseif ($1 == !append) {
    if ($hget(Help,$2)) {
      msg $chan Appended $3- to $hget(Help,$2)
      hadd Help $2 $nick $gettok($hget(Help,$2),2-,32) $3-
    }
    else msg $chan No such keyword ( $+ $2 $+ ).
  }
  elseif ($1 == !delete) {
    if ($hget(Help,$2)) {
      msg $chan Deleted $2 -- $gettok($hget(Help,$2),2-,32)
      hdel Help $2
    }
    else msg $chan No such keyword ( $+ $2 $+ ).
  }
  elseif ($1 == !whoset) {
    if ($hget(Help,$2)) {
      msg $chan $gettok($hget(Help,$2),1,32) was the last person to update $2 $+ .
    }
    else msg $chan No such keyword ( $+ $2 $+ ).
  }
  hsave Help Help.hsh
}


Invision Support
#Invision on irc.irchighway.net
#160044 27/09/06 09:52 PM
Joined: Oct 2004
Posts: 8,330
Hoopy frood
Offline
Hoopy frood
Joined: Oct 2004
Posts: 8,330
Quote:
you guys are awesome!, really helped me out

how did you guys learn mirc scripting? played with it? any good tutorials or sites?

i only know of here and www.mircscripts.org


I learned by doing it. Back in 2001, I started running TrivBot 2000 and after not very long, I realized that I wanted it to do more than it did. So, I started looking at the scripting and tried to figure out how to make it do what I wanted. Now our trivia bot is more advanced than any other trivia bot I've ever seen and it has around 10,000 questions specifically about old (classic) games for PC, console, and handheld. Of course, I have a lot of prior programming knowledge, so the scripting language isn't really that hard to figure out (or at least get a general idea of what is happening) with that prior knowledge.

I was on Dalnet at the time and it had 2 good #scripting channels... #scripthelp and #scripting, or something like that. I have no idea if those are the correct names or if they are still around. Anyhow, I always went there to ask questions.

As I got more involved with scripting, I started looking at other peoples' scripts to see how they worked. Combining that with mIRC's help file and this forum and the scripting channels, I have been able to figure out what I wanted to do without too much difficulty.

The real trick is this...

1) You need to really *want* to learn it. Otherwise, you won't put in enough effort and it will just be a waste of your time to try.

2) You need to script regularly (or at least play around with scripts, even if you're not writing new ones). When learning any language (computer or human), you learn through use. If you rarely use it, you won't succeed. I would love to relearn C++ (I haven't used it in so long that I forgot most of it), but I don't really have any need for writing programs in it, so learning it isn't really possible --- without needing to use it, I have no incentive to learn it and I don't get enough practice using it. With mIRC, I use it almost every day, so I'm always finding things that I can script or improve or change in scripts, so I have plenty of practice.

3) Learn to use the help file. Many people complain about it because it really isn't all that user friendly. However, it is a GREAT source of information if you know how to use it properly so that you can find what you are looking for.

4) Get some simple scripts from mircscripts.org and see how they do what they do. See if you can edit them to do something else. Start with simple things like on TEXT triggers. Try something like having the script send a message to anyone who says hello. As you progress, you can pick up more difficult scripts... but if you try to skip the easy scripts because you think they are "kid stuff", then you'll never really get very far.

5) Once you have a handle on the easier scripting skills, start paying attention to what people here are writing. Don't start answering scripting questions unless you're sure you know how to do it, but just read the answers others give. If the question is about sockets, for example, and you think you want to try to learn how to use sockets, then look at how the script in the answer looks and try to see how it works. Then start looking at other socket answers in the forum to see similarities. Try changing some things to see if you can make it do something different. Eventually, you can try writing your own. Keep in mind that sockets is advanced and I just used it as an example. The idea is that you see how people do something and then try to make it work for yourself.

6) Ask questions!! However, if you are learning to script, don't just ask if someone can write a script for you. Even just saying, "How can I make a script do ____?" will usually get you a script for an answer. That isn't what you want. Instead, ask the question, but include what you've already tried to create. And make sure to point out that you are trying to learn to do it yourself so that, hopefully, you'll get a good explanation on how to do it.


Invision Support
#Invision on irc.irchighway.net
#160045 28/09/06 08:20 PM
Joined: Mar 2003
Posts: 612
B
Fjord artisan
Offline
Fjord artisan
B
Joined: Mar 2003
Posts: 612
7) remember your scripts do what you tell them to do, not what you want them to do....

smirk

btk


billythekid
Page 1 of 4 1 2 3 4

Link Copied to Clipboard