source: irpg/trunk/bot/irpgdbtool @ 1444

Last change on this file since 1444 was 1444, checked in by tereutes, 13 years ago

import initial

File size: 14.6 KB
Line 
1# IRPG db conversion tool; converts db version 2.4 -> 3.0
2# Jon Honeycutt, jotun@idlerpg.net, http://idlerpg.net
3# Free for all use, public and private, with retention of copyright notice.
4
5use strict;
6use IO::Socket;
7
8my %rps = ();
9my $temp;
10
11$|=1;
12
13print "\nIRPG db conversion tool; version 2.4 -> 3.0\n\n";
14
15do {
16    print "Read from file [irpg.db]: ";
17    chomp($temp=<STDIN>);
18    $temp ||= "irpg.db";
19    if (! -e $temp) { print "Error: No such file\n"; }
20} until (-e $temp);
21
22loaddb($temp);
23
24print "Loaded ".scalar(keys(%rps))." accounts from $temp.\n";
25
26do {
27    print "\nBackup old irpg.db file? [yes]: ";
28    chomp($temp=<STDIN>);
29    $temp||="yes";
30    $temp=lc($temp);
31} until ($temp eq "yes" || $temp eq "no");
32
33if ($temp eq "yes") {
34    do {
35        print "\nBackup filename [irpg.db.old]: ";
36        chomp($temp=<STDIN>);
37        $temp||="irpg.db.old";
38    } until (defined($temp));
39    open(RPS,">$temp") or die("Cannot write $temp: $!");
40    print RPS "# username\tpass\tlevel\tclass\tnext\tnick\tuserhost\tonline\t".
41              "idled\tpen_mesg\tpen_nick\tpen_part\tpen_kick\tpen_quit\t".
42              "pen_quest\tpen_logout\tcreated\tlast login\tamulet\tcharm\t".
43              "helm\tboots\tgloves\tring\tleggings\tshield\ttunic\tweapon\n";
44    for my $k (keys %rps) {
45        print RPS join("\t",
46          $k,
47          $rps{$k}{pass},
48          $rps{$k}{level},
49          $rps{$k}{class},
50          $rps{$k}{next},
51          $rps{$k}{nick}||"",
52          $rps{$k}{userhost}||"",
53          $rps{$k}{online}||0,
54          $rps{$k}{idled}||0,
55          $rps{$k}{pen_mesg}||0,
56          $rps{$k}{pen_nick}||0,
57          $rps{$k}{pen_part}||0,
58          $rps{$k}{pen_kick}||0,
59          $rps{$k}{pen_quit}||0,
60          $rps{$k}{pen_quest}||0,
61          $rps{$k}{pen_logout}||0,
62          $rps{$k}{created},
63          $rps{$k}{lastlogin},
64          $rps{$k}{item}{amulet}||0,
65          $rps{$k}{item}{charm}||0,
66          $rps{$k}{item}{helm}||0,
67          $rps{$k}{item}{"pair of boots"}||0,
68          $rps{$k}{item}{"pair of gloves"}||0,
69          $rps{$k}{item}{ring}||0,
70          $rps{$k}{item}{"set of leggings"}||0,
71          $rps{$k}{item}{shield}||0,
72          $rps{$k}{item}{tunic}||0,
73          $rps{$k}{item}{weapon}||0)."\n";
74    }
75    close(RPS);
76    print "Wrote $temp.\n";
77}
78
79do {
80    print "\nReset all user levels to 0, all times to level to 0, all items ".
81          "to 0, all penalties to 0, all online flags to 0, all idled times ".
82          "to 0, all creation dates and last login times to today (i.e., ".
83          "reset game)? [no]: ";
84    chomp($temp=<STDIN>);
85    $temp||="no";
86    $temp=lc($temp);
87} until ($temp eq "yes" || $temp eq "no");
88
89if ($temp eq "yes") {
90    for my $k (keys(%rps)) {
91        $rps{$k}{next}=0;
92        $rps{$k}{level}=0;
93        $rps{$k}{online}=0;
94        $rps{$k}{idled}=0;
95        $rps{$k}{item}{amulet}=0;
96        $rps{$k}{item}{charm}=0;
97        $rps{$k}{item}{helm}=0;
98        $rps{$k}{item}{"pair of boots"}=0;
99        $rps{$k}{item}{"pair of gloves"}=0;
100        $rps{$k}{item}{ring}=0;
101        $rps{$k}{item}{"set of leggings"}=0;
102        $rps{$k}{item}{shield}=0;
103        $rps{$k}{item}{tunic}=0;
104        $rps{$k}{item}{weapon}=0;
105        $rps{$k}{pen_mesg}=0;
106        $rps{$k}{pen_nick}=0;
107        $rps{$k}{pen_part}=0;
108        $rps{$k}{pen_kick}=0;
109        $rps{$k}{pen_quit}=0;
110        $rps{$k}{pen_quest}=0;
111        $rps{$k}{pen_logout}=0;
112        $rps{$k}{created}=time();
113        $rps{$k}{lastlogin}=time();
114    }
115    print "Game reset.\n";
116}
117
118do {
119    print "\nStrip all control codes from character names and classes? [no]: ";
120    chomp($temp=<STDIN>);
121    $temp ||="no";
122    $temp=lc($temp);
123} until ($temp eq "yes" || $temp eq "no");
124
125if ($temp eq "yes") {
126    my(@usernames,@classes);
127    for my $k (keys(%rps)) {
128        if ($k =~ /[[:cntrl:]]/) {
129            my $newusername = $k;
130            $newusername =~ s/[[:cntrl:]]//g;
131            if (exists($rps{$newusername}) || !defined($newusername) ||
132                !length($newusername)) {
133                print "\nError: While trying to strip control codes from $k, ".
134                      "found stripped version ($newusername) already exists ".
135                      "in database or is undefined. Skipping this user, so ".
136                      "sorry.\n";
137            }
138            else {
139                $rps{$newusername}=delete($rps{$k});
140                push(@usernames,"$k is now: $newusername");
141                $k = $newusername;
142            }
143        }
144        if ($rps{$k}{class} =~ /[[:cntrl:]]/) {
145            $rps{$k}{class} =~ s/[[:cntrl:]]//g;
146            push(@classes,"$k is now: $rps{$k}{class}");
147        }
148    }
149    if (@usernames) {
150        print "\nUsernames changed (would be good to alert these users):\n";
151        print "User $_\n" for @usernames;
152        print "\n";
153    }
154    if (@classes) {
155        print "\nClass names changed (might be good to alert these users):\n";
156        print "User $_\n" for @classes;
157        print "\n";
158    }
159}
160
161do {
162    print "\nStrip all non-printable characters from character names and ".
163          "classes? [no]: ";
164    chomp($temp=<STDIN>);
165    $temp ||="no";
166    $temp=lc($temp);
167} until ($temp eq "yes" || $temp eq "no");
168
169if ($temp eq "yes") {
170    my(@usernames,@classes);
171    for my $k (keys(%rps)) {
172        if ($k =~ /[[:^print:]]/) {
173            my $newusername = $k;
174            $newusername =~ s/[[:^print:]]//g;
175            if (exists($rps{$newusername}) || !defined($newusername) ||
176                !length($newusername)) {
177                print "\nError: While trying to strip non-printable chars ".
178                      "from $k, found stripped version ($newusername) already ".
179                      "exists in database or is undefined. Skipping this ".
180                      "user, so sorry.\n";
181            }
182            else {
183                $rps{$newusername}=delete($rps{$k});
184                push(@usernames,"$k is now: $newusername");
185                $k = $newusername;
186            }
187        }
188        if ($rps{$k}{class} =~ /[[:^print:]]/) {
189            $rps{$k}{class} =~ s/[[:^print:]]//g;
190            push(@classes,"$k\'s class is now: $rps{$k}{class}");
191        }
192    }
193    if (@usernames) {
194        print "\nUsernames changed (would be good to alert these users):\n";
195        print "User $_\n" for @usernames;
196        print "\n";
197    }
198    if (@classes) {
199        print "\nClass names changed (might be good to alert these users):\n";
200        print "User $_\n" for @classes;
201        print "\n";
202    }
203}
204
205do {
206    print "\nVersion 3.0 supports 'named items,' or a method of marking ".
207          "unique items as being unique. Attempt to name existing items that ".
208          "are known uniques? [yes]: ";
209    chomp($temp=<STDIN>);
210    $temp ||="yes";
211    $temp=lc($temp);
212} until ($temp eq "yes" || $temp eq "no");
213
214if ($temp eq "yes") {
215    for my $k (keys(%rps)) {
216        for my $item (keys(%{$rps{$k}{item}})) {
217            if ($rps{$k}{item}{$item} > int(1.5*$rps{$k}{level})) {
218                if ($item eq "helm") {
219                    print "$k\'s $item named as Mattt's Omniscience.\n";
220                    $rps{$k}{item}{$item} .= "a";
221                }
222                elsif ($item eq "tunic") {
223                    print "$k\'s $item named as Res0's Protectorate.\n";
224                    $rps{$k}{item}{$item} .= "b";
225                }
226                elsif ($item eq "amulet") {
227                    print "$k\'s $item named as Dwyn's Storm.\n";
228                    $rps{$k}{item}{$item} .= "c";
229                }
230                elsif ($item eq "weapon" && $rps{$k}{item}{$item} < 175) {
231                    print "$k\'s $item named as Jotun's Fury.\n";
232                    $rps{$k}{item}{$item} .= "d";
233                }
234                elsif ($item eq "weapon" && $rps{$k}{item}{$item} > 175 &&
235                       $rps{$k}{item}{$item} < 201) {
236                    print "$k\'s $item named as Drdink's Cane of Blind Rage.\n";
237                    $rps{$k}{item}{$item} .= "e";
238                }
239                else {
240                    print "$k has unknown unique of level ".
241                          "$rps{$k}{item}{$item}.\n";
242                }
243            }
244        }
245    }
246}
247
248do {
249    print "\nThere exist new items in version 3.0 that some of your clients ".
250          "may already have had the chance to find. I.E., there is a new item ".
251          "with a required level of 48. Simulate an item find for all users ".
252          "above 48 for this and other new items to make the game fair for ".
253          "older users? [yes]: ";
254    chomp($temp=<STDIN>);
255    $temp ||="yes";
256    $temp=lc($temp);
257} until ($temp eq "yes" || $temp eq "no");
258
259if ($temp eq "yes") {
260    for my $k (keys(%rps)) {
261        if ($rps{$k}{level} >= 48) {
262            for (48..$rps{$k}{level}) {
263                # approximately equal to normal item find, i believe
264                if (rand(100) < 2.25) {
265                    my $ulevel = 250+int(rand(51));
266                    if ($ulevel > int($rps{$k}{item}{"pair of boots"})) {
267                        print "$k found level $ulevel Mrquick's Magical Boots ".
268                              "of Swiftness.\n";
269                        $rps{$k}{item}{"pair of boots"} = $ulevel."f";
270                    }
271                }
272            }
273        }
274        if ($rps{$k}{level} >= 52) {
275            for (52..$rps{$k}{level}) {
276                # approximately equal to normal item find, i believe
277                if (rand(100) < 2.15) {
278                    my $ulevel = 300+int(rand(51));
279                    if ($ulevel > int($rps{$k}{item}{weapon})) {
280                        print "$k found level $ulevel Jeff's Cluehammer of ".
281                              "Doom.\n";
282                        $rps{$k}{item}{weapon} = $ulevel."g";
283                    }
284                }
285            }
286        }
287        if ($rps{$k}{level} >= 25) {
288            for (25..$rps{$k}{level}) {
289                # approximately equal to normal item find, i believe
290                if (rand(100) < 2.43) {
291                    my $ulevel = 50+int(rand(25));
292                    if ($ulevel > int($rps{$k}{item}{ring})) {
293                        print "$k found level $ulevel Juliet's Glorious Ring ".
294                              "of Sparkliness.\n";
295                        $rps{$k}{item}{ring} = $ulevel."h";
296                    }
297                }
298            }
299        }
300    }
301}
302
303for my $k (keys(%rps)) {
304    $rps{$k}{x} = int(rand(500));
305    $rps{$k}{y} = int(rand(500));
306    $rps{$k}{isadmin}=0;
307    $rps{$k}{alignment}="n";
308}
309
310print "\nUsernames that you would like to have admin status (separate with ".
311      "commas, use proper CaSe): ";
312chomp($temp=<STDIN>);
313$temp =~ s/\s//g;
314for my $k (split(/,/,$temp)) {
315    if (!exists($rps{$k})) {
316        print "\nError: Account name '$k' does not exist. Remember that ".
317              "account names are case sensitive. Skipping this username. Edit ".
318              "the database manually, or use the MKADMIN command after the ".
319              "bot connects to add this user.\n\n";
320    }
321    else {
322        print "$k is now admin.\n";
323        $rps{$k}{isadmin}=1;
324    }
325}
326print "\nYou can add more admins later with the MKADMIN command.\n";
327
328do {
329    print "\nWrite to new db file [irpg.db]: ";
330    chomp($temp=<STDIN>);
331    $temp ||= "irpg.db";
332} until (defined($temp));
333
334open(RPS,">$temp") or die "Cannot open $temp: $!";
335
336print RPS join("\t","# username",
337    "pass",
338    "is admin",
339    "level",
340    "class",
341    "next ttl",
342    "nick",
343    "userhost",
344    "online",
345    "idled",
346    "x pos",
347    "y pos",
348    "pen_mesg",
349    "pen_nick",
350    "pen_part",
351    "pen_kick",
352    "pen_quit",
353    "pen_quest",
354    "pen_logout",
355    "created",
356    "last login",
357    "amulet",
358    "charm",
359    "helm",
360    "boots",
361    "gloves",
362    "ring",
363    "leggings",
364    "shield",
365    "tunic",
366    "weapon",
367    "alignment")."\n";
368
369for my $k (keys(%rps)) {
370    print RPS join("\t",
371        $k,
372        $rps{$k}{pass},
373        $rps{$k}{isadmin},
374        $rps{$k}{level},
375        $rps{$k}{class},
376        $rps{$k}{next},
377        $rps{$k}{nick},
378        $rps{$k}{userhost},
379        $rps{$k}{online},
380        $rps{$k}{idled},
381        $rps{$k}{x},
382        $rps{$k}{y},
383        $rps{$k}{pen_mesg},
384        $rps{$k}{pen_nick},
385        $rps{$k}{pen_part},
386        $rps{$k}{pen_kick},
387        $rps{$k}{pen_quit},
388        $rps{$k}{pen_quest},
389        $rps{$k}{pen_logout},
390        $rps{$k}{created},
391        $rps{$k}{lastlogin},
392        $rps{$k}{item}{amulet},
393        $rps{$k}{item}{charm},
394        $rps{$k}{item}{helm},
395        $rps{$k}{item}{"pair of boots"},
396        $rps{$k}{item}{"pair of gloves"},
397        $rps{$k}{item}{ring},
398        $rps{$k}{item}{"set of leggings"},
399        $rps{$k}{item}{shield},
400        $rps{$k}{item}{tunic},
401        $rps{$k}{item}{weapon},
402        $rps{$k}{alignment})."\n";
403}
404close(RPS);
405
406do {
407    print "\nDone writing $temp! Thanks for your interest in the Idle RPG. May ".
408          "I send an (anonymous) user count to idlerpg.net? jotun is ".
409          "interested in knowing how many people play his game :^) [yes]: ";
410    chomp($temp=<STDIN>);
411    $temp||="yes";
412    $temp=lc($temp);
413} until ($temp eq "yes" || $temp eq "no");
414
415if ($temp eq "yes") {
416    print "Sending...\n";
417    my $sock = IO::Socket::INET->new(PeerAddr=>"jotun.ultrazone.org:80");
418    if ($sock) {
419        print $sock "GET /g7/count.php?converted=".scalar(keys(%rps)).
420                        " HTTP/1.1\r\n".
421                    "Host: jotun.ultrazone.org:80\r\n\r\n";
422        1 while <$sock>;
423    }
424    print "\nDone! Thanks a million! Enjoy Idle RPG. :^)\n";
425}
426else {
427    print "\nI'm setting your chance of evil HoG to 100%, then. Just kidding. ".
428          "Thanks anyway.\n";
429}
430
431sub loaddb { # load the players database
432  open(RPS,shift(@_)) or die("loaddb() failed: $!");
433  while (my $l=<RPS>) {
434    chomp $l;
435    next if $l =~ /^#/; # skip comments
436    my @i = split("\t",$l);
437    print Dumper @i if @i != 28;
438    die("Anomaly in loaddb(); line $. of database has wrong fields (".
439      scalar(@i).")") if @i != 28;
440    ($rps{$i[0]}{pass},
441    $rps{$i[0]}{level},
442    $rps{$i[0]}{class},
443    $rps{$i[0]}{next},
444    $rps{$i[0]}{nick},
445    $rps{$i[0]}{userhost},
446    $rps{$i[0]}{online},
447    $rps{$i[0]}{idled},
448    $rps{$i[0]}{pen_mesg},
449    $rps{$i[0]}{pen_nick},
450    $rps{$i[0]}{pen_part},
451    $rps{$i[0]}{pen_kick},
452    $rps{$i[0]}{pen_quit},
453    $rps{$i[0]}{pen_quest},
454    $rps{$i[0]}{pen_logout},
455    $rps{$i[0]}{created},
456    $rps{$i[0]}{lastlogin},
457    $rps{$i[0]}{item}{amulet},
458    $rps{$i[0]}{item}{charm},
459    $rps{$i[0]}{item}{helm},
460    $rps{$i[0]}{item}{"pair of boots"},
461    $rps{$i[0]}{item}{"pair of gloves"},
462    $rps{$i[0]}{item}{ring},
463    $rps{$i[0]}{item}{"set of leggings"},
464    $rps{$i[0]}{item}{shield},
465    $rps{$i[0]}{item}{tunic},
466    $rps{$i[0]}{item}{weapon}) = (@i[1..$#i]);
467  }
468  close RPS;
469}
Note: See TracBrowser for help on using the repository browser.