This is the new home of the egghelp.org community forum.
All data has been migrated (including user logins/passwords) to a new phpBB version.


For more information, see this announcement post. Click the X in the top right-corner of this box to dismiss this message.

asl thingy

Old posts that have not been replied to for several years.
Locked
User avatar
dusk
Halfop
Posts: 91
Joined: Sun Mar 06, 2005 7:25 pm
Location: Belgium

asl thingy

Post by dusk »

Weird thing happened......I'm using 'asl thingy v1.02' for age/sex/location input in my channel. Everything worked just fine untill last wednesday, suddenly the script returned (for some users) their age minus 1.

for example :

!asladd dusk m/somewhere 23/02/1977
the script returns : dusk is 27 (MUST be 28 ) years old, his anniversary : 23 feb
First I thought there was a problem with the clock on the server wich I'm using a shell on, but bots who are placed on another server (other provider) suddenly reacted the same way.Altough there was no problem before (and I didn't change the code either)

This is the script (partial) : Maybe if someone could take a look....

Code: Select all

# create the data file if it doesn't exist
if {![file exist $asl_storefile]} {
    set create [open $asl_storefile a+]
    close $create
}
# load the data in memory
catch { unset asl_entries }
set asl_file [open $asl_storefile]
while {![eof $asl_file]} {
    lappend asl_entries [string tolower [lindex [gets $asl_file] 0]]
}
close $asl_file

bind pub $asl_addflag $asl_addtrig asl_add
bind pub $asl_delflag $asl_deltrig asl_del
bind pub $asl_flag $asl_trig asl_search

# add info
proc asl_add {nick host handle chan arg} {
    global asl_storefile asl_addtrig asl_entries
    if {[lindex $arg 2] == ""} {
	puthelp "notice $nick :USAGE: $asl_addtrig <nick> <sex/location> <date>"
    } {
	set entry [string tolower [lindex $arg 0]]
	# create the data file if it doesn't exist
	if {![file exist $asl_storefile]} {
	    set create [open $asl_storefile a+]
	    close $create
	    catch { unset asl_entries }
	}
	if {[lsearch -exact $asl_entries $entry] == -1} {
	    if {![isvaliddate [lindex $arg 2]]} {
		puthelp "notice $nick :USAGE: $asl_addtrig <nick> <sex/location> <date>"
		puthelp "notice $nick :[lindex $arg 2] is geen geldige datum!"
		return 0
	    }
	    if {![isvalidasl [lindex $arg 1]]} {
		puthelp "notice $nick :USAGE: $asl_addtrig <nick> <sex/location> <date>"
		puthelp "notice $nick :[lindex $arg 1] is geen geldig <sex/locatie>"
		return 0
	    }
	    lappend asl_entries $entry
	    set file [open $asl_storefile a+]
	    puts $file $arg
	    close $file
	    putserv "notice $nick :Info van [lindex $arg 0] werd opgeslagen!"
	} {
	    putserv "notice $nick :Info over [lindex $arg 0] werd reeds opgeslagen!"
	}
    }
}

# delete info
proc asl_del {nick host handle chan arg} {
    global asl_storefile asl_tempfile asl_deltrig asl_entries
    if {[lindex $arg 1] != "" || [lindex $arg 0] == ""} {
	putserv "notice $nick :GEBRUIK: $asl_deltrig <nick>"
    } {
	set entry [string tolower $arg]
	# create the data file if it doesn't exist
	if {![file exist $asl_storefile]} {
	    set create [open $asl_storefile a+]
	    close $create
	    catch { unset asl_entries }
	    putserv "notice $nick :Geen info over $arg gevonden!"
	    return 0
	}
	set idx [lsearch -exact $asl_entries $entry]
	if {$idx != -1} {
	    set asl_entries [lreplace $asl_entries $idx $idx]
	    set file [open $asl_storefile]
	    set tempfile [open $asl_tempfile w]
	    while {![eof $file]} {
		set temp [gets $file]
		if {[string tolower [lindex $temp 0]] != $entry && $temp != ""} {
		    puts $tempfile $temp
		}
	    }
	    close $file
	    close $tempfile
	    file delete $asl_storefile
	    file rename $asl_tempfile $asl_storefile
	    putserv "notice $nick :deleted info for $arg"
	} {
	    putserv "notice $nick :Geen info gevonden over $arg ."
	}
    }
}

# search for info
proc asl_search {nick host handle chan arg} {
    global asl_storefile asl_entries
    # create the data file if it doesn't exist
    if {![file exist $asl_storefile]} {
	set create [open $asl_storefile a+]
	close $create
	catch { unset asl_entries }
	return 0
    }
    set entry [string tolower [lindex $arg 0]]
    if {$entry == ""} { return 0 }
    
    if {[lsearch -exact $asl_entries $entry] != -1} {
	set file [open $asl_storefile]
	while {![eof $file]} {
	    set line [gets $file]
	    set matchnick [string tolower [lindex $line 0]]
	    if {$entry == $matchnick} {
		set rnick [lindex $line 0]
		set asl [lindex $line 1]
		set date [lindex $line 2]
		if {[isvalidasl $asl]} {
		    set location [lindex [split $asl "/"] 1]
		    set sex [lindex [split $asl "/"] 0]
		    if {$sex == "m" || $sex == "M"} {
			set heshe "Hij"
		    } {
			set heshe "Ze"
		    }
		} {
		    puthelp "privmsg $chan :$nick, $rnick's info is corrupt :/"
		    close $file
		    return 0
		}
		if {[isvaliddate $date]} {
		    set splitted [split $date "/"]
		    set day [lindex $splitted 0]
		    set month [lindex $splitted 1]
		    set year [lindex $splitted 2]
		    if {[string index $month 0] == 0} {
			set month [string index $month 1]
		    }
		    if {[string index $day 0] == 0} {
			set day [string index $day 1]
		    }
		    set systemday [clock format [unixtime] -format %d]
		    set systemmonth [clock format [unixtime] -format %m]
		    set systemyear [clock format [unixtime] -format %Y]
		    set age [expr $systemyear - $year -1]
		    if {$month < $systemmonth} { incr age }
		    if {$month == $systemmonth} {
			if {$day < $systemday} { incr age }
		    }
		} {
		    puthelp "privmsg $chan :$nick, $rnick's info is corrupt :/"
		    close $file
		    return 0
		}
		puthelp "privmsg $chan :$nick, $rnick is $age jaar. $heshe woont in $location en is jarig op $day [humanmonth $month] ."
		close $file
		return 0
	    }
	}
	close $file
    }
    puthelp "privmsg $chan :$nick, geen info over [lindex $arg 0]"
}

# checkt of een string een geldige 'sex/location' is
proc isvalidasl {string} {
    set splittedasl [split $string "/"]
    if {[llength $splittedasl] != 2} { return 0 }
    set sex [lindex $splittedasl 0]
    if {$sex != "m" && $sex != "v" && $sex != "f" &&
	$sex != "M" && $sex != "V" && $sex != "F"} {
	return 0
    }
    return 1
}

# checkt of een string een geldige datum voorstelt in dd/mm/yyyy
# (schrikkeljaren buiten beschouwen gelaten :p)
proc isvaliddate {string} {
    set splitteddate [split $string "/"]
    if {[llength $splitteddate] != 3} { return 0 }
    foreach num $splitteddate {
	if {![isnumber $num]} { return 0 }
    }
    set day [lindex $splitteddate 0]
    set month [lindex $splitteddate 1]
    set year [lindex $splitteddate 2]
    if {[string length $year] != 4} { return 0 }
    if {$day > 31 || $day == 0} { return 0 }
    if {$month > 12 || $month == 0} { return 0 }
    
    switch $month {
	2 { if {$day > 29} { return 0 } }
	4 -
	6 -
	9 -
	11 { if {$day > 30} { return 0 } }
    }
    return 1
}

# zet getal 1-12 om naar de corresponderende maand
proc humanmonth {num} {
    switch $num {
	1 { return "januari" }
	2 { return "februari" }
	3 { return "maart" }
	4 { return "april" }
	5 { return "mei" }
	6 { return "juni" }
	7 { return "juli" }
	8 { return "augustus" }
	9 { return "september" }
	10 { return "oktober" }
	11 { return "november" }
	12 { return "december" }
    }
}

putlog "asl thingy v1.02 loaded .."

## EOF
First I thought this was the problem, but it seems fine (also weird it doesn't affect ALL users, just some of them)

Code: Select all

		    set age [expr $systemyear - $year -1]
		    if {$month < $systemmonth} { incr age }
		    if {$month == $systemmonth} {
			if {$day < $systemday} { incr age }
Thx in advance.
User avatar
^DooM^
Owner
Posts: 772
Joined: Tue Aug 26, 2003 5:40 pm
Location: IronForge
Contact:

Post by ^DooM^ »

If you are running this on a windrop then just to let you know that windows does not handle dates properly before 1970 if using a mysql date time or unixtime format.
The lifecycle of a noob is complex. Fledgling noobs gestate inside biometric pods. Once a budding noob has matured thru gestation they climb out of their pod, sit down at a PC, ask a bunch of questions that are clearly in the FAQ, The Noob is born
User avatar
demond
Revered One
Posts: 3073
Joined: Sat Jun 12, 2004 9:58 am
Location: San Francisco, CA
Contact:

Post by demond »

well, the [unixtime] starts on Jan 1st, 1970 ;)
User avatar
dusk
Halfop
Posts: 91
Joined: Sun Mar 06, 2005 7:25 pm
Location: Belgium

no windrop

Post by dusk »

Nope, I'm using this with eggdrop 1.6.17 :) (5eggs on 3 different servers), and that's just the weird thing about it, it worked fine for 2 months.

thx
User avatar
^DooM^
Owner
Posts: 772
Joined: Tue Aug 26, 2003 5:40 pm
Location: IronForge
Contact:

Post by ^DooM^ »

Err yeah thats what I meant. :) I had problems with the date function in php a while back.
date(): Windows does not support dates prior to midnight (00:00:00), January 1, 1970
The lifecycle of a noob is complex. Fledgling noobs gestate inside biometric pods. Once a budding noob has matured thru gestation they climb out of their pod, sit down at a PC, ask a bunch of questions that are clearly in the FAQ, The Noob is born
User avatar
dusk
Halfop
Posts: 91
Joined: Sun Mar 06, 2005 7:25 pm
Location: Belgium

unixtime

Post by dusk »

thus.... the [unixtime] should be the problem then? any idea how to change the code so this thing could work properly again?

THX
User avatar
demond
Revered One
Posts: 3073
Joined: Sat Jun 12, 2004 9:58 am
Location: San Francisco, CA
Contact:

Post by demond »

this is an awfully written script but nevertheless its age arithmetic is correct; therefore, the reason for displaying incorrect data could only be incorrect data file, so you should inspect data file entries leading to incorrect results
User avatar
dusk
Halfop
Posts: 91
Joined: Sun Mar 06, 2005 7:25 pm
Location: Belgium

datafile

Post by dusk »

I've checked the datafile over and over again, even erased it en tested with some new entries....still the same problem.

Could it be the incr is too slow?

if {$month < $systemmonth} { incr age }
if {$month == $systemmonth} {
if {$day < $systemday} { incr age }

thx
User avatar
demond
Revered One
Posts: 3073
Joined: Sat Jun 12, 2004 9:58 am
Location: San Francisco, CA
Contact:

Post by demond »

nope, it's not too slow hehehe
User avatar
dusk
Halfop
Posts: 91
Joined: Sun Mar 06, 2005 7:25 pm
Location: Belgium

Problem solved

Post by dusk »

Finally I'v found the problem.

It seems the problem was that the script removed the zero if u entered for example 19/02/1977 <--- it removed the 0 before the 2 (same for the days) and it seems 2 is recognized in the equasion as GREATER than for example 08 ($systemmonth) ????? Weird.

So I just removed these lines :

Code: Select all

		    if {[string index $month 0] == 0} {
			set month [string index $month 1]
		    }
		    if {[string index $day 0] == 0} {
			set day [string index $day 1]
		    }
And put a "0" before all months below 10 in the humanmonth proc at the end of the script.

Works like a charm again, just don't understand why it worked before...?

Thx anyway :)
Locked