| View previous topic :: View next topic |
| Author |
Message |
dusk Halfop

Joined: 06 Mar 2005 Posts: 91 Location: Belgium
|
Posted: Sat Aug 06, 2005 10:33 am Post subject: asl thingy |
|
|
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: | # 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: | set age [expr $systemyear - $year -1]
if {$month < $systemmonth} { incr age }
if {$month == $systemmonth} {
if {$day < $systemday} { incr age }
|
Thx in advance. |
|
| Back to top |
|
 |
^DooM^ Owner

Joined: 26 Aug 2003 Posts: 772 Location: IronForge
|
Posted: Sat Aug 06, 2005 12:04 pm Post subject: |
|
|
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 |
|
| Back to top |
|
 |
demond Revered One

Joined: 12 Jun 2004 Posts: 3073 Location: San Francisco, CA
|
Posted: Sat Aug 06, 2005 12:11 pm Post subject: |
|
|
well, the [unixtime] starts on Jan 1st, 1970  |
|
| Back to top |
|
 |
dusk Halfop

Joined: 06 Mar 2005 Posts: 91 Location: Belgium
|
Posted: Sat Aug 06, 2005 12:15 pm Post subject: no windrop |
|
|
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 |
|
| Back to top |
|
 |
^DooM^ Owner

Joined: 26 Aug 2003 Posts: 772 Location: IronForge
|
Posted: Sat Aug 06, 2005 12:20 pm Post subject: |
|
|
Err yeah thats what I meant. I had problems with the date function in php a while back.
| Quote: | | 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 |
|
| Back to top |
|
 |
dusk Halfop

Joined: 06 Mar 2005 Posts: 91 Location: Belgium
|
Posted: Sat Aug 06, 2005 1:21 pm Post subject: unixtime |
|
|
thus.... the [unixtime] should be the problem then? any idea how to change the code so this thing could work properly again?
THX |
|
| Back to top |
|
 |
demond Revered One

Joined: 12 Jun 2004 Posts: 3073 Location: San Francisco, CA
|
Posted: Sun Aug 07, 2005 3:54 am Post subject: |
|
|
| 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 |
|
| Back to top |
|
 |
dusk Halfop

Joined: 06 Mar 2005 Posts: 91 Location: Belgium
|
Posted: Sun Aug 07, 2005 7:40 am Post subject: datafile |
|
|
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 |
|
| Back to top |
|
 |
demond Revered One

Joined: 12 Jun 2004 Posts: 3073 Location: San Francisco, CA
|
Posted: Sun Aug 07, 2005 11:40 am Post subject: |
|
|
| nope, it's not too slow hehehe |
|
| Back to top |
|
 |
dusk Halfop

Joined: 06 Mar 2005 Posts: 91 Location: Belgium
|
Posted: Sun Aug 07, 2005 11:56 am Post subject: Problem solved |
|
|
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: |
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  |
|
| Back to top |
|
 |
|