Wie setze ich Channel bezogene Variablen?

General

Well-Known Member
#1
Hallo

Ich habe einen Bot, der auf gewisse Text Events reagiert.
Momentan habe ich das so, dass wenn in irgenteinen Channel der Event genannt wird, sagt der Bot in keinem Channel mehr war.

Nun gut, meine Idee, dass ich das Channel bezogen machen könnte, wäre gewesen ...

Ich zeige jetzt nur einen Ausschnitt...
Momentan hab ich es so:

Code:
elseif (($1 == Hi) && (!%hallo)) {
    .timerhihosag 1 2 msg $chan $read $mircdir/txt/hallo.txt
    .set -u500 %hallo $true
  }
damit das Channelbezogen wäre, hatte ich mir das so gedacht...
Code:
elseif (($1 == Hi) && (!%hallo. $+ #)) {
    .timerhihosag 1 2 msg $chan $read $mircdir/txt/hallo.txt
    .set -u500 %hallo. $+ # $true
  }
Das mit dem Channel bezogenen klappt nicht. Es wird zwar die variable gesetzt, aber das auch schon alles.

Was mache ich falsch oder was habe ich vergessen?

Vielen Dank
 

General

Well-Known Member
#3
Hi gencha!

Was genau sind Hash-Tables? Damit habe ich noch nie gearbeitet.
Wäre schön, wenn Du mir einen Denk Anstoss geben könntest.

Vielen Dank!
 

gencha

Well-Known Member
#4
Naja im Grunde ist das eine etwas angenehmere Art Variablen zu speichern.

Code:
hmake myTable 10
hadd myTable myValue Ich bins der gencha!
echo -a $hget(myTable, myValue)

Dann kannst du auch einen Namen für die Variable zusammen puzzlen. Aber es ist wesentlich eleganter.
 

General

Well-Known Member
#5
Hallo

Also ich habs jetzt versucht mit [ ] zu lösen ..
Das hadd usw.. versteh ich nicht ganz :/

Hab nur ein kleines Problem mit ..

Code:
if ((%badnickk. [ $+ [ $nick ] ] == 1) && ($chan == %badchan. [ $+ [ $chan [ $+ [ $nick ] ] ] ]))
Ich hab schon alle möglichen Varianten versucht...
Würde mir mal bitte jemand dabei helfen?

Vielen Dank
 
Zuletzt bearbeitet:

KathY

Well-Known Member
#6
Hi,

der zweite Teil sieht komisch aus.
Probiere folgendes aus:
Code:
if ((%badnickk. [ $+ [ $nick ] ] == 1) && ($chan == %badchan. [ $+ [ $chan ] $+ [ $nick ] ]))
Grüße,
Kathy
 

General

Well-Known Member
#7
Hi Kathy

Nein, das funktioniert leider auch nicht. Das hatte ich auch schon probiert gehabt.

Aber hier mal das ganze Script. Sollte ein Badwort Kick Script für einen Bot sein. Dass es noch nicht perfekt ist, weis ich selber, aber das Grund Script mach ich immer zuerst ...

Code:
on *:text:*:#: { 
  if (%kicknbad == 1) {
    if ($1- isin %badwort) {
      if ((%badnickk. [ $+ [ $nick ] ] == 1) && ($chan == %badchan. [ $+ [ $chan ] $+ [ $nick ] ] )) {
        kick $chan $nick Badword Kick!
        unset %badnickk. $+ $nick
        unset %badchan. $+ # $+ $nick
      }
      else {
        msg $chan 1. Verwarnung für $nick ! Beim nächsten mal gibt es einen Kick!
        set %badnickk. $+ $nick 1
        set %badchan. $+ # $+ $nick
      }

    }
  }
}
Es überspringt mir immer den Teil mit dem Kick Script. Gibt immer nur Verwarnungen. Variablen werden ordnungsgemäss gesetzt

Danke
 

General

Well-Known Member
#9
Hi

Naja, ich find keinen Anfang, wie gesagt, ist neu für mich.. und in der Hilfe find ich nix zu hmake ect ....

Danke
 

gencha

Well-Known Member
#10
Wie wäre das:
Hash Tables

Hash tables allow you to efficiently store large amounts of information which can be quickly referenced and retrieved later on.

A hash table can be created, freed, referenced, or modified using the following commands and identifiers.

/hmake -s <name> <N>
Creates a new hash table with N slots.

A hash table can store an unlimited number of items regardless of the N you choose, however the bigger N is, the faster it will work, depending on the number of items stored.

eg. if you expect that you'll be storing 1000 items in the table, a table of N set to 100 is quite sufficient.

The -s switch makes the command display the result.

/hfree -sw <name>
Frees an existing hash table.

The -w switch indicates that name is a wildcard, all matching tables are freed.

/hadd -smbczuN <name> <item> [data | &binvar]
Adds an item to an existing hash table.

If the item you're adding already exists, the old item is replaced.

The -m switch makes /hadd create the hash table if it doesn't already exist.

The -uN switch unsets the item after N seconds.

The -b indicates that you're adding a &binvar item to the hash table.

The -c switch chops the &binvar up to the first null value and treats it as plain text.

The -z switch decreases hash item once per second until it reaches zero and then unsets it.

The /hinc and /hdec commands use the same parameters as /hadd and increase or decrease the number value of an item.

When used with /hinc or /hdec, the -c switch increases or decreases the value once per second.

/hdel -sw <name> <item>
Deletes an item from a hash table.

The -w switch indicates that item is a wildcard, all matching items are freed.

/hload -sbni <name> <filename> [section]
/hsave -sbniau <name> <filename> [section]
Load or save a table to/from a file.

These load/save plain text to a text file, with item and data on separate lines. $cr and $lf characters are stripped from text when saving as plain text.

The -b switch loads or saves binary files. $cr and $lf are preserved when saving as binary files.

You can use -n to load or save files as data only, with no items. When loading with -n each line of data is assigned an N item value, starting at N = 1.

/hsave also supports -a to append to an existing file instead of overwriting it.

By default /hsave excludes items that are in the /hadd -uN unset list, the -u switch forces it to include the unset items.

The -i switch treats the file as an ini file. You can specify an optional section name after the filename.

Note: /hload does not create the table, it must already have been created by /hmake.

$hget(name/N)
Returns name of a hash table if it exists, or returns the name of the Nth hash table.

Properties: size

$hget(moo).size returns the N size of table, as specified in /hmake

$hget(name/N, item)
Returns the data associated with an item in the specified hash table.

Properties: unset

The unset property returns the time remaining before an item is unset.

$hget(name/N, item, &binvar)
Assigns the contents of an item to a &binvar.

$hget(name/N, N).item
This allows you to reference the table as an index from 0 to N, in order to look up the Nth item in the table.

If N is zero, returns the total number of items in the table.

You can also reference the Nth data value directly with $hget().data.

Note: This method is provided as a convenience, it is not an efficient way to use the hash table.

$hfind(name/N, text, N, M)
Searches table for the Nth item name which matches text. Returns item name.

Properties: data

If you specify the .data property, searches for a matching data value.

M is optional, and can be:

n normal text comparison (default if M isn't specified)
w text is wildcard text
W hash table item/data is wildcard text
r text is regular expression
R hash table item/data is regular expression
 
#11
hallo gencha

hmake myTable 10
hadd myTable myValue Ich bins der gencha!
echo -a $hget(myTable, myValue)
1. Wo oder in welchem fenster wird das unter echo ausgegeben?

2. also bei dir sind 10 werte möglich soweit ich das verstanden habe
wo werden dann die zweiten dritten wwerte etc hingeschrieben.
das schade bei solchen contents hilfen ist dass es viel zu wenig beispiele hat und ich soo es sehr schwer und mühsam erlernen kann, deshalb bevorzuge ich immer die einfache variante schliesslich will ich ja so schnell wie möglich ans ziel kommen

3. da ich unötiges weglassen möchte und einfach nur variablen speichern will kann ich das nicht auch einfach per?:

%variable1 = dies und das
%variable2 =12345
etc.
 

gencha

Well-Known Member
#12
1. -a heisst es wird im aktiven Fenster ausgegeben.
2. Die 10 bei hmake heisst nicht, dass nur 10 Werte in die Tabelle passen.
In Hash Tables passen immer (theoretisch) endlos viele Werte. Selbst die mIRC Hilfe geht hier nicht wirklich ins Detail.
Ich kann dir nur sagen wie ich das ganze Verstanden hab und bitte darum mich zu korriegeren wenn es falsch ist ;)
Die Zahl gibt die Anzahl der Buckets an. Im Idealfall bekommt jeder Wert einen eigenen Bucket. Nötig ist das aber nicht. Sagt man: "Ich mach mir einfach 1000000 Buckets, dann passts schon" können das aber auch unnötig viele sein wenn man dann nur 5 Werte speichert.
Also einfach mal schätzen wie viele Werte man braucht und dann passt das schon (so lange es nicht 100x mehr werden).
3. Wenn du einfach nur Variablen willst, dann kannst du auch Variablen nehmen. Hier ging es ja darum Arrays zu simulieren indem man Variablennamen zusammen puzzelt. Und das ist einfach unnötig.
 
#13
Versuchs mal damit
Code:
on *:text:*:#Ag-Universe: {
  if (%kicknbad == 1) {
    if ($1- isin %badwort) {
      if (%badnickk. [ $+ [ $nick ] ] == 1) && ($chan isin %badchan. $+ # $+ $nick) goto kick
      else goto warn
      :kick
      kick $chan $nick Badword Kick!
      unset %badnickk. $+ $nick
      unset %badchan. $+ # $+ $nick
      halt
      :warn
      msg $chan 1. Verwarnung für $nick ! Beim nächsten mal gibt es einen Kick!
      set %badnickk. $+ $nick 1
      set %badchan. $+ # $+ $nick
      halt
    }

  }
}
 
Oben