summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2013-04-06 13:14:47 +0200
committerPaul Buetow <paul@buetow.org>2013-04-06 13:14:47 +0200
commit630af0ed6c0af69c7df2e45aef7a87722a3c00c0 (patch)
treead76f850278b090f7e5c26561035d19c320400cc
parent2860b03f00e48264ed15c132ad90b240ebe6070b (diff)
tagging ychat-perl-legacyychat-perl-legacy
-rw-r--r--0.2.1/HTDOCS.PL219
-rw-r--r--0.2.1/INDEX.PL339
-rw-r--r--0.2.1/INSTALL.txt83
-rw-r--r--0.2.1/LIESMICH.txt24
-rw-r--r--0.2.1/bar.gifbin0 -> 231 bytes
-rw-r--r--0.2.1/config.pm296
-rw-r--r--0.2.1/help_html616
-rw-r--r--0.2.1/logs_html391
-rw-r--r--0.2.1/main.pl555
-rw-r--r--0.2.1/main2.pl502
-rw-r--r--0.2.1/push.pl85
-rw-r--r--0.2.1/unten.gifbin0 -> 662 bytes
-rw-r--r--0.2.1/yChat.jpgbin0 -> 50407 bytes
-rw-r--r--0.2.2/INSTALL.txt86
-rw-r--r--0.2.2/LIESMICH.txt24
-rw-r--r--0.2.2/UPDATES.txt22
-rw-r--r--0.2.2/bar.gifbin0 -> 231 bytes
-rw-r--r--0.2.2/config.pm313
-rw-r--r--0.2.2/help_html616
-rw-r--r--0.2.2/htdocs.pl223
-rw-r--r--0.2.2/index.pl354
-rw-r--r--0.2.2/logs_html391
-rw-r--r--0.2.2/main.pl497
-rw-r--r--0.2.2/main2.pl502
-rw-r--r--0.2.2/online.pl52
-rw-r--r--0.2.2/push.pl85
-rw-r--r--0.2.2/unten.gifbin0 -> 662 bytes
-rw-r--r--0.2.2/yChat.jpgbin0 -> 50407 bytes
-rw-r--r--0.2.3/INDEX.PL354
-rw-r--r--0.2.3/INSTALL.txt104
-rw-r--r--0.2.3/LIESMICH.txt24
-rw-r--r--0.2.3/UPDATES.txt31
-rw-r--r--0.2.3/bar.gifbin0 -> 231 bytes
-rw-r--r--0.2.3/config.pm321
-rw-r--r--0.2.3/help_html616
-rw-r--r--0.2.3/htdocs.pl222
-rw-r--r--0.2.3/logs_html391
-rw-r--r--0.2.3/main.pl497
-rw-r--r--0.2.3/main2.pl513
-rw-r--r--0.2.3/online.pl52
-rw-r--r--0.2.3/push.pl93
-rw-r--r--0.2.3/setup.sh42
-rw-r--r--0.2.3/unten.gifbin0 -> 662 bytes
-rw-r--r--0.2.3/yBanner.gifbin0 -> 5185 bytes
-rw-r--r--0.2.3/yChat.jpgbin0 -> 50407 bytes
-rw-r--r--0.2.4a/INSTALL.txt107
-rw-r--r--0.2.4a/LIESMICH.txt33
-rw-r--r--0.2.4a/TODO.txt32
-rw-r--r--0.2.4a/UPDATES.txt43
-rw-r--r--0.2.4a/bar.gifbin0 -> 231 bytes
-rw-r--r--0.2.4a/config.pm321
-rw-r--r--0.2.4a/help_html616
-rw-r--r--0.2.4a/htdocs.pl222
-rw-r--r--0.2.4a/index.pl354
-rw-r--r--0.2.4a/logs_html391
-rw-r--r--0.2.4a/main.pl498
-rw-r--r--0.2.4a/main2.pl513
-rw-r--r--0.2.4a/online.pl52
-rw-r--r--0.2.4a/push.pl96
-rw-r--r--0.2.4a/setup.sh42
-rw-r--r--0.2.4a/unten.gifbin0 -> 662 bytes
-rw-r--r--0.2.4a/yBanner.gifbin0 -> 5185 bytes
-rw-r--r--0.2.4a/yChat.jpgbin0 -> 50407 bytes
-rw-r--r--0.2.4c/INSTALL.txt107
-rw-r--r--0.2.4c/LIESMICH.txt33
-rw-r--r--0.2.4c/UPDATES.txt43
-rw-r--r--0.2.4c/bar.gifbin0 -> 231 bytes
-rw-r--r--0.2.4c/config.pm321
-rw-r--r--0.2.4c/help_html616
-rw-r--r--0.2.4c/htdocs.pl222
-rw-r--r--0.2.4c/index.pl354
-rw-r--r--0.2.4c/logs_html391
-rw-r--r--0.2.4c/main.pl560
-rw-r--r--0.2.4c/main2.pl561
-rw-r--r--0.2.4c/online.pl52
-rw-r--r--0.2.4c/push.pl96
-rw-r--r--0.2.4c/setup.sh42
-rw-r--r--0.2.4c/unten.gifbin0 -> 662 bytes
-rw-r--r--0.2.4c/yBanner.gifbin0 -> 5185 bytes
-rw-r--r--0.2.4c/yChat.jpgbin0 -> 50407 bytes
-rw-r--r--0.2.5a2/INSTALL.txt103
-rw-r--r--0.2.5a2/LIESMICH.txt45
-rw-r--r--0.2.5a2/TODO.txt27
-rw-r--r--0.2.5a2/UPDATES.txt75
-rw-r--r--0.2.5a2/bar.gifbin0 -> 231 bytes
-rw-r--r--0.2.5a2/config.pm320
-rw-r--r--0.2.5a2/help.sno54
-rw-r--r--0.2.5a2/htdocs.pl206
-rw-r--r--0.2.5a2/index.pl368
-rw-r--r--0.2.5a2/main.pl633
-rw-r--r--0.2.5a2/main2.pl571
-rw-r--r--0.2.5a2/online.pl56
-rw-r--r--0.2.5a2/push.pl97
-rw-r--r--0.2.5a2/setup.sh40
-rw-r--r--0.2.5a2/unten.gifbin0 -> 662 bytes
-rw-r--r--0.2.5a2/yBanner.gifbin0 -> 5185 bytes
-rw-r--r--0.2.5a2/yBanner2.gifbin0 -> 2105 bytes
-rw-r--r--0.2.5a2/yChat.jpgbin0 -> 50407 bytes
-rw-r--r--0.2.6a/INSTALL.txt106
-rw-r--r--0.2.6a/LIESMICH.txt45
-rw-r--r--0.2.6a/TODO.txt25
-rw-r--r--0.2.6a/UPDATES.txt91
-rw-r--r--0.2.6a/bar.gifbin0 -> 231 bytes
-rw-r--r--0.2.6a/config.pm321
-rw-r--r--0.2.6a/help.sno54
-rw-r--r--0.2.6a/htdocs.pl208
-rw-r--r--0.2.6a/index.pl369
-rw-r--r--0.2.6a/main.pl698
-rw-r--r--0.2.6a/main2.pl571
-rw-r--r--0.2.6a/online.pl56
-rw-r--r--0.2.6a/push.pl105
-rw-r--r--0.2.6a/setup.sh42
-rw-r--r--0.2.6a/yBanner.gifbin0 -> 5185 bytes
-rw-r--r--0.2.6a/yBanner2.gifbin0 -> 2105 bytes
-rw-r--r--0.2.6a/yChat.jpgbin0 -> 50407 bytes
-rw-r--r--0.4.0a/INSTALL.txt107
-rw-r--r--0.4.0a/LIESMICH.txt45
-rw-r--r--0.4.0a/TODO.txt24
-rw-r--r--0.4.0a/UPDATES.txt102
-rw-r--r--0.4.0a/bar.gifbin0 -> 231 bytes
-rw-r--r--0.4.0a/config.pm307
-rw-r--r--0.4.0a/help.sno56
-rw-r--r--0.4.0a/htdocs.pl195
-rw-r--r--0.4.0a/index.pl373
-rw-r--r--0.4.0a/main.pl739
-rw-r--r--0.4.0a/main2.pl576
-rw-r--r--0.4.0a/online.pl72
-rw-r--r--0.4.0a/push.pl97
-rw-r--r--0.4.0a/setup.sh42
-rw-r--r--0.4.0a/yBanner.gifbin0 -> 5185 bytes
-rw-r--r--0.4.0a/yBanner2.gifbin0 -> 2105 bytes
-rw-r--r--0.4.0a/yChat.jpgbin0 -> 50407 bytes
-rw-r--r--0.4.1/INSTALL.txt107
-rw-r--r--0.4.1/LIESMICH.txt45
-rw-r--r--0.4.1/TODO.txt24
-rw-r--r--0.4.1/UPDATES.txt111
-rw-r--r--0.4.1/bar.gifbin0 -> 231 bytes
-rw-r--r--0.4.1/colors.sno290
-rw-r--r--0.4.1/config.pm306
-rw-r--r--0.4.1/help.sno55
-rw-r--r--0.4.1/htdocs.pl195
-rw-r--r--0.4.1/index.pl376
-rw-r--r--0.4.1/main.pl737
-rw-r--r--0.4.1/main2.pl568
-rw-r--r--0.4.1/online.pl72
-rw-r--r--0.4.1/push.pl97
-rw-r--r--0.4.1/setup.sh42
-rw-r--r--0.4.1/yBanner.gifbin0 -> 5185 bytes
-rw-r--r--0.4.1/yBanner2.gifbin0 -> 2105 bytes
-rw-r--r--0.4.1/yChat.jpgbin0 -> 50407 bytes
-rw-r--r--0.4.2/CREDITS.txt26
-rw-r--r--0.4.2/README.txt33
-rw-r--r--0.4.2/SETUP.txt102
-rw-r--r--0.4.2/TODO.txt24
-rw-r--r--0.4.2/UPDATES.txt119
-rw-r--r--0.4.2/colors.sno290
-rw-r--r--0.4.2/config.pm307
-rw-r--r--0.4.2/help.sno55
-rw-r--r--0.4.2/htdocs.pl244
-rw-r--r--0.4.2/index.pl392
-rw-r--r--0.4.2/main.pl798
-rw-r--r--0.4.2/main2.pl568
-rw-r--r--0.4.2/online.pl72
-rw-r--r--0.4.2/push.pl97
-rw-r--r--0.4.2/setup.sh42
-rw-r--r--0.4.2/y.gifbin0 -> 5408 bytes
-rw-r--r--0.4.2/y_.gifbin0 -> 1518 bytes
-rw-r--r--0.4.3a/CREDITS.txt26
-rw-r--r--0.4.3a/README.txt35
-rw-r--r--0.4.3a/SETUP.txt102
-rw-r--r--0.4.3a/TODO.txt24
-rw-r--r--0.4.3a/UPDATES.txt136
-rw-r--r--0.4.3a/colors.sno290
-rw-r--r--0.4.3a/config.pm303
-rw-r--r--0.4.3a/help.sno58
-rw-r--r--0.4.3a/htdocs.pl221
-rw-r--r--0.4.3a/index.pl408
-rw-r--r--0.4.3a/main.pl899
-rw-r--r--0.4.3a/main2.pl601
-rw-r--r--0.4.3a/online.pl71
-rw-r--r--0.4.3a/ow7
-rw-r--r--0.4.3a/push.pl99
-rw-r--r--0.4.3a/setup.sh45
-rw-r--r--0.4.3a/y.gifbin0 -> 5408 bytes
-rw-r--r--0.4.3a/y_.gifbin0 -> 1518 bytes
-rw-r--r--0.4.4a3/CREDITS.txt22
-rw-r--r--0.4.4a3/README.txt36
-rw-r--r--0.4.4a3/SETUP.txt133
-rw-r--r--0.4.4a3/TODO.txt38
-rw-r--r--0.4.4a3/UPDATES.txt150
-rw-r--r--0.4.4a3/colors.sno290
-rw-r--r--0.4.4a3/config.pm245
-rw-r--r--0.4.4a3/help.sno57
-rw-r--r--0.4.4a3/htdocs.pl225
-rw-r--r--0.4.4a3/index.pl406
-rw-r--r--0.4.4a3/input.pl138
-rw-r--r--0.4.4a3/main.pl817
-rw-r--r--0.4.4a3/main2.pl594
-rw-r--r--0.4.4a3/online.pl71
-rw-r--r--0.4.4a3/push.pl96
-rw-r--r--0.4.4a3/setup.sh46
-rw-r--r--0.4.4a3/y.gifbin0 -> 5408 bytes
-rw-r--r--0.4.4a3/y_.gifbin0 -> 1518 bytes
-rw-r--r--0.4.5a/CREDITS.txt21
-rw-r--r--0.4.5a/README.txt36
-rw-r--r--0.4.5a/SETUP.txt133
-rw-r--r--0.4.5a/TODO.txt33
-rw-r--r--0.4.5a/UPDATES.txt162
-rw-r--r--0.4.5a/colors.sno290
-rw-r--r--0.4.5a/config.pm233
-rw-r--r--0.4.5a/help.sno57
-rw-r--r--0.4.5a/htdocs.pl240
-rw-r--r--0.4.5a/index.pl418
-rw-r--r--0.4.5a/input.pl121
-rw-r--r--0.4.5a/main.pl896
-rw-r--r--0.4.5a/main2.pl594
-rw-r--r--0.4.5a/online.pl71
-rw-r--r--0.4.5a/push.pl103
-rw-r--r--0.4.5a/setup.sh48
-rw-r--r--0.4.5a/y.gifbin0 -> 5408 bytes
-rw-r--r--0.4.5a/yIntro.swfbin0 -> 11367 bytes
-rw-r--r--0.4.5a/ySymbol.swfbin0 -> 9548 bytes
-rw-r--r--0.4.5a/y_.gifbin0 -> 1518 bytes
-rw-r--r--0.4.6/CREDITS.txt21
-rw-r--r--0.4.6/README.txt36
-rw-r--r--0.4.6/SETUP.txt136
-rw-r--r--0.4.6/TODO.txt33
-rw-r--r--0.4.6/UPDATES.txt177
-rw-r--r--0.4.6/colors.sno290
-rw-r--r--0.4.6/config.pm241
-rw-r--r--0.4.6/help.sno57
-rw-r--r--0.4.6/htdocs.pl240
-rw-r--r--0.4.6/index.pl418
-rw-r--r--0.4.6/input.pl121
-rw-r--r--0.4.6/main.pl903
-rw-r--r--0.4.6/main2.pl594
-rw-r--r--0.4.6/online.pl71
-rw-r--r--0.4.6/push.pl112
-rw-r--r--0.4.6/setup.sh50
-rw-r--r--0.4.6/y.gifbin0 -> 5408 bytes
-rw-r--r--0.4.6/yIntro.swfbin0 -> 11367 bytes
-rw-r--r--0.4.6/ySymbol.swfbin0 -> 9548 bytes
-rw-r--r--0.4.6/y_.gifbin0 -> 1518 bytes
-rw-r--r--0.4.7a2/CREDITS.txt30
-rw-r--r--0.4.7a2/README.txt24
-rw-r--r--0.4.7a2/SETUP.txt136
-rw-r--r--0.4.7a2/TODO.txt36
-rw-r--r--0.4.7a2/UPDATES.txt192
-rw-r--r--0.4.7a2/colors.sno290
-rw-r--r--0.4.7a2/config.pm247
-rw-r--r--0.4.7a2/help.sno57
-rw-r--r--0.4.7a2/htdocs.pl241
-rw-r--r--0.4.7a2/index.pl421
-rw-r--r--0.4.7a2/input.pl194
-rw-r--r--0.4.7a2/main.pl912
-rw-r--r--0.4.7a2/main2.pl594
-rw-r--r--0.4.7a2/online.pl71
-rw-r--r--0.4.7a2/push.pl112
-rw-r--r--0.4.7a2/setup.sh50
-rw-r--r--0.4.7a2/y.gifbin0 -> 5408 bytes
-rw-r--r--0.4.7a2/yIntro.swfbin0 -> 15455 bytes
-rw-r--r--0.4.7a2/ySymbol.swfbin0 -> 9548 bytes
-rw-r--r--0.4.7a2/y_.gifbin0 -> 1518 bytes
-rw-r--r--0.4.8a2/CREDITS.txt30
-rw-r--r--0.4.8a2/README.txt24
-rw-r--r--0.4.8a2/SETUP.txt137
-rw-r--r--0.4.8a2/TODO.txt33
-rw-r--r--0.4.8a2/UPDATES.txt215
-rw-r--r--0.4.8a2/colors.sno290
-rw-r--r--0.4.8a2/config.pm269
-rw-r--r--0.4.8a2/help.sno58
-rw-r--r--0.4.8a2/htdocs.pl241
-rw-r--r--0.4.8a2/index.pl426
-rw-r--r--0.4.8a2/input.pl197
-rw-r--r--0.4.8a2/main.pl945
-rw-r--r--0.4.8a2/main2.pl638
-rw-r--r--0.4.8a2/online.pl71
-rw-r--r--0.4.8a2/push.pl117
-rw-r--r--0.4.8a2/ranking.php480
-rw-r--r--0.4.8a2/setup.sh50
-rw-r--r--0.4.8a2/y.gifbin0 -> 5408 bytes
-rw-r--r--0.4.8a2/yIntro.swfbin0 -> 11367 bytes
-rw-r--r--0.4.8a2/ySymbol.swfbin0 -> 9548 bytes
-rw-r--r--0.4.8a2/y_.gifbin0 -> 1518 bytes
-rw-r--r--0.4.9/CREDITS.txt30
-rw-r--r--0.4.9/README.txt24
-rw-r--r--0.4.9/SETUP.txt139
-rw-r--r--0.4.9/TODO.txt32
-rw-r--r--0.4.9/UPDATES.txt227
-rw-r--r--0.4.9/away.gifbin0 -> 920 bytes
-rw-r--r--0.4.9/colors.sno290
-rw-r--r--0.4.9/config.pm322
-rw-r--r--0.4.9/help.sno58
-rw-r--r--0.4.9/htdocs.pl241
-rw-r--r--0.4.9/index.pl429
-rw-r--r--0.4.9/input.pl201
-rw-r--r--0.4.9/main.pl910
-rw-r--r--0.4.9/main2.pl640
-rw-r--r--0.4.9/online.pl84
-rw-r--r--0.4.9/ow.gifbin0 -> 984 bytes
-rw-r--r--0.4.9/push.pl122
-rw-r--r--0.4.9/rb.gifbin0 -> 971 bytes
-rw-r--r--0.4.9/setup.sh50
-rw-r--r--0.4.9/stat.pl207
-rw-r--r--0.4.9/wa.gifbin0 -> 986 bytes
-rw-r--r--0.4.9/y.gifbin0 -> 5408 bytes
-rw-r--r--0.4.9/yIntro.swfbin0 -> 11367 bytes
-rw-r--r--0.4.9/ySymbol.swfbin0 -> 9548 bytes
-rw-r--r--0.4.9/y_.gifbin0 -> 1518 bytes
-rw-r--r--0.6.0/CREDITS.txt33
-rw-r--r--0.6.0/README.txt24
-rw-r--r--0.6.0/SETUP.txt140
-rw-r--r--0.6.0/TODO.txt32
-rw-r--r--0.6.0/UPDATES.txt249
-rw-r--r--0.6.0/away.gifbin0 -> 920 bytes
-rw-r--r--0.6.0/chatiq.sno1
-rw-r--r--0.6.0/colors.sno290
-rw-r--r--0.6.0/config.pm314
-rw-r--r--0.6.0/help.sno60
-rw-r--r--0.6.0/htdocs.pl245
-rw-r--r--0.6.0/index.pl446
-rw-r--r--0.6.0/input.pl201
-rw-r--r--0.6.0/main.pl901
-rw-r--r--0.6.0/main2.pl618
-rw-r--r--0.6.0/online.pl138
-rw-r--r--0.6.0/ow.gifbin0 -> 984 bytes
-rw-r--r--0.6.0/push.pl120
-rw-r--r--0.6.0/rb.gifbin0 -> 971 bytes
-rw-r--r--0.6.0/setup.sh50
-rw-r--r--0.6.0/stat.pl208
-rw-r--r--0.6.0/wa.gifbin0 -> 986 bytes
-rw-r--r--0.6.0/y.gifbin0 -> 5408 bytes
-rw-r--r--0.6.0/yIntro.swfbin0 -> 11367 bytes
-rw-r--r--0.6.0/ySymbol.swfbin0 -> 9548 bytes
-rw-r--r--0.6.0/y_.gifbin0 -> 1518 bytes
-rw-r--r--0.6.1/CREDITS.txt33
-rw-r--r--0.6.1/README.txt24
-rw-r--r--0.6.1/SETUP.txt146
-rw-r--r--0.6.1/TODO.txt32
-rw-r--r--0.6.1/UPDATES.txt268
-rw-r--r--0.6.1/away.gifbin0 -> 920 bytes
-rw-r--r--0.6.1/chatiq.sno1
-rw-r--r--0.6.1/colors.sno290
-rw-r--r--0.6.1/config.pm329
-rw-r--r--0.6.1/help.sno60
-rw-r--r--0.6.1/htdocs.pl246
-rw-r--r--0.6.1/index.pl474
-rw-r--r--0.6.1/input.pl201
-rw-r--r--0.6.1/main.pl951
-rw-r--r--0.6.1/main2.pl619
-rw-r--r--0.6.1/online.pl125
-rw-r--r--0.6.1/ow.gifbin0 -> 209 bytes
-rw-r--r--0.6.1/push.pl112
-rw-r--r--0.6.1/rb.gifbin0 -> 199 bytes
-rw-r--r--0.6.1/setup.sh51
-rw-r--r--0.6.1/stat.pl209
-rw-r--r--0.6.1/wa.gifbin0 -> 212 bytes
-rw-r--r--0.6.1/y.gifbin0 -> 5408 bytes
-rw-r--r--0.6.1/yIntro.swfbin0 -> 11367 bytes
-rw-r--r--0.6.1/ySymbol.swfbin0 -> 9548 bytes
-rw-r--r--0.6.1/y_.gifbin0 -> 1518 bytes
-rw-r--r--0.6.2/CREDITS.txt33
-rw-r--r--0.6.2/README.txt29
-rw-r--r--0.6.2/SETUP.txt144
-rw-r--r--0.6.2/UPDATES.txt308
-rw-r--r--0.6.2/adm.gifbin0 -> 179 bytes
-rw-r--r--0.6.2/away.gifbin0 -> 141 bytes
-rw-r--r--0.6.2/chatiq.sno1
-rw-r--r--0.6.2/colors.sno290
-rw-r--r--0.6.2/config.pm333
-rw-r--r--0.6.2/help.sno62
-rw-r--r--0.6.2/htdocs.pl258
-rw-r--r--0.6.2/index.pl526
-rw-r--r--0.6.2/input.pl204
-rw-r--r--0.6.2/main.pl985
-rw-r--r--0.6.2/main2.pl624
-rw-r--r--0.6.2/online.pl133
-rw-r--r--0.6.2/ow.gifbin0 -> 209 bytes
-rw-r--r--0.6.2/push.pl116
-rw-r--r--0.6.2/rb.gifbin0 -> 199 bytes
-rw-r--r--0.6.2/stat.pl209
-rw-r--r--0.6.2/uvl.gifbin0 -> 192 bytes
-rw-r--r--0.6.2/wa.gifbin0 -> 212 bytes
-rw-r--r--0.6.2/yIntro.swfbin0 -> 15455 bytes
-rw-r--r--0.6.2/ySymbol.swfbin0 -> 9548 bytes
-rw-r--r--0.7.1/changeroom.pm81
-rw-r--r--0.7.1/chatiq.sno1
-rw-r--r--0.7.1/colors.sno290
-rw-r--r--0.7.1/commands784
-rw-r--r--0.7.1/commands.pm1016
-rw-r--r--0.7.1/config.pm44
-rw-r--r--0.7.1/help.sno75
-rw-r--r--0.7.1/hierachie.pm101
-rw-r--r--0.7.1/htdocs.pm220
-rw-r--r--0.7.1/input.pm195
-rw-r--r--0.7.1/loggedin.pm89
-rw-r--r--0.7.1/main1.pm57
-rw-r--r--0.7.1/main2.pm626
-rw-r--r--0.7.1/online.pm151
-rw-r--r--0.7.1/setup.sh18
-rw-r--r--0.7.1/shared.pm478
-rw-r--r--0.7.1/start.pm506
-rw-r--r--0.7.1/stat.pm206
-rw-r--r--0.7.1/stream.pm250
-rw-r--r--0.7.1/ychatd.pl109
-rw-r--r--0.7.2/config.pm42
-rw-r--r--0.7.2/modules/changeroom.pm69
-rw-r--r--0.7.2/modules/commands.pm784
-rw-r--r--0.7.2/modules/divcom.pm260
-rw-r--r--0.7.2/modules/hierachie.pm74
-rw-r--r--0.7.2/modules/htdocs.pm127
-rw-r--r--0.7.2/modules/input.pm14
-rw-r--r--0.7.2/modules/loggedin.pm37
-rw-r--r--0.7.2/modules/online.pm104
-rw-r--r--0.7.2/modules/postmessage.pm90
-rw-r--r--0.7.2/modules/shared.pm307
-rw-r--r--0.7.2/modules/start.pm254
-rw-r--r--0.7.2/modules/statistic.pm148
-rw-r--r--0.7.2/modules/stream.pm170
-rw-r--r--0.7.2/setup.sh18
-rw-r--r--0.7.2/templates/chatiq.sno1
-rw-r--r--0.7.2/templates/colors.sno290
-rw-r--r--0.7.2/templates/help.sno75
-rw-r--r--0.7.2/ychatd.pl59
-rw-r--r--0.7.6/config.pm42
-rw-r--r--0.7.6/gfx/adm-i.gifbin0 -> 164 bytes
-rw-r--r--0.7.6/gfx/adm.gifbin0 -> 179 bytes
-rw-r--r--0.7.6/gfx/away.gifbin0 -> 141 bytes
-rw-r--r--0.7.6/gfx/ow-i.gifbin0 -> 191 bytes
-rw-r--r--0.7.6/gfx/ow.gifbin0 -> 209 bytes
-rw-r--r--0.7.6/gfx/rb.gifbin0 -> 199 bytes
-rw-r--r--0.7.6/gfx/twa.gifbin0 -> 255 bytes
-rw-r--r--0.7.6/gfx/unten.gifbin0 -> 662 bytes
-rw-r--r--0.7.6/gfx/uvl.gifbin0 -> 192 bytes
-rw-r--r--0.7.6/gfx/wa-i.gifbin0 -> 205 bytes
-rw-r--r--0.7.6/gfx/wa.gifbin0 -> 212 bytes
-rw-r--r--0.7.6/gfx/yIntro.swfbin0 -> 15455 bytes
-rw-r--r--0.7.6/gfx/ySymbol.swfbin0 -> 9548 bytes
-rw-r--r--0.7.6/modules/changeroom.pm67
-rw-r--r--0.7.6/modules/commands.pm870
-rw-r--r--0.7.6/modules/divcom.pm266
-rw-r--r--0.7.6/modules/hierachie.pm77
-rw-r--r--0.7.6/modules/htdocs.pm127
-rw-r--r--0.7.6/modules/input.pm14
-rw-r--r--0.7.6/modules/loggedin.pm41
-rw-r--r--0.7.6/modules/online.pm148
-rw-r--r--0.7.6/modules/postmessage.pm90
-rw-r--r--0.7.6/modules/shared.pm338
-rw-r--r--0.7.6/modules/start.pm252
-rw-r--r--0.7.6/modules/statistic.pm148
-rw-r--r--0.7.6/modules/stream.pm170
-rw-r--r--0.7.6/modules/webchat.pm22
-rw-r--r--0.7.6/setup.sh18
-rw-r--r--0.7.6/templates/chatiq.sno1
-rw-r--r--0.7.6/templates/colors.sno290
-rw-r--r--0.7.6/templates/help.sno79
-rw-r--r--0.7.6/ychatd.pl60
-rw-r--r--0.8.0/INSTALL.txt63
-rwxr-xr-x0.8.0/config.pm43
-rwxr-xr-x0.8.0/modules/changeroom.pm67
-rwxr-xr-x0.8.0/modules/commands.pm867
-rwxr-xr-x0.8.0/modules/divcom.pm288
-rwxr-xr-x0.8.0/modules/hierachie.pm77
-rwxr-xr-x0.8.0/modules/htdocs.pm127
-rwxr-xr-x0.8.0/modules/input.pm14
-rwxr-xr-x0.8.0/modules/loggedin.pm41
-rwxr-xr-x0.8.0/modules/online.pm167
-rwxr-xr-x0.8.0/modules/postmessage.pm90
-rwxr-xr-x0.8.0/modules/shared.pm353
-rwxr-xr-x0.8.0/modules/start.pm264
-rwxr-xr-x0.8.0/modules/statistic.pm148
-rwxr-xr-x0.8.0/modules/stream.pm170
-rwxr-xr-x0.8.0/modules/webchat.pm22
-rwxr-xr-x0.8.0/setup.sh18
-rwxr-xr-x0.8.0/templates/chatiq.sno1
-rwxr-xr-x0.8.0/templates/colors.sno290
-rwxr-xr-x0.8.0/templates/help.sno79
-rwxr-xr-x0.8.0/yC-web-docs/adm-i.gifbin0 -> 164 bytes
-rwxr-xr-x0.8.0/yC-web-docs/adm.gifbin0 -> 179 bytes
-rwxr-xr-x0.8.0/yC-web-docs/away.gifbin0 -> 141 bytes
-rwxr-xr-x0.8.0/yC-web-docs/blank.gifbin0 -> 824 bytes
-rwxr-xr-x0.8.0/yC-web-docs/ow-i.gifbin0 -> 191 bytes
-rwxr-xr-x0.8.0/yC-web-docs/ow.gifbin0 -> 209 bytes
-rwxr-xr-x0.8.0/yC-web-docs/rb.gifbin0 -> 199 bytes
-rwxr-xr-x0.8.0/yC-web-docs/twa.gifbin0 -> 255 bytes
-rwxr-xr-x0.8.0/yC-web-docs/uvl.gifbin0 -> 192 bytes
-rwxr-xr-x0.8.0/yC-web-docs/wa-i.gifbin0 -> 205 bytes
-rwxr-xr-x0.8.0/yC-web-docs/wa.gifbin0 -> 212 bytes
-rwxr-xr-x0.8.0/yC-web-docs/yIntro.swfbin0 -> 15455 bytes
-rwxr-xr-x0.8.0/yC-web-docs/ySymbol.swfbin0 -> 9548 bytes
-rwxr-xr-x0.8.0/ychatd.pl94
-rwxr-xr-x0.8.1/config.pm43
-rwxr-xr-x0.8.1/data/hierachie12
-rwxr-xr-x0.8.1/modules/changeroom.pm67
-rwxr-xr-x0.8.1/modules/commands.pm867
-rwxr-xr-x0.8.1/modules/divcom.pm288
-rwxr-xr-x0.8.1/modules/hierachie.pm77
-rwxr-xr-x0.8.1/modules/htdocs.pm127
-rwxr-xr-x0.8.1/modules/input.pm14
-rwxr-xr-x0.8.1/modules/loggedin.pm41
-rw-r--r--0.8.1/modules/nohup.out2
-rwxr-xr-x0.8.1/modules/online.pm167
-rwxr-xr-x0.8.1/modules/postmessage.pm90
-rwxr-xr-x0.8.1/modules/shared.pm353
-rwxr-xr-x0.8.1/modules/start.pm264
-rwxr-xr-x0.8.1/modules/statistic.pm148
-rwxr-xr-x0.8.1/modules/stream.pm170
-rwxr-xr-x0.8.1/modules/webchat.pm22
-rwxr-xr-x0.8.1/modules/ychatd.pl94
-rwxr-xr-x0.8.1/setup.sh19
-rwxr-xr-x0.8.1/templates/chatiq.sno1
-rwxr-xr-x0.8.1/templates/colors.sno290
-rwxr-xr-x0.8.1/templates/help.sno79
-rwxr-xr-x0.8.1/ychatd.pl94
514 files changed, 85995 insertions, 0 deletions
diff --git a/0.2.1/HTDOCS.PL b/0.2.1/HTDOCS.PL
new file mode 100644
index 0000000..cc2ae41
--- /dev/null
+++ b/0.2.1/HTDOCS.PL
@@ -0,0 +1,219 @@
+#!/usr/bin/perl -w
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+if ($var eq "help_html") {
+ &printfile("data/htdocs/help_html","Alle Chatbefehle");
+} elsif ($var eq "menu_html") {
+ &menu_html;
+} elsif ($var eq "werda_html") {
+ &werda_html;
+} elsif ($var eq "logs_html") {
+ &logs_html;
+} elsif ($var eq "view_sulogs_html") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ &start_html("Oberwächter-Logdateien");
+ print "<div><a href=\"push.pl?alias=$alias&tmp=$tmp&var=push_logs_html\">Push</a><hr>";
+ &printfile($tmp);
+ print "</div></body></html>";
+ }
+} elsif ($var eq "view_logs_html") {
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ &printfile($tmp,$tmp,"log");
+ }
+} elsif ($var eq "superuser_html") {
+ &superuser_html;
+} else {
+ print
+ $q->start_html(-bgcolor=>"000000"),
+ $q->end_html;
+}
+
+sub menu_html {
+ if ($tmp eq "quit") {
+ print
+ $q->script( { -language=>"JavaScript" }, "window.open(\"index.pl?tmp=quit\",\"_top\")" );
+ sleep 1;
+ &remove_online($alias);
+ &secure_removeip($alias);
+ unlink("data/msgs/$alias");
+ }
+ &start_html("Menü","menu");
+print <<END;
+ <center>
+ <div>
+ [<a href="htdocs.pl?var=werda_html&alias=$alias&room=$room&col=$col&secol=$secol&&tmp=$tmp" target="werda">Wer ist da?</a>]
+ [<a href="main2.pl?var=alias_html&alias=$alias&tmp=$alias" target="DeinProfil">Dein Profil</a>]
+ [<a href="main2.pl?var=edit_profile_html&alias=$alias" target="ProfilAendern">Profil ändern</a>]
+ [<a href="main2.pl?var=edit_options_html&alias=$alias" target="main">Chat-Optionen</a>]
+ [<a href="main2.pl?var=list_alias_html&alias=$alias" target="Benutzerliste">Benutzerliste</a>]
+ [<a href="htdocs.pl?var=help_html" target="Befehle">Chat-Befehle</a>]
+ [<a href="main2.pl?var=gb_html&alias=$alias" target="Board">Benutzerboard</a>]
+ [<a href="htdocs.pl?var=superuser_html&alias=$alias" target="Hirachie">Superuser</a>]
+ [<a href="htdocs.pl?var=logs_html&alias=$alias" target="Logdateien">Logdateien</a>]
+ [<a href="push.pl?alias=$alias&room=$room&var=clear_screen" target="main">Weiterchatten</a>]
+ [<a href="htdocs.pl?var=menu_html&tmp=quit&alias=$alias">Chat verlassen</a>]
+ </div>
+ </center>
+</body>
+</html>
+END
+}
+
+
+sub werda_html { # Anzeige, wer eingelogt ist.
+ &start_html("Wer ist da?");
+ print <<END;
+<div>
+ $alias, schön daß Du hier bist :-)
+</div>
+<hr>
+<div>
+ Folgende Personen befinden sich im Chat:
+</div>
+<br>
+<div>
+END
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ my $room = $_;
+ &list_dir("data/online/rooms/$room",2);
+ local $nr = $#dir2-1;
+ print $q->b( $_ ),
+ "($nr)",
+ $q->br;
+ foreach(@dir2) {
+ if ($_ ne ".." && $_ ne ".") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_" }, "$_"), " ";
+ }
+ }
+ print $q->br, $q->br;
+ }
+ }
+ print
+ "</div>",
+ $q->end_html;
+}
+
+sub logs_html {
+ &secure_checkip($alias);
+ &start_html("Logdateien");
+ print <<END;
+<div>
+ Hier befinden sich alle Logdateien
+</div>
+<hr>
+END
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ if ($hirachie eq "ow") {
+ print $q->div( "Folgende Logdateien können nur von Oberwächtern (OW) gelesen werden" );
+ &printfile("data/htdocs/logs_html");
+ &list_dir("data/logs/ow");
+ my @sortedir = sort(@dir);
+ foreach(@sortedir) {
+ if (-f "data/logs/ow/$_") {
+ print $q->a( { -href=>"htdocs.pl?var=view_sulogs_html&alias=$alias&tmp=data/logs/ow/$_",
+ -target=>$_},
+ "$_" ).
+ " ",
+ }
+ }
+ print $q->hr;
+ }
+ print $q->div( "Folgende Logdateien können nur von Wächtern und Oberwächtern gelesen werden (Sortiert nach A-Z, a-z):" ),
+ $q->br;
+ &list_dir("data/logs");
+ my @sortedir = sort(@dir);
+ foreach(@sortedir) {
+ if (-f "data/logs/$_") {
+ print $q->a( { -href=>"htdocs.pl?alias=$alias&var=view_logs_html&tmp=data/logs/$_",
+ -target=>"_new" },
+ "$_" ),
+ " ";
+ }
+ }
+ if ($hirachie eq "wa") {
+ print $q->hr,
+ $q->div( "Oberwächter können zusätzlich die Systemlogdateien lesen. Du bist allerdings ein \"Wächter\" und ",
+ " bist nicht dazu berechtigt " ),
+ $q->br;
+ &printfile("data/htdocs/logs_html");
+ }
+ } else {
+ print $q->div( "Logdateien können nur von Oberwächtern (OW) und von Wächtern (WÄ) gelesen werden. Du bist jedoch ein ",
+ "\"Normaler Chatter\". Wächter können alles nachlesen, was öffentlich gechattet wurde. Oberwächter ",
+ "können folgende Systemlogdateien zusätzlich lesen:" ),
+ $q->hr;
+ &printfile("data/htdocs/logs_html");
+ }
+ print
+ $q->end_html;
+}
+
+sub superuser_html { # Zeigt an, wer Superuser ist
+ &start_html("Superuser");
+ print "<div>Hallo $alias. Du bist als ";
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ print
+ $q->b( "Oberwächter" ),
+ " (OW) eingetragen.</div>",
+ $q->hr;
+ } elsif ( $hirachie eq "wa") {
+ print
+ $q->b( "Wächter" ),
+ " (WÄ) eingetragen.</div>",
+ $q->hr;
+ } else {
+ print
+ $q->b( "normaler Chatter" ),
+ " (NC) eingetragen.</div>",
+ $q->hr;
+ }
+ my $nrow = $#ows+1;
+ print
+ "<div>",
+ $q->b( "OW" ),
+ "s ($nrow Stück)";
+ foreach(@ows) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+ my $nrwa = $#was+1;
+ print
+ "</div>",
+ $q->hr,
+ "<div>",
+ $q->b( "WÄ" ),
+ "s ($nrwa Stück)";
+ foreach(@was) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+print <<END;
+<hr>
+ Die jeweiligen Fähigkeiten der Oberwächter (OW) und der Wächter (WÄ) sind unter
+ "<a href="htdocs.pl?var=help_html">Chat-Befehle</a>"
+ dokumentiert.
+</div>
+</body>
+</html>
+END
+} \ No newline at end of file
diff --git a/0.2.1/INDEX.PL b/0.2.1/INDEX.PL
new file mode 100644
index 0000000..1533656
--- /dev/null
+++ b/0.2.1/INDEX.PL
@@ -0,0 +1,339 @@
+#!/usr/bin/perl -w
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header; # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUFGERUFEN WERDEN?##
+#####################################
+if ($var eq "create_alias_html") {
+ &create_alias_html;
+} elsif ($var eq "create_alias") {
+ &create_alias;
+} elsif ($var eq "login_html") {
+ &login_html;
+} elsif ($alias eq "") {
+ &login_html;
+} else {
+ &checklogin;
+}
+
+sub login_html { # Erste Startseite
+local $counter = undef;
+&read_file("data/count");
+ $counter = <DATEI>;
+close DATEI;
+$counter++;
+&write_file_new("data/count");
+ print DATEI $counter;
+close DATEI;
+&start_html("Created by Paul C. Bütow 2k");
+print <<END;
+ <center>
+ <table width=400>
+ <tr>
+ <td>
+ <b>
+ <div>
+ $title
+ <img src="$gfxpath/yChat.jpg">
+ </div>
+ </b>
+END
+ if ($tmp eq "true") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Wahrscheinlich existiert Dein Alias "$alias" nicht,
+ <br>
+ Du hast Dich verschrieben oder das Passwort ist falsch.
+ <br>
+ Versuch es erneuert !
+ </div>
+END
+ } elsif ($tmp eq "quit") {
+print <<END;
+ <div>
+ Du hast soeben den Chat verlassen.
+ <br>
+ Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ } elsif ($tmp eq "banned") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein Alias "$alias" wurde verbannt.
+ <br>
+ Z.z. kannst Du Dich leider nicht in den Chat einloggen.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($tmp eq "kick") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wurdest soeben aus dem Chat katapultiert!
+ <br>
+ Schlechtes Verhalten mag die Ursache hierfür sein.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($var eq "create_alias") {
+print "<div>Du hast sich soeben in die Datenbank eingetragen. Einfach auf \"Los Geht's\" klicken :-)</div>";
+ } else {
+print <<END;
+ <div>
+ Herzlich willkommen!
+ <br>
+ Einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ &log("system","\"first_http_ok\"");
+ }
+print <<END;
+ <hr>
+ <form action="index.pl">
+ <input type="hidden" name="tmp" value="true">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Alias:
+ <br>
+ <input name="alias" value="$alias">
+ </div>
+ </td>
+ <td>
+ <div>
+ Dein Passwort:
+ <br>
+ <input type="password" name="id" value="$id">
+ </div>
+ </td>
+ </tr>
+ </table>
+ <br>
+ <br>
+ <div>
+ Solltest Du noch keinen Nick besitzen, dann auf "Registrieren" klicken!
+ </div>
+ <br>
+ <table>
+ <tr>
+ <td>
+ <font color="ffffff">
+ <input type="submit" value="Los geht's!">
+ </font>
+ </form>
+ </td>
+ <td>
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias_html">
+ <font color="ffffff">
+ <input type="submit" value="Registrieren">
+ </font>
+ </form>
+ </td>
+ </tr>
+ </table>
+ <hr>
+ <div>
+ yChat befindet sich momentan noch in der Entwicklungsphase !
+ <br>
+ Fragen gehen an Paul Bütow (
+ <a href="mailto:paul\@buetow.oxg.de">
+ paul\@buetow.oxg.de
+ </a>
+ ) :-)
+ <br>
+ <br>
+ Diese Seite wurde schon $counter mal aufgerufen.
+ </td>
+ </tr>
+ </table>
+ </center>
+</body>
+</html>
+END
+}
+
+
+sub create_alias_html { # HTML-Form für Erstellung eines neuen Benutzers.
+my $reload = $_[0];
+&start_html("Registration");
+print <<END;
+ <center>
+ <table width=400>
+ <tr>
+ <td>
+END
+ if ($reload eq "alias_exists") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Der von Dir gewählte Benutzername "$alias" existiert in unserer Datenbank bereits. Bitte versuch es erneuert mit
+ einem anderen Benutzernamen !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "pw_wrong") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Deine beiden Passworteingaben stimmen nicht überein. Bitte geb das Passwort erneuert an um sicherzugehen, daß
+ kein falsches Passwort abgespeichert wird !
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Hier kannst Du Dich registrieren. Bitte beachte, daß die Passworteingabefelder übereinstimmen!
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias">
+ <div>
+ Dein Alias:
+ <font color="ffa500">
+ (Muß angegeben werden)
+ </font>
+ <br>
+ <input name="alias" VALUE="$alias">
+ </div>
+ <br>
+ <div>
+ Dein gewünschtes Passwort:
+ <br>
+ <input type="password" name="id" value="$id">
+ </div>
+ <br>
+ <div>
+ Geb hier Dein Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp">
+ </div>
+ <br>
+ <font color=ffffff>
+ <input type="submit" value="Registrieren">
+ </font>
+ <br>
+ </form>
+ <hr>
+ <div>
+ Um den Chat zu betreten müssen die Daten nach der Registration auf der Startseite erneuert bestätigt werden !
+ </div>
+ </td>
+ </tr>
+ </table>
+</center>
+</body>
+</html>
+END
+}
+
+sub checklogin { # Überprüfen, ob die Login-Daten korrekt sind.
+ my $lognotexists = "true";
+ &list_dir("data/user/options");
+ for (my $i=0; $i<=$#dir; $i++) {
+ if ($dir[$i] eq $alias) {
+ &read_file("data/user/options/$alias");
+ @datei = <DATEI>;
+ close DATEI;
+ chomp($datei[0]);
+ if ($datei[0] eq $id) {
+ &read_file("data/ban"); # Überprüfen, ob Alias verbannt ist
+ @banned = <DATEI>;
+ close DATEI;
+ foreach(@banned) {
+ if ($_ eq "$alias\n") {
+ &log("system","\"login_alias_banned\"");
+ $tmp = "banned";
+ &login_html();
+ exit;
+ }
+ }
+ $col = $datei[1];
+ $secol = $datei[2];
+ &secure_setip($alias);
+ &frameset_html;
+ exit;
+ } else {
+ &log("system","\"login_pw_wrong\"");
+ $lognotexists = "false";
+ }
+ }
+ }
+ if ($lognotexists eq "true") {
+ &log("system","\"login_alias_notexists\"");
+ }
+ &login_html; # Falls Login-Daten inkorrekt sind, zurück zur Startseite.
+}
+
+sub create_alias { # Erstellung eines neuen Benutzers.
+ if ($alias =~ /[\W]/ || $alias eq "") {
+ &log("system","\"reg_alias_prohibited\"");
+ &create_alias_html("alias_prohibited");;
+ exit;
+ } elsif ($id ne $tmp) {
+ &log("system","\"reg_pw_wrong\"");
+ &create_alias_html("pw_wrong");
+ exit;
+ }
+ &list_dir("data/user/options");
+ for (my $i=0; $i<=$#dir; $i++) {
+ if ($dir[$i] eq $alias) {
+ &log("system","\"reg_alias_exists\"");
+ &create_alias_html("alias_exists");
+ exit;
+ }
+ }
+ &write_file_new("data/user/options/$alias");
+ print DATEI $id."\n";
+ close DATEI;
+ &zeit;
+ &list_dir("data/user/options");
+ my $number = $#dir-1;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias [$number] hat sich soeben als neuer Benutzer registriert :-) ...</font></i>");
+ &log("system","\"reg_ok\"");
+ &login_html;
+}
+
+sub frameset_html {
+print <<END;
+<html>
+ <head>
+ <title>
+ $title - Created by Paul C. Bütow 2k
+ </title>
+ </head>
+<frameset border=0 frameborder=0 framespacing=0 rows="50,1,*,55">
+ <frame name="menu" src="htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol" scrolling="no">
+ <frame name="inroom" src="main.pl?var=inroom_html&alias=$alias&room=$room" scrolling="no">
+ <frame name="main" src="push.pl?room=$room&alias=$alias&var=clear_screen">
+ <frame name="input" src="main.pl?alias=$alias&var=input_html&room=$room&col=$col&secol=$secol&tmp=login" scrolling="no">
+</frameset>
+</html>
+END
+}
diff --git a/0.2.1/INSTALL.txt b/0.2.1/INSTALL.txt
new file mode 100644
index 0000000..16cfd0a
--- /dev/null
+++ b/0.2.1/INSTALL.txt
@@ -0,0 +1,83 @@
+#############################################################################
+## yChat.de Version 0.2.1 by CXG.de: The chatters of the next generation ##
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+yChat findest Du im Internet unter der Adresse www.yChat.de. Bei Kritik,
+Anregungen oder Fragen bitte in das dort vorhandene Board posten oder eine
+E-Mail an die oben stehende Adresse senden. Ich bemühe mich, yChat so gut wie
+möglich zu machen und bin über Ratschläge immer sehr erfreut :-) ...
+
+Folgende Basis-Dateien sind im Chat enthalten und müssen in das cgi-bin
+Verzeichnis kopiert werden. Z.B. nach ./cgi-bin/yChat/:
+
+config.pm => 500 Configurationsdatei ("Shared subs")
+htdocs.pl => 101 HTML-Dokumentdateien (Nicht unbedingt erforderlich)
+index.pl => 101 Startskript (Registrierung, Frameset, Login, Daten edit.)
+main.pl => 101 Hauptskript (Alle Hauptfunktionen des Chats)
+main2.pl => 101 Skript für editieren der Benutzerdaten etc.
+push.pl => 101 Server-Push-Routine
+LIESMICH.txt => Beinhaltet wichtige Informationen
+INSTALL.txt => Dieses Dokument
+
+Folgende Verzeichnisse müssen erstellt werden (chmod 777 sollte
+funktionieren):
+
+- Hier befinden sich alle für den Chat notwenidgen Daten:
+ ./cgi-bin/yChat/data/*
+
+- Hier befinden sich alle für den Chat notwendigen HTML-Dokumente:
+ ./cgi-bin/yChat/data/htdocs/*
+
+ Folgende Dateien müssen in das "data/htdocs" verzeichnis bewegt werden:
+
+ help_html => 101 Hilfedatei
+ logs_html => 101 Logbeschreibung
+
+- Hier befinden sich alle Logdateien, die vom Chat erstellt werden:
+ ./cgi-bin/yChat/data/logs/*
+
+- Hier befinden sich die Message-Dateien der eingelogten Benutzer:
+ ./cgi-bin/yChat/data/msgs/*
+
+- Hier befinden sich alle Daten der registrierten Benutzer:
+ ./cgi-bin/yChat/data/user/*
+
+- Hier befinden sich alle Chat-Optionen und Passwörter der registrierten
+ Benutzer:
+ ./cgi-bin/yChat/data/user/options/*
+
+- Hier befinden sich alle Benutzerprofile der Benutzer:
+ ./cgi-bin/yChat/data/user/profiles/*
+
+- Hier befinden sich alle Gästebucheinträge der Benutzer:
+ ./cgi-bin/yChat/data/user/gbooks/*
+
+- Hier befinden sich alle Daten zu den aktuellen Chaträumen und User die online sind
+ ./cgi-bin/yChat/data/online/*
+
+- Hier befinden sich alle offnenen Räume
+ ./cgi-bin/yChat/data/online/rooms/*
+
+- Hier befinden sich die Chatter, die sich in den jew. Räumen befinden
+ ./cgi-bin/yChat/data/online/rooms/RAUMNAME/*
+
+- Hier befinden sich alle Chatter, die sich z.Z. im System befinden
+ ./cgi-bin/yChat/data/online/users/*
+
+- Hier befinden sich alle IP-Nummern der eingelogten Chatter
+ ./cgi-bin/yChat/data/online/ident/*
+
+Folgende GRafikdateien sollten in ein nicht-CGI-BIN-Verzeichnis kopiert werden. Z.B.
+nach ./yChat/
+
+ bar.gif => Der gelb gestreifte Rand auf den meisten Seiten
+ unten.gif => Der Hintergrund für das Eingabeformular im Chat
+ yChat.gif => Das yChat-Logo auf der Startseite
+
+Zum schluß sollte die config.pm-Datei nach wünschen editiert werden. Allerdings sollten
+die Copyright Hinweise und die Versionsnummern nicht manipuliert werden.
+
+Folgende Dateien werden von yChat automatisch erstellt:
+
+Viel Spaß beim Chatten ...
+ Snooper \ No newline at end of file
diff --git a/0.2.1/LIESMICH.txt b/0.2.1/LIESMICH.txt
new file mode 100644
index 0000000..93db3ce
--- /dev/null
+++ b/0.2.1/LIESMICH.txt
@@ -0,0 +1,24 @@
+#############################################################################
+## yChat.de Version 0.2.1 by CXG.de: The chatters of the next generation ##
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+Hallo Du,
+vielen Dank, daß Du Dir die Zeit nimmst, dieses Dokument sorgfältig zu
+lesen. Die grundliegende Idee von yChat.de ist die, ein funktionsfähiges,
+einfach zu bedienendes und zu installierendes Chat-System zu bieten. yChat
+ist keineswegs Free- oder Shareware und darf somit NICHT ohne die Erlaubnis
+vom Autor weitergegeben oder kopiert werden.
+Diejenigen, die dazu befugt sind, yChat vom eigenen Server aus zu betreiben,
+dürfen keineswegs die Copyright-Hinweise des Systems so manipulieren, daß
+diese für den Besucher nicht mehr ersichtlich sind.
+Weitergabe des yChat-Systems darf nur durch Einwilligung des Autors
+durchgeführt werden. Dies geschieht nur gegen entsprechende Gegenleistungen
+wie z.B. Bannerwerbung für www.yChat.de auf viel Besuchten Seiten (
+Seitenbesuche müssen nachgewiesen werden ), Werbung in vielgelesenen
+Newslettern o.Ä. . Allerdings sollte dem Autor vorher um Erlaubnis geboten
+werden. Gegen Geld ist das yChat-System noch nicht zu haben. Allerdings
+wird der Preis in etwa DM 500,- betragen. Für Fragen und Antworten bitte an
+die obrige E-Mail Adresse wenden.
+Installationshinweise findest Du in der datei INSTALL.txt
+MfG
+Paul C. Bütow aka Snooper
diff --git a/0.2.1/bar.gif b/0.2.1/bar.gif
new file mode 100644
index 0000000..61d02b7
--- /dev/null
+++ b/0.2.1/bar.gif
Binary files differ
diff --git a/0.2.1/config.pm b/0.2.1/config.pm
new file mode 100644
index 0000000..3baeb56
--- /dev/null
+++ b/0.2.1/config.pm
@@ -0,0 +1,296 @@
+########################### Dieser Teil bestimmt die Standart-Variabeln.
+##STANDART-CONFIGURATION:## (CSS, Farben, Version etc.)
+###########################
+
+$alias = $q->param("alias");
+$var = $q->param("var");
+$room = $q->param("room");
+$col = $q->param("col");
+$secol = $q->param("secol");
+$msg = $q->param("msg");
+$tmp = $q->param("tmp");
+$id = $q->param("id");
+$room = "Cyberbar" if ($room eq "");
+$col = "ffffef" if ($col eq "");
+$secol = "ffffef" if ($secol eq "");
+$datum = "20.11.2k";
+$version = "0.2.1";
+$title = "yChat.de ($version)";
+$gfxpath = "http://localhost/yChat/";
+#$gfxpath = "../../gfx/";
+$style = <<ENDCSS;
+<style rel="stylesheet" type="text/css">
+ body { background-image: url("$gfxpath/bar.gif"); background-color: 000000 }
+ body.menu { background-image: none }
+ body.log { background-color: 000000 }
+ div { font-family: arial, verdana, helvetiva; font-size: 10pt; color: ffffff }
+ div.b { font-weight: bold; color: ffa500 }
+ a { color: ffffef }
+ a:hover { color: ffffff; text-decoration: none }
+</style>
+ENDCSS
+
+############### Dieser Teil enthält Programmcode, der an verschiedenen
+##SHARED-SUBS## Stellen ausgeführt werden muß und jedem Skript zur
+############### Verfügung steht.
+
+sub printfile { # Liest eine externe Datei ein und gibt sie mit print aus
+ my ($file2print,$pagetitle,$bodyclass) = @_;
+ if ($pagetitle ne "") {
+ &start_html($pagetitle,$bodyclass);
+ }
+ print "<div><a href=\"push.pl?alias=$alias&tmp=$tmp&var=push_logs_html\">Push</a></div><hr>" if ($bodyclass eq "log");
+ &read_file($file2print);
+ @file2print = <DATEI>;
+ close DATEI;
+ print @file2print;
+}
+
+
+sub start_html { # Der HEADER einer HTML-Datei
+print <<END;
+<html>
+ <head>
+ <title>
+ $title - $_[0]
+ </title>
+ $style
+ </head>
+END
+ if ($_[1] ne "") {
+ print "<body class=$_[1]>";
+ } else {
+ print "<body>";
+ }
+}
+
+sub post { # Öffentliche Nachricht im aktuellen Raum $room posten.
+ my ($msg2post,$secroom) = @_;
+ my @rooms = ($room,$secroom);
+ foreach(@rooms) {
+ my $room2post = $_;
+ &list_dir("data/online/rooms/$room2post");
+ foreach(@dir) {
+ my $alias2post = $_;
+ if (-f "data/online/rooms/$room2post/$alias2post") {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+ }
+ }
+ }
+ &log("msg","$msg2post");
+}
+
+
+sub post_all { # Öffentliche Nachricht in ALLEN Räumen gleichzeitig posten.
+ my $msg2post = $_[0];
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ my $alias2post = $_;
+ if (-f "data/online/users/$alias2post") {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+ }
+ }
+ &log("msg","$msg2post");
+}
+
+sub post_prv { # Private Nachricht posten (flüstern).
+ my $alias2post = $_[0];
+ my $msg2post = $_[1];
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+}
+
+sub log { # Protokollieren der Nachrichten etc.
+ my ($method,$msg2log) = @_;
+ &zeit;
+ if ( $method eq "msg") {
+ $log = "data/logs/$room-$day.$month.$year";
+ } elsif ($method eq "logins") {
+ $log = "data/logs/ow/logins-$day.$month.$year";
+ $syslog = "data/logs/ow/system-$day.$month.$year";
+ } elsif ($method eq "system") {
+ $log = "data/logs/ow/system-$day.$month.$year";
+ }
+ &write_file($log);
+ if ($method eq "msg") {
+ print DATEI "<br><font color=ffffef><i>($hours:$min:$sec)</i></font> $msg2log\n";
+ } elsif ($method eq "logins") {
+ print DATEI "($day.$month.-$hours:$min:$sec) User: $alias IP#: $ENV{'REMOTE_ADDR'} Agent: $ENV{'HTTP_USER_AGENT'}\n<br>";
+ close DATEI;
+ &write_file($syslog);
+ print DATEI "($day.$month.-$hours:$min:$sec) $msg2log User: $alias IP#: $ENV{'REMOTE_ADDR'}\n<br>";
+ } elsif ($method eq "system") {
+ print DATEI "($day.$month.-$hours:$min:$sec) $msg2log User: $alias IP#: $ENV{'REMOTE_ADDR'}\n<br>";
+ }
+ close DATEI;
+}
+
+
+sub zeit { # Aktuelles Datum und Uhrzeit bestimmen.
+ ($sec, $min, $hours, $day, $month, $year) = (localtime)[0..5];
+ $month += 1;
+ $hours = "0".$hours if ($hours < 10);
+ $min = "0".$min if ($min < 10);
+ $sec = "0".$sec if ($sec < 10);
+ $day = "0".$day if ($day < 10);
+ $month = "0".$month if ($month < 10);
+ $year = $year - 100;
+ if ($year < 10) {
+ $year = "200".$year;
+ } else {
+ $year = "20".$year;
+ }
+}
+
+sub count { # Zeilen in einer Datei Zählen.
+ my $file2count = $_[0];
+ &read_file($file2count);
+ my @datei = <DATEI>;
+ close DATEI;
+ $number = $#datei+1;
+}
+
+sub read_file { # Datei öffnen.
+ my $file2read = $_[0];
+ if (-e "$file2read") {
+ open (DATEI,"<$file2read") || &error("Konnte $file2read nicht öffnen");
+ }
+}
+
+sub write_file { # Text an eine Datei anhängen.
+ my $file2write = $_[0];
+ if (-e "$file2write") {
+ open (DATEI,">>$file2write") || &error("Konnte $file2write nicht öffnen");
+ } else {
+ &create_file("$file2write");
+ open (DATEI,">>$file2write") || &error("Konnte $file2write nicht öffnen");
+ }
+}
+
+sub write_file_new { # Datei neu schreiben.
+ my $file2write = $_[0];
+ if (-e "$file2write") {
+ open (DATEI,">$file2write") || &error("Konnte $file2write nicht öffnen");
+ } else {
+ &create_file("$file2write");
+ open (DATEI,">$file2write") || &error("Konnte $file2write nicht öffnen");
+ }
+}
+
+sub create_file { # Datei erstellen.
+ my $file2create = $_[0];
+ open (CREATE, ">$file2create") || &error("Konnte $file2create nicht erstellen");
+ print CREATE "";
+ close CREATE;
+}
+
+sub error { # Error-Ausgabe.
+ my $error_msg = $_[0];
+ &start_html( "Error: ($error_msg)" );
+ print $q->div( "Error: ($error_msg)" ),
+ $q->end_html;
+ exit;
+}
+
+
+sub remove_online { # Chatter entfernen
+ my ($alias,$room,$method) = @_;
+ unlink("data/online/users/$alias");
+ unlink("data/online/rooms/$room/$alias") if ($room ne undef);
+ unlink("data/online/ident/$alias");
+ &rm_rooms;
+ &zeit;
+ if ($method eq undef) {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias verläßt den Chat ...</font></i>");
+ } else {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500> $_ hat den Chat verlassen ... </font></i>");
+ &log("system","\"logout_$__ok\"");
+ }
+}
+
+sub rm_rooms { # Leere Räume aus dem System entfernen
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-d "data/online/rooms/$_") {
+ &rm_alias("data/online/rooms/$_");
+ &list_dir("data/online/rooms/$_",2);
+ rmdir("data/online/rooms/$_") if ($#dir2 = 1);
+ }
+ }
+}
+
+sub secure_setip { # Beim einloggen die IP-Nummer in dat/ip eintragen.
+ my $alias2set = $_[0];
+ &write_file_new("data/online/ident/$alias2set");
+ print DATEI $ENV{'REMOTE_ADDR'};
+ close DATEI;
+}
+
+sub secure_removeip { # Beim ausloggen die IP-Nummer aus dat/ip austragen.
+ my $alias2rm = $_[0];
+ unlink("data/online/ident/$alias2rm");
+}
+
+sub secure_checkip { # data/ip auf die eigene IP-Nummer überprüfen.
+ my $alias2check = $_[0];
+ &read_file("data/online/ident/$alias2check");
+ my $ip2check = <DATEI>;
+ close DATEI;
+ if ($ip2check ne $ENV{'REMOTE_ADDR'}) {
+ &log("system","\"secure_ip\"");
+ &error("Du bist nicht befugt, mit der IP# $ENV{'REMOTE_ADDR'} und dem Alias \"$alias\" zu handeln. Sollte diese Meldung aufgrund eines Fehlers aufgetaucht sein, dann log Dich doch bitte neu in den Chat ein.");
+ exit;
+ }
+}
+
+sub remove_rooms { # Leere Räume entfernen.
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-d "data/online/rooms/$_") {
+ &list_dir("data/online/rooms/$_");
+ rmdir("data/online/rooms/$_") if ($#dir = 1);
+ }
+ }
+}
+
+sub list_dir { # Beliebigen Verzeichnisbaum einlesen.
+ my ($dir,$method) = @_;
+ opendir(DIR, $dir);
+ if ($method eq undef) {
+ @dir = readdir(DIR);
+ } elsif ($method = 2) {
+ @dir2 = readdir(DIR);
+ }
+ closedir(DIR);
+}
+
+sub hirachie { # Chatter nach Sonderrechte überprüfen.
+ my $alias2prove = $_[0];
+ $hirachie = "nc";
+ &read_file("data/wa");
+ @was = <DATEI>;
+ close DATEI;
+ foreach(@was) {
+ if ($_ eq $alias2prove || $_ eq "$alias2prove\n") {
+ $hirachie = "wa";
+ }
+ }
+ if ($hirachie ne "wa" || $_ eq "$alias2prove\n") {
+ &read_file("data/ow");
+ @ows = <DATEI>;
+ close DATEI;
+ foreach(@ows) {
+ if ($_ eq $alias2prove || $_ eq "$alias2prove\n") {
+ $hirachie = "ow";
+ }
+ }
+ }
+}
+
+
+
diff --git a/0.2.1/help_html b/0.2.1/help_html
new file mode 100644
index 0000000..79b94fa
--- /dev/null
+++ b/0.2.1/help_html
@@ -0,0 +1,616 @@
+<div>
+ Alle Chat-Befehle:
+</div>
+<hr>
+<table width=100% bgcolor=555555>
+ <tr>
+ <th bgcolor=666666>
+ <div>
+ SU
+ </div>
+ </th>
+ <th bgcolor=666666>
+ <div>
+ Befehl
+ </div>
+ </th>
+ <th bgcolor=666666>
+ <div>
+ Beschreibung
+ </div>
+ </th>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/about
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt aktuelle Version und andere Infos der Community an
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/away
+ <font color=red>
+ Nachricht
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Abmelden mit einer
+ <font color=red>
+ Abmeldenachricht
+ </font>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/clear
+ </div>
+ </td>
+ <td>
+ <div>
+ Bildschirm wird gelöscht
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/col
+ <font color=red>
+ XXXXXX
+ </font>
+ <font color=ffa500>
+ XXXXXX
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Abmelden mit einer
+ Farbe/n (
+ <font color=red>
+ Namensfarbe
+ </font>/
+ <font color=ffa500>
+ Textfarbe
+ </font>
+ ) wechseln. Angabe in Hexadezimal. Wird
+ <font color=ffa500>
+ Textfarbe
+ </font>
+ nicht angegeben, dann hat der Text die
+ <font color=red>
+ Namensfarbe
+ </font>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /date
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt aktuelles Datum und Urzeit an
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/j
+ <font color=red>
+ Raumname
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Raum wechseln/erstellen
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /ju
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ in den Raum wechseln/folgen, wo sich
+ <font color=red>
+ Alias
+ </font>
+ befindet.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/m
+ </div>
+ </td>
+ <td>
+ <div>
+ Handeln mit 2 Farben
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/me
+ </div>
+ </td>
+ <td>
+ <div>
+ Handeln mit einer Farbe
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /msg
+ <font color=red>
+ Alias
+ </font>
+ <font color=ffa500>
+ Nachricht
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>
+ Alias
+ </font>
+ eine private
+ <font color=ffa500>
+ Nachricht
+ </font>
+ flüstern. (Wird nicht vom Chat protokolliert)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /
+ <font color=ffa500>
+ Nachricht
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Eine private
+ <font color=ffa500>
+ Nachricht
+ </font>
+ demjenigen flüstern, dem zuletzt eine geflüstert wurde. (Wird nicht vom Chat protokolliert)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+//
+ </div>
+ </td>
+ <td>
+ <div>
+ Wurde zuletzt eine öffentliche Nachricht gepostet, dann wird diese nocheinmal gepostet. (Funktioniert nicht bei Befehlen, flüstern oder schreien)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/q
+ </div>
+ </td>
+ <td>
+ <div>
+ Cumunnity verlassen
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/s <font color=red>Nachricht</font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>Nachricht</font> schreien
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/w
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt an, wer sich im aktuellen Raum befindet.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/wc
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt an, wer eingelog ist.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /wc
+ <font color=red>
+ Raum
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt an, wer sich im
+ <font color=red>
+ Raum
+ </font>
+ befindet.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /wc/
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt alle offenen Räume und deren Chatter an
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /wj
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt an, in welchen Raum sich
+ <font color=red>
+ Alias
+ </font>
+ befindet.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=ffa500>
+ WÄ
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ /k
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>
+ Alias
+ </font>
+ wird aus dem Chat katapultiert!
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+/ban
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt alle verbannten Benutzer an
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+/ban
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>
+ Alias
+ </font>
+ verbannen.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+/rban
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>
+ Alias
+ </font>
+ "entbannen"
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ /ip
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt die IP-Nummer von
+ <font color=red>
+ Alias
+ </font>
+ an.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ /wa
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>
+ Alias
+ </font>
+ zum Wächter ernennen
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ /rwa
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>
+ Alias
+ </font>
+ vom Wächter zum normalen Chatter degradieren
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ /sys
+ <font color=red>
+ Nachricht
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Systemnachricht schreiben. (Erscheint in allen bestehenden Räumen)
+ </div>
+ </td>
+ </tr>
+</table>
+<hr>
+<div>
+ Zur Erklärung: NC steht für "Normale Chatter", WÄ für "Wächter" und OW für "Oberwächter".
+ Obrige Befehle können nur von der/den jeweiligen Benutzergruppe/n oder höher ausgeführt werden.
+</div>
+</body>
+</html> \ No newline at end of file
diff --git a/0.2.1/logs_html b/0.2.1/logs_html
new file mode 100644
index 0000000..1317062
--- /dev/null
+++ b/0.2.1/logs_html
@@ -0,0 +1,391 @@
+<br>
+<div>
+ In der System-Logdatei tauchen folgende Ursachen auf:
+</div>
+<br>
+<table border=0 width=100% bgcolor=555555>
+ <tr>
+ <th bgcolor=666666>
+ <div>
+ Ursache
+ </div>
+ </th>
+ <th bgcolor=666666>
+ <div>
+ Beschreibung
+ </div>
+ </th>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ edit_profile_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzername hat sein Profil erfolgreich editiert.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ edit_pw_wrong
+ </div>
+ </td>
+ <td>
+ <div>
+ Beim Editieren der Chat-Optionen stimmten die beiden Passwortfelder nicht überein.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ edit_colors_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzername hat seine Chatfarben erfolgreich gewechselt.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+edit_options_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzername hat seine Chat-Optionen erfolgreich editiert.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+first_http_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Der angegebenen IP# wurde Startseite erfolgreich angezeigt. (Benutzername noch nicht vorhanden)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+login_alias_banned
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzer konnte sich nicht in das System einloggen, da sein benutzername verbannt war.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ login_alias_notexists
+ </div>
+ </td>
+ <td>
+ <div>
+ Beim Einlogversuch existierte der angegebene Benutzername nicht.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+login_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzer hat sich erfolgreich in das System eingelogt.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ login_pw_wrong
+ </div>
+ </td>
+ <td>
+ <div>
+ Beim Einloggen wurde das falsche PW eingegeben.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ logout_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzer hat sich erfolgreich (manuell) aus dem System ausgelogt. ("... verläßt den Chat ...")
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ logout_<font color=red>Alias</font>_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ User hat gemerkt, daß sich
+ <font color=red>
+ Alias
+ </font>
+ nicht mehr im Chat befindet. ("... hat den Chat verlassen ...").
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ow_ban_<font color=red>Alias</font>_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat
+ <font color=red>
+ Alias
+ </font>
+ verbannt
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ow_ban_<font color=red>Alias</font>_ow
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat ohne Erfolg versucht
+ <font color=red>
+ Alias
+ </font>
+ zu verbannen (
+ <font color=red>
+ Alias
+ </font>
+ war Oberwächter und konnte nicht verbannt werden )
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ow_rban_<font color=red>Alias</font>_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat
+ <font color=red>
+ Alias
+ </font>
+ "entbannt"
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ ow_wa_<font color=red>Alias</font>_exists
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat ohne Erfolg versucht
+ <font color=red>
+ Alias
+ </font>
+ zum Wächter zu ernennen. (
+ <font color=red>
+ Alias
+ </font>
+ war bereits als Wächter eingetragen.)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ ow_wa_<font color=red>Alias</font>_notexists
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat ohne Erfolg versucht
+ <font color=red>
+ Alias
+ </font>
+ zum Wächter zu ernennen. (
+ <font color=red>
+ Alias
+ </font>
+ existierte nicht in der Benutzerdatenbank.)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ ow_wa_<font color=red>Alias</font>_ow-exists
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat ohne Erfolg versucht
+ <font color=red>
+ Alias
+ </font>
+ zum Wächter zu ernennen. (
+ <font color=red>
+ Alias
+ </font>
+ war bereits als Oberwächter eingetragen. Oberwächter können nicht zeitgleich Wächter sein.)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ ow_wa_<font color=red>Alias</font>_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat
+ <font color=red>
+ Alias
+ </font>
+ erfolgreich zum Wächter ernannt.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ ow_rwa_<font color=red>Alias</font>_notexists
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter konnte
+ <font color=red>
+ Alias
+ </font>
+ nicht zum Wächter ernennen. (War nicht als WÄ registriert)..
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ ow_rwa_<font color=red>Alias</font>_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat
+ <font color=red>
+ Alias
+ </font>
+ vom Wächter zum normalen Chatter degradiert.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ reg_alias_exists
+ </div>
+ </td>
+ <td>
+ <div>
+ Bei der Registrierung war der Benutzername bereits vorhanden.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ reg_alias_prohibited
+ </div>
+ </td>
+ <td>
+ <div>
+ Bei der Registrierung war der angegebene Benutzername verboten (enthielt Sonderzeichen).
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ reg_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzername hat sich erfolgreich registriert.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ reg_pw_wrong
+ </div>
+ </td>
+ <td>
+ <div>
+ Bei der Registrierung wurde das PW falsch eingegeben.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ secure_ip
+ </div>
+ </td>
+ <td>
+ <div>
+ Unbefugter Zugriff der angegebenen IP# auf den angegebenen Benutzernamen.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ sys_msg_<font color=red>Raum</font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Oberwächter schreibt eine Systemnachricht aus
+ <font color=red>
+ Raum
+ </font>.
+ </div>
+ </td>
+ </tr>
+</table>
+<br> \ No newline at end of file
diff --git a/0.2.1/main.pl b/0.2.1/main.pl
new file mode 100644
index 0000000..0a48de6
--- /dev/null
+++ b/0.2.1/main.pl
@@ -0,0 +1,555 @@
+#!/usr/bin/perl -w
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+if ($var eq "input_html") {
+ &input_html;
+} elsif ($var eq "inroom_html") {
+ &inroom_html($alias,$room);
+} elsif ($var eq "post_msg") {
+ &post_msg;
+} elsif ($var eq "change_room") {
+ &change_room;
+} else {
+ &error("Parameter fehlt");
+}
+
+sub input_html { # Eingabemaske für den Chat.
+ my ($reload,$action,$whisper,$lastmsg) = @_;
+ $action = $q->param('action') if ($action eq "");
+ if ($tmp eq "away") {
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias meldet sich zurück ... </font></i>");
+ } elsif ($tmp eq "login") {
+ &remove_rooms;
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat den Chat betreten ...</font></i>");
+ &log("logins","\"login_ok\"");
+ }
+ if ($action ne "" && $action ne "whisper" && $action ne "away") {
+ print "<html><head><script language=\"JavaScript\">";
+ if ($action eq "change_room") {
+ print "open(\"main.pl?var=inroom_html&alias=$alias&room=$room&col=$col&secol=$secol&tmp=$tmp\",\"inroom\");";
+ print "open(\"main.pl?var=input_html&alias=$alias&room=$room&col=$col&secol=$secol\",\"input\");";
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol\",\"menu\");";
+ } elsif ($action eq "change_colors") {
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol\",\"menu\");";
+ }
+ print "</script></head><body background=\"$gfxpath/unten.gif\" bgcolor=ffa500>";
+ } else {
+ print "<html><body background=\"$gfxpath/unten.gif\" bgcolor=ffa500>";
+ }
+ print "<center><form action=\"main.pl\">";
+ print "<input type=\"hidden\" name=\"tmp\" value=\"away\">" if ($action eq "away");
+ print <<END;
+ <input type="hidden" name="var" value="post_msg">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="room" value="$room">
+ <input type="hidden" name="col" value="$col">
+ <input type="hidden" name="secol" value="$secol">
+ <input type="hidden" name="id" value="$whisper">
+ <input type="hidden" name="lastmsg" value="$lastmsg">
+ <input size="70" name="msg">
+ <input type="submit" value="Texten"></form></center>
+END
+if ($reload eq "true") {
+print <<END;
+ <script language="JavaScript">
+ <!--
+ document.forms[0].msg.focus();
+ //-->
+ </script>
+END
+}
+print
+ $q->end_html;
+}
+
+sub post_msg { # Wird aufgerufen, wenn aus input_html eine Eingabe gepostet wurde.
+ &secure_checkip($alias);
+ $msg =~ s#<#&lt\;#g; # HTML-Tags deaktivieren
+ $msg =~ s#kilahu#yChat#g;
+ $msg =~ s#perle#per!#g;
+ if (substr($msg,0,1) eq "/") { # Überprüfen, ob Befehl oder Nachricht
+ &cmd($msg);
+ } else {
+ $msg = "<b><font color=$col>$alias: <font color=$secol>".$msg."</font></font></b>";
+ &post($msg);
+ $msg =~ s#"#'#g; # " in ' umtauschen für den befehl "//"
+ &input_html("true","",$id,$msg); # -> Reload=true, Action=none, Whisper=$id
+ }
+}
+
+sub cmd { # Alle Chatbefehle, die über input_html eingegeben werden können.
+ $_[0] = $_[0]." ";
+ $_[0] = substr($_[0], 1, length($_[0])-1);
+ my @cmd = split(/ /, $_[0]);
+ my $cmd = substr($_[0],0 , index($_[0], " "));
+ my ($reload,$action,$whisper) = ("true","",$id);
+#############>- NORMALE CHATBEFEHLE ( Alphabetisch sortiert ) -<
+#############>- DER LETZTEN ZUGEFLÜSTERTEN PERSON NOCHEINMAL FLÜSTERN -<
+ if ($cmd eq "/") {
+ &post($q->param('lastmsg'));
+#############>- INFORMATIONEN ÜBER DAS SYSTEM AUSGEBEN -<
+ } elsif ($cmd eq "about") {
+ &post_prv("$alias","<font size=2 color=ffffff>Aktuelle Version ist $title und wurde am $datum aktuallisiert. Created by Paul C. Bütow 2k.</font>");
+#############>- ABMELDEN MIT 'AWAY-NACHRICHT' -<
+ } elsif ($cmd eq "away") {
+ if ($tmp eq "away") { # Falls 2 mal hintereinander /away eingegeben wurde
+ $tmp = "";
+ }
+ for ($i=1; $i <= $#cmd; $i++) {
+ $tmp = $tmp." ".$cmd[$i];
+ }
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias meldet sich ab (<font color=red>$tmp</font> ) ...</i></font>");
+ $action = "away";
+#############>- EIGENEN CHATBILDSCHIRM LÖSCHEN -<
+ } elsif ($cmd eq "clear") {
+ &post_prv("$alias","<script language=\"JavaScript\">window.open(\"push.pl?alias=$alias&room=$room&var=clear_screen\",\"main\");</script>");
+#############>- FARBEN WECHSELN -<
+ } elsif ($cmd eq "col") {
+ $col = $cmd[1];
+ my $tmpsecol = $cmd[2];
+ if ($tmpsecol eq "") {
+ $secol = $col
+ } else {
+ $secol = $tmpsecol;
+ }
+ &read_file("data/user/options/$alias");
+ my @pro = <DATEI>;
+ close DATEI;
+ &write_file_new("data/user/options/$alias");
+ print DATEI $pro[0]."".$col."\n".$secol;
+ close DATEI;
+ &log("system","\"edit_colors_ok\"");
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat die Farbe gewechselt ...</font></i>");
+ $action = "change_colors";
+#############>- AKTUELLES DATUM UND URZEIT AUSGEBEN -<
+ } elsif ($cmd eq "date") {
+ &zeit;
+ &post_prv("$alias","<font size=2 color=ffffff>Heute ist der $day.$month. Jahr $year. Es ist genau $hours:$min Uhr und $sec Sekunden.</font>");
+#############>- EINEN NEUEN RAUM ERSTELLEN BZW. IN EINEN BESTEHENDEN RAUM WECHSELN -<
+ } elsif ($cmd eq "j") {
+# $tmp = $room; #Alter Raum nach tmp
+# $room = $cmd[1]; #Neuer Raum nach room
+ &change_room("j",$cmd[1],$room);
+ $action = "change_room";
+#############>- HANDELN -<
+ } elsif ($cmd eq "me" || $cmd eq "m") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $me_msg = $me_msg." ".$cmd[$i];
+ }
+ if ($cmd eq "m") {
+ &post("<i><font color=$col>$alias <font color=$secol>$me_msg</font></font></i>");
+ } else {
+ &post("<i><font color=$col>$alias $me_msg</font></i>");
+ }
+#############>- FLÜSTERN ( Auch mit '/' ) -<
+ } elsif ($cmd eq "msg" || $cmd eq "") {
+ my ($alias2post,$msg2post) = ($cmd[1],"");
+ if ($cmd eq "msg") {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ } else {
+ $alias2post = $id;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ }
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ if ($_ eq $alias2post) {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "<i><font color=$col>$alias flüstert <font color=ffffff>=></font><font color=$secol>$msg2post</font></font></i><br>\n";
+ close DATEI;
+ &write_file("data/msgs/$alias");
+ print DATEI "<i><font color=$col>Zu $alias2post geflüstert <font color=ffffff>=></font><font color=$secol>$msg2post</font></font></i><br>\n";
+ close DATEI;
+ &input_html($reload,"",$alias2post);
+ exit;
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2post <font color=ffffff>ist momentan nicht anwesend !</font></font>");
+#############>- DAS SYSTEM VERLASSEN -<
+ } elsif ($cmd eq "q") {
+ &post_prv("$alias","<script language=\"JavaScript\">window.open(\"index.pl?tmp=quit\",\"_top\");</script>");
+ sleep 1;
+ &remove_online($alias,$room);
+ &secure_removeip($alias);
+ unlink("data/msgs/$alias");
+ exit;
+#############>- SCHREIEN -<
+ } elsif ($cmd eq "s") {
+ my $msg2scream,$msg2post;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2scream = $msg2scream." ".$cmd[$i];
+ }
+ $msg2post = "\U$msg2scream";
+ &post("<font color=$col><i>$alias schreit:</i> <b><font color=$secol>".$msg2post."</font></font></b>");
+#############>- ANZEIGEN WER SICH IM AKTUELLEN RAUM BEFINDET -<
+} elsif ($cmd eq "w") {
+ &list_dir("data/online/rooms/$room");
+ my ($is,$nr) = ("t",0);
+ foreach(@dir) {
+ if (-f "data/online/rooms/$room/$_") {
+ $personen = $personen." ".$_;
+ $nr++;
+ }
+ }
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "n";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>$nr Person$nrs befinde$is sich im aktuellen Raum (\"$room\"): <font color=ffa500>$personen</font></font>");
+#############>- ANZEIGEN WER SICH IM SYSTEM BEFINDET -<
+ } elsif ($cmd eq "wc" || $cmd eq "wc/") {
+ $raum = $cmd[1];
+ if ($raum eq "" && $cmd eq "wc") {
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/users/$_");
+ }
+ my $nr = ($#dir-1);
+ my ($nrs,$is) = ("","ist");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "sind";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>$nr Person$nrs $is insgesamt eingelogt: <font color=ffa500>$personen</font></font>");
+ } elsif ($raum eq "" && $cmd eq "wc/") {
+ my $msg2post;
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ &list_dir("data/online/rooms/$_",2);
+ my $nr = $#dir2-1;
+ $msg2post = $msg2post."<tr><td><b><font size=2 color=ffffff>$_ ($nr)</font></b></td><td><font size=2 color=ffffff>";
+ foreach $chatter (@dir2) {
+ if (-f "data/online/rooms/$_/$chatter") {
+ $msg2post = $msg2post."$chatter ";
+ }
+ }
+ print "</font></td>";
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>Folgende Räume sind offen:</font><table>$msg2post</table>");
+ } elsif ($raum ne "") {
+ my $personen;
+ &list_dir("data/online/rooms/$raum");
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/rooms/$raum/$_");
+ }
+ my ($nr,$is) = (($#dir-1),"t");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "n";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff> $nr Person$nrs befinde$is sich im Raum \"$raum\": <font color=ffa500>$personen</font></font>");
+ }
+#############>- ANZEIGEN IN WELCHEN RAUM SICH JMD. BEFINDET BZW. JMD IN EINEN RAUM FOLGEN -<
+ } elsif ($cmd eq "wj" || $cmd eq "ju") {
+ my $alias2search = $cmd[1];
+ &list_dir("data/online/rooms");
+ foreach $raum (@dir) {
+ &list_dir("data/online/rooms/$raum",2) if (-d "data/online/rooms/$raum");
+ foreach $user (@dir2) {
+ if (-f "data/online/rooms/$raum/$user") {
+ if ($user eq $alias2search) {
+ if ($cmd eq "wj") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2search <font color=ffffff>befindet sich im Raum \"$raum\" !</font></font>");
+ } else {
+ $action = "change_room";
+ &change_room("ju",$raum,$room,$alias2search);
+ }
+ &input_html($reload,$action,$whisper);
+ exit;
+ }
+ }
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2search <font color=ffffff> ist nicht eingelogt !</font></font>");
+#############>- SUPERUSER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- ALIAS VERBANNEN BZW. ENTBANNEN -<
+ } elsif ($cmd eq "ban" || $cmd eq "rban") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ my ($alias2handle,$registriert) = $cmd[1];
+ &list_dir("data/user/options");
+ foreach(@dir) {
+ $registriert = "true" if ($_ eq $alias2handle);
+ }
+ if ($registriert ne "true") {
+ if ($cmd eq "ban") {
+ if ($alias2handle ne "") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> existiert nicht in der Benutzerdatenbank und kann so nich verbannt werden !</font></font>");
+ } else {
+ &read_file("data/ban");
+ my @banned = <DATEI>;
+ my ($benutzer);
+ my $nr = $#banned+1;
+ close DATEI;
+ foreach(@banned) {
+ $benutzer = $benutzer." ".$_;
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>Folgende Benutzer sind verbannt [$nr]: <font color=ffa500>$benutzer</font></font>");
+ }
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> existiert nicht in der Benutzerdatenbank und kann so nicht \"entbannt\" werden !</font></font>");
+ }
+ &input_html("true");
+ exit;
+ }
+ &read_file("data/ban");
+ my @banlist = <DATEI>;
+ close DATEI;
+ foreach(@banlist) {
+ if ($_ eq "$alias2handle\n") {
+ if ($cmd eq "ban") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> ist bereits verbannt worden !</font></font>");
+ } else {
+ my $banned = "false";
+ foreach(@banlist) {
+ $banned = "true" if ($_ eq "$alias2handle\n");
+ }
+ if ($banned eq "true") {
+ my @newbanlist;
+ foreach(@banlist) {
+ push @newbanlist,$_ if ($_ ne "$alias2handle\n");
+ }
+ &write_file_new("data/ban");
+ print DATEI @newbanlist;
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> wurde soeben \"entbannt\" !</font></font>");
+ &log("system","\"ow_rban_$alias2handle_ok\"");
+ }
+ }
+ &input_html("true");
+ exit;
+ }
+ }
+ if ($cmd eq "ban") {
+ &hirachie($alias2handle);
+ if ($hirachie ne "ow") {
+ &write_file("data/ban");
+ print DATEI "$alias2handle\n";
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> wurde soeben verbannt und kann sich nun nichtmehr in den Chat einloggen !</font>");
+ &log("system","\"ow_ban_$alias2handle_ok\"");
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> ist ein Oberwächter und kann deshalb nicht verbannt werden !</font></font>");
+ &log("system","\"ow_ban_$alias2handle_ow\"");
+ }
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> konnte nicht \"entbannt\" werden, da <font color=ffa500>$alias2handle</font> garnicht verbannt war !</font></font>");
+ }
+ }
+#############>- IP # VON ALIAS ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "ip") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ my $alias2prove = $cmd[1];
+ &list_dir("data/online/ident");
+ foreach(@dir) {
+ if ($_ eq $alias2prove) {
+ &read_file("data/online/ident/$_");
+ local $ipnr = <DATEI>;
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$_ <font color=ffffff>hat die IP-Nummer $ipnr !</font></font>");
+ }
+ }
+ }
+#############>- ALIAS AUS DEM CHAT KATAPULTIEREN -<
+ } elsif ($cmd eq "k") {
+ &hirachie($alias);
+ if ($hirachie eq "wa" || $hirachie eq "ow") {
+ my $alias2kick = $cmd[1];
+ &list_dir("data/online/rooms");
+ foreach $raum (@dir) {
+ &list_dir("data/online/rooms/$raum",2);
+ foreach $chatter (@dir2) {
+ if ($chatter eq $alias2kick) {
+ &hirachie($alias2kick);
+ if ($hirachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist Oberwächter und kann nicht \"gekickt\" werden !</font></font>");
+ &log("system","wa_k_$alias2kick_ow"); #!!
+ } elsif ($hirachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist Wächter und kann nicht \"gekickt\" werden !</font></font>");
+ &log("system","wa_k_$alias2kick_ow"); #!!
+ } else {
+ &post_prv("$alias2kick","<script language=\"JavaScript\">window.open(\"index.pl?tmp=kick\",\"_top\");</script>");
+ &zeit;
+ $_ = undef if ($room eq $_);
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias katapultiert \"$alias2kick\" aus dem Chat ...</font></i>",$_);
+ &log("system","wa_k_$alias2kick"); #!!
+ &remove_online($alias2kick,$_,"kick");
+ &secure_removeip($alias2kick);
+ }
+ &input_html("true");
+ exit;
+ }
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist nicht anwesend und kann nicht \"gekickt\" werden !</font></font>");
+ }
+#############>- SYSTEMNACHRICHT IN ALLE BESTEHENDEN RÄUME POSTEN -<
+ } elsif ($cmd eq "sys") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $sys_msg = $sys_msg." ".$cmd[$i];
+ }
+ &zeit;
+ &post_all("<i><font color=ffffff>($hours:$min:$sec)</font></i> <b><font size=2 color=red>SYSTEMNACHRICHT</font></b><i><font color=ffffff>: $sys_msg ...</font></i>");
+ &log("system","\"sys_msg_$room\"");
+ }
+#############>- ALIAS ZUM WÄCHTER ERNNENNEN BZW. ZUM NORMALEN CHATTER DEGRADIEREN -<
+ } elsif ($cmd eq "wa" || $cmd eq "rwa") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ &zeit;
+ my $alias2handle = $cmd[1];
+ if ($cmd eq "wa") {
+ my $anerkennen = "false";
+ &list_dir("data/user/options");
+ foreach(@dir) {
+ if ($_ eq $alias2handle) {
+ $anerkennen = "true";
+ }
+ }
+ if ($anerkennen eq "true") {
+ &hirachie($alias2handle);
+ if ($hirachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff>ist bereits als Wächter eingetragen. Eine erneuerte Eintragung ist nicht möglich!</font></font>");
+ &log("system","\"oh_wa_".$alias2handle."_exists\"");
+ } elsif ($hirachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff>ist schon als Oberwächter eingetragen. Oberwächter können nicht gleichzeitig Wächter sein!</font></font>");
+ &log("system","\"oh_wa_".$alias2handle."_oh-exists\"");
+ } else {
+ &write_file("data/wa");
+ print DATEI $alias2handle."\n";
+ close DATEI;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font><font color=ffa500> $alias ernennt \"$alias2handle\" zum Wächter ...</font></i>");
+ &log("system","\"oh_wa_".$alias2handle."_ok\"");
+ }
+ } else {
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2handle <font color=ffffff>kann nicht zum Wächter ernannt werden da Benutzername nicht existiert!</font></font>");
+ &log("system","\"oh_wa_".$alias2handle."_notexists\"");
+ }
+ } elsif ($cmd eq "rwa") {
+ &read_file("data/wa");
+ my @wafile = <DATEI>;
+ close DATEI;
+ my $aberkennen = "false";
+ foreach(@wafile) {
+ if ($_ ne "$alias2handle\n") {
+ push @newafile,$_;
+ } else {
+ $aberkennen = "true";
+ }
+ }
+ &write_file_new("data/wa");
+ print DATEI @newafile;
+ close DATEI;
+ if ($aberkennen eq "true") {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat \"$alias2handle\" vom Wächter zum normalen Chatter degradiert ...</font></i>");
+ &log("system","\"oh_rwa_".$alias2handle."_ok\"");
+ } else {
+ &post("<font size=2 color=ffa500>$alias2handle <font color=ffffff>konnte der Wächterstatus nicht aberkannt werden da Benutzer kein Wächter ist!</font></font>");
+ &log("system","\"oh_rwa_".$alias2handle."_notexists\"");
+ }
+ }
+ }
+#############>- ENDE DER CHATBEFEHLE -<
+}
+&input_html($reload,$action,$whisper);
+}
+
+sub inroom_html { # Auto-refresh für Raumonlineliste
+ my ($alias,$room) = @_;
+print <<END;
+<html>
+ <head>
+ <meta http-equiv="refresh" content="20" URL="main.pl?var=inchat_html&alias=$alias&room=$room">
+ </head>
+<body bgcolor=ffa500>
+</body>
+</html>
+END
+ &online($alias,$room);
+}
+
+sub change_room { # Den Chat-Raum wechseln
+ my ($method,$newroom,$oldroom,$alias2follow) = @_;
+ $room = $oldroom;
+ &secure_checkip($alias); # IP Nummer überprüfen
+ &zeit; # Zeit 'erneuern'
+ if ($method eq "j") {
+ unlink("data/online/rooms/$oldroom/$alias");
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias wechselt in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias kommt aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ &post_prv("$alias","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>Du wechselst aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ } elsif ($method eq "ju") {
+ unlink("data/online/rooms/$oldroom/$alias");
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias folgt \"$alias2follow\" in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias kommt aus dem Raum \"$oldroom\" und folgt \"$alias2follow\" herein nach \"$newroom\" ...</font></i>");
+ &post_prv("$alias","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>Du folgst \"$alias2follow\" aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ }
+ &rm_rooms;
+}
+
+sub online { # Benutzer in die Onlineliste hinzufügen bzw. erneuern
+ my ($alias,$room) = @_;
+ &write_file_new("data/online/users/$alias");
+ print DATEI time;
+ close DATEI;
+ if (-e "data/online/rooms/$room") {
+ } else {
+ mkdir "data/online/rooms/$room", 0777;
+ }
+ &write_file_new("data/online/rooms/$room/$alias");
+ print DATEI time;
+ close DATEI;
+ &read_file("data/online/prove"); # Räume und Chatter auf Existenz überprüfen
+ my $provetime = <DATEI>;
+ close DATEI;
+ if ($provetime < (time - 30)) {
+ &write_file_new("data/online/prove");
+ print DATEI time;
+ close DATEI;
+ &rm_alias("data/online/users");
+ &rm_rooms;
+ }
+}
+
+sub rm_alias { # Chatter aus dem System entfernen, die älter als 60 Sekunden sind
+ my $dir2rm = $_[0];
+ &list_dir($dir2rm,2);
+ foreach(@dir2) {
+ if (-f "$dir2rm/$_") {
+ &read_file("$dir2rm/$_");
+ my $timestamp = <DATEI>;
+ close DATEI;
+ if ($timestamp < (time - 60)) {
+ if ($dir2rm eq "data/online/users") {
+ &remove_online($_,undef,1);
+ } else {
+ unlink("$dir2rm/$_");
+ }
+ }
+ }
+ }
+}
diff --git a/0.2.1/main2.pl b/0.2.1/main2.pl
new file mode 100644
index 0000000..9e6066c
--- /dev/null
+++ b/0.2.1/main2.pl
@@ -0,0 +1,502 @@
+#!/usr/bin/perl -w
+
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+
+if ($var eq "list_alias_html") {
+ &list_alias_html;
+} elsif ($var eq "alias_html") {
+ &alias_html;
+} elsif ($var eq "edit_profile_html") {
+ &edit_html("edit_profile_html");
+} elsif ($var eq "edit_options_html") {
+ &edit_html("edit_options_html");
+} elsif ($var eq "gb_html") {
+ &gb_html;
+} elsif ($var eq "post_gb") {
+ &post_gb;
+} elsif ($var eq "rm_gb_alias") {
+ &rm_gb;
+} elsif ($var eq "edit_profile") {
+ &edit("edit_profile");
+} elsif ($var eq "edit_options") {
+ &edit("edit_options");
+} else {
+ &error("Parameter fehlt");
+}
+
+###########################
+##HAUPTTEIL DIESER DATEI:##
+###########################
+
+sub gb_html { # Das Benutzerboard/Gästebuch.
+ my $message = $_[0];
+ &start_html("Benutzerboard");
+if ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </i>
+ einen Text und poste
+ <u>dann</u>
+ !
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Vielen Dank für Deinen Beitrag. Wenn Du willst, kannst Du jetzt gleich noch einen Eintrag posten ...
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Falls Du Anregungen oder Verbesserungsvorschläge für die Community hast, dann poste doch einen kleinen Eintrag :-)
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmp" value="guestbook">
+ <input type="hidden" name="id" value="y">
+ <input size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+ if (-e "data/guestbook") {
+ open (DATEI,"<data/guestbook") || &error("Konnte dat/guestbook nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ print
+ $q->div(@datei);
+ }
+ print
+ $q->end_html;
+}
+
+
+sub post_gb { # Wenn etwas in ein Gästebuch eingetragen wird
+ &secure_checkip($alias);
+ &zeit;
+ if ($msg eq "") {
+ if ($id eq "y") { # Überprüfen, ob Benutzerboard- oder Privatgästebuch
+ &gb_html("post_empty");
+ } else {
+ &alias_html("post_empty");
+ }
+ exit;
+ }
+ $msg =~ s#<#&lt\;#g;
+ my $tmpath = "";
+ if ($id eq "y") {
+ $tmpath = "data/guestbook";
+ } else {
+ $tmpath = "data/user/gbooks/$tmp";
+ }
+ if (-e "$tmpath") {
+ &read_file("$tmpath");
+ my @datei = <DATEI>;
+ close DATEI;
+ pop(@datei) if ($#datei > 99);
+ my @newdatei = "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ @newdatei = ("@newdatei", "@datei");
+ &write_file_new("$tmpath");
+ print DATEI @newdatei;
+ close DATEI;
+ } else {
+ &write_file_new("$tmpath");
+ print DATEI "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ close DATEI;
+ }
+ if ($id eq "y") {
+ &gb_html("post_ok");
+ exit;
+ } else {
+ post_prv("$tmp","<font size=2 color=ffffff><a href=\"main2.pl?alias=$alias&var=alias_html&tmp=$alias\" target=\"_new\">$alias</a> hat soeben einen Pin in <a href=\"main2.pl?alias=$alias&var=alias_html&tmp=$tmp\" target=\"_new\">Dein Profil</a> gehängt ... </font>");
+ &alias_html;
+ exit;
+ }
+}
+
+sub rm_gb { # Gästebucheintrag entfernen
+ &secure_checkip($alias);
+ $tmp = $alias;
+ &read_file("data/user/gbooks/$alias");
+ my @gbfile = <DATEI>;
+ close DATEI;
+ my @newgbfile = ();
+ for($i=0; $i <= $#gbfile; $i++) {
+ push(@newgbfile,$gbfile[$i]) if ($i != $id);
+ }
+ &write_file_new("data/user/gbooks/$alias");
+ print DATEI @newgbfile;
+ close DATEI;
+ &alias_html("rm_ok");
+}
+
+sub list_alias_html { # Liste aller Benutzer
+ &start_html("Alle Benutzer");
+ &list_dir("data/user/options");
+ my @liste = sort(@dir);
+ my $nr = $#dir-1;
+print <<END;
+ <div>
+ Es sind z.Z. genau $nr Benutzernamen in der Datenbank vorhanden! (Sortiert nach #, A-Z, a-z)
+ </div>
+ <hr>
+ <div>
+END
+ foreach(@liste) {
+ if (-f "data/user/options/$_") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_" },
+ "$_"),
+ " ";
+ }
+ }
+print <<END;
+ </div>
+</body>
+</html>
+END
+}
+
+sub alias_html { # Anzeigen eines Benutzerprofils
+ my $message = $_[0];
+ &start_html($tmp);
+print <<END;
+<div>
+ <a href="htdocs.pl?var=werda_html&alias=$alias">Hier</a>
+ gehts zur Gesamtübersicht !
+</div>
+<hr>
+END
+if ($message eq "rm_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Der von Dir gewählte Eintrag wurde erfolgreich gelöscht.
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </u>
+ einen Text und poste
+ <u>dann</u>
+ !
+ <hr>
+END
+}
+ &read_file("data/user/profiles/$tmp");
+ @data = <DATEI>;
+ close DATEI;
+print <<END;
+ <div>
+ Alias: $tmp
+ <br>
+ <br>
+ Nachname: $data[0]
+ <br>
+ <br>
+ Vorname: $data[1]
+ <br>
+ <br>
+ Alter: $data[2]
+ <br>
+ <br>
+ Wohnort: $data[3]
+ <br>
+ <br>
+ E-Mail:
+ <a href="mailto:$data[4]">$data[4]</a>
+ <br>
+ <br>
+ ICQ-Nummer: $data[5]
+ <br>
+ <br>
+ Homepage:
+ <a href="$data[6]" target="_new">$data[6]</a>
+ <br>
+ <br>
+ Weiteres:
+ <br>
+ $data[7]
+ <hr>
+ Hier kannst Du $tmp eine Nachricht hinterlassen!
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input type="text" size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+if (-e "data/user/gbooks/$tmp") {
+ open (DATEI,"<data/user/gbooks/$tmp") || &error("Konnte data/user/gbooks/$tmp nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ if ($alias ne $tmp) {
+ print @datei;
+ } else {
+print <<END;
+ <table>
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="rm_gb_alias">
+ <input type="hidden" name="alias" value="$alias">
+END
+for($i=0; $i <= $#datei; $i++) {
+print <<END;
+ <tr>
+ <td>
+ <input type="radio" name="id" value="$i">
+ </td>
+ <td>
+ <div class=q>
+ $datei[$i]
+ </div>
+ </td>
+ </tr>
+END
+}
+print <<END;
+ </table>
+ <table>
+ <tr>
+ <td>
+ <font color=ffffff>
+ <input type="submit" value="Makierten Eintrag löschen">
+ </font>
+ </td>
+ <td>
+ <font color=ffffff>
+ <input type="reset" value="Makierung rückgängig machen">
+ </font>
+ </td>
+ </tr>
+ </table>
+ </form>
+END
+}
+}
+ print
+ $q->end_html;
+}
+
+sub edit_html { # Chat-Optionen / Benutzerprofil editieren
+ my ($method,$message) = @_;
+ &secure_checkip($alias);
+ &start_html("Benutzerprofil ändern");
+ if ($method eq "edit_options_html") {
+ &read_file("data/user/options/$alias");
+ } elsif ($method eq "edit_profile_html") {
+ &read_file("data/user/profiles/$alias");
+ }
+ @data = <DATEI>;
+ close DATEI;
+ if ($method eq "edit_options_html") {
+ chomp($data[0]);
+ if ($message eq "edit_options_ok") {
+print <<END;
+<script language="JavaScript">
+ open("main.pl?var=input_html&alias=$alias&room=$room&col=$col&secol=$secol","input");
+ open("htdocs.pl?var=menu_html&alias=$alias&room=$room&col=$col&secol=$secol","menu");
+</script>
+<div class=b>
+ Hinweis:
+</div>
+<div>
+ Du hast soeben Deine Chat-Optionen erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren. Um
+ weiterzuchatten einfach auf <a href="push.pl?alias=$alias&room=$room">Weiterchatten</a> klicken.
+</div>
+<hr>
+END
+ } elsif ($message eq "edit_pw_wrong") {
+print <<END;
+<div class=b>
+ ACHTUNG!
+</div>
+<div>
+ Du hast soeben versucht, dein Passwort zu ändern. Jedoch stimmte die Erste Eingabe nicht mit der Zweiten überein.
+ Bitte versuch es erneuert ...
+</div>
+<hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Deine Chat-Optionen editieren!" ),
+ $q->hr;
+ }
+print <<END;
+<form action="main2.pl">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="var" value="edit_options">
+ <div>
+ Dein Passwort
+ <font color=ffa500>
+ (Gut merken !!)
+ </font>
+ <br>
+ <input type="password" name="id" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ Geb hier das Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ "Deine Farbe (Farbe Deines Nicks, Angabe in Hexadezimal):
+ <br>
+ <input type="text" name="col" value="$data[1]">
+ </div>
+ <br>
+ <div>
+ Deine zweite Farbe (Farbe Deiner Nachrichten, Angabe in Hexadezimal):
+ <br>
+ <input type="text" name="secol" value="$data[2]">
+ </div>
+ <br>
+END
+ } elsif ($method eq "edit_profile_html") {
+ if ($message eq "edit_profile_ok") {
+print <<END;
+ <div class=b>
+ Hinweis:
+ </div>
+ <div>
+ Du hast soeben Dein Profil erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren:
+ <hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Dein Profil editieren!" ),
+ $q->hr;
+ }
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="var" value="edit_profile">
+ <div>
+ Dein Nachname:
+ <br>
+ <input name="nachname" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ Dein Vorname:
+ <br>
+ <input name="vorname" value="$data[1]">
+ </div>
+ <br>
+ <div>
+ Dein Alter:
+ <br>
+ <input name="alter" value="$data[2]">
+ </div>
+ <br>
+ <div>
+ Dein Wohnort:
+ <br>
+ <input name="wohnort" value="$data[3]">
+ </div>
+ <br>
+ <div>
+ Deine E-Mail Adresse:
+ <br>
+ <input name="email" value="$data[4]">
+ </div>
+ <br>
+ <div>
+ Deine ICQ-Nummer:
+ <br>
+ <input name="icq" value="$data[5]">
+ </div>
+ <br>
+ <div>
+ Deine Homepage:
+ <br>
+ <input name="homepage" value="$data[6]">
+ </div>
+ <br>
+ <div>
+ Weiteres:
+ <br>
+ <textarea rows="5" cols="40"name="weiteres" wrap="virtual">$data[7]</textarea>
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <font color=ffffff>
+ <input type="submit" value="Daten ändern ...">
+ </font>
+ </form>
+</body>
+</html>
+END
+}
+
+
+sub edit { # Benutzerprofil od. Chat-Optionen abspeichern
+ &secure_checkip($alias);
+ my $method = $_[0];
+ if ($method eq "edit_profile") {
+ &write_file_new("data/user/profiles/$alias");
+ print DATEI $q->param('nachname')."\n".$q->param('vorname')."\n".$q->param('alter')."\n".$q->param('wohnort')."\n".$q->param('email')."\n".$q->param('icq')."\n".$q->param('homepage')."\n".$q->param('weiteres');
+ close DATEI;
+ &log("system","\"edit_profile_ok\"");
+ &edit_html("edit_profile_html","edit_profile_ok");
+ } elsif ($method eq "edit_options") {
+ if ($id ne $tmp) {
+ &log("system","\"edit_pw_wrong\"");
+ &edit_html("edit_options_html","edit_pw_wrong");
+ exit;
+ }
+ &secure_checkip($alias);
+ &write_file_new("data/user/options/$alias");
+ print DATEI $id."\n".$col."\n".$secol;
+ close DATEI;
+ &log("system","\"edit_options_ok\"");
+ &edit_html("edit_options_html","edit_options_ok");
+ }
+}
diff --git a/0.2.1/push.pl b/0.2.1/push.pl
new file mode 100644
index 0000000..5489592
--- /dev/null
+++ b/0.2.1/push.pl
@@ -0,0 +1,85 @@
+#!/usr/bin/perl -w
+use CGI;
+$q = new CGI;
+
+print
+ $q->header; # HTML-Header erzeugen
+
+require config;
+
+&secure_checkip($alias);
+
+########################################
+##ANFANG DER ZU STREAMENDEN HTML-DATEI##
+########################################
+
+print <<END;
+<html>
+ <head>
+ <script language="JavaScript">
+ <!--
+ scrolling=true;
+ function scroll_wnd() {
+ if (scrolling != false) {
+ window.scroll(1, 500000);
+ }
+ window.setTimeout("scroll_wnd()", 100);
+ }
+ scroll_wnd();
+ //-->
+ </script>
+ </head>
+<body bgcolor=000000 link=FFFFFF alink=FFFFEF vlink=FFFFEF>
+END
+
+$| = 1; # Cache von Perl ausschalten
+
+#############################
+##BEGRÜSSUNGSTEXT SCHREIBEN##
+#############################
+
+my $msgfile;
+
+ print
+ $q->font( { -size=>1,
+ -color=>"ffffff",
+ -face=>"arial"},
+ "$title Copyright by Paul C. Bütow 2k $tmp\n");
+
+if ($var eq "push_logs_html") {
+ $msgfile = $tmp;
+ print "<hr><font size=2 color=ffffff face=arial>";
+} elsif ($var eq "clear_screen") {
+ $msgfile = "data/msgs/$alias";
+ &write_file_new($msgfile);
+ print DATEI $q->br;
+ close DATEI;
+} else {
+ $msgfile = "data/msgs/$alias";
+ print $q->br;
+}
+
+open (MSGFILE, $msgfile);
+
+#################################
+##ENDLOSSCHLEIFE FÜR DEN STREAM##
+#################################
+
+my ($times,$online) = (0,"false");
+for (;;) {
+ for ($curpos = tell(MSGFILE); <MSGFILE>; $curpos = tell(MSGFILE)) {
+ print $_ ;
+ }
+ $times++;
+ if ($times > 29) { # Nach 30 Sekunden
+ print "\n<!--PING//-->"; # Ping zum Browser senden
+ $times = 0; # Sekundenzahl auf 0 zurücksetzen
+ $online = "true" if (-e "data/online/users/$alias");
+ if ($online eq "false") {
+ print "<font size=2 color=red>Aus technischen Gründen bitte auf <a href=\"push.pl?alias=$alias&room=$room&var=clear_screen\">Weiterchatten</a> klicken.</font>";
+ exit;
+ }
+ }
+ sleep 1;
+ seek(MSGFILE, $curpos, 0); # Position wiederherstellen
+}
diff --git a/0.2.1/unten.gif b/0.2.1/unten.gif
new file mode 100644
index 0000000..285fb53
--- /dev/null
+++ b/0.2.1/unten.gif
Binary files differ
diff --git a/0.2.1/yChat.jpg b/0.2.1/yChat.jpg
new file mode 100644
index 0000000..61eabfb
--- /dev/null
+++ b/0.2.1/yChat.jpg
Binary files differ
diff --git a/0.2.2/INSTALL.txt b/0.2.2/INSTALL.txt
new file mode 100644
index 0000000..5466112
--- /dev/null
+++ b/0.2.2/INSTALL.txt
@@ -0,0 +1,86 @@
+#############################################################################
+## yChat.de Version 0.2.2 by CXG.de: The chatters of the next generation ##
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+yChat findest Du im Internet unter der Adresse www.yChat.de. Bei Kritik,
+Anregungen oder Fragen bitte in das dort vorhandene Board posten oder eine
+E-Mail an die oben stehende Adresse senden. Ich bemühe mich, yChat so gut wie
+möglich zu machen und bin über Ratschläge immer sehr erfreut :-) ...
+
+Folgende Basis-Dateien sind im Chat enthalten und müssen in das cgi-bin
+Verzeichnis kopiert werden. Z.B. nach ./cgi-bin/yChat/:
+
+config.pm => Configurationsdatei ("Shared subs")
+htdocs.pl => HTML-Dokumentdateien (Nicht unbedingt erforderlich)
+index.pl => Startskript (Registrierung, Frameset, Login, Daten edit.)
+main.pl => Hauptskript (Alle Hauptfunktionen des Chats)
+main2.pl => Skript für editieren der Benutzerdaten etc.
+online.pl => Anzeige und Überprüfung der eingelogten Benutzer
+push.pl => Server-Push-Routine
+
+LIESMICH.txt => Beinhaltet wichtige Informationen
+UPDATES.txt => Updateliste der verschiedenen Versionen
+INSTALL.txt => Dieses Dokument
+
+Folgende Verzeichnisse müssen erstellt werden (chmod 777 sollte
+funktionieren):
+
+- Hier befinden sich alle für den Chat notwenidgen Daten:
+ ./cgi-bin/yChat/data/*
+
+- Hier befinden sich alle für den Chat notwendigen HTML-Dokumente:
+ ./cgi-bin/yChat/data/htdocs/*
+
+ Folgende Dateien müssen in das "data/htdocs" verzeichnis bewegt werden:
+
+ help_html => 101 Hilfedatei
+ logs_html => 101 Logbeschreibung
+
+- Hier befinden sich alle Logdateien, die vom Chat erstellt werden:
+ ./cgi-bin/yChat/data/logs/*
+
+- Hier befinden sich die Message-Dateien der eingelogten Benutzer:
+ ./cgi-bin/yChat/data/msgs/*
+
+- Hier befinden sich alle Daten der registrierten Benutzer:
+ ./cgi-bin/yChat/data/user/*
+
+- Hier befinden sich alle Chat-Optionen und Passwörter der registrierten
+ Benutzer:
+ ./cgi-bin/yChat/data/user/options/*
+
+- Hier befinden sich alle Benutzerprofile der Benutzer:
+ ./cgi-bin/yChat/data/user/profiles/*
+
+- Hier befinden sich alle Gästebucheinträge der Benutzer:
+ ./cgi-bin/yChat/data/user/gbooks/*
+
+- Hier befinden sich alle Daten zu den aktuellen Chaträumen und User die online sind
+ ./cgi-bin/yChat/data/online/*
+
+- Hier befinden sich alle offnenen Räume
+ ./cgi-bin/yChat/data/online/rooms/*
+
+- Hier befinden sich die Chatter, die sich in den jew. Räumen befinden
+ ./cgi-bin/yChat/data/online/rooms/RAUMNAME/*
+
+- Hier befinden sich alle Chatter, die sich z.Z. im System befinden
+ ./cgi-bin/yChat/data/online/users/*
+
+- Hier befinden sich alle IP-Nummern der eingelogten Chatter
+ ./cgi-bin/yChat/data/online/ident/*
+
+Folgende GRafikdateien sollten in ein nicht-CGI-BIN-Verzeichnis kopiert werden. Z.B.
+nach ./yChat/
+
+ bar.gif => Der gelb gestreifte Rand auf den meisten Seiten
+ unten.gif => Der Hintergrund für das Eingabeformular im Chat
+ yChat.gif => Das yChat-Logo auf der Startseite
+
+Zum schluß sollte die config.pm-Datei nach wünschen editiert werden. Allerdings sollten
+die Copyright Hinweise und die Versionsnummern nicht manipuliert werden.
+
+Folgende Dateien werden von yChat automatisch erstellt:
+
+Viel Spaß beim Chatten ...
+ Snooper \ No newline at end of file
diff --git a/0.2.2/LIESMICH.txt b/0.2.2/LIESMICH.txt
new file mode 100644
index 0000000..b0789c1
--- /dev/null
+++ b/0.2.2/LIESMICH.txt
@@ -0,0 +1,24 @@
+#############################################################################
+## yChat.de Version 0.2.2 by CXG.de: The chatters of the next generation ##
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+Hallo Du,
+vielen Dank, daß Du Dir die Zeit nimmst, dieses Dokument sorgfältig zu
+lesen. Die grundliegende Idee von yChat.de ist die, ein funktionsfähiges,
+einfach zu bedienendes und zu installierendes Chat-System zu bieten. yChat
+ist keineswegs Free- oder Shareware und darf somit NICHT ohne die Erlaubnis
+vom Autor weitergegeben oder kopiert werden.
+Diejenigen, die dazu befugt sind, yChat vom eigenen Server aus zu betreiben,
+dürfen keineswegs die Copyright-Hinweise des Systems so manipulieren, daß
+diese für den Besucher nicht mehr ersichtlich sind.
+Weitergabe des yChat-Systems darf nur durch Einwilligung des Autors
+durchgeführt werden. Dies geschieht nur gegen entsprechende Gegenleistungen
+wie z.B. Bannerwerbung für www.yChat.de auf viel Besuchten Seiten (
+Seitenbesuche müssen nachgewiesen werden ), Werbung in vielgelesenen
+Newslettern o.Ä. . Allerdings sollte dem Autor vorher um Erlaubnis geboten
+werden. Gegen Geld ist das yChat-System noch nicht zu haben. Allerdings
+wird der Preis in etwa DM 500,- betragen. Für Fragen und Antworten bitte an
+die obrige E-Mail Adresse wenden.
+Installationshinweise findest Du in der datei INSTALL.txt
+MfG
+Paul C. Bütow aka Snooper
diff --git a/0.2.2/UPDATES.txt b/0.2.2/UPDATES.txt
new file mode 100644
index 0000000..e62a01c
--- /dev/null
+++ b/0.2.2/UPDATES.txt
@@ -0,0 +1,22 @@
+########################### yChat.de UPDATE LIST ###########################
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+Hier sind alle Erneuerungen der Versionen dokumentiert:
+
+Update von 0.2.1 nach 0.2.2 vom 23.11.2k
+ - Einige Bugs wurden entfernt.
+ - Geschwindigkeit des Chats wurde optimiert.
+ - Eine Liste aller eingelogten Benutzer erscheint am Rand. Hierfür
+ wurde die Datei online.pl eingeführt. Sie aktuallisiert sich alle
+ 20 Sekunden.
+ - Die UPDATES.txt wurde eingeführt.
+
+Update von 0.2.0 nach 0.2.1
+ - Einige Bugs wurden entfernt.
+ - Die IP# der eingelogten Benutzer werden
+ nun anders verwaltet.
+
+Update von Alpha XVIII nach 0.2.0
+ - Die Handhabung der eingelogten Benutzer im System wurde komplett neu
+ konzeptiert.
+ - Neue Versionsnumern wurden eingeführt.
diff --git a/0.2.2/bar.gif b/0.2.2/bar.gif
new file mode 100644
index 0000000..61d02b7
--- /dev/null
+++ b/0.2.2/bar.gif
Binary files differ
diff --git a/0.2.2/config.pm b/0.2.2/config.pm
new file mode 100644
index 0000000..4fca6b6
--- /dev/null
+++ b/0.2.2/config.pm
@@ -0,0 +1,313 @@
+########################### Dieser Teil bestimmt die Standart-Variabeln.
+##STANDART-CONFIGURATION:## (CSS, Farben, Version etc.)
+###########################
+
+$alias = $q->param("alias");
+$var = $q->param("var");
+$room = $q->param("room");
+$col = $q->param("col");
+$secol = $q->param("secol");
+$msg = $q->param("msg");
+$tmp = $q->param("tmp");
+$id = $q->param("id");
+$room = "Cyberbar" if ($room eq "");
+$col = "ffffef" if ($col eq "");
+$secol = "ffffef" if ($secol eq "");
+$datum = "23.11.2k";
+$version = "0.2.2";
+$title = "yChat.de ($version)";
+#$gfxpath = "http://localhost/yChat/";
+$gfxpath = "../../yChat/";
+$style = <<ENDCSS;
+<style rel="stylesheet" type="text/css">
+ body { background-image: url("$gfxpath/bar.gif"); background-color: 000000 }
+ body.menu { background-image: none }
+ body.log { background-color: 000000 }
+ body.online { background-color: 444444; background-image: none }
+ div { font-family: arial, verdana, helvetiva; font-size: 10pt; color: ffffff }
+ div.b { font-weight: bold; color: ffa500 }
+ a { color: ffffef }
+ a:hover { color: ffffff; text-decoration: none }
+</style>
+ENDCSS
+
+############### Dieser Teil enthält Programmcode, der an verschiedenen
+##SHARED-SUBS## Stellen ausgeführt werden muß und jedem Skript zur
+############### Verfügung steht.
+
+sub printfile { # Liest eine externe Datei ein und gibt sie mit print aus
+ my ($file2print,$pagetitle,$bodyclass) = @_;
+ if ($pagetitle ne "") {
+ &start_html($pagetitle,$bodyclass);
+ }
+ print "<div><a href=\"push.pl?alias=$alias&tmp=$tmp&var=push_logs_html\">Push</a></div><hr>" if ($bodyclass eq "log");
+ &read_file($file2print);
+ @file2print = <DATEI>;
+ close DATEI;
+ print @file2print;
+}
+
+
+sub start_html { # Der HEADER einer HTML-Datei
+print "<html><head>";
+print "<meta http-equiv=\"refresh\" content=\"20\" URL=\"online.pl?room=$room\">" if ($_[1] eq "online");
+print <<END;
+ <title>
+ $title - $_[0]
+ </title>
+ $style
+ </head>
+END
+ if ($_[1] ne "") {
+ print "<body class=$_[1]>";
+ } else {
+ print "<body>";
+ }
+}
+
+sub post { # Öffentliche Nachricht im aktuellen Raum $room posten.
+ my ($msg2post,$secroom) = @_;
+ my @rooms = ($room,$secroom);
+ foreach(@rooms) {
+ my $room2post = $_;
+ &list_dir("data/online/rooms/$room2post");
+ foreach(@dir) {
+ my $alias2post = $_;
+ if (-f "data/online/rooms/$room2post/$alias2post") {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+ }
+ }
+ }
+ &log("msg","$msg2post");
+}
+
+
+sub post_all { # Öffentliche Nachricht in ALLEN Räumen gleichzeitig posten.
+ my $msg2post = $_[0];
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ my $alias2post = $_;
+ if (-f "data/online/users/$alias2post") {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+ }
+ }
+ &log("msg","$msg2post");
+}
+
+sub post_prv { # Private Nachricht posten (flüstern).
+ my $alias2post = $_[0];
+ my $msg2post = $_[1];
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+}
+
+sub log { # Protokollieren der Nachrichten etc.
+ my ($method,$msg2log) = @_;
+ &zeit;
+ if ( $method eq "msg") {
+ $log = "data/logs/$room-$day.$month.$year";
+ } elsif ($method eq "logins") {
+ $log = "data/logs/ow/logins-$day.$month.$year";
+ $syslog = "data/logs/ow/system-$day.$month.$year";
+ } elsif ($method eq "system") {
+ $log = "data/logs/ow/system-$day.$month.$year";
+ }
+ &write_file($log);
+ if ($method eq "msg") {
+ print DATEI "<br><font color=ffffef><i>($hours:$min:$sec)</i></font> $msg2log\n";
+ } elsif ($method eq "logins") {
+ print DATEI "($day.$month.-$hours:$min:$sec) User: $alias IP#: $ENV{'REMOTE_ADDR'} Agent: $ENV{'HTTP_USER_AGENT'}\n<br>";
+ close DATEI;
+ &write_file($syslog);
+ print DATEI "($day.$month.-$hours:$min:$sec) $msg2log User: $alias IP#: $ENV{'REMOTE_ADDR'}\n<br>";
+ } elsif ($method eq "system") {
+ print DATEI "($day.$month.-$hours:$min:$sec) $msg2log User: $alias IP#: $ENV{'REMOTE_ADDR'}\n<br>";
+ }
+ close DATEI;
+}
+
+
+sub zeit { # Aktuelles Datum und Uhrzeit bestimmen.
+ ($sec, $min, $hours, $day, $month, $year) = (localtime)[0..5];
+ $month += 1;
+ $hours = "0".$hours if ($hours < 10);
+ $min = "0".$min if ($min < 10);
+ $sec = "0".$sec if ($sec < 10);
+ $day = "0".$day if ($day < 10);
+ $month = "0".$month if ($month < 10);
+ $year = $year - 100;
+ if ($year < 10) {
+ $year = "200".$year;
+ } else {
+ $year = "20".$year;
+ }
+}
+
+sub count { # Zeilen in einer Datei Zählen.
+ my $file2count = $_[0];
+ &read_file($file2count);
+ my @datei = <DATEI>;
+ close DATEI;
+ $number = $#datei+1;
+}
+
+sub read_file { # Datei öffnen.
+ my $file2read = $_[0];
+ if (-e "$file2read") {
+ open (DATEI,"<$file2read") || &error("Konnte $file2read nicht öffnen");
+ }
+}
+
+sub write_file { # Text an eine Datei anhängen.
+ my $file2write = $_[0];
+ if (-e "$file2write") {
+ open (DATEI,">>$file2write") || &error("Konnte $file2write nicht öffnen");
+ } else {
+ &create_file("$file2write");
+ open (DATEI,">>$file2write") || &error("Konnte $file2write nicht öffnen");
+ }
+}
+
+sub write_file_new { # Datei neu schreiben.
+ my $file2write = $_[0];
+ if (-e "$file2write") {
+ open (DATEI,">$file2write") || &error("Konnte $file2write nicht öffnen");
+ } else {
+ &create_file("$file2write");
+ open (DATEI,">$file2write") || &error("Konnte $file2write nicht öffnen");
+ }
+}
+
+sub create_file { # Datei erstellen.
+ my $file2create = $_[0];
+ open (CREATE, ">$file2create") || &error("Konnte $file2create nicht erstellen");
+ print CREATE "";
+ close CREATE;
+}
+
+sub error { # Error-Ausgabe.
+ my $error_msg = $_[0];
+ &start_html( "Error: ($error_msg)" );
+ print $q->div( "Error: ($error_msg)" ),
+ $q->end_html;
+ exit;
+}
+
+sub remove_online { # Chatter entfernen
+ my ($alias,$room,$method) = @_;
+ unlink("data/online/users/$alias");
+ unlink("data/online/rooms/$room/$alias") if ($room ne undef);
+ unlink("data/online/ident/$alias");
+ &rm_rooms;
+ &zeit;
+ if ($method eq undef) {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias verläßt den Chat ...</font></i>");
+ } else {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500> $_ hat den Chat verlassen ... </font></i>");
+ &log("system","\"logout_$__ok\"");
+ }
+}
+
+sub rm_alias { # Chatter aus dem System entfernen, die älter als 60 Sekunden sind
+ my $dir2rm = $_[0];
+ &list_dir($dir2rm,2);
+ foreach(@dir2) {
+ if (-f "$dir2rm/$_" && $_ ne undef) {
+ &read_file("$dir2rm/$_");
+ my $timestamp = <DATEI>;
+ close DATEI;
+ if ($timestamp < (time - 60)) {
+ if ($dir2rm eq "data/online/users") {
+ &remove_online($_,undef,1);
+ } else {
+ unlink("$dir2rm/$_");
+ }
+ }
+ }
+ }
+}
+
+sub rm_rooms { # Leere Räume aus dem System entfernen
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-d "data/online/rooms/$_") {
+ &rm_alias("data/online/rooms/$_");
+ &list_dir("data/online/rooms/$_",2);
+ rmdir("data/online/rooms/$_") if ($#dir2 = 1);
+ }
+ }
+}
+
+sub secure_removeip { # Beim ausloggen die IP-Nummer aus dat/ip austragen.
+ my $alias2rm = $_[0];
+ unlink("data/online/ident/$alias2rm");
+}
+
+sub secure_checkip { # data/ip auf die eigene IP-Nummer überprüfen.
+ my ($alias2check,$method) = @_;
+ &read_file("data/online/ident/$alias2check");
+ my @ip = <DATEI>;
+ close DATEI;
+ if ($ip[0] ne $ENV{'REMOTE_ADDR'}) {
+ &log("system","\"secure_ip\"");
+ if ($method eq undef) {
+ &error("Du bist nicht befugt, mit der IP# $ENV{'REMOTE_ADDR'} und dem Alias \"$alias\" zu handeln. Sollte diese Meldung aufgrund eines Fehlers aufgetaucht sein, dann log Dich doch bitte neu in den Chat ein.");
+ } else {
+ &post_prv("$alias2check","<font color=red>Du bist nicht befugt, mit der IP# $ENV{'REMOTE_ADDR'} und dem Alias \"$alias\" zu handeln. Sollte diese Meldung aufgrund eines Fehlers aufgetaucht sein, dann log Dich doch bitte neu in den Chat ein.</font>");
+ &input_html("true") if ($method = 2);
+ }
+ exit;
+ }
+}
+
+sub remove_rooms { # Leere Räume entfernen.
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-d "data/online/rooms/$_") {
+ &list_dir("data/online/rooms/$_");
+ rmdir("data/online/rooms/$_") if ($#dir = 1);
+ }
+ }
+}
+
+sub list_dir { # Beliebigen Verzeichnisbaum einlesen.
+ my ($dir,$method) = @_;
+ opendir(DIR, $dir);
+ if ($method eq undef) {
+ @dir = readdir(DIR);
+ } elsif ($method = 2) {
+ @dir2 = readdir(DIR);
+ }
+ closedir(DIR);
+}
+
+sub hirachie { # Chatter nach Sonderrechte überprüfen.
+ my $alias2prove = $_[0];
+ $hirachie = "nc";
+ &read_file("data/wa");
+ @was = <DATEI>;
+ close DATEI;
+ foreach(@was) {
+ if ($_ eq $alias2prove || $_ eq "$alias2prove\n") {
+ $hirachie = "wa";
+ }
+ }
+ if ($hirachie ne "wa" || $_ eq "$alias2prove\n") {
+ &read_file("data/ow");
+ @ows = <DATEI>;
+ close DATEI;
+ foreach(@ows) {
+ if ($_ eq $alias2prove || $_ eq "$alias2prove\n") {
+ $hirachie = "ow";
+ }
+ }
+ }
+}
+
+
+
diff --git a/0.2.2/help_html b/0.2.2/help_html
new file mode 100644
index 0000000..d57d552
--- /dev/null
+++ b/0.2.2/help_html
@@ -0,0 +1,616 @@
+<div>
+ Alle Chat-Befehle:
+</div>
+<hr>
+<table width=100% bgcolor=555555>
+ <tr>
+ <th bgcolor=666666>
+ <div>
+ SU
+ </div>
+ </th>
+ <th bgcolor=666666>
+ <div>
+ Befehl
+ </div>
+ </th>
+ <th bgcolor=666666>
+ <div>
+ Beschreibung
+ </div>
+ </th>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/about
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt aktuelle Version und andere Infos der Community an
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/away
+ <font color=red>
+ Nachricht
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Abmelden mit einer
+ <font color=red>
+ Abmeldenachricht
+ </font>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/clear
+ </div>
+ </td>
+ <td>
+ <div>
+ Bildschirm wird gelöscht
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/col
+ <font color=red>
+ XXXXXX
+ </font>
+ <font color=ffa500>
+ XXXXXX
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Abmelden mit einer
+ Farbe/n (
+ <font color=red>
+ Namensfarbe
+ </font>/
+ <font color=ffa500>
+ Textfarbe
+ </font>
+ ) wechseln. Angabe in Hexadezimal. Wird
+ <font color=ffa500>
+ Textfarbe
+ </font>
+ nicht angegeben, dann hat der Text die
+ <font color=red>
+ Namensfarbe
+ </font>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /date
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt aktuelles Datum und Urzeit an
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/j
+ <font color=red>
+ Raumname
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Raum wechseln/erstellen
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /ju
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ in den Raum wechseln/folgen, wo sich
+ <font color=red>
+ Alias
+ </font>
+ befindet.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/m
+ </div>
+ </td>
+ <td>
+ <div>
+ Handeln mit 2 Farben
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/me
+ </div>
+ </td>
+ <td>
+ <div>
+ Handeln mit einer Farbe
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /msg
+ <font color=red>
+ Alias
+ </font>
+ <font color=ffa500>
+ Nachricht
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>
+ Alias
+ </font>
+ eine private
+ <font color=ffa500>
+ Nachricht
+ </font>
+ flüstern. (Wird nicht vom Chat protokolliert)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /
+ <font color=ffa500>
+ Nachricht
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Eine private
+ <font color=ffa500>
+ Nachricht
+ </font>
+ demjenigen flüstern, dem zuletzt eine geflüstert wurde. (Wird nicht vom Chat protokolliert)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+//
+ </div>
+ </td>
+ <td>
+ <div>
+ Wurde zuletzt eine öffentliche Nachricht gepostet, dann wird diese nocheinmal gepostet. (Funktioniert nicht bei Befehlen, flüstern oder schreien)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/q
+ </div>
+ </td>
+ <td>
+ <div>
+ Cumunnity verlassen
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/s <font color=red>Nachricht</font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>Nachricht</font> schreien
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/w
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt an, wer sich im aktuellen Raum befindet.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/wc
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt an, wer eingelog ist.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /wc
+ <font color=red>
+ Raum
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt an, wer sich im
+ <font color=red>
+ Raum
+ </font>
+ befindet.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /wc/
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt alle offenen Räume und deren Chatter an
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /wj
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt an, in welchen Raum sich
+ <font color=red>
+ Alias
+ </font>
+ befindet.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=ffa500>
+ WÄ
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ /k
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>
+ Alias
+ </font>
+ wird aus dem Chat katapultiert!
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+/ban
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt alle verbannten Benutzer an
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+/ban
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>
+ Alias
+ </font>
+ verbannen.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+/rbaN
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>
+ Alias
+ </font>
+ "entbannen"
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ /ip
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt die IP-Nummer von
+ <font color=red>
+ Alias
+ </font>
+ an.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ /wa
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>
+ Alias
+ </font>
+ zum Wächter ernennen
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ /rwa
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>
+ Alias
+ </font>
+ vom Wächter zum normalen Chatter degradieren
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ /sys
+ <font color=red>
+ Nachricht
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Systemnachricht schreiben. (Erscheint in allen bestehenden Räumen)
+ </div>
+ </td>
+ </tr>
+</table>
+<hr>
+<div>
+ Zur Erklärung: NC steht für "Normale Chatter", WÄ für "Wächter" und OW für "Oberwächter".
+ Obrige Befehle können nur von der/den jeweiligen Benutzergruppe/n oder höher ausgeführt werden.
+</div>
+</body>
+</html> \ No newline at end of file
diff --git a/0.2.2/htdocs.pl b/0.2.2/htdocs.pl
new file mode 100644
index 0000000..b958add
--- /dev/null
+++ b/0.2.2/htdocs.pl
@@ -0,0 +1,223 @@
+#!/usr/bin/perl -w
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+if ($var eq "help_html") {
+ &printfile("data/htdocs/help_html","Alle Chatbefehle");
+} elsif ($var eq "menu_html") {
+ &menu_html;
+} elsif ($var eq "werda_html") {
+ &werda_html;
+} elsif ($var eq "logs_html") {
+ &logs_html;
+} elsif ($var eq "view_sulogs_html") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ &start_html("Oberwächter-Logdateien");
+ print "<div><a href=\"push.pl?alias=$alias&tmp=$tmp&var=push_logs_html\">Push</a><hr>";
+ &printfile($tmp);
+ print "</div></body></html>";
+ }
+} elsif ($var eq "view_logs_html") {
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ &printfile($tmp,$tmp,"log");
+ }
+} elsif ($var eq "superuser_html") {
+ &superuser_html;
+} elsif ($var eq "bar_html") {
+ print
+ $q->start_html(-bgcolor=>"ffa500"),
+ $q->end_html;
+} else {
+ print
+ $q->start_html(-bgcolor=>"000000"),
+ $q->end_html;
+}
+
+sub menu_html {
+ if ($tmp eq "quit") {
+ print
+ $q->script( { -language=>"JavaScript" }, "window.open(\"index.pl?tmp=quit\",\"_top\")" );
+ sleep 1;
+ &remove_online($alias);
+ &secure_removeip($alias);
+ unlink("data/msgs/$alias");
+ }
+ &start_html("Menü","menu");
+print <<END;
+ <center>
+ <div>
+ [<a href="htdocs.pl?var=werda_html&alias=$alias&room=$room&col=$col&secol=$secol&&tmp=$tmp" target="werda">Wer ist da?</a>]
+ [<a href="main2.pl?var=alias_html&alias=$alias&tmp=$alias" target="DeinProfil">Dein Profil</a>]
+ [<a href="main2.pl?var=edit_profile_html&alias=$alias" target="ProfilAendern">Profil ändern</a>]
+ [<a href="main2.pl?var=edit_options_html&alias=$alias" target="main">Chat-Optionen</a>]
+ [<a href="main2.pl?var=list_alias_html&alias=$alias" target="Benutzerliste">Benutzerliste</a>]
+ [<a href="htdocs.pl?var=help_html" target="Befehle">Chat-Befehle</a>]
+ [<a href="main2.pl?var=gb_html&alias=$alias" target="Board">Benutzerboard</a>]
+ [<a href="htdocs.pl?var=superuser_html&alias=$alias" target="Hirachie">Superuser</a>]
+ [<a href="htdocs.pl?var=logs_html&alias=$alias" target="Logdateien">Logdateien</a>]
+ [<a href="push.pl?alias=$alias&room=$room&var=clear_screen" target="main">Weiterchatten</a>]
+ [<a href="htdocs.pl?var=menu_html&tmp=quit&alias=$alias">Chat verlassen</a>]
+ </div>
+ </center>
+</body>
+</html>
+END
+}
+
+
+sub werda_html { # Anzeige, wer eingelogt ist.
+ &start_html("Wer ist da?");
+ print <<END;
+<div>
+ $alias, schön daß Du hier bist :-)
+</div>
+<hr>
+<div>
+ Folgende Personen befinden sich im Chat:
+</div>
+<br>
+<div>
+END
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ my $room = $_;
+ &list_dir("data/online/rooms/$room",2);
+ local $nr = $#dir2-1;
+ print $q->b( $_ ),
+ "($nr)",
+ $q->br;
+ foreach(@dir2) {
+ if ($_ ne ".." && $_ ne ".") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_" }, "$_"), " ";
+ }
+ }
+ print $q->br, $q->br;
+ }
+ }
+ print
+ "</div>",
+ $q->end_html;
+}
+
+sub logs_html {
+ &secure_checkip($alias);
+ &start_html("Logdateien");
+ print <<END;
+<div>
+ Hier befinden sich alle Logdateien
+</div>
+<hr>
+END
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ if ($hirachie eq "ow") {
+ print $q->div( "Folgende Logdateien können nur von Oberwächtern (OW) gelesen werden" );
+ &printfile("data/htdocs/logs_html");
+ &list_dir("data/logs/ow");
+ my @sortedir = sort(@dir);
+ foreach(@sortedir) {
+ if (-f "data/logs/ow/$_") {
+ print $q->a( { -href=>"htdocs.pl?var=view_sulogs_html&alias=$alias&tmp=data/logs/ow/$_",
+ -target=>$_},
+ "$_" ).
+ " ",
+ }
+ }
+ print $q->hr;
+ }
+ print $q->div( "Folgende Logdateien können nur von Wächtern und Oberwächtern gelesen werden (Sortiert nach A-Z, a-z):" ),
+ $q->br;
+ &list_dir("data/logs");
+ my @sortedir = sort(@dir);
+ foreach(@sortedir) {
+ if (-f "data/logs/$_") {
+ print $q->a( { -href=>"htdocs.pl?alias=$alias&var=view_logs_html&tmp=data/logs/$_",
+ -target=>"_new" },
+ "$_" ),
+ " ";
+ }
+ }
+ if ($hirachie eq "wa") {
+ print $q->hr,
+ $q->div( "Oberwächter können zusätzlich die Systemlogdateien lesen. Du bist allerdings ein \"Wächter\" und ",
+ " bist nicht dazu berechtigt " ),
+ $q->br;
+ &printfile("data/htdocs/logs_html");
+ }
+ } else {
+ print $q->div( "Logdateien können nur von Oberwächtern (OW) und von Wächtern (WÄ) gelesen werden. Du bist jedoch ein ",
+ "\"Normaler Chatter\". Wächter können alles nachlesen, was öffentlich gechattet wurde. Oberwächter ",
+ "können folgende Systemlogdateien zusätzlich lesen:" ),
+ $q->hr;
+ &printfile("data/htdocs/logs_html");
+ }
+ print
+ $q->end_html;
+}
+
+sub superuser_html { # Zeigt an, wer Superuser ist
+ &start_html("Superuser");
+ print "<div>Hallo $alias. Du bist als ";
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ print
+ $q->b( "Oberwächter" ),
+ " (OW) eingetragen.</div>",
+ $q->hr;
+ } elsif ( $hirachie eq "wa") {
+ print
+ $q->b( "Wächter" ),
+ " (WÄ) eingetragen.</div>",
+ $q->hr;
+ } else {
+ print
+ $q->b( "normaler Chatter" ),
+ " (NC) eingetragen.</div>",
+ $q->hr;
+ }
+ my $nrow = $#ows+1;
+ print
+ "<div>",
+ $q->b( "OW" ),
+ "s ($nrow Stück)";
+ foreach(@ows) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+ my $nrwa = $#was+1;
+ print
+ "</div>",
+ $q->hr,
+ "<div>",
+ $q->b( "WÄ" ),
+ "s ($nrwa Stück)";
+ foreach(@was) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+print <<END;
+<hr>
+ Die jeweiligen Fähigkeiten der Oberwächter (OW) und der Wächter (WÄ) sind unter
+ "<a href="htdocs.pl?var=help_html">Chat-Befehle</a>"
+ dokumentiert.
+</div>
+</body>
+</html>
+END
+} \ No newline at end of file
diff --git a/0.2.2/index.pl b/0.2.2/index.pl
new file mode 100644
index 0000000..a2d7bd3
--- /dev/null
+++ b/0.2.2/index.pl
@@ -0,0 +1,354 @@
+#!/usr/bin/perl -w
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header; # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUFGERUFEN WERDEN?##
+#####################################
+if ($var eq "create_alias_html") {
+ &create_alias_html;
+} elsif ($var eq "create_alias") {
+ &create_alias;
+} elsif ($var eq "login_html") {
+ &login_html;
+} elsif ($alias eq "") {
+ &login_html;
+} else {
+ &checklogin;
+}
+
+sub login_html { # Erste Startseite
+local $counter = undef;
+&read_file("data/count");
+ $counter = <DATEI>;
+close DATEI;
+$counter++;
+&write_file_new("data/count");
+ print DATEI $counter;
+close DATEI;
+&start_html("Created by Paul C. Bütow 2k");
+print <<END;
+ <center>
+ <table width=400>
+ <tr>
+ <td>
+ <b>
+ <div>
+ $title
+ <img src="$gfxpath/yChat.jpg">
+ </div>
+ </b>
+END
+ if ($tmp eq "true") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Wahrscheinlich existiert Dein Alias "$alias" nicht,
+ <br>
+ Du hast Dich verschrieben oder das Passwort ist falsch.
+ <br>
+ Versuch es erneuert !
+ </div>
+END
+ } elsif ($tmp eq "quit") {
+print <<END;
+ <div>
+ Du hast soeben den Chat verlassen.
+ <br>
+ Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ } elsif ($tmp eq "banned") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein Alias "$alias" wurde verbannt.
+ <br>
+ Z.z. kannst Du Dich leider nicht in den Chat einloggen.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($tmp eq "kick") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wurdest soeben aus dem Chat katapultiert!
+ <br>
+ Schlechtes Verhalten mag die Ursache hierfür sein.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($var eq "create_alias") {
+print "<div>Du hast sich soeben in die Datenbank eingetragen. Einfach auf \"Los Geht's\" klicken :-)</div>";
+ } else {
+print <<END;
+ <div>
+ Herzlich willkommen!
+ <br>
+ Einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ &log("system","\"first_http_ok\"");
+ }
+print <<END;
+ <hr>
+ <form action="index.pl">
+ <input type="hidden" name="tmp" value="true">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Alias:
+ <br>
+ <input name="alias" value="$alias">
+ </div>
+ </td>
+ <td>
+ <div>
+ Dein Passwort:
+ <br>
+ <input type="password" name="id" value="$id">
+ </div>
+ </td>
+ </tr>
+ </table>
+ <br>
+ <br>
+ <div>
+ Solltest Du noch keinen Nick besitzen, dann auf "Registrieren" klicken!
+ </div>
+ <br>
+ <table>
+ <tr>
+ <td>
+ <font color="ffffff">
+ <input type="submit" value="Los geht's!">
+ </font>
+ </form>
+ </td>
+ <td>
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias_html">
+ <font color="ffffff">
+ <input type="submit" value="Registrieren">
+ </font>
+ </form>
+ </td>
+ </tr>
+ </table>
+ <hr>
+ <div>
+ yChat befindet sich momentan noch in der Entwicklungsphase !
+ <br>
+ Fragen gehen an Paul Bütow (
+ <a href="mailto:paul\@buetow.oxg.de">
+ paul\@buetow.oxg.de
+ </a>
+ ) :-)
+ <br>
+ <br>
+ Diese Seite wurde schon $counter mal aufgerufen.
+ </td>
+ </tr>
+ </table>
+ </center>
+</body>
+</html>
+END
+}
+
+
+sub create_alias_html { # HTML-Form für Erstellung eines neuen Benutzers.
+my $reload = $_[0];
+&start_html("Registration");
+print <<END;
+ <center>
+ <table width=400>
+ <tr>
+ <td>
+END
+ if ($reload eq "alias_exists") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Der von Dir gewählte Benutzername "$alias" existiert in unserer Datenbank bereits. Bitte versuch es erneuert mit
+ einem anderen Benutzernamen !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "pw_wrong") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Deine beiden Passworteingaben stimmen nicht überein. Bitte geb das Passwort erneuert an um sicherzugehen, daß
+ kein falsches Passwort abgespeichert wird !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "alias_prohibited") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein gewählter Benutername "$alias" enthält illegale Zeichen. Bitte versuch einen anderen Benutzernamen!
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Hier kannst Du Dich registrieren. Bitte beachte, daß die Passworteingabefelder übereinstimmen!
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias">
+ <div>
+ Dein Alias:
+ <font color="ffa500">
+ (Muß angegeben werden)
+ </font>
+ <br>
+ <input name="alias" VALUE="$alias">
+ </div>
+ <br>
+ <div>
+ Dein gewünschtes Passwort:
+ <br>
+ <input type="password" name="id" value="$id">
+ </div>
+ <br>
+ <div>
+ Geb hier Dein Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp">
+ </div>
+ <br>
+ <font color=ffffff>
+ <input type="submit" value="Registrieren">
+ </font>
+ <br>
+ </form>
+ <hr>
+ <div>
+ Um den Chat zu betreten müssen die Daten nach der Registration auf der Startseite erneuert bestätigt werden !
+ </div>
+ </td>
+ </tr>
+ </table>
+</center>
+</body>
+</html>
+END
+}
+
+sub checklogin { # Überprüfen, ob die Login-Daten korrekt sind.
+ my $lognotexists = "true";
+ &list_dir("data/user/options");
+ for (my $i=0; $i<=$#dir; $i++) {
+ if ($dir[$i] eq $alias) {
+ &read_file("data/user/options/$alias");
+ @datei = <DATEI>;
+ close DATEI;
+ chomp($datei[0]);
+ if ($datei[0] eq $id) {
+ &read_file("data/ban"); # Überprüfen, ob Alias verbannt ist
+ @banned = <DATEI>;
+ close DATEI;
+ foreach(@banned) {
+ if ($_ eq "$alias\n") {
+ &log("system","\"login_alias_banned\"");
+ $tmp = "banned";
+ &login_html();
+ exit;
+ }
+ }
+ $col = $datei[1];
+ $secol = $datei[2];
+ &write_file_new("data/online/ident/$alias");
+ print DATEI $ENV{'REMOTE_ADDR'};
+ close DATEI;
+ &frameset_html;
+ exit;
+ } else {
+ &log("system","\"login_pw_wrong\"");
+ $lognotexists = "false";
+ }
+ }
+ }
+ if ($lognotexists eq "true") {
+ &log("system","\"login_alias_notexists\"");
+ }
+ &login_html; # Falls Login-Daten inkorrekt sind, zurück zur Startseite.
+}
+
+sub create_alias { # Erstellung eines neuen Benutzers.
+ if ($alias =~ /[\W]/ || $alias eq "") {
+ &log("system","\"reg_alias_prohibited\"");
+ &create_alias_html("alias_prohibited");;
+ exit;
+ } elsif ($id ne $tmp) {
+ &log("system","\"reg_pw_wrong\"");
+ &create_alias_html("pw_wrong");
+ exit;
+ }
+ &list_dir("data/user/options");
+ for (my $i=0; $i<=$#dir; $i++) {
+ if ($dir[$i] eq $alias) {
+ &log("system","\"reg_alias_exists\"");
+ &create_alias_html("alias_exists");
+ exit;
+ }
+ }
+ &write_file_new("data/user/options/$alias");
+ print DATEI $id."\n";
+ close DATEI;
+ &zeit;
+ &list_dir("data/user/options");
+ my $number = $#dir-1;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias [$number] hat sich soeben als neuer Benutzer registriert :-) ...</font></i>");
+ &log("system","\"reg_ok\"");
+ &login_html;
+}
+
+sub frameset_html {
+print <<END;
+<html>
+ <head>
+ <title>
+ $title - Created by Paul C. Bütow 2k
+ </title>
+ </head>
+<frameset border=0 frameborder=0 framespacing=0 rows="50,1,*,55">
+ <frame name="menu" src="htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol" scrolling="no">
+ <frame src="htdocs.pl?var=bar_html scrolling="no">
+ <frameset border=0 frameborder=0 framespacing=0 cols="150,*">
+ <frame name="online" src="online.pl?room=$room&alias=$alias">
+ <frame name="main" src="push.pl?room=$room&alias=$alias&var=clear_screen">
+ </frameset>
+ <frame name="input" src="main.pl?alias=$alias&var=input_html&room=$room&col=$col&secol=$secol&tmp=login" scrolling="no">
+</frameset>
+</html>
+END
+}
diff --git a/0.2.2/logs_html b/0.2.2/logs_html
new file mode 100644
index 0000000..1317062
--- /dev/null
+++ b/0.2.2/logs_html
@@ -0,0 +1,391 @@
+<br>
+<div>
+ In der System-Logdatei tauchen folgende Ursachen auf:
+</div>
+<br>
+<table border=0 width=100% bgcolor=555555>
+ <tr>
+ <th bgcolor=666666>
+ <div>
+ Ursache
+ </div>
+ </th>
+ <th bgcolor=666666>
+ <div>
+ Beschreibung
+ </div>
+ </th>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ edit_profile_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzername hat sein Profil erfolgreich editiert.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ edit_pw_wrong
+ </div>
+ </td>
+ <td>
+ <div>
+ Beim Editieren der Chat-Optionen stimmten die beiden Passwortfelder nicht überein.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ edit_colors_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzername hat seine Chatfarben erfolgreich gewechselt.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+edit_options_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzername hat seine Chat-Optionen erfolgreich editiert.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+first_http_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Der angegebenen IP# wurde Startseite erfolgreich angezeigt. (Benutzername noch nicht vorhanden)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+login_alias_banned
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzer konnte sich nicht in das System einloggen, da sein benutzername verbannt war.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ login_alias_notexists
+ </div>
+ </td>
+ <td>
+ <div>
+ Beim Einlogversuch existierte der angegebene Benutzername nicht.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+login_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzer hat sich erfolgreich in das System eingelogt.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ login_pw_wrong
+ </div>
+ </td>
+ <td>
+ <div>
+ Beim Einloggen wurde das falsche PW eingegeben.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ logout_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzer hat sich erfolgreich (manuell) aus dem System ausgelogt. ("... verläßt den Chat ...")
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ logout_<font color=red>Alias</font>_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ User hat gemerkt, daß sich
+ <font color=red>
+ Alias
+ </font>
+ nicht mehr im Chat befindet. ("... hat den Chat verlassen ...").
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ow_ban_<font color=red>Alias</font>_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat
+ <font color=red>
+ Alias
+ </font>
+ verbannt
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ow_ban_<font color=red>Alias</font>_ow
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat ohne Erfolg versucht
+ <font color=red>
+ Alias
+ </font>
+ zu verbannen (
+ <font color=red>
+ Alias
+ </font>
+ war Oberwächter und konnte nicht verbannt werden )
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ow_rban_<font color=red>Alias</font>_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat
+ <font color=red>
+ Alias
+ </font>
+ "entbannt"
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ ow_wa_<font color=red>Alias</font>_exists
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat ohne Erfolg versucht
+ <font color=red>
+ Alias
+ </font>
+ zum Wächter zu ernennen. (
+ <font color=red>
+ Alias
+ </font>
+ war bereits als Wächter eingetragen.)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ ow_wa_<font color=red>Alias</font>_notexists
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat ohne Erfolg versucht
+ <font color=red>
+ Alias
+ </font>
+ zum Wächter zu ernennen. (
+ <font color=red>
+ Alias
+ </font>
+ existierte nicht in der Benutzerdatenbank.)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ ow_wa_<font color=red>Alias</font>_ow-exists
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat ohne Erfolg versucht
+ <font color=red>
+ Alias
+ </font>
+ zum Wächter zu ernennen. (
+ <font color=red>
+ Alias
+ </font>
+ war bereits als Oberwächter eingetragen. Oberwächter können nicht zeitgleich Wächter sein.)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ ow_wa_<font color=red>Alias</font>_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat
+ <font color=red>
+ Alias
+ </font>
+ erfolgreich zum Wächter ernannt.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ ow_rwa_<font color=red>Alias</font>_notexists
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter konnte
+ <font color=red>
+ Alias
+ </font>
+ nicht zum Wächter ernennen. (War nicht als WÄ registriert)..
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ ow_rwa_<font color=red>Alias</font>_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat
+ <font color=red>
+ Alias
+ </font>
+ vom Wächter zum normalen Chatter degradiert.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ reg_alias_exists
+ </div>
+ </td>
+ <td>
+ <div>
+ Bei der Registrierung war der Benutzername bereits vorhanden.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ reg_alias_prohibited
+ </div>
+ </td>
+ <td>
+ <div>
+ Bei der Registrierung war der angegebene Benutzername verboten (enthielt Sonderzeichen).
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ reg_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzername hat sich erfolgreich registriert.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ reg_pw_wrong
+ </div>
+ </td>
+ <td>
+ <div>
+ Bei der Registrierung wurde das PW falsch eingegeben.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ secure_ip
+ </div>
+ </td>
+ <td>
+ <div>
+ Unbefugter Zugriff der angegebenen IP# auf den angegebenen Benutzernamen.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ sys_msg_<font color=red>Raum</font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Oberwächter schreibt eine Systemnachricht aus
+ <font color=red>
+ Raum
+ </font>.
+ </div>
+ </td>
+ </tr>
+</table>
+<br> \ No newline at end of file
diff --git a/0.2.2/main.pl b/0.2.2/main.pl
new file mode 100644
index 0000000..ac156fb
--- /dev/null
+++ b/0.2.2/main.pl
@@ -0,0 +1,497 @@
+#!/usr/bin/perl -w
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+if ($var eq "input_html") {
+ &input_html;
+} elsif ($var eq "post_msg") {
+ &post_msg;
+} elsif ($var eq "change_room") {
+ &change_room;
+} else {
+ &error("Parameter fehlt");
+}
+
+sub input_html { # Eingabemaske für den Chat.
+ my ($reload,$action,$whisper,$lastmsg) = @_;
+ $action = $q->param('action') if ($action eq "");
+ if ($tmp eq "away") {
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias meldet sich zurück ... </font></i>");
+ } elsif ($tmp eq "login") {
+ &remove_rooms;
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat den Chat betreten ...</font></i>");
+ &log("logins","\"login_ok\"");
+ }
+ if ($action ne "" && $action ne "whisper" && $action ne "away") {
+ print "<html><head><script language=\"JavaScript\">";
+ if ($action eq "change_room") {
+ print "open(\"online.pl?alias=$alias&room=$room\",\"online\");";
+ print "open(\"main.pl?var=input_html&alias=$alias&room=$room&col=$col&secol=$secol\",\"input\");";
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol\",\"menu\");";
+ } elsif ($action eq "change_colors") {
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol\",\"menu\");";
+ }
+ print "</script></head><body background=\"$gfxpath/unten.gif\" bgcolor=ffa500>";
+ } else {
+ print "<html><body background=\"$gfxpath/unten.gif\" bgcolor=ffa500>";
+ }
+ print "<center><form action=\"main.pl\">";
+ print "<input type=\"hidden\" name=\"tmp\" value=\"away\">" if ($action eq "away");
+ print <<END;
+ <input type="hidden" name="var" value="post_msg">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="room" value="$room">
+ <input type="hidden" name="col" value="$col">
+ <input type="hidden" name="secol" value="$secol">
+ <input type="hidden" name="id" value="$whisper">
+ <input type="hidden" name="lastmsg" value="$lastmsg">
+ <input size="70" name="msg">
+ <input type="submit" value="Texten"></form></center>
+END
+if ($reload eq "true") {
+print <<END;
+ <script language="JavaScript">
+ <!--
+ document.forms[0].msg.focus();
+ //-->
+ </script>
+END
+}
+print
+ $q->end_html;
+}
+
+sub post_msg { # Wird aufgerufen, wenn aus input_html eine Eingabe gepostet wurde.
+ $| = 1; # Cache von Perl ausschalten
+ $msg =~ s#<#&lt\;#g; # HTML-Tags deaktivieren
+ $msg =~ s#kilahu#yChat#g;
+ $msg =~ s#ooperle#per!#g;
+ if (substr($msg,0,1) ne "/") { # Überprüfen, ob Befehl oder Nachricht
+ $msg = "<b><font color=$col>$alias: <font color=$secol>".$msg."</font></font></b>";
+ $msg =~ s#"#'#g; # " in ' umtauschen für den befehl "//"
+ &input_html("true","",$id,$msg); # -> Reload=true, Action=none, Whisper=$id
+ &secure_checkip($alias,1);
+ &post($msg);
+ } else {
+ &secure_checkip($alias,2);
+ &cmd($msg);
+ }
+}
+
+sub cmd { # Alle Chatbefehle, die über input_html eingegeben werden können.
+ $_[0] = $_[0]." ";
+ $_[0] = substr($_[0], 1, length($_[0])-1);
+ my @cmd = split(/ /, $_[0]);
+ my $cmd = substr($_[0],0 , index($_[0], " "));
+ my ($reload,$action,$whisper) = ("true","",$id);
+#############>- NORMALE CHATBEFEHLE ( Alphabetisch sortiert ) -<
+#############>- DER LETZTEN ZUGEFLÜSTERTEN PERSON NOCHEINMAL FLÜSTERN -<
+ if ($cmd eq "/") {
+ &post($q->param('lastmsg'));
+#############>- INFORMATIONEN ÜBER DAS SYSTEM AUSGEBEN -<
+ } elsif ($cmd eq "about") {
+ &post_prv("$alias","<font size=2 color=ffffff>Aktuelle Version ist $title und wurde am $datum aktuallisiert. Created by Paul C. Bütow 2k.</font>");
+#############>- ABMELDEN MIT 'AWAY-NACHRICHT' -<
+ } elsif ($cmd eq "away") {
+ if ($tmp eq "away") { # Falls 2 mal hintereinander /away eingegeben wurde
+ $tmp = "";
+ }
+ for ($i=1; $i <= $#cmd; $i++) {
+ $tmp = $tmp." ".$cmd[$i];
+ }
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias meldet sich ab (<font color=red>$tmp</font> ) ...</i></font>");
+ $action = "away";
+#############>- EIGENEN CHATBILDSCHIRM LÖSCHEN -<
+ } elsif ($cmd eq "clear") {
+ &post_prv("$alias","<script language=\"JavaScript\">window.open(\"push.pl?alias=$alias&room=$room&var=clear_screen\",\"main\");</script>");
+#############>- FARBEN WECHSELN -<
+ } elsif ($cmd eq "col") {
+ $col = $cmd[1];
+ my $tmpsecol = $cmd[2];
+ if ($tmpsecol eq "") {
+ $secol = $col
+ } else {
+ $secol = $tmpsecol;
+ }
+ &read_file("data/user/options/$alias");
+ my @pro = <DATEI>;
+ close DATEI;
+ &write_file_new("data/user/options/$alias");
+ print DATEI $pro[0]."".$col."\n".$secol;
+ close DATEI;
+ &log("system","\"edit_colors_ok\"");
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat die Farbe gewechselt ...</font></i>");
+ $action = "change_colors";
+#############>- AKTUELLES DATUM UND URZEIT AUSGEBEN -<
+ } elsif ($cmd eq "date") {
+ &zeit;
+ &post_prv("$alias","<font size=2 color=ffffff>Heute ist der $day.$month. Jahr $year. Es ist genau $hours:$min Uhr und $sec Sekunden.</font>");
+#############>- EINEN NEUEN RAUM ERSTELLEN BZW. IN EINEN BESTEHENDEN RAUM WECHSELN -<
+ } elsif ($cmd eq "j") {
+ &change_room("j",$cmd[1],$room);
+ $action = "change_room";
+#############>- HANDELN -<
+ } elsif ($cmd eq "me" || $cmd eq "m") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $me_msg = $me_msg." ".$cmd[$i];
+ }
+ if ($cmd eq "m") {
+ &post("<i><font color=$col>$alias <font color=$secol>$me_msg</font></font></i>");
+ } else {
+ &post("<i><font color=$col>$alias $me_msg</font></i>");
+ }
+#############>- FLÜSTERN ( Auch mit '/' ) -<
+ } elsif ($cmd eq "msg" || $cmd eq "") {
+ my ($alias2post,$msg2post) = ($cmd[1],"");
+ if ($cmd eq "msg") {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ } else {
+ $alias2post = $id;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ }
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ if ($_ eq $alias2post) {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "<i><font color=$col>$alias flüstert <font color=ffffff>=></font><font color=$secol>$msg2post</font></font></i><br>\n";
+ close DATEI;
+ &write_file("data/msgs/$alias");
+ print DATEI "<i><font color=$col>Zu $alias2post geflüstert <font color=ffffff>=></font><font color=$secol>$msg2post</font></font></i><br>\n";
+ close DATEI;
+ &input_html($reload,"",$alias2post);
+ exit;
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2post <font color=ffffff>ist momentan nicht anwesend !</font></font>");
+#############>- DAS SYSTEM VERLASSEN -<
+ } elsif ($cmd eq "q") {
+ &post_prv("$alias","<script language=\"JavaScript\">window.open(\"index.pl?tmp=quit\",\"_top\");</script>");
+ sleep 1;
+ &remove_online($alias,$room);
+ &secure_removeip($alias);
+ unlink("data/msgs/$alias");
+ exit;
+#############>- SCHREIEN -<
+ } elsif ($cmd eq "s") {
+ my $msg2scream,$msg2post;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2scream = $msg2scream." ".$cmd[$i];
+ }
+ $msg2post = "\U$msg2scream";
+ &post("<font color=$col><i>$alias schreit:</i> <b><font color=$secol>".$msg2post."</font></font></b>");
+#############>- ANZEIGEN WER SICH IM AKTUELLEN RAUM BEFINDET -<
+} elsif ($cmd eq "w") {
+ &list_dir("data/online/rooms/$room");
+ my ($is,$nr) = ("t",0);
+ foreach(@dir) {
+ if (-f "data/online/rooms/$room/$_") {
+ $personen = $personen." ".$_;
+ $nr++;
+ }
+ }
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "n";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>$nr Person$nrs befinde$is sich im aktuellen Raum (\"$room\"): <font color=ffa500>$personen</font></font>");
+#############>- ANZEIGEN WER SICH IM SYSTEM BEFINDET -<
+ } elsif ($cmd eq "wc" || $cmd eq "wc/") {
+ $raum = $cmd[1];
+ if ($raum eq "" && $cmd eq "wc") {
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/users/$_");
+ }
+ my $nr = ($#dir-1);
+ my ($nrs,$is) = ("","ist");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "sind";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>$nr Person$nrs $is insgesamt eingelogt: <font color=ffa500>$personen</font></font>");
+ } elsif ($raum eq "" && $cmd eq "wc/") {
+ my $msg2post;
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ &list_dir("data/online/rooms/$_",2);
+ my $nr = $#dir2-1;
+ $msg2post = $msg2post."<tr><td><b><font size=2 color=ffffff>$_ ($nr)</font></b></td><td><font size=2 color=ffffff>";
+ foreach $chatter (@dir2) {
+ if (-f "data/online/rooms/$_/$chatter") {
+ $msg2post = $msg2post."$chatter ";
+ }
+ }
+ print "</font></td>";
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>Folgende Räume sind offen:</font><table>$msg2post</table>");
+ } elsif ($raum ne "") {
+ my $personen;
+ &list_dir("data/online/rooms/$raum");
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/rooms/$raum/$_");
+ }
+ my ($nr,$is) = (($#dir-1),"t");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "n";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff> $nr Person$nrs befinde$is sich im Raum \"$raum\": <font color=ffa500>$personen</font></font>");
+ }
+#############>- ANZEIGEN IN WELCHEN RAUM SICH JMD. BEFINDET BZW. JMD IN EINEN RAUM FOLGEN -<
+ } elsif ($cmd eq "wj" || $cmd eq "ju") {
+ my $alias2search = $cmd[1];
+ &list_dir("data/online/rooms");
+ foreach $raum (@dir) {
+ &list_dir("data/online/rooms/$raum",2) if (-d "data/online/rooms/$raum");
+ foreach $user (@dir2) {
+ if (-f "data/online/rooms/$raum/$user") {
+ if ($user eq $alias2search) {
+ if ($cmd eq "wj") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2search <font color=ffffff>befindet sich im Raum \"$raum\" !</font></font>");
+ } else {
+ $action = "change_room";
+ &change_room("ju",$raum,$room,$alias2search);
+ }
+ &input_html($reload,$action,$whisper);
+ exit;
+ }
+ }
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2search <font color=ffffff> ist nicht eingelogt !</font></font>");
+#############>- SUPERUSER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- ALIAS VERBANNEN BZW. ENTBANNEN -<
+ } elsif ($cmd eq "ban" || $cmd eq "rban") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ my ($alias2handle,$registriert) = $cmd[1];
+ &list_dir("data/user/options");
+ foreach(@dir) {
+ $registriert = "true" if ($_ eq $alias2handle);
+ }
+ if ($registriert ne "true") {
+ if ($cmd eq "ban") {
+ if ($alias2handle ne "") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> existiert nicht in der Benutzerdatenbank und kann so nich verbannt werden !</font></font>");
+ } else {
+ &read_file("data/ban");
+ my @banned = <DATEI>;
+ my ($benutzer);
+ my $nr = $#banned+1;
+ close DATEI;
+ foreach(@banned) {
+ $benutzer = $benutzer." ".$_;
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>Folgende Benutzer sind verbannt [$nr]: <font color=ffa500>$benutzer</font></font>");
+ }
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> existiert nicht in der Benutzerdatenbank und kann so nicht \"entbannt\" werden !</font></font>");
+ }
+ &input_html("true");
+ exit;
+ }
+ &read_file("data/ban");
+ my @banlist = <DATEI>;
+ close DATEI;
+ foreach(@banlist) {
+ if ($_ eq "$alias2handle\n") {
+ if ($cmd eq "ban") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> ist bereits verbannt worden !</font></font>");
+ } else {
+ my $banned = "false";
+ foreach(@banlist) {
+ $banned = "true" if ($_ eq "$alias2handle\n");
+ }
+ if ($banned eq "true") {
+ my @newbanlist;
+ foreach(@banlist) {
+ push @newbanlist,$_ if ($_ ne "$alias2handle\n");
+ }
+ &write_file_new("data/ban");
+ print DATEI @newbanlist;
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> wurde soeben \"entbannt\" !</font></font>");
+ &log("system","\"ow_rban_$alias2handle_ok\"");
+ }
+ }
+ &input_html("true");
+ exit;
+ }
+ }
+ if ($cmd eq "ban") {
+ &hirachie($alias2handle);
+ if ($hirachie ne "ow") {
+ &write_file("data/ban");
+ print DATEI "$alias2handle\n";
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> wurde soeben verbannt und kann sich nun nichtmehr in den Chat einloggen !</font>");
+ &log("system","\"ow_ban_".$alias2handle."_ok\"");
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> ist ein Oberwächter und kann deshalb nicht verbannt werden !</font></font>");
+ &log("system","\"ow_ban_".$alias2handle."_ow\"");
+ }
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> konnte nicht \"entbannt\" werden, da <font color=ffa500>$alias2handle</font> garnicht verbannt war !</font></font>");
+ }
+ }
+#############>- IP # VON ALIAS ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "ip") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ my $alias2prove = $cmd[1];
+ &list_dir("data/online/ident");
+ foreach(@dir) {
+ if ($_ eq $alias2prove) {
+ &read_file("data/online/ident/$_");
+ local $ipnr = <DATEI>;
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$_ <font color=ffffff>hat die IP-Nummer $ipnr !</font></font>");
+ }
+ }
+ }
+#############>- ALIAS AUS DEM CHAT KATAPULTIEREN -<
+ } elsif ($cmd eq "k") {
+ &hirachie($alias);
+ if ($hirachie eq "wa" || $hirachie eq "ow") {
+ my $alias2kick = $cmd[1];
+ &list_dir("data/online/rooms");
+ foreach $raum (@dir) {
+ &list_dir("data/online/rooms/$raum",2);
+ foreach $chatter (@dir2) {
+ if ($chatter eq $alias2kick) {
+ &hirachie($alias2kick);
+ if ($hirachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist Oberwächter und kann nicht \"gekickt\" werden !</font></font>");
+ &log("system","wa_k_$alias2kick_ow"); #!!
+ } elsif ($hirachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist Wächter und kann nicht \"gekickt\" werden !</font></font>");
+ &log("system","wa_k_$alias2kick_ow"); #!!
+ } else {
+ &post_prv("$alias2kick","<script language=\"JavaScript\">window.open(\"index.pl?tmp=kick\",\"_top\");</script>");
+ &zeit;
+ $_ = undef if ($room eq $_);
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias katapultiert \"$alias2kick\" aus dem Chat ...</font></i>",$_);
+ &log("system","wa_k_$alias2kick"); #!!
+ &remove_online($alias2kick,$_,"kick");
+ &secure_removeip($alias2kick);
+ }
+ &input_html("true");
+ exit;
+ }
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist nicht anwesend und kann nicht \"gekickt\" werden !</font></font>");
+ }
+#############>- SYSTEMNACHRICHT IN ALLE BESTEHENDEN RÄUME POSTEN -<
+ } elsif ($cmd eq "sys") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $sys_msg = $sys_msg." ".$cmd[$i];
+ }
+ &zeit;
+ &post_all("<i><font color=ffffff>($hours:$min:$sec)</font></i> <b><font size=2 color=red>SYSTEMNACHRICHT</font></b><i><font color=ffffff>: $sys_msg ...</font></i>");
+ &log("system","\"sys_msg_$room\"");
+ }
+#############>- ALIAS ZUM WÄCHTER ERNNENNEN BZW. ZUM NORMALEN CHATTER DEGRADIEREN -<
+ } elsif ($cmd eq "wa" || $cmd eq "rwa") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ &zeit;
+ my $alias2handle = $cmd[1];
+ if ($cmd eq "wa") {
+ my $anerkennen = "false";
+ &list_dir("data/user/options");
+ foreach(@dir) {
+ if ($_ eq $alias2handle) {
+ $anerkennen = "true";
+ }
+ }
+ if ($anerkennen eq "true") {
+ &hirachie($alias2handle);
+ if ($hirachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff>ist bereits als Wächter eingetragen. Eine erneuerte Eintragung ist nicht möglich!</font></font>");
+ &log("system","\"oh_wa_".$alias2handle."_exists\"");
+ } elsif ($hirachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff>ist schon als Oberwächter eingetragen. Oberwächter können nicht gleichzeitig Wächter sein!</font></font>");
+ &log("system","\"oh_wa_".$alias2handle."_oh-exists\"");
+ } else {
+ &write_file("data/wa");
+ print DATEI $alias2handle."\n";
+ close DATEI;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font><font color=ffa500> $alias ernennt \"$alias2handle\" zum Wächter ...</font></i>");
+ &log("system","\"oh_wa_".$alias2handle."_ok\"");
+ }
+ } else {
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2handle <font color=ffffff>kann nicht zum Wächter ernannt werden da Benutzername nicht existiert!</font></font>");
+ &log("system","\"oh_wa_".$alias2handle."_notexists\"");
+ }
+ } elsif ($cmd eq "rwa") {
+ &read_file("data/wa");
+ my @wafile = <DATEI>;
+ close DATEI;
+ my $aberkennen = "false";
+ foreach(@wafile) {
+ if ($_ ne "$alias2handle\n") {
+ push @newafile,$_;
+ } else {
+ $aberkennen = "true";
+ }
+ }
+ &write_file_new("data/wa");
+ print DATEI @newafile;
+ close DATEI;
+ if ($aberkennen eq "true") {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat \"$alias2handle\" vom Wächter zum normalen Chatter degradiert ...</font></i>");
+ &log("system","\"oh_rwa_".$alias2handle."_ok\"");
+ } else {
+ &post("<font size=2 color=ffa500>$alias2handle <font color=ffffff>konnte der Wächterstatus nicht aberkannt werden da Benutzer kein Wächter ist!</font></font>");
+ &log("system","\"oh_rwa_".$alias2handle."_notexists\"");
+ }
+ }
+ }
+#############>- ENDE DER CHATBEFEHLE -<
+}
+&input_html($reload,$action,$whisper);
+}
+
+sub change_room { # Den Chat-Raum wechseln
+ my ($method,$newroom,$oldroom,$alias2follow) = @_;
+ $room = $oldroom;
+ &secure_checkip($alias); # IP Nummer überprüfen
+ &zeit; # Zeit 'erneuern'
+ if ($method eq "j") {
+ unlink("data/online/rooms/$oldroom/$alias");
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias wechselt in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias kommt aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ &post_prv("$alias","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>Du wechselst aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ } elsif ($method eq "ju") {
+ unlink("data/online/rooms/$oldroom/$alias");
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias folgt \"$alias2follow\" in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias kommt aus dem Raum \"$oldroom\" und folgt \"$alias2follow\" herein nach \"$newroom\" ...</font></i>");
+ &post_prv("$alias","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>Du folgst \"$alias2follow\" aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ }
+ &rm_rooms;
+}
+
diff --git a/0.2.2/main2.pl b/0.2.2/main2.pl
new file mode 100644
index 0000000..9e6066c
--- /dev/null
+++ b/0.2.2/main2.pl
@@ -0,0 +1,502 @@
+#!/usr/bin/perl -w
+
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+
+if ($var eq "list_alias_html") {
+ &list_alias_html;
+} elsif ($var eq "alias_html") {
+ &alias_html;
+} elsif ($var eq "edit_profile_html") {
+ &edit_html("edit_profile_html");
+} elsif ($var eq "edit_options_html") {
+ &edit_html("edit_options_html");
+} elsif ($var eq "gb_html") {
+ &gb_html;
+} elsif ($var eq "post_gb") {
+ &post_gb;
+} elsif ($var eq "rm_gb_alias") {
+ &rm_gb;
+} elsif ($var eq "edit_profile") {
+ &edit("edit_profile");
+} elsif ($var eq "edit_options") {
+ &edit("edit_options");
+} else {
+ &error("Parameter fehlt");
+}
+
+###########################
+##HAUPTTEIL DIESER DATEI:##
+###########################
+
+sub gb_html { # Das Benutzerboard/Gästebuch.
+ my $message = $_[0];
+ &start_html("Benutzerboard");
+if ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </i>
+ einen Text und poste
+ <u>dann</u>
+ !
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Vielen Dank für Deinen Beitrag. Wenn Du willst, kannst Du jetzt gleich noch einen Eintrag posten ...
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Falls Du Anregungen oder Verbesserungsvorschläge für die Community hast, dann poste doch einen kleinen Eintrag :-)
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmp" value="guestbook">
+ <input type="hidden" name="id" value="y">
+ <input size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+ if (-e "data/guestbook") {
+ open (DATEI,"<data/guestbook") || &error("Konnte dat/guestbook nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ print
+ $q->div(@datei);
+ }
+ print
+ $q->end_html;
+}
+
+
+sub post_gb { # Wenn etwas in ein Gästebuch eingetragen wird
+ &secure_checkip($alias);
+ &zeit;
+ if ($msg eq "") {
+ if ($id eq "y") { # Überprüfen, ob Benutzerboard- oder Privatgästebuch
+ &gb_html("post_empty");
+ } else {
+ &alias_html("post_empty");
+ }
+ exit;
+ }
+ $msg =~ s#<#&lt\;#g;
+ my $tmpath = "";
+ if ($id eq "y") {
+ $tmpath = "data/guestbook";
+ } else {
+ $tmpath = "data/user/gbooks/$tmp";
+ }
+ if (-e "$tmpath") {
+ &read_file("$tmpath");
+ my @datei = <DATEI>;
+ close DATEI;
+ pop(@datei) if ($#datei > 99);
+ my @newdatei = "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ @newdatei = ("@newdatei", "@datei");
+ &write_file_new("$tmpath");
+ print DATEI @newdatei;
+ close DATEI;
+ } else {
+ &write_file_new("$tmpath");
+ print DATEI "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ close DATEI;
+ }
+ if ($id eq "y") {
+ &gb_html("post_ok");
+ exit;
+ } else {
+ post_prv("$tmp","<font size=2 color=ffffff><a href=\"main2.pl?alias=$alias&var=alias_html&tmp=$alias\" target=\"_new\">$alias</a> hat soeben einen Pin in <a href=\"main2.pl?alias=$alias&var=alias_html&tmp=$tmp\" target=\"_new\">Dein Profil</a> gehängt ... </font>");
+ &alias_html;
+ exit;
+ }
+}
+
+sub rm_gb { # Gästebucheintrag entfernen
+ &secure_checkip($alias);
+ $tmp = $alias;
+ &read_file("data/user/gbooks/$alias");
+ my @gbfile = <DATEI>;
+ close DATEI;
+ my @newgbfile = ();
+ for($i=0; $i <= $#gbfile; $i++) {
+ push(@newgbfile,$gbfile[$i]) if ($i != $id);
+ }
+ &write_file_new("data/user/gbooks/$alias");
+ print DATEI @newgbfile;
+ close DATEI;
+ &alias_html("rm_ok");
+}
+
+sub list_alias_html { # Liste aller Benutzer
+ &start_html("Alle Benutzer");
+ &list_dir("data/user/options");
+ my @liste = sort(@dir);
+ my $nr = $#dir-1;
+print <<END;
+ <div>
+ Es sind z.Z. genau $nr Benutzernamen in der Datenbank vorhanden! (Sortiert nach #, A-Z, a-z)
+ </div>
+ <hr>
+ <div>
+END
+ foreach(@liste) {
+ if (-f "data/user/options/$_") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_" },
+ "$_"),
+ " ";
+ }
+ }
+print <<END;
+ </div>
+</body>
+</html>
+END
+}
+
+sub alias_html { # Anzeigen eines Benutzerprofils
+ my $message = $_[0];
+ &start_html($tmp);
+print <<END;
+<div>
+ <a href="htdocs.pl?var=werda_html&alias=$alias">Hier</a>
+ gehts zur Gesamtübersicht !
+</div>
+<hr>
+END
+if ($message eq "rm_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Der von Dir gewählte Eintrag wurde erfolgreich gelöscht.
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </u>
+ einen Text und poste
+ <u>dann</u>
+ !
+ <hr>
+END
+}
+ &read_file("data/user/profiles/$tmp");
+ @data = <DATEI>;
+ close DATEI;
+print <<END;
+ <div>
+ Alias: $tmp
+ <br>
+ <br>
+ Nachname: $data[0]
+ <br>
+ <br>
+ Vorname: $data[1]
+ <br>
+ <br>
+ Alter: $data[2]
+ <br>
+ <br>
+ Wohnort: $data[3]
+ <br>
+ <br>
+ E-Mail:
+ <a href="mailto:$data[4]">$data[4]</a>
+ <br>
+ <br>
+ ICQ-Nummer: $data[5]
+ <br>
+ <br>
+ Homepage:
+ <a href="$data[6]" target="_new">$data[6]</a>
+ <br>
+ <br>
+ Weiteres:
+ <br>
+ $data[7]
+ <hr>
+ Hier kannst Du $tmp eine Nachricht hinterlassen!
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input type="text" size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+if (-e "data/user/gbooks/$tmp") {
+ open (DATEI,"<data/user/gbooks/$tmp") || &error("Konnte data/user/gbooks/$tmp nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ if ($alias ne $tmp) {
+ print @datei;
+ } else {
+print <<END;
+ <table>
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="rm_gb_alias">
+ <input type="hidden" name="alias" value="$alias">
+END
+for($i=0; $i <= $#datei; $i++) {
+print <<END;
+ <tr>
+ <td>
+ <input type="radio" name="id" value="$i">
+ </td>
+ <td>
+ <div class=q>
+ $datei[$i]
+ </div>
+ </td>
+ </tr>
+END
+}
+print <<END;
+ </table>
+ <table>
+ <tr>
+ <td>
+ <font color=ffffff>
+ <input type="submit" value="Makierten Eintrag löschen">
+ </font>
+ </td>
+ <td>
+ <font color=ffffff>
+ <input type="reset" value="Makierung rückgängig machen">
+ </font>
+ </td>
+ </tr>
+ </table>
+ </form>
+END
+}
+}
+ print
+ $q->end_html;
+}
+
+sub edit_html { # Chat-Optionen / Benutzerprofil editieren
+ my ($method,$message) = @_;
+ &secure_checkip($alias);
+ &start_html("Benutzerprofil ändern");
+ if ($method eq "edit_options_html") {
+ &read_file("data/user/options/$alias");
+ } elsif ($method eq "edit_profile_html") {
+ &read_file("data/user/profiles/$alias");
+ }
+ @data = <DATEI>;
+ close DATEI;
+ if ($method eq "edit_options_html") {
+ chomp($data[0]);
+ if ($message eq "edit_options_ok") {
+print <<END;
+<script language="JavaScript">
+ open("main.pl?var=input_html&alias=$alias&room=$room&col=$col&secol=$secol","input");
+ open("htdocs.pl?var=menu_html&alias=$alias&room=$room&col=$col&secol=$secol","menu");
+</script>
+<div class=b>
+ Hinweis:
+</div>
+<div>
+ Du hast soeben Deine Chat-Optionen erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren. Um
+ weiterzuchatten einfach auf <a href="push.pl?alias=$alias&room=$room">Weiterchatten</a> klicken.
+</div>
+<hr>
+END
+ } elsif ($message eq "edit_pw_wrong") {
+print <<END;
+<div class=b>
+ ACHTUNG!
+</div>
+<div>
+ Du hast soeben versucht, dein Passwort zu ändern. Jedoch stimmte die Erste Eingabe nicht mit der Zweiten überein.
+ Bitte versuch es erneuert ...
+</div>
+<hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Deine Chat-Optionen editieren!" ),
+ $q->hr;
+ }
+print <<END;
+<form action="main2.pl">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="var" value="edit_options">
+ <div>
+ Dein Passwort
+ <font color=ffa500>
+ (Gut merken !!)
+ </font>
+ <br>
+ <input type="password" name="id" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ Geb hier das Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ "Deine Farbe (Farbe Deines Nicks, Angabe in Hexadezimal):
+ <br>
+ <input type="text" name="col" value="$data[1]">
+ </div>
+ <br>
+ <div>
+ Deine zweite Farbe (Farbe Deiner Nachrichten, Angabe in Hexadezimal):
+ <br>
+ <input type="text" name="secol" value="$data[2]">
+ </div>
+ <br>
+END
+ } elsif ($method eq "edit_profile_html") {
+ if ($message eq "edit_profile_ok") {
+print <<END;
+ <div class=b>
+ Hinweis:
+ </div>
+ <div>
+ Du hast soeben Dein Profil erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren:
+ <hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Dein Profil editieren!" ),
+ $q->hr;
+ }
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="var" value="edit_profile">
+ <div>
+ Dein Nachname:
+ <br>
+ <input name="nachname" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ Dein Vorname:
+ <br>
+ <input name="vorname" value="$data[1]">
+ </div>
+ <br>
+ <div>
+ Dein Alter:
+ <br>
+ <input name="alter" value="$data[2]">
+ </div>
+ <br>
+ <div>
+ Dein Wohnort:
+ <br>
+ <input name="wohnort" value="$data[3]">
+ </div>
+ <br>
+ <div>
+ Deine E-Mail Adresse:
+ <br>
+ <input name="email" value="$data[4]">
+ </div>
+ <br>
+ <div>
+ Deine ICQ-Nummer:
+ <br>
+ <input name="icq" value="$data[5]">
+ </div>
+ <br>
+ <div>
+ Deine Homepage:
+ <br>
+ <input name="homepage" value="$data[6]">
+ </div>
+ <br>
+ <div>
+ Weiteres:
+ <br>
+ <textarea rows="5" cols="40"name="weiteres" wrap="virtual">$data[7]</textarea>
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <font color=ffffff>
+ <input type="submit" value="Daten ändern ...">
+ </font>
+ </form>
+</body>
+</html>
+END
+}
+
+
+sub edit { # Benutzerprofil od. Chat-Optionen abspeichern
+ &secure_checkip($alias);
+ my $method = $_[0];
+ if ($method eq "edit_profile") {
+ &write_file_new("data/user/profiles/$alias");
+ print DATEI $q->param('nachname')."\n".$q->param('vorname')."\n".$q->param('alter')."\n".$q->param('wohnort')."\n".$q->param('email')."\n".$q->param('icq')."\n".$q->param('homepage')."\n".$q->param('weiteres');
+ close DATEI;
+ &log("system","\"edit_profile_ok\"");
+ &edit_html("edit_profile_html","edit_profile_ok");
+ } elsif ($method eq "edit_options") {
+ if ($id ne $tmp) {
+ &log("system","\"edit_pw_wrong\"");
+ &edit_html("edit_options_html","edit_pw_wrong");
+ exit;
+ }
+ &secure_checkip($alias);
+ &write_file_new("data/user/options/$alias");
+ print DATEI $id."\n".$col."\n".$secol;
+ close DATEI;
+ &log("system","\"edit_options_ok\"");
+ &edit_html("edit_options_html","edit_options_ok");
+ }
+}
diff --git a/0.2.2/online.pl b/0.2.2/online.pl
new file mode 100644
index 0000000..2e8bf8d
--- /dev/null
+++ b/0.2.2/online.pl
@@ -0,0 +1,52 @@
+#!/usr/bin/perl -w
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+&secure_checkip($alias);
+&start_html("Online","online");
+&online($alias,$room);
+&list_dir("data/online/rooms/".$room);
+print
+ $q->div( "$room:" ),
+ "<font size=1 color=ffffef face=arial>";
+ foreach $online (@dir) {
+ if (-f "data/online/rooms/$room/$online") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$online",
+ -target=>"$online" }, "$online"), $q->br;
+ }
+ }
+print
+ "</font>",
+ $q->end_html;
+
+sub online { # Benutzer in die Onlineliste hinzufügen bzw. erneuern
+ my ($alias,$room) = @_;
+ &write_file_new("data/online/users/$alias");
+ print DATEI time;
+ close DATEI;
+ if (-e "data/online/rooms/$room") {
+ } else {
+ mkdir "data/online/rooms/$room", 0777;
+ }
+ &write_file_new("data/online/rooms/$room/$alias");
+ print DATEI time;
+ close DATEI;
+ &read_file("data/online/prove"); # Räume und Chatter auf Existenz überprüfen
+ my $provetime = <DATEI>;
+ close DATEI;
+ if ($provetime < (time - 30)) {
+ &write_file_new("data/online/prove");
+ print DATEI time;
+ close DATEI;
+ &rm_alias("data/online/users");
+ &rm_rooms;
+ }
+}
+
diff --git a/0.2.2/push.pl b/0.2.2/push.pl
new file mode 100644
index 0000000..5489592
--- /dev/null
+++ b/0.2.2/push.pl
@@ -0,0 +1,85 @@
+#!/usr/bin/perl -w
+use CGI;
+$q = new CGI;
+
+print
+ $q->header; # HTML-Header erzeugen
+
+require config;
+
+&secure_checkip($alias);
+
+########################################
+##ANFANG DER ZU STREAMENDEN HTML-DATEI##
+########################################
+
+print <<END;
+<html>
+ <head>
+ <script language="JavaScript">
+ <!--
+ scrolling=true;
+ function scroll_wnd() {
+ if (scrolling != false) {
+ window.scroll(1, 500000);
+ }
+ window.setTimeout("scroll_wnd()", 100);
+ }
+ scroll_wnd();
+ //-->
+ </script>
+ </head>
+<body bgcolor=000000 link=FFFFFF alink=FFFFEF vlink=FFFFEF>
+END
+
+$| = 1; # Cache von Perl ausschalten
+
+#############################
+##BEGRÜSSUNGSTEXT SCHREIBEN##
+#############################
+
+my $msgfile;
+
+ print
+ $q->font( { -size=>1,
+ -color=>"ffffff",
+ -face=>"arial"},
+ "$title Copyright by Paul C. Bütow 2k $tmp\n");
+
+if ($var eq "push_logs_html") {
+ $msgfile = $tmp;
+ print "<hr><font size=2 color=ffffff face=arial>";
+} elsif ($var eq "clear_screen") {
+ $msgfile = "data/msgs/$alias";
+ &write_file_new($msgfile);
+ print DATEI $q->br;
+ close DATEI;
+} else {
+ $msgfile = "data/msgs/$alias";
+ print $q->br;
+}
+
+open (MSGFILE, $msgfile);
+
+#################################
+##ENDLOSSCHLEIFE FÜR DEN STREAM##
+#################################
+
+my ($times,$online) = (0,"false");
+for (;;) {
+ for ($curpos = tell(MSGFILE); <MSGFILE>; $curpos = tell(MSGFILE)) {
+ print $_ ;
+ }
+ $times++;
+ if ($times > 29) { # Nach 30 Sekunden
+ print "\n<!--PING//-->"; # Ping zum Browser senden
+ $times = 0; # Sekundenzahl auf 0 zurücksetzen
+ $online = "true" if (-e "data/online/users/$alias");
+ if ($online eq "false") {
+ print "<font size=2 color=red>Aus technischen Gründen bitte auf <a href=\"push.pl?alias=$alias&room=$room&var=clear_screen\">Weiterchatten</a> klicken.</font>";
+ exit;
+ }
+ }
+ sleep 1;
+ seek(MSGFILE, $curpos, 0); # Position wiederherstellen
+}
diff --git a/0.2.2/unten.gif b/0.2.2/unten.gif
new file mode 100644
index 0000000..285fb53
--- /dev/null
+++ b/0.2.2/unten.gif
Binary files differ
diff --git a/0.2.2/yChat.jpg b/0.2.2/yChat.jpg
new file mode 100644
index 0000000..61eabfb
--- /dev/null
+++ b/0.2.2/yChat.jpg
Binary files differ
diff --git a/0.2.3/INDEX.PL b/0.2.3/INDEX.PL
new file mode 100644
index 0000000..a2d7bd3
--- /dev/null
+++ b/0.2.3/INDEX.PL
@@ -0,0 +1,354 @@
+#!/usr/bin/perl -w
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header; # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUFGERUFEN WERDEN?##
+#####################################
+if ($var eq "create_alias_html") {
+ &create_alias_html;
+} elsif ($var eq "create_alias") {
+ &create_alias;
+} elsif ($var eq "login_html") {
+ &login_html;
+} elsif ($alias eq "") {
+ &login_html;
+} else {
+ &checklogin;
+}
+
+sub login_html { # Erste Startseite
+local $counter = undef;
+&read_file("data/count");
+ $counter = <DATEI>;
+close DATEI;
+$counter++;
+&write_file_new("data/count");
+ print DATEI $counter;
+close DATEI;
+&start_html("Created by Paul C. Bütow 2k");
+print <<END;
+ <center>
+ <table width=400>
+ <tr>
+ <td>
+ <b>
+ <div>
+ $title
+ <img src="$gfxpath/yChat.jpg">
+ </div>
+ </b>
+END
+ if ($tmp eq "true") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Wahrscheinlich existiert Dein Alias "$alias" nicht,
+ <br>
+ Du hast Dich verschrieben oder das Passwort ist falsch.
+ <br>
+ Versuch es erneuert !
+ </div>
+END
+ } elsif ($tmp eq "quit") {
+print <<END;
+ <div>
+ Du hast soeben den Chat verlassen.
+ <br>
+ Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ } elsif ($tmp eq "banned") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein Alias "$alias" wurde verbannt.
+ <br>
+ Z.z. kannst Du Dich leider nicht in den Chat einloggen.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($tmp eq "kick") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wurdest soeben aus dem Chat katapultiert!
+ <br>
+ Schlechtes Verhalten mag die Ursache hierfür sein.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($var eq "create_alias") {
+print "<div>Du hast sich soeben in die Datenbank eingetragen. Einfach auf \"Los Geht's\" klicken :-)</div>";
+ } else {
+print <<END;
+ <div>
+ Herzlich willkommen!
+ <br>
+ Einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ &log("system","\"first_http_ok\"");
+ }
+print <<END;
+ <hr>
+ <form action="index.pl">
+ <input type="hidden" name="tmp" value="true">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Alias:
+ <br>
+ <input name="alias" value="$alias">
+ </div>
+ </td>
+ <td>
+ <div>
+ Dein Passwort:
+ <br>
+ <input type="password" name="id" value="$id">
+ </div>
+ </td>
+ </tr>
+ </table>
+ <br>
+ <br>
+ <div>
+ Solltest Du noch keinen Nick besitzen, dann auf "Registrieren" klicken!
+ </div>
+ <br>
+ <table>
+ <tr>
+ <td>
+ <font color="ffffff">
+ <input type="submit" value="Los geht's!">
+ </font>
+ </form>
+ </td>
+ <td>
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias_html">
+ <font color="ffffff">
+ <input type="submit" value="Registrieren">
+ </font>
+ </form>
+ </td>
+ </tr>
+ </table>
+ <hr>
+ <div>
+ yChat befindet sich momentan noch in der Entwicklungsphase !
+ <br>
+ Fragen gehen an Paul Bütow (
+ <a href="mailto:paul\@buetow.oxg.de">
+ paul\@buetow.oxg.de
+ </a>
+ ) :-)
+ <br>
+ <br>
+ Diese Seite wurde schon $counter mal aufgerufen.
+ </td>
+ </tr>
+ </table>
+ </center>
+</body>
+</html>
+END
+}
+
+
+sub create_alias_html { # HTML-Form für Erstellung eines neuen Benutzers.
+my $reload = $_[0];
+&start_html("Registration");
+print <<END;
+ <center>
+ <table width=400>
+ <tr>
+ <td>
+END
+ if ($reload eq "alias_exists") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Der von Dir gewählte Benutzername "$alias" existiert in unserer Datenbank bereits. Bitte versuch es erneuert mit
+ einem anderen Benutzernamen !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "pw_wrong") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Deine beiden Passworteingaben stimmen nicht überein. Bitte geb das Passwort erneuert an um sicherzugehen, daß
+ kein falsches Passwort abgespeichert wird !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "alias_prohibited") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein gewählter Benutername "$alias" enthält illegale Zeichen. Bitte versuch einen anderen Benutzernamen!
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Hier kannst Du Dich registrieren. Bitte beachte, daß die Passworteingabefelder übereinstimmen!
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias">
+ <div>
+ Dein Alias:
+ <font color="ffa500">
+ (Muß angegeben werden)
+ </font>
+ <br>
+ <input name="alias" VALUE="$alias">
+ </div>
+ <br>
+ <div>
+ Dein gewünschtes Passwort:
+ <br>
+ <input type="password" name="id" value="$id">
+ </div>
+ <br>
+ <div>
+ Geb hier Dein Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp">
+ </div>
+ <br>
+ <font color=ffffff>
+ <input type="submit" value="Registrieren">
+ </font>
+ <br>
+ </form>
+ <hr>
+ <div>
+ Um den Chat zu betreten müssen die Daten nach der Registration auf der Startseite erneuert bestätigt werden !
+ </div>
+ </td>
+ </tr>
+ </table>
+</center>
+</body>
+</html>
+END
+}
+
+sub checklogin { # Überprüfen, ob die Login-Daten korrekt sind.
+ my $lognotexists = "true";
+ &list_dir("data/user/options");
+ for (my $i=0; $i<=$#dir; $i++) {
+ if ($dir[$i] eq $alias) {
+ &read_file("data/user/options/$alias");
+ @datei = <DATEI>;
+ close DATEI;
+ chomp($datei[0]);
+ if ($datei[0] eq $id) {
+ &read_file("data/ban"); # Überprüfen, ob Alias verbannt ist
+ @banned = <DATEI>;
+ close DATEI;
+ foreach(@banned) {
+ if ($_ eq "$alias\n") {
+ &log("system","\"login_alias_banned\"");
+ $tmp = "banned";
+ &login_html();
+ exit;
+ }
+ }
+ $col = $datei[1];
+ $secol = $datei[2];
+ &write_file_new("data/online/ident/$alias");
+ print DATEI $ENV{'REMOTE_ADDR'};
+ close DATEI;
+ &frameset_html;
+ exit;
+ } else {
+ &log("system","\"login_pw_wrong\"");
+ $lognotexists = "false";
+ }
+ }
+ }
+ if ($lognotexists eq "true") {
+ &log("system","\"login_alias_notexists\"");
+ }
+ &login_html; # Falls Login-Daten inkorrekt sind, zurück zur Startseite.
+}
+
+sub create_alias { # Erstellung eines neuen Benutzers.
+ if ($alias =~ /[\W]/ || $alias eq "") {
+ &log("system","\"reg_alias_prohibited\"");
+ &create_alias_html("alias_prohibited");;
+ exit;
+ } elsif ($id ne $tmp) {
+ &log("system","\"reg_pw_wrong\"");
+ &create_alias_html("pw_wrong");
+ exit;
+ }
+ &list_dir("data/user/options");
+ for (my $i=0; $i<=$#dir; $i++) {
+ if ($dir[$i] eq $alias) {
+ &log("system","\"reg_alias_exists\"");
+ &create_alias_html("alias_exists");
+ exit;
+ }
+ }
+ &write_file_new("data/user/options/$alias");
+ print DATEI $id."\n";
+ close DATEI;
+ &zeit;
+ &list_dir("data/user/options");
+ my $number = $#dir-1;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias [$number] hat sich soeben als neuer Benutzer registriert :-) ...</font></i>");
+ &log("system","\"reg_ok\"");
+ &login_html;
+}
+
+sub frameset_html {
+print <<END;
+<html>
+ <head>
+ <title>
+ $title - Created by Paul C. Bütow 2k
+ </title>
+ </head>
+<frameset border=0 frameborder=0 framespacing=0 rows="50,1,*,55">
+ <frame name="menu" src="htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol" scrolling="no">
+ <frame src="htdocs.pl?var=bar_html scrolling="no">
+ <frameset border=0 frameborder=0 framespacing=0 cols="150,*">
+ <frame name="online" src="online.pl?room=$room&alias=$alias">
+ <frame name="main" src="push.pl?room=$room&alias=$alias&var=clear_screen">
+ </frameset>
+ <frame name="input" src="main.pl?alias=$alias&var=input_html&room=$room&col=$col&secol=$secol&tmp=login" scrolling="no">
+</frameset>
+</html>
+END
+}
diff --git a/0.2.3/INSTALL.txt b/0.2.3/INSTALL.txt
new file mode 100644
index 0000000..c58665e
--- /dev/null
+++ b/0.2.3/INSTALL.txt
@@ -0,0 +1,104 @@
+#############################################################################
+## yChat.de Version 0.2.3 by CXG.de: The chatters of the next generation ##
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+yChat findest Du im Internet unter der Adresse www.yChat.de. Bei Kritik,
+Anregungen oder Fragen bitte in das dort vorhandene Board posten oder eine
+E-Mail an die oben stehende Adresse senden. Ich bemühe mich, yChat so gut wie
+möglich zu machen und bin über Ratschläge immer sehr erfreut :-) ...
+
+Die Installation kann auf Unix-Systemen voll automatisch duchgeführt werden.
+Allerdings ist dafür ein Telnet-Zugang notwendig. Kopiere alle vorhandenen
+Dateien in das Verzeichnis cgi-bin/yChat und führe dann das Shellskript
+setup.sh mit dem Befehl ./setup.sh aus. Alle Verzeichnisse werden
+automatisch erstellt. Dies wurde allerdings nur auf SuSE Linux Systemen
+mit root-Zugriff getestet. Solltest Du ein anderes System verwenden oder
+den Chat auf einen virtuellen Webserver installieren wollen, dann mußt Du
+unter umständen das Verzeichnis "../../htdocs/yChat" nach "../../yChat"
+in der setup.sh umbenennen. Ansonsten werden die dazugehörigen Grafikdateien
+falsch oder garnicht kopiert.
+
+Wenn Du keinen Telnet-Zugang hast, kannst Du hier die Verzeichnisse manuell
+erstellen:
+
+Folgende Basis-Dateien sind im Chat enthalten und müssen in das cgi-bin
+Verzeichnis kopiert werden. Z.B. nach ./cgi-bin/yChat/:
+
+config.pm => Configurationsdatei ("Shared subs")
+htdocs.pl => HTML-Dokumentdateien (Nicht unbedingt erforderlich)
+index.pl => Startskript (Registrierung, Frameset, Login, Daten edit.)
+main.pl => Hauptskript (Alle Hauptfunktionen des Chats)
+main2.pl => Skript für editieren der Benutzerdaten etc.
+online.pl => Anzeige und Überprüfung der eingelogten Benutzer
+push.pl => Server-Push-Routine
+setup.sh => Dient zur automatischen Einrichtung des Chats.
+LIESMICH.txt => Beinhaltet wichtige Informationen
+UPDATES.txt => Updateliste der verschiedenen Versionen
+INSTALL.txt => Dieses Dokument
+
+Folgende Verzeichnisse müssen erstellt werden (chmod 777 sollte
+funktionieren):
+
+- Hier befinden sich alle für den Chat notwenidgen Daten:
+ ./cgi-bin/yChat/data/*
+
+- Hier befinden sich alle für den Chat notwendigen HTML-Dokumente:
+ ./cgi-bin/yChat/data/htdocs/*
+
+ Folgende Dateien müssen in das "data/htdocs" verzeichnis bewegt werden:
+
+ help_html => 101 Hilfedatei
+ logs_html => 101 Logbeschreibung
+
+- Hier befinden sich alle Logdateien, die vom Chat erstellt werden:
+ ./cgi-bin/yChat/data/logs/*
+
+- Hier befinden sich die Message-Dateien der eingelogten Benutzer:
+ ./cgi-bin/yChat/data/msgs/*
+
+- Hier befinden sich alle Daten der registrierten Benutzer:
+ ./cgi-bin/yChat/data/user/*
+
+- Hier wird abgespeichert, wie oft ein Benutzerprofil insgesant schon
+ aufgerufen wurde:
+ ./cgi-bin/yChat/data/user/counts/*
+
+- Hier befinden sich alle Chat-Optionen und Passwörter der registrierten
+ Benutzer:
+ ./cgi-bin/yChat/data/user/options/*
+
+- Hier befinden sich alle Benutzerprofile der Benutzer:
+ ./cgi-bin/yChat/data/user/profiles/*
+
+- Hier befinden sich alle Gästebucheinträge der Benutzer:
+ ./cgi-bin/yChat/data/user/gbooks/*
+
+- Hier befinden sich alle Daten zu den aktuellen Chaträumen und User die online sind
+ ./cgi-bin/yChat/data/online/*
+
+- Hier befinden sich alle offnenen Räume
+ ./cgi-bin/yChat/data/online/rooms/*
+
+- Hier befinden sich die Chatter, die sich in den jew. Räumen befinden
+ ./cgi-bin/yChat/data/online/rooms/RAUMNAME/*
+
+- Hier befinden sich alle Chatter, die sich z.Z. im System befinden
+ ./cgi-bin/yChat/data/online/users/*
+
+- Hier befinden sich alle IP-Nummern der eingelogten Chatter
+ ./cgi-bin/yChat/data/online/ident/*
+
+Folgende GRafikdateien sollten in ein nicht-CGI-BIN-Verzeichnis kopiert werden. Z.B.
+nach ./yChat/
+
+ bar.gif => Der gelb gestreifte Rand auf den meisten Seiten
+ unten.gif => Der Hintergrund für das Eingabeformular im Chat
+ yChat.gif => Das yChat-Logo auf der Startseite
+
+Zum schluß sollte die config.pm-Datei nach wünschen editiert werden. Allerdings sollten
+die Copyright Hinweise und die Versionsnummern nicht manipuliert werden.
+
+Folgende Dateien werden von yChat automatisch erstellt:
+
+Viel Spaß beim Chatten ...
+ Snooper \ No newline at end of file
diff --git a/0.2.3/LIESMICH.txt b/0.2.3/LIESMICH.txt
new file mode 100644
index 0000000..e9bafb0
--- /dev/null
+++ b/0.2.3/LIESMICH.txt
@@ -0,0 +1,24 @@
+#############################################################################
+## yChat.de Version 0.2.3 by CXG.de: The chatters of the next generation ##
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+Hallo Du,
+vielen Dank, daß Du Dir die Zeit nimmst, dieses Dokument sorgfältig zu
+lesen. Die grundliegende Idee von yChat.de ist die, ein funktionsfähiges,
+einfach zu bedienendes und zu installierendes Chat-System zu bieten. yChat
+ist keineswegs Free- oder Shareware und darf somit NICHT ohne die Erlaubnis
+vom Autor weitergegeben oder kopiert werden.
+Diejenigen, die dazu befugt sind, yChat vom eigenen Server aus zu betreiben,
+dürfen keineswegs die Copyright-Hinweise des Systems so manipulieren, daß
+diese für den Besucher nicht mehr ersichtlich sind.
+Weitergabe des yChat-Systems darf nur durch Einwilligung des Autors
+durchgeführt werden. Dies geschieht nur gegen entsprechende Gegenleistungen
+wie z.B. Bannerwerbung für www.yChat.de auf viel Besuchten Seiten (
+Seitenbesuche müssen nachgewiesen werden ), Werbung in vielgelesenen
+Newslettern o.Ä. . Allerdings sollte dem Autor vorher um Erlaubnis geboten
+werden. Gegen Geld ist das yChat-System noch nicht zu haben. Allerdings
+wird der Preis in etwa DM 500,- betragen. Für Fragen und Antworten bitte an
+die obrige E-Mail Adresse wenden.
+Installationshinweise findest Du in der datei INSTALL.txt
+MfG
+Paul C. Bütow aka Snooper
diff --git a/0.2.3/UPDATES.txt b/0.2.3/UPDATES.txt
new file mode 100644
index 0000000..2e777cf
--- /dev/null
+++ b/0.2.3/UPDATES.txt
@@ -0,0 +1,31 @@
+########################### yChat.de UPDATE LIST ###########################
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+Hier sind alle Erneuerungen der Versionen dokumentiert:
+
+Update von 0.2.2 nach 0.2.3 vom 25.11.2k
+ - Smooth scrolling JavaScript (Vielen Dank an Andreas Buchwald).
+ - "IP#-Fehler" wurde so gut wie eleminiert.
+ - Aufrufe der einzelnen Benutzerprofile wird gezählt und angezeigt.
+ Diese werden in data/user/counts/* gespeichert.
+ - Automatische Einrichtung des Chats mit setup.sh und Telnet.
+ - Menüpunkt "Dein Profil" wurde entfernt da eigenes Profil auch
+ stets über die Onlineliste aufgerufen werden kann.
+
+Update von 0.2.1 nach 0.2.2 vom 23.11.2k
+ - Einige Bugs wurden entfernt.
+ - Geschwindigkeit des Chats wurde optimiert.
+ - Eine Liste aller eingelogten Benutzer erscheint am Rand. Hierfür
+ wurde die Datei online.pl eingeführt. Sie aktuallisiert sich alle
+ 20 Sekunden.
+ - Die UPDATES.txt wurde eingeführt.
+
+Update von 0.2.0 nach 0.2.1
+ - Einige Bugs wurden entfernt.
+ - Die IP# der eingelogten Benutzer werden
+ nun anders verwaltet.
+
+Update von Alpha XVIII nach 0.2.0
+ - Die Handhabung der eingelogten Benutzer im System wurde komplett neu
+ konzeptiert.
+ - Neue Versionsnumern wurden eingeführt.
diff --git a/0.2.3/bar.gif b/0.2.3/bar.gif
new file mode 100644
index 0000000..61d02b7
--- /dev/null
+++ b/0.2.3/bar.gif
Binary files differ
diff --git a/0.2.3/config.pm b/0.2.3/config.pm
new file mode 100644
index 0000000..f89f5b2
--- /dev/null
+++ b/0.2.3/config.pm
@@ -0,0 +1,321 @@
+########################### Dieser Teil bestimmt die Standart-Variabeln.
+##STANDART-CONFIGURATION:## (CSS, Farben, Version etc.)
+###########################
+
+$alias = $q->param("alias");
+$var = $q->param("var");
+$room = $q->param("room");
+$col = $q->param("col");
+$secol = $q->param("secol");
+$msg = $q->param("msg");
+$tmp = $q->param("tmp");
+$id = $q->param("id");
+$room = "Cyberbar" if ($room eq "");
+$col = "ffffef" if ($col eq "");
+$secol = "ffffef" if ($secol eq "");
+$datum = "25.11.2k";
+$version = "0.2.3";
+$title = "yChat.de ($version)";
+$gfxpath = "../../yChat/";
+$style = <<ENDCSS;
+<style rel="stylesheet" type="text/css">
+ body { background-image: url("$gfxpath/bar.gif"); background-color: 000000 }
+ body.menu { background-image: none }
+ body.log { background-color: 000000 }
+ body.online { background-color: 444444; background-image: none }
+ div { font-family: arial, verdana, helvetiva; font-size: 10pt; color: ffffff }
+ div.b { font-weight: bold; color: ffa500 }
+ a { color: ffffef }
+ a:hover { color: ffffff; text-decoration: none }
+</style>
+ENDCSS
+
+############### Dieser Teil enthält Programmcode, der an verschiedenen
+##SHARED-SUBS## Stellen ausgeführt werden muß und jedem Skript zur
+############### Verfügung steht.
+
+sub printfile { # Liest eine externe Datei ein und gibt sie mit print aus
+ my ($file2print,$pagetitle,$bodyclass) = @_;
+ if ($pagetitle ne "") {
+ &start_html($pagetitle,$bodyclass);
+ }
+ print "<div><a href=\"push.pl?alias=$alias&tmp=$tmp&var=push_logs_html\">Push</a></div><hr>" if ($bodyclass eq "log");
+ &read_file($file2print);
+ @file2print = <DATEI>;
+ close DATEI;
+ print @file2print;
+}
+
+
+sub start_html { # Der HEADER einer HTML-Datei
+print "<html><head>";
+print "<meta http-equiv=\"refresh\" content=\"20\" URL=\"online.pl?room=$room\">" if ($_[1] eq "online");
+print <<END;
+ <title>
+ $title - $_[0]
+ </title>
+ $style
+ </head>
+END
+ if ($_[1] ne "") {
+ print "<body class=$_[1]>";
+ } else {
+ print "<body>";
+ }
+}
+
+sub post { # Öffentliche Nachricht im aktuellen Raum $room posten.
+ my ($msg2post,$secroom) = @_;
+ my @rooms = ($room,$secroom);
+ foreach(@rooms) {
+ my $room2post = $_;
+ &list_dir("data/online/rooms/$room2post");
+ foreach(@dir) {
+ my $alias2post = $_;
+ if (-f "data/online/rooms/$room2post/$alias2post") {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+ }
+ }
+ }
+ &log("msg","$msg2post");
+}
+
+
+sub post_all { # Öffentliche Nachricht in ALLEN Räumen gleichzeitig posten.
+ my $msg2post = $_[0];
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ my $alias2post = $_;
+ if (-f "data/online/users/$alias2post") {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+ }
+ }
+ &log("msg","$msg2post");
+}
+
+sub post_prv { # Private Nachricht posten (flüstern).
+ my $alias2post = $_[0];
+ my $msg2post = $_[1];
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+}
+
+sub log { # Protokollieren der Nachrichten etc.
+ my ($method,$msg2log) = @_;
+ &zeit;
+ if ( $method eq "msg") {
+ $log = "data/logs/$room-$day.$month.$year";
+ } elsif ($method eq "logins") {
+ $log = "data/logs/ow/logins-$day.$month.$year";
+ $syslog = "data/logs/ow/system-$day.$month.$year";
+ } elsif ($method eq "system") {
+ $log = "data/logs/ow/system-$day.$month.$year";
+ }
+ &write_file($log);
+ if ($method eq "msg") {
+ print DATEI "<br><font color=ffffef><i>($hours:$min:$sec)</i></font> $msg2log\n";
+ } elsif ($method eq "logins") {
+ print DATEI "($day.$month.-$hours:$min:$sec) User: $alias IP#: $ENV{'REMOTE_ADDR'} Agent: $ENV{'HTTP_USER_AGENT'}\n<br>";
+ close DATEI;
+ &write_file($syslog);
+ print DATEI "($day.$month.-$hours:$min:$sec) $msg2log User: $alias IP#: $ENV{'REMOTE_ADDR'}\n<br>";
+ } elsif ($method eq "system") {
+ print DATEI "($day.$month.-$hours:$min:$sec) $msg2log User: $alias IP#: $ENV{'REMOTE_ADDR'}\n<br>";
+ }
+ close DATEI;
+}
+
+
+sub zeit { # Aktuelles Datum und Uhrzeit bestimmen.
+ ($sec, $min, $hours, $day, $month, $year) = (localtime)[0..5];
+ $month += 1;
+ $hours = "0".$hours if ($hours < 10);
+ $min = "0".$min if ($min < 10);
+ $sec = "0".$sec if ($sec < 10);
+ $day = "0".$day if ($day < 10);
+ $month = "0".$month if ($month < 10);
+ $year = $year - 100;
+ if ($year < 10) {
+ $year = "200".$year;
+ } else {
+ $year = "20".$year;
+ }
+}
+
+sub count { # Zeilen in einer Datei Zählen.
+ my $file2count = $_[0];
+ &read_file($file2count);
+ my @datei = <DATEI>;
+ close DATEI;
+ $number = $#datei+1;
+}
+
+sub read_file { # Datei öffnen.
+ my $file2read = $_[0];
+ if (-e "$file2read") {
+ open (DATEI,"<$file2read") || &error("Konnte $file2read nicht öffnen");
+ }
+}
+
+sub write_file { # Text an eine Datei anhängen.
+ my $file2write = $_[0];
+ if (-e "$file2write") {
+ open (DATEI,">>$file2write") || &error("Konnte $file2write nicht öffnen");
+ } else {
+ &create_file("$file2write");
+ open (DATEI,">>$file2write") || &error("Konnte $file2write nicht öffnen");
+ }
+}
+
+sub write_file_new { # Datei neu schreiben.
+ my $file2write = $_[0];
+ if (-e "$file2write") {
+ open (DATEI,">$file2write") || &error("Konnte $file2write nicht öffnen");
+ } else {
+ &create_file("$file2write");
+ open (DATEI,">$file2write") || &error("Konnte $file2write nicht öffnen");
+ }
+}
+
+sub create_file { # Datei erstellen.
+ my $file2create = $_[0];
+ open (CREATE, ">$file2create") || &error("Konnte $file2create nicht erstellen");
+ print CREATE "";
+ close CREATE;
+}
+
+sub error { # Error-Ausgabe.
+ my $error_msg = $_[0];
+ &start_html( "Error: ($error_msg)" );
+ print $q->div( "Error: ($error_msg)" ),
+ $q->end_html;
+ exit;
+}
+
+sub remove_online { # Chatter entfernen
+ my ($alias,$room,$method) = @_;
+ unlink("data/online/users/$alias");
+ unlink("data/online/rooms/$room/$alias") if ($room ne undef);
+ unlink("data/online/ident/$alias");
+ &rm_rooms;
+ &zeit;
+ if ($method eq undef) {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias verläßt den Chat ...</font></i>");
+ } else {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500> $_ hat den Chat verlassen ... </font></i>");
+ &log("system","\"logout_$__ok\"");
+ }
+}
+
+sub rm_alias { # Chatter aus dem System entfernen, die älter als 60 Sekunden sind
+ my $dir2rm = $_[0];
+ &list_dir($dir2rm,2);
+ foreach(@dir2) {
+ if (-f "$dir2rm/$_" && $_ ne undef) {
+ &read_file("$dir2rm/$_");
+ my $timestamp = <DATEI>;
+ close DATEI;
+ if ($timestamp < (time - 60)) {
+ if ($dir2rm eq "data/online/users") {
+ &remove_online($_,undef,1);
+ } else {
+ unlink("$dir2rm/$_");
+ }
+ }
+ }
+ }
+}
+
+sub rm_rooms { # Leere Räume aus dem System entfernen
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-d "data/online/rooms/$_") {
+ &rm_alias("data/online/rooms/$_");
+ &list_dir("data/online/rooms/$_",2);
+ rmdir("data/online/rooms/$_") if ($#dir2 = 1);
+ }
+ }
+}
+
+sub secure_removeip { # Beim ausloggen die IP-Nummer aus dat/ip austragen.
+ my $alias2rm = $_[0];
+ unlink("data/online/ident/$alias2rm");
+}
+
+sub secure_checkip { # data/ip auf die eigene IP-Nummer überprüfen.
+ my ($alias2check,$method) = @_;
+ my $ip;
+ for($i=0 ;$i<=5;) {
+ &read_file("data/online/ident/$alias2check");
+ $ip = <DATEI>;
+ close DATEI;
+ if ($ip ne $ENV{'REMOTE_ADDR'}) {
+ $i++;
+ } else {
+ goto ENDCHECKIP
+ }
+ if ($i<=5) {
+ &log("system","\"secure_ip\"");
+ if ($method eq undef) {
+ &error("Du bist nicht befugt, mit der IP# $ENV{'REMOTE_ADDR'} und dem Alias \"$alias\" zu handeln. Sollte diese Meldung aufgrund eines Fehlers aufgetaucht sein, dann log Dich doch bitte neu in den Chat ein.");
+ } else {
+ &post_prv("$alias2check","<font color=red>Du bist nicht befugt, mit der IP# $ENV{'REMOTE_ADDR'} und dem Alias \"$alias\" zu handeln. Sollte diese Meldung aufgrund eines Fehlers aufgetaucht sein, dann log Dich doch bitte neu in den Chat ein.</font>");
+ &input_html("true") if ($method = 2);
+ }
+ exit;
+ }
+ }
+ENDCHECKIP:
+}
+
+sub remove_rooms { # Leere Räume entfernen.
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-d "data/online/rooms/$_") {
+ &list_dir("data/online/rooms/$_");
+ rmdir("data/online/rooms/$_") if ($#dir = 1);
+ }
+ }
+}
+
+sub list_dir { # Beliebigen Verzeichnisbaum einlesen.
+ my ($dir,$method) = @_;
+ opendir(DIR, $dir);
+ if ($method eq undef) {
+ @dir = readdir(DIR);
+ } elsif ($method = 2) {
+ @dir2 = readdir(DIR);
+ }
+ closedir(DIR);
+}
+
+sub hirachie { # Chatter nach Sonderrechte überprüfen.
+ my $alias2prove = $_[0];
+ $hirachie = "nc";
+ &read_file("data/wa");
+ @was = <DATEI>;
+ close DATEI;
+ foreach(@was) {
+ if ($_ eq $alias2prove || $_ eq "$alias2prove\n") {
+ $hirachie = "wa";
+ }
+ }
+ if ($hirachie ne "wa" || $_ eq "$alias2prove\n") {
+ &read_file("data/ow");
+ @ows = <DATEI>;
+ close DATEI;
+ foreach(@ows) {
+ if ($_ eq $alias2prove || $_ eq "$alias2prove\n") {
+ $hirachie = "ow";
+ }
+ }
+ }
+}
+
+
+
diff --git a/0.2.3/help_html b/0.2.3/help_html
new file mode 100644
index 0000000..79b94fa
--- /dev/null
+++ b/0.2.3/help_html
@@ -0,0 +1,616 @@
+<div>
+ Alle Chat-Befehle:
+</div>
+<hr>
+<table width=100% bgcolor=555555>
+ <tr>
+ <th bgcolor=666666>
+ <div>
+ SU
+ </div>
+ </th>
+ <th bgcolor=666666>
+ <div>
+ Befehl
+ </div>
+ </th>
+ <th bgcolor=666666>
+ <div>
+ Beschreibung
+ </div>
+ </th>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/about
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt aktuelle Version und andere Infos der Community an
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/away
+ <font color=red>
+ Nachricht
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Abmelden mit einer
+ <font color=red>
+ Abmeldenachricht
+ </font>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/clear
+ </div>
+ </td>
+ <td>
+ <div>
+ Bildschirm wird gelöscht
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/col
+ <font color=red>
+ XXXXXX
+ </font>
+ <font color=ffa500>
+ XXXXXX
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Abmelden mit einer
+ Farbe/n (
+ <font color=red>
+ Namensfarbe
+ </font>/
+ <font color=ffa500>
+ Textfarbe
+ </font>
+ ) wechseln. Angabe in Hexadezimal. Wird
+ <font color=ffa500>
+ Textfarbe
+ </font>
+ nicht angegeben, dann hat der Text die
+ <font color=red>
+ Namensfarbe
+ </font>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /date
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt aktuelles Datum und Urzeit an
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/j
+ <font color=red>
+ Raumname
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Raum wechseln/erstellen
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /ju
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ in den Raum wechseln/folgen, wo sich
+ <font color=red>
+ Alias
+ </font>
+ befindet.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/m
+ </div>
+ </td>
+ <td>
+ <div>
+ Handeln mit 2 Farben
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/me
+ </div>
+ </td>
+ <td>
+ <div>
+ Handeln mit einer Farbe
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /msg
+ <font color=red>
+ Alias
+ </font>
+ <font color=ffa500>
+ Nachricht
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>
+ Alias
+ </font>
+ eine private
+ <font color=ffa500>
+ Nachricht
+ </font>
+ flüstern. (Wird nicht vom Chat protokolliert)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /
+ <font color=ffa500>
+ Nachricht
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Eine private
+ <font color=ffa500>
+ Nachricht
+ </font>
+ demjenigen flüstern, dem zuletzt eine geflüstert wurde. (Wird nicht vom Chat protokolliert)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+//
+ </div>
+ </td>
+ <td>
+ <div>
+ Wurde zuletzt eine öffentliche Nachricht gepostet, dann wird diese nocheinmal gepostet. (Funktioniert nicht bei Befehlen, flüstern oder schreien)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/q
+ </div>
+ </td>
+ <td>
+ <div>
+ Cumunnity verlassen
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/s <font color=red>Nachricht</font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>Nachricht</font> schreien
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/w
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt an, wer sich im aktuellen Raum befindet.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/wc
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt an, wer eingelog ist.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /wc
+ <font color=red>
+ Raum
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt an, wer sich im
+ <font color=red>
+ Raum
+ </font>
+ befindet.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /wc/
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt alle offenen Räume und deren Chatter an
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /wj
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt an, in welchen Raum sich
+ <font color=red>
+ Alias
+ </font>
+ befindet.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=ffa500>
+ WÄ
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ /k
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>
+ Alias
+ </font>
+ wird aus dem Chat katapultiert!
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+/ban
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt alle verbannten Benutzer an
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+/ban
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>
+ Alias
+ </font>
+ verbannen.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+/rban
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>
+ Alias
+ </font>
+ "entbannen"
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ /ip
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt die IP-Nummer von
+ <font color=red>
+ Alias
+ </font>
+ an.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ /wa
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>
+ Alias
+ </font>
+ zum Wächter ernennen
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ /rwa
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>
+ Alias
+ </font>
+ vom Wächter zum normalen Chatter degradieren
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ /sys
+ <font color=red>
+ Nachricht
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Systemnachricht schreiben. (Erscheint in allen bestehenden Räumen)
+ </div>
+ </td>
+ </tr>
+</table>
+<hr>
+<div>
+ Zur Erklärung: NC steht für "Normale Chatter", WÄ für "Wächter" und OW für "Oberwächter".
+ Obrige Befehle können nur von der/den jeweiligen Benutzergruppe/n oder höher ausgeführt werden.
+</div>
+</body>
+</html> \ No newline at end of file
diff --git a/0.2.3/htdocs.pl b/0.2.3/htdocs.pl
new file mode 100644
index 0000000..17aef05
--- /dev/null
+++ b/0.2.3/htdocs.pl
@@ -0,0 +1,222 @@
+#!/usr/bin/perl -w
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+if ($var eq "help_html") {
+ &printfile("data/htdocs/help_html","Alle Chatbefehle");
+} elsif ($var eq "menu_html") {
+ &menu_html;
+} elsif ($var eq "werda_html") {
+ &werda_html;
+} elsif ($var eq "logs_html") {
+ &logs_html;
+} elsif ($var eq "view_sulogs_html") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ &start_html("Oberwächter-Logdateien");
+ print "<div><a href=\"push.pl?alias=$alias&tmp=$tmp&var=push_logs_html\">Push</a><hr>";
+ &printfile($tmp);
+ print "</div></body></html>";
+ }
+} elsif ($var eq "view_logs_html") {
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ &printfile($tmp,$tmp,"log");
+ }
+} elsif ($var eq "superuser_html") {
+ &superuser_html;
+} elsif ($var eq "bar_html") {
+ print
+ $q->start_html(-bgcolor=>"ffa500"),
+ $q->end_html;
+} else {
+ print
+ $q->start_html(-bgcolor=>"000000"),
+ $q->end_html;
+}
+
+sub menu_html {
+ if ($tmp eq "quit") {
+ print
+ $q->script( { -language=>"JavaScript" }, "window.open(\"index.pl?tmp=quit\",\"_top\")" );
+ sleep 1;
+ &remove_online($alias);
+ &secure_removeip($alias);
+ unlink("data/msgs/$alias");
+ }
+ &start_html("Menü","menu");
+print <<END;
+ <center>
+ <div>
+ [<a href="htdocs.pl?var=werda_html&alias=$alias&room=$room&col=$col&secol=$secol&&tmp=$tmp" target="werda">Wer ist da?</a>]
+ [<a href="main2.pl?var=edit_profile_html&alias=$alias" target="ProfilAendern">Profil ändern</a>]
+ [<a href="main2.pl?var=edit_options_html&alias=$alias" target="main">Chat-Optionen</a>]
+ [<a href="main2.pl?var=list_alias_html&alias=$alias" target="Benutzerliste">Benutzerliste</a>]
+ [<a href="htdocs.pl?var=help_html" target="Befehle">Chat-Befehle</a>]
+ [<a href="main2.pl?var=gb_html&alias=$alias" target="Board">Benutzerboard</a>]
+ [<a href="htdocs.pl?var=superuser_html&alias=$alias" target="Hirachie">Superuser</a>]
+ [<a href="htdocs.pl?var=logs_html&alias=$alias" target="Logdateien">Logdateien</a>]
+ [<a href="push.pl?alias=$alias&room=$room&var=clear_screen" target="main">Weiterchatten</a>]
+ [<a href="htdocs.pl?var=menu_html&tmp=quit&alias=$alias">Chat verlassen</a>]
+ </div>
+ </center>
+</body>
+</html>
+END
+}
+
+
+sub werda_html { # Anzeige, wer eingelogt ist.
+ &start_html("Wer ist da?");
+ print <<END;
+<div>
+ $alias, schön daß Du hier bist :-)
+</div>
+<hr>
+<div>
+ Folgende Personen befinden sich im Chat:
+</div>
+<br>
+<div>
+END
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ my $room = $_;
+ &list_dir("data/online/rooms/$room",2);
+ local $nr = $#dir2-1;
+ print $q->b( $_ ),
+ "($nr)",
+ $q->br;
+ foreach(@dir2) {
+ if ($_ ne ".." && $_ ne ".") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_" }, "$_"), " ";
+ }
+ }
+ print $q->br, $q->br;
+ }
+ }
+ print
+ "</div>",
+ $q->end_html;
+}
+
+sub logs_html {
+ &secure_checkip($alias);
+ &start_html("Logdateien");
+ print <<END;
+<div>
+ Hier befinden sich alle Logdateien
+</div>
+<hr>
+END
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ if ($hirachie eq "ow") {
+ print $q->div( "Folgende Logdateien können nur von Oberwächtern (OW) gelesen werden" );
+ &printfile("data/htdocs/logs_html");
+ &list_dir("data/logs/ow");
+ my @sortedir = sort(@dir);
+ foreach(@sortedir) {
+ if (-f "data/logs/ow/$_") {
+ print $q->a( { -href=>"htdocs.pl?var=view_sulogs_html&alias=$alias&tmp=data/logs/ow/$_",
+ -target=>$_},
+ "$_" ).
+ " ",
+ }
+ }
+ print $q->hr;
+ }
+ print $q->div( "Folgende Logdateien können nur von Wächtern und Oberwächtern gelesen werden (Sortiert nach A-Z, a-z):" ),
+ $q->br;
+ &list_dir("data/logs");
+ my @sortedir = sort(@dir);
+ foreach(@sortedir) {
+ if (-f "data/logs/$_") {
+ print $q->a( { -href=>"htdocs.pl?alias=$alias&var=view_logs_html&tmp=data/logs/$_",
+ -target=>"_new" },
+ "$_" ),
+ " ";
+ }
+ }
+ if ($hirachie eq "wa") {
+ print $q->hr,
+ $q->div( "Oberwächter können zusätzlich die Systemlogdateien lesen. Du bist allerdings ein \"Wächter\" und ",
+ " bist nicht dazu berechtigt " ),
+ $q->br;
+ &printfile("data/htdocs/logs_html");
+ }
+ } else {
+ print $q->div( "Logdateien können nur von Oberwächtern (OW) und von Wächtern (WÄ) gelesen werden. Du bist jedoch ein ",
+ "\"Normaler Chatter\". Wächter können alles nachlesen, was öffentlich gechattet wurde. Oberwächter ",
+ "können folgende Systemlogdateien zusätzlich lesen:" ),
+ $q->hr;
+ &printfile("data/htdocs/logs_html");
+ }
+ print
+ $q->end_html;
+}
+
+sub superuser_html { # Zeigt an, wer Superuser ist
+ &start_html("Superuser");
+ print "<div>Hallo $alias. Du bist als ";
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ print
+ $q->b( "Oberwächter" ),
+ " (OW) eingetragen.</div>",
+ $q->hr;
+ } elsif ( $hirachie eq "wa") {
+ print
+ $q->b( "Wächter" ),
+ " (WÄ) eingetragen.</div>",
+ $q->hr;
+ } else {
+ print
+ $q->b( "normaler Chatter" ),
+ " (NC) eingetragen.</div>",
+ $q->hr;
+ }
+ my $nrow = $#ows+1;
+ print
+ "<div>",
+ $q->b( "OW" ),
+ "s ($nrow Stück)";
+ foreach(@ows) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+ my $nrwa = $#was+1;
+ print
+ "</div>",
+ $q->hr,
+ "<div>",
+ $q->b( "WÄ" ),
+ "s ($nrwa Stück)";
+ foreach(@was) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+print <<END;
+<hr>
+ Die jeweiligen Fähigkeiten der Oberwächter (OW) und der Wächter (WÄ) sind unter
+ "<a href="htdocs.pl?var=help_html">Chat-Befehle</a>"
+ dokumentiert.
+</div>
+</body>
+</html>
+END
+} \ No newline at end of file
diff --git a/0.2.3/logs_html b/0.2.3/logs_html
new file mode 100644
index 0000000..1317062
--- /dev/null
+++ b/0.2.3/logs_html
@@ -0,0 +1,391 @@
+<br>
+<div>
+ In der System-Logdatei tauchen folgende Ursachen auf:
+</div>
+<br>
+<table border=0 width=100% bgcolor=555555>
+ <tr>
+ <th bgcolor=666666>
+ <div>
+ Ursache
+ </div>
+ </th>
+ <th bgcolor=666666>
+ <div>
+ Beschreibung
+ </div>
+ </th>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ edit_profile_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzername hat sein Profil erfolgreich editiert.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ edit_pw_wrong
+ </div>
+ </td>
+ <td>
+ <div>
+ Beim Editieren der Chat-Optionen stimmten die beiden Passwortfelder nicht überein.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ edit_colors_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzername hat seine Chatfarben erfolgreich gewechselt.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+edit_options_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzername hat seine Chat-Optionen erfolgreich editiert.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+first_http_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Der angegebenen IP# wurde Startseite erfolgreich angezeigt. (Benutzername noch nicht vorhanden)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+login_alias_banned
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzer konnte sich nicht in das System einloggen, da sein benutzername verbannt war.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ login_alias_notexists
+ </div>
+ </td>
+ <td>
+ <div>
+ Beim Einlogversuch existierte der angegebene Benutzername nicht.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+login_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzer hat sich erfolgreich in das System eingelogt.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ login_pw_wrong
+ </div>
+ </td>
+ <td>
+ <div>
+ Beim Einloggen wurde das falsche PW eingegeben.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ logout_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzer hat sich erfolgreich (manuell) aus dem System ausgelogt. ("... verläßt den Chat ...")
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ logout_<font color=red>Alias</font>_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ User hat gemerkt, daß sich
+ <font color=red>
+ Alias
+ </font>
+ nicht mehr im Chat befindet. ("... hat den Chat verlassen ...").
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ow_ban_<font color=red>Alias</font>_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat
+ <font color=red>
+ Alias
+ </font>
+ verbannt
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ow_ban_<font color=red>Alias</font>_ow
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat ohne Erfolg versucht
+ <font color=red>
+ Alias
+ </font>
+ zu verbannen (
+ <font color=red>
+ Alias
+ </font>
+ war Oberwächter und konnte nicht verbannt werden )
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ow_rban_<font color=red>Alias</font>_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat
+ <font color=red>
+ Alias
+ </font>
+ "entbannt"
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ ow_wa_<font color=red>Alias</font>_exists
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat ohne Erfolg versucht
+ <font color=red>
+ Alias
+ </font>
+ zum Wächter zu ernennen. (
+ <font color=red>
+ Alias
+ </font>
+ war bereits als Wächter eingetragen.)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ ow_wa_<font color=red>Alias</font>_notexists
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat ohne Erfolg versucht
+ <font color=red>
+ Alias
+ </font>
+ zum Wächter zu ernennen. (
+ <font color=red>
+ Alias
+ </font>
+ existierte nicht in der Benutzerdatenbank.)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ ow_wa_<font color=red>Alias</font>_ow-exists
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat ohne Erfolg versucht
+ <font color=red>
+ Alias
+ </font>
+ zum Wächter zu ernennen. (
+ <font color=red>
+ Alias
+ </font>
+ war bereits als Oberwächter eingetragen. Oberwächter können nicht zeitgleich Wächter sein.)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ ow_wa_<font color=red>Alias</font>_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat
+ <font color=red>
+ Alias
+ </font>
+ erfolgreich zum Wächter ernannt.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ ow_rwa_<font color=red>Alias</font>_notexists
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter konnte
+ <font color=red>
+ Alias
+ </font>
+ nicht zum Wächter ernennen. (War nicht als WÄ registriert)..
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ ow_rwa_<font color=red>Alias</font>_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat
+ <font color=red>
+ Alias
+ </font>
+ vom Wächter zum normalen Chatter degradiert.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ reg_alias_exists
+ </div>
+ </td>
+ <td>
+ <div>
+ Bei der Registrierung war der Benutzername bereits vorhanden.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ reg_alias_prohibited
+ </div>
+ </td>
+ <td>
+ <div>
+ Bei der Registrierung war der angegebene Benutzername verboten (enthielt Sonderzeichen).
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ reg_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzername hat sich erfolgreich registriert.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ reg_pw_wrong
+ </div>
+ </td>
+ <td>
+ <div>
+ Bei der Registrierung wurde das PW falsch eingegeben.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ secure_ip
+ </div>
+ </td>
+ <td>
+ <div>
+ Unbefugter Zugriff der angegebenen IP# auf den angegebenen Benutzernamen.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ sys_msg_<font color=red>Raum</font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Oberwächter schreibt eine Systemnachricht aus
+ <font color=red>
+ Raum
+ </font>.
+ </div>
+ </td>
+ </tr>
+</table>
+<br> \ No newline at end of file
diff --git a/0.2.3/main.pl b/0.2.3/main.pl
new file mode 100644
index 0000000..ac156fb
--- /dev/null
+++ b/0.2.3/main.pl
@@ -0,0 +1,497 @@
+#!/usr/bin/perl -w
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+if ($var eq "input_html") {
+ &input_html;
+} elsif ($var eq "post_msg") {
+ &post_msg;
+} elsif ($var eq "change_room") {
+ &change_room;
+} else {
+ &error("Parameter fehlt");
+}
+
+sub input_html { # Eingabemaske für den Chat.
+ my ($reload,$action,$whisper,$lastmsg) = @_;
+ $action = $q->param('action') if ($action eq "");
+ if ($tmp eq "away") {
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias meldet sich zurück ... </font></i>");
+ } elsif ($tmp eq "login") {
+ &remove_rooms;
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat den Chat betreten ...</font></i>");
+ &log("logins","\"login_ok\"");
+ }
+ if ($action ne "" && $action ne "whisper" && $action ne "away") {
+ print "<html><head><script language=\"JavaScript\">";
+ if ($action eq "change_room") {
+ print "open(\"online.pl?alias=$alias&room=$room\",\"online\");";
+ print "open(\"main.pl?var=input_html&alias=$alias&room=$room&col=$col&secol=$secol\",\"input\");";
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol\",\"menu\");";
+ } elsif ($action eq "change_colors") {
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol\",\"menu\");";
+ }
+ print "</script></head><body background=\"$gfxpath/unten.gif\" bgcolor=ffa500>";
+ } else {
+ print "<html><body background=\"$gfxpath/unten.gif\" bgcolor=ffa500>";
+ }
+ print "<center><form action=\"main.pl\">";
+ print "<input type=\"hidden\" name=\"tmp\" value=\"away\">" if ($action eq "away");
+ print <<END;
+ <input type="hidden" name="var" value="post_msg">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="room" value="$room">
+ <input type="hidden" name="col" value="$col">
+ <input type="hidden" name="secol" value="$secol">
+ <input type="hidden" name="id" value="$whisper">
+ <input type="hidden" name="lastmsg" value="$lastmsg">
+ <input size="70" name="msg">
+ <input type="submit" value="Texten"></form></center>
+END
+if ($reload eq "true") {
+print <<END;
+ <script language="JavaScript">
+ <!--
+ document.forms[0].msg.focus();
+ //-->
+ </script>
+END
+}
+print
+ $q->end_html;
+}
+
+sub post_msg { # Wird aufgerufen, wenn aus input_html eine Eingabe gepostet wurde.
+ $| = 1; # Cache von Perl ausschalten
+ $msg =~ s#<#&lt\;#g; # HTML-Tags deaktivieren
+ $msg =~ s#kilahu#yChat#g;
+ $msg =~ s#ooperle#per!#g;
+ if (substr($msg,0,1) ne "/") { # Überprüfen, ob Befehl oder Nachricht
+ $msg = "<b><font color=$col>$alias: <font color=$secol>".$msg."</font></font></b>";
+ $msg =~ s#"#'#g; # " in ' umtauschen für den befehl "//"
+ &input_html("true","",$id,$msg); # -> Reload=true, Action=none, Whisper=$id
+ &secure_checkip($alias,1);
+ &post($msg);
+ } else {
+ &secure_checkip($alias,2);
+ &cmd($msg);
+ }
+}
+
+sub cmd { # Alle Chatbefehle, die über input_html eingegeben werden können.
+ $_[0] = $_[0]." ";
+ $_[0] = substr($_[0], 1, length($_[0])-1);
+ my @cmd = split(/ /, $_[0]);
+ my $cmd = substr($_[0],0 , index($_[0], " "));
+ my ($reload,$action,$whisper) = ("true","",$id);
+#############>- NORMALE CHATBEFEHLE ( Alphabetisch sortiert ) -<
+#############>- DER LETZTEN ZUGEFLÜSTERTEN PERSON NOCHEINMAL FLÜSTERN -<
+ if ($cmd eq "/") {
+ &post($q->param('lastmsg'));
+#############>- INFORMATIONEN ÜBER DAS SYSTEM AUSGEBEN -<
+ } elsif ($cmd eq "about") {
+ &post_prv("$alias","<font size=2 color=ffffff>Aktuelle Version ist $title und wurde am $datum aktuallisiert. Created by Paul C. Bütow 2k.</font>");
+#############>- ABMELDEN MIT 'AWAY-NACHRICHT' -<
+ } elsif ($cmd eq "away") {
+ if ($tmp eq "away") { # Falls 2 mal hintereinander /away eingegeben wurde
+ $tmp = "";
+ }
+ for ($i=1; $i <= $#cmd; $i++) {
+ $tmp = $tmp." ".$cmd[$i];
+ }
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias meldet sich ab (<font color=red>$tmp</font> ) ...</i></font>");
+ $action = "away";
+#############>- EIGENEN CHATBILDSCHIRM LÖSCHEN -<
+ } elsif ($cmd eq "clear") {
+ &post_prv("$alias","<script language=\"JavaScript\">window.open(\"push.pl?alias=$alias&room=$room&var=clear_screen\",\"main\");</script>");
+#############>- FARBEN WECHSELN -<
+ } elsif ($cmd eq "col") {
+ $col = $cmd[1];
+ my $tmpsecol = $cmd[2];
+ if ($tmpsecol eq "") {
+ $secol = $col
+ } else {
+ $secol = $tmpsecol;
+ }
+ &read_file("data/user/options/$alias");
+ my @pro = <DATEI>;
+ close DATEI;
+ &write_file_new("data/user/options/$alias");
+ print DATEI $pro[0]."".$col."\n".$secol;
+ close DATEI;
+ &log("system","\"edit_colors_ok\"");
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat die Farbe gewechselt ...</font></i>");
+ $action = "change_colors";
+#############>- AKTUELLES DATUM UND URZEIT AUSGEBEN -<
+ } elsif ($cmd eq "date") {
+ &zeit;
+ &post_prv("$alias","<font size=2 color=ffffff>Heute ist der $day.$month. Jahr $year. Es ist genau $hours:$min Uhr und $sec Sekunden.</font>");
+#############>- EINEN NEUEN RAUM ERSTELLEN BZW. IN EINEN BESTEHENDEN RAUM WECHSELN -<
+ } elsif ($cmd eq "j") {
+ &change_room("j",$cmd[1],$room);
+ $action = "change_room";
+#############>- HANDELN -<
+ } elsif ($cmd eq "me" || $cmd eq "m") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $me_msg = $me_msg." ".$cmd[$i];
+ }
+ if ($cmd eq "m") {
+ &post("<i><font color=$col>$alias <font color=$secol>$me_msg</font></font></i>");
+ } else {
+ &post("<i><font color=$col>$alias $me_msg</font></i>");
+ }
+#############>- FLÜSTERN ( Auch mit '/' ) -<
+ } elsif ($cmd eq "msg" || $cmd eq "") {
+ my ($alias2post,$msg2post) = ($cmd[1],"");
+ if ($cmd eq "msg") {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ } else {
+ $alias2post = $id;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ }
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ if ($_ eq $alias2post) {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "<i><font color=$col>$alias flüstert <font color=ffffff>=></font><font color=$secol>$msg2post</font></font></i><br>\n";
+ close DATEI;
+ &write_file("data/msgs/$alias");
+ print DATEI "<i><font color=$col>Zu $alias2post geflüstert <font color=ffffff>=></font><font color=$secol>$msg2post</font></font></i><br>\n";
+ close DATEI;
+ &input_html($reload,"",$alias2post);
+ exit;
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2post <font color=ffffff>ist momentan nicht anwesend !</font></font>");
+#############>- DAS SYSTEM VERLASSEN -<
+ } elsif ($cmd eq "q") {
+ &post_prv("$alias","<script language=\"JavaScript\">window.open(\"index.pl?tmp=quit\",\"_top\");</script>");
+ sleep 1;
+ &remove_online($alias,$room);
+ &secure_removeip($alias);
+ unlink("data/msgs/$alias");
+ exit;
+#############>- SCHREIEN -<
+ } elsif ($cmd eq "s") {
+ my $msg2scream,$msg2post;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2scream = $msg2scream." ".$cmd[$i];
+ }
+ $msg2post = "\U$msg2scream";
+ &post("<font color=$col><i>$alias schreit:</i> <b><font color=$secol>".$msg2post."</font></font></b>");
+#############>- ANZEIGEN WER SICH IM AKTUELLEN RAUM BEFINDET -<
+} elsif ($cmd eq "w") {
+ &list_dir("data/online/rooms/$room");
+ my ($is,$nr) = ("t",0);
+ foreach(@dir) {
+ if (-f "data/online/rooms/$room/$_") {
+ $personen = $personen." ".$_;
+ $nr++;
+ }
+ }
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "n";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>$nr Person$nrs befinde$is sich im aktuellen Raum (\"$room\"): <font color=ffa500>$personen</font></font>");
+#############>- ANZEIGEN WER SICH IM SYSTEM BEFINDET -<
+ } elsif ($cmd eq "wc" || $cmd eq "wc/") {
+ $raum = $cmd[1];
+ if ($raum eq "" && $cmd eq "wc") {
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/users/$_");
+ }
+ my $nr = ($#dir-1);
+ my ($nrs,$is) = ("","ist");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "sind";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>$nr Person$nrs $is insgesamt eingelogt: <font color=ffa500>$personen</font></font>");
+ } elsif ($raum eq "" && $cmd eq "wc/") {
+ my $msg2post;
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ &list_dir("data/online/rooms/$_",2);
+ my $nr = $#dir2-1;
+ $msg2post = $msg2post."<tr><td><b><font size=2 color=ffffff>$_ ($nr)</font></b></td><td><font size=2 color=ffffff>";
+ foreach $chatter (@dir2) {
+ if (-f "data/online/rooms/$_/$chatter") {
+ $msg2post = $msg2post."$chatter ";
+ }
+ }
+ print "</font></td>";
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>Folgende Räume sind offen:</font><table>$msg2post</table>");
+ } elsif ($raum ne "") {
+ my $personen;
+ &list_dir("data/online/rooms/$raum");
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/rooms/$raum/$_");
+ }
+ my ($nr,$is) = (($#dir-1),"t");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "n";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff> $nr Person$nrs befinde$is sich im Raum \"$raum\": <font color=ffa500>$personen</font></font>");
+ }
+#############>- ANZEIGEN IN WELCHEN RAUM SICH JMD. BEFINDET BZW. JMD IN EINEN RAUM FOLGEN -<
+ } elsif ($cmd eq "wj" || $cmd eq "ju") {
+ my $alias2search = $cmd[1];
+ &list_dir("data/online/rooms");
+ foreach $raum (@dir) {
+ &list_dir("data/online/rooms/$raum",2) if (-d "data/online/rooms/$raum");
+ foreach $user (@dir2) {
+ if (-f "data/online/rooms/$raum/$user") {
+ if ($user eq $alias2search) {
+ if ($cmd eq "wj") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2search <font color=ffffff>befindet sich im Raum \"$raum\" !</font></font>");
+ } else {
+ $action = "change_room";
+ &change_room("ju",$raum,$room,$alias2search);
+ }
+ &input_html($reload,$action,$whisper);
+ exit;
+ }
+ }
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2search <font color=ffffff> ist nicht eingelogt !</font></font>");
+#############>- SUPERUSER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- ALIAS VERBANNEN BZW. ENTBANNEN -<
+ } elsif ($cmd eq "ban" || $cmd eq "rban") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ my ($alias2handle,$registriert) = $cmd[1];
+ &list_dir("data/user/options");
+ foreach(@dir) {
+ $registriert = "true" if ($_ eq $alias2handle);
+ }
+ if ($registriert ne "true") {
+ if ($cmd eq "ban") {
+ if ($alias2handle ne "") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> existiert nicht in der Benutzerdatenbank und kann so nich verbannt werden !</font></font>");
+ } else {
+ &read_file("data/ban");
+ my @banned = <DATEI>;
+ my ($benutzer);
+ my $nr = $#banned+1;
+ close DATEI;
+ foreach(@banned) {
+ $benutzer = $benutzer." ".$_;
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>Folgende Benutzer sind verbannt [$nr]: <font color=ffa500>$benutzer</font></font>");
+ }
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> existiert nicht in der Benutzerdatenbank und kann so nicht \"entbannt\" werden !</font></font>");
+ }
+ &input_html("true");
+ exit;
+ }
+ &read_file("data/ban");
+ my @banlist = <DATEI>;
+ close DATEI;
+ foreach(@banlist) {
+ if ($_ eq "$alias2handle\n") {
+ if ($cmd eq "ban") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> ist bereits verbannt worden !</font></font>");
+ } else {
+ my $banned = "false";
+ foreach(@banlist) {
+ $banned = "true" if ($_ eq "$alias2handle\n");
+ }
+ if ($banned eq "true") {
+ my @newbanlist;
+ foreach(@banlist) {
+ push @newbanlist,$_ if ($_ ne "$alias2handle\n");
+ }
+ &write_file_new("data/ban");
+ print DATEI @newbanlist;
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> wurde soeben \"entbannt\" !</font></font>");
+ &log("system","\"ow_rban_$alias2handle_ok\"");
+ }
+ }
+ &input_html("true");
+ exit;
+ }
+ }
+ if ($cmd eq "ban") {
+ &hirachie($alias2handle);
+ if ($hirachie ne "ow") {
+ &write_file("data/ban");
+ print DATEI "$alias2handle\n";
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> wurde soeben verbannt und kann sich nun nichtmehr in den Chat einloggen !</font>");
+ &log("system","\"ow_ban_".$alias2handle."_ok\"");
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> ist ein Oberwächter und kann deshalb nicht verbannt werden !</font></font>");
+ &log("system","\"ow_ban_".$alias2handle."_ow\"");
+ }
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> konnte nicht \"entbannt\" werden, da <font color=ffa500>$alias2handle</font> garnicht verbannt war !</font></font>");
+ }
+ }
+#############>- IP # VON ALIAS ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "ip") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ my $alias2prove = $cmd[1];
+ &list_dir("data/online/ident");
+ foreach(@dir) {
+ if ($_ eq $alias2prove) {
+ &read_file("data/online/ident/$_");
+ local $ipnr = <DATEI>;
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$_ <font color=ffffff>hat die IP-Nummer $ipnr !</font></font>");
+ }
+ }
+ }
+#############>- ALIAS AUS DEM CHAT KATAPULTIEREN -<
+ } elsif ($cmd eq "k") {
+ &hirachie($alias);
+ if ($hirachie eq "wa" || $hirachie eq "ow") {
+ my $alias2kick = $cmd[1];
+ &list_dir("data/online/rooms");
+ foreach $raum (@dir) {
+ &list_dir("data/online/rooms/$raum",2);
+ foreach $chatter (@dir2) {
+ if ($chatter eq $alias2kick) {
+ &hirachie($alias2kick);
+ if ($hirachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist Oberwächter und kann nicht \"gekickt\" werden !</font></font>");
+ &log("system","wa_k_$alias2kick_ow"); #!!
+ } elsif ($hirachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist Wächter und kann nicht \"gekickt\" werden !</font></font>");
+ &log("system","wa_k_$alias2kick_ow"); #!!
+ } else {
+ &post_prv("$alias2kick","<script language=\"JavaScript\">window.open(\"index.pl?tmp=kick\",\"_top\");</script>");
+ &zeit;
+ $_ = undef if ($room eq $_);
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias katapultiert \"$alias2kick\" aus dem Chat ...</font></i>",$_);
+ &log("system","wa_k_$alias2kick"); #!!
+ &remove_online($alias2kick,$_,"kick");
+ &secure_removeip($alias2kick);
+ }
+ &input_html("true");
+ exit;
+ }
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist nicht anwesend und kann nicht \"gekickt\" werden !</font></font>");
+ }
+#############>- SYSTEMNACHRICHT IN ALLE BESTEHENDEN RÄUME POSTEN -<
+ } elsif ($cmd eq "sys") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $sys_msg = $sys_msg." ".$cmd[$i];
+ }
+ &zeit;
+ &post_all("<i><font color=ffffff>($hours:$min:$sec)</font></i> <b><font size=2 color=red>SYSTEMNACHRICHT</font></b><i><font color=ffffff>: $sys_msg ...</font></i>");
+ &log("system","\"sys_msg_$room\"");
+ }
+#############>- ALIAS ZUM WÄCHTER ERNNENNEN BZW. ZUM NORMALEN CHATTER DEGRADIEREN -<
+ } elsif ($cmd eq "wa" || $cmd eq "rwa") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ &zeit;
+ my $alias2handle = $cmd[1];
+ if ($cmd eq "wa") {
+ my $anerkennen = "false";
+ &list_dir("data/user/options");
+ foreach(@dir) {
+ if ($_ eq $alias2handle) {
+ $anerkennen = "true";
+ }
+ }
+ if ($anerkennen eq "true") {
+ &hirachie($alias2handle);
+ if ($hirachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff>ist bereits als Wächter eingetragen. Eine erneuerte Eintragung ist nicht möglich!</font></font>");
+ &log("system","\"oh_wa_".$alias2handle."_exists\"");
+ } elsif ($hirachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff>ist schon als Oberwächter eingetragen. Oberwächter können nicht gleichzeitig Wächter sein!</font></font>");
+ &log("system","\"oh_wa_".$alias2handle."_oh-exists\"");
+ } else {
+ &write_file("data/wa");
+ print DATEI $alias2handle."\n";
+ close DATEI;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font><font color=ffa500> $alias ernennt \"$alias2handle\" zum Wächter ...</font></i>");
+ &log("system","\"oh_wa_".$alias2handle."_ok\"");
+ }
+ } else {
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2handle <font color=ffffff>kann nicht zum Wächter ernannt werden da Benutzername nicht existiert!</font></font>");
+ &log("system","\"oh_wa_".$alias2handle."_notexists\"");
+ }
+ } elsif ($cmd eq "rwa") {
+ &read_file("data/wa");
+ my @wafile = <DATEI>;
+ close DATEI;
+ my $aberkennen = "false";
+ foreach(@wafile) {
+ if ($_ ne "$alias2handle\n") {
+ push @newafile,$_;
+ } else {
+ $aberkennen = "true";
+ }
+ }
+ &write_file_new("data/wa");
+ print DATEI @newafile;
+ close DATEI;
+ if ($aberkennen eq "true") {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat \"$alias2handle\" vom Wächter zum normalen Chatter degradiert ...</font></i>");
+ &log("system","\"oh_rwa_".$alias2handle."_ok\"");
+ } else {
+ &post("<font size=2 color=ffa500>$alias2handle <font color=ffffff>konnte der Wächterstatus nicht aberkannt werden da Benutzer kein Wächter ist!</font></font>");
+ &log("system","\"oh_rwa_".$alias2handle."_notexists\"");
+ }
+ }
+ }
+#############>- ENDE DER CHATBEFEHLE -<
+}
+&input_html($reload,$action,$whisper);
+}
+
+sub change_room { # Den Chat-Raum wechseln
+ my ($method,$newroom,$oldroom,$alias2follow) = @_;
+ $room = $oldroom;
+ &secure_checkip($alias); # IP Nummer überprüfen
+ &zeit; # Zeit 'erneuern'
+ if ($method eq "j") {
+ unlink("data/online/rooms/$oldroom/$alias");
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias wechselt in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias kommt aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ &post_prv("$alias","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>Du wechselst aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ } elsif ($method eq "ju") {
+ unlink("data/online/rooms/$oldroom/$alias");
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias folgt \"$alias2follow\" in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias kommt aus dem Raum \"$oldroom\" und folgt \"$alias2follow\" herein nach \"$newroom\" ...</font></i>");
+ &post_prv("$alias","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>Du folgst \"$alias2follow\" aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ }
+ &rm_rooms;
+}
+
diff --git a/0.2.3/main2.pl b/0.2.3/main2.pl
new file mode 100644
index 0000000..cdc6886
--- /dev/null
+++ b/0.2.3/main2.pl
@@ -0,0 +1,513 @@
+#!/usr/bin/perl -w
+
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+
+if ($var eq "list_alias_html") {
+ &list_alias_html;
+} elsif ($var eq "alias_html") {
+ &alias_html;
+} elsif ($var eq "edit_profile_html") {
+ &edit_html("edit_profile_html");
+} elsif ($var eq "edit_options_html") {
+ &edit_html("edit_options_html");
+} elsif ($var eq "gb_html") {
+ &gb_html;
+} elsif ($var eq "post_gb") {
+ &post_gb;
+} elsif ($var eq "rm_gb_alias") {
+ &rm_gb;
+} elsif ($var eq "edit_profile") {
+ &edit("edit_profile");
+} elsif ($var eq "edit_options") {
+ &edit("edit_options");
+} else {
+ &error("Parameter fehlt");
+}
+
+###########################
+##HAUPTTEIL DIESER DATEI:##
+###########################
+
+sub gb_html { # Das Benutzerboard/Gästebuch.
+ my $message = $_[0];
+ &start_html("Benutzerboard");
+if ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </i>
+ einen Text und poste
+ <u>dann</u>
+ !
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Vielen Dank für Deinen Beitrag. Wenn Du willst, kannst Du jetzt gleich noch einen Eintrag posten ...
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Falls Du Anregungen oder Verbesserungsvorschläge für die Community hast, dann poste doch einen kleinen Eintrag :-)
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmp" value="guestbook">
+ <input type="hidden" name="id" value="y">
+ <input size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+ if (-e "data/guestbook") {
+ open (DATEI,"<data/guestbook") || &error("Konnte dat/guestbook nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ print
+ $q->div(@datei);
+ }
+ print
+ $q->end_html;
+}
+
+
+sub post_gb { # Wenn etwas in ein Gästebuch eingetragen wird
+ &secure_checkip($alias);
+ &zeit;
+ if ($msg eq "") {
+ if ($id eq "y") { # Überprüfen, ob Benutzerboard- oder Privatgästebuch
+ &gb_html("post_empty");
+ } else {
+ &alias_html("post_empty");
+ }
+ exit;
+ }
+ $msg =~ s#<#&lt\;#g;
+ my $tmpath = "";
+ if ($id eq "y") {
+ $tmpath = "data/guestbook";
+ } else {
+ $tmpath = "data/user/gbooks/$tmp";
+ }
+ if (-e "$tmpath") {
+ &read_file("$tmpath");
+ my @datei = <DATEI>;
+ close DATEI;
+ pop(@datei) if ($#datei > 99);
+ my @newdatei = "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ @newdatei = ("@newdatei", "@datei");
+ &write_file_new("$tmpath");
+ print DATEI @newdatei;
+ close DATEI;
+ } else {
+ &write_file_new("$tmpath");
+ print DATEI "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ close DATEI;
+ }
+ if ($id eq "y") {
+ &gb_html("post_ok");
+ exit;
+ } else {
+ post_prv("$tmp","<font size=2 color=ffffff><a href=\"main2.pl?alias=$alias&var=alias_html&tmp=$alias\" target=\"_new\">$alias</a> hat soeben einen Pin in <a href=\"main2.pl?alias=$alias&var=alias_html&tmp=$tmp\" target=\"_new\">Dein Profil</a> gehängt ... </font>");
+ &alias_html;
+ exit;
+ }
+}
+
+sub rm_gb { # Gästebucheintrag entfernen
+ &secure_checkip($alias);
+ $tmp = $alias;
+ &read_file("data/user/gbooks/$alias");
+ my @gbfile = <DATEI>;
+ close DATEI;
+ my @newgbfile = ();
+ for($i=0; $i <= $#gbfile; $i++) {
+ push(@newgbfile,$gbfile[$i]) if ($i != $id);
+ }
+ &write_file_new("data/user/gbooks/$alias");
+ print DATEI @newgbfile;
+ close DATEI;
+ &alias_html("rm_ok");
+}
+
+sub list_alias_html { # Liste aller Benutzer
+ &start_html("Alle Benutzer");
+ &list_dir("data/user/options");
+ my @liste = sort(@dir);
+ my $nr = $#dir-1;
+print <<END;
+ <div>
+ Es sind z.Z. genau $nr Benutzernamen in der Datenbank vorhanden! (Sortiert nach #, A-Z, a-z)
+ </div>
+ <hr>
+ <div>
+END
+ foreach(@liste) {
+ if (-f "data/user/options/$_") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_" },
+ "$_"),
+ " ";
+ }
+ }
+print <<END;
+ </div>
+</body>
+</html>
+END
+}
+
+sub alias_html { # Anzeigen eines Benutzerprofils
+ my $message = $_[0];
+ local $counter = undef;
+ &read_file("data/user/counts/$tmp");
+ $counter = <DATEI>;
+ close DATEI;
+ $counter++;
+ &write_file_new("data/user/counts/$tmp");
+ print DATEI $counter;
+ close DATEI;
+ &start_html($tmp);
+print <<END;
+<div>
+ <a href="htdocs.pl?var=werda_html&alias=$alias">Hier</a>
+ gehts zur Gesamtübersicht !
+</div>
+<hr>
+END
+if ($message eq "rm_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Der von Dir gewählte Eintrag wurde erfolgreich gelöscht.
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </u>
+ einen Text und poste
+ <u>dann</u>
+ !
+ <hr>
+END
+}
+ &read_file("data/user/profiles/$tmp");
+ @data = <DATEI>;
+ close DATEI;
+print <<END;
+ <div>
+ Dieses Profil wurde insgesamt schon $counter mal aufgerufen !
+ <br>
+ <br>
+ Alias: $tmp
+ <br>
+ <br>
+ Nachname: $data[0]
+ <br>
+ <br>
+ Vorname: $data[1]
+ <br>
+ <br>
+ Alter: $data[2]
+ <br>
+ <br>
+ Wohnort: $data[3]
+ <br>
+ <br>
+ E-Mail:
+ <a href="mailto:$data[4]">$data[4]</a>
+ <br>
+ <br>
+ ICQ-Nummer: $data[5]
+ <br>
+ <br>
+ Homepage:
+ <a href="$data[6]" target="_new">$data[6]</a>
+ <br>
+ <br>
+ Weiteres:
+ <br>
+ $data[7]
+ <hr>
+ Hier kannst Du $tmp eine Nachricht hinterlassen!
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input type="text" size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+if (-e "data/user/gbooks/$tmp") {
+ open (DATEI,"<data/user/gbooks/$tmp") || &error("Konnte data/user/gbooks/$tmp nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ if ($alias ne $tmp) {
+ print @datei;
+ } else {
+print <<END;
+ <table>
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="rm_gb_alias">
+ <input type="hidden" name="alias" value="$alias">
+END
+for($i=0; $i <= $#datei; $i++) {
+print <<END;
+ <tr>
+ <td>
+ <input type="radio" name="id" value="$i">
+ </td>
+ <td>
+ <div class=q>
+ $datei[$i]
+ </div>
+ </td>
+ </tr>
+END
+}
+print <<END;
+ </table>
+ <table>
+ <tr>
+ <td>
+ <font color=ffffff>
+ <input type="submit" value="Makierten Eintrag löschen">
+ </font>
+ </td>
+ <td>
+ <font color=ffffff>
+ <input type="reset" value="Makierung rückgängig machen">
+ </font>
+ </td>
+ </tr>
+ </table>
+ </form>
+END
+}
+}
+ print
+ $q->end_html;
+}
+
+sub edit_html { # Chat-Optionen / Benutzerprofil editieren
+ my ($method,$message) = @_;
+ &secure_checkip($alias);
+ &start_html("Benutzerprofil ändern");
+ if ($method eq "edit_options_html") {
+ &read_file("data/user/options/$alias");
+ } elsif ($method eq "edit_profile_html") {
+ &read_file("data/user/profiles/$alias");
+ }
+ @data = <DATEI>;
+ close DATEI;
+ if ($method eq "edit_options_html") {
+ chomp($data[0]);
+ if ($message eq "edit_options_ok") {
+print <<END;
+<script language="JavaScript">
+ open("main.pl?var=input_html&alias=$alias&room=$room&col=$col&secol=$secol","input");
+ open("htdocs.pl?var=menu_html&alias=$alias&room=$room&col=$col&secol=$secol","menu");
+</script>
+<div class=b>
+ Hinweis:
+</div>
+<div>
+ Du hast soeben Deine Chat-Optionen erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren. Um
+ weiterzuchatten einfach auf <a href="push.pl?alias=$alias&room=$room">Weiterchatten</a> klicken.
+</div>
+<hr>
+END
+ } elsif ($message eq "edit_pw_wrong") {
+print <<END;
+<div class=b>
+ ACHTUNG!
+</div>
+<div>
+ Du hast soeben versucht, dein Passwort zu ändern. Jedoch stimmte die Erste Eingabe nicht mit der Zweiten überein.
+ Bitte versuch es erneuert ...
+</div>
+<hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Deine Chat-Optionen editieren!" ),
+ $q->hr;
+ }
+print <<END;
+<form action="main2.pl">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="var" value="edit_options">
+ <div>
+ Dein Passwort
+ <font color=ffa500>
+ (Gut merken !!)
+ </font>
+ <br>
+ <input type="password" name="id" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ Geb hier das Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ "Deine Farbe (Farbe Deines Nicks, Angabe in Hexadezimal):
+ <br>
+ <input type="text" name="col" value="$data[1]">
+ </div>
+ <br>
+ <div>
+ Deine zweite Farbe (Farbe Deiner Nachrichten, Angabe in Hexadezimal):
+ <br>
+ <input type="text" name="secol" value="$data[2]">
+ </div>
+ <br>
+END
+ } elsif ($method eq "edit_profile_html") {
+ if ($message eq "edit_profile_ok") {
+print <<END;
+ <div class=b>
+ Hinweis:
+ </div>
+ <div>
+ Du hast soeben Dein Profil erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren:
+ <hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Dein Profil editieren!" ),
+ $q->hr;
+ }
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="var" value="edit_profile">
+ <div>
+ Dein Nachname:
+ <br>
+ <input name="nachname" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ Dein Vorname:
+ <br>
+ <input name="vorname" value="$data[1]">
+ </div>
+ <br>
+ <div>
+ Dein Alter:
+ <br>
+ <input name="alter" value="$data[2]">
+ </div>
+ <br>
+ <div>
+ Dein Wohnort:
+ <br>
+ <input name="wohnort" value="$data[3]">
+ </div>
+ <br>
+ <div>
+ Deine E-Mail Adresse:
+ <br>
+ <input name="email" value="$data[4]">
+ </div>
+ <br>
+ <div>
+ Deine ICQ-Nummer:
+ <br>
+ <input name="icq" value="$data[5]">
+ </div>
+ <br>
+ <div>
+ Deine Homepage:
+ <br>
+ <input name="homepage" value="$data[6]">
+ </div>
+ <br>
+ <div>
+ Weiteres:
+ <br>
+ <textarea rows="5" cols="40"name="weiteres" wrap="virtual">$data[7]</textarea>
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <font color=ffffff>
+ <input type="submit" value="Daten ändern ...">
+ </font>
+ </form>
+</body>
+</html>
+END
+}
+
+
+sub edit { # Benutzerprofil od. Chat-Optionen abspeichern
+ &secure_checkip($alias);
+ my $method = $_[0];
+ if ($method eq "edit_profile") {
+ &write_file_new("data/user/profiles/$alias");
+ print DATEI $q->param('nachname')."\n".$q->param('vorname')."\n".$q->param('alter')."\n".$q->param('wohnort')."\n".$q->param('email')."\n".$q->param('icq')."\n".$q->param('homepage')."\n".$q->param('weiteres');
+ close DATEI;
+ &log("system","\"edit_profile_ok\"");
+ &edit_html("edit_profile_html","edit_profile_ok");
+ } elsif ($method eq "edit_options") {
+ if ($id ne $tmp) {
+ &log("system","\"edit_pw_wrong\"");
+ &edit_html("edit_options_html","edit_pw_wrong");
+ exit;
+ }
+ &secure_checkip($alias);
+ &write_file_new("data/user/options/$alias");
+ print DATEI $id."\n".$col."\n".$secol;
+ close DATEI;
+ &log("system","\"edit_options_ok\"");
+ &edit_html("edit_options_html","edit_options_ok");
+ }
+}
diff --git a/0.2.3/online.pl b/0.2.3/online.pl
new file mode 100644
index 0000000..2e8bf8d
--- /dev/null
+++ b/0.2.3/online.pl
@@ -0,0 +1,52 @@
+#!/usr/bin/perl -w
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+&secure_checkip($alias);
+&start_html("Online","online");
+&online($alias,$room);
+&list_dir("data/online/rooms/".$room);
+print
+ $q->div( "$room:" ),
+ "<font size=1 color=ffffef face=arial>";
+ foreach $online (@dir) {
+ if (-f "data/online/rooms/$room/$online") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$online",
+ -target=>"$online" }, "$online"), $q->br;
+ }
+ }
+print
+ "</font>",
+ $q->end_html;
+
+sub online { # Benutzer in die Onlineliste hinzufügen bzw. erneuern
+ my ($alias,$room) = @_;
+ &write_file_new("data/online/users/$alias");
+ print DATEI time;
+ close DATEI;
+ if (-e "data/online/rooms/$room") {
+ } else {
+ mkdir "data/online/rooms/$room", 0777;
+ }
+ &write_file_new("data/online/rooms/$room/$alias");
+ print DATEI time;
+ close DATEI;
+ &read_file("data/online/prove"); # Räume und Chatter auf Existenz überprüfen
+ my $provetime = <DATEI>;
+ close DATEI;
+ if ($provetime < (time - 30)) {
+ &write_file_new("data/online/prove");
+ print DATEI time;
+ close DATEI;
+ &rm_alias("data/online/users");
+ &rm_rooms;
+ }
+}
+
diff --git a/0.2.3/push.pl b/0.2.3/push.pl
new file mode 100644
index 0000000..7cabba9
--- /dev/null
+++ b/0.2.3/push.pl
@@ -0,0 +1,93 @@
+#!/usr/bin/perl -w
+use CGI;
+$q = new CGI;
+
+print
+ $q->header; # HTML-Header erzeugen
+
+require config;
+
+&secure_checkip($alias);
+
+########################################
+##ANFANG DER ZU STREAMENDEN HTML-DATEI##
+########################################
+
+print <<END;
+<html>
+ <head>
+<script language="JavaScript">
+<!--
+// Scroll-Routine von Anklepper (http://www.anklepper.de)
+// speziell für yChat (http://www.yChat.de), Copyright 2000
+scrolling = true;
+moves_steps = 4; // Schrittgröße
+moves_interval = 4; // Schrittgeschwindigkeit
+
+function moves()
+{
+ if( scrolling != false )
+ window.scrollBy( 0, moves_steps );
+ window.setTimeout( "moves()", moves_interval );
+}
+
+moves();
+//-->
+</script>
+ </head>
+<body bgcolor=000000 link=FFFFFF alink=FFFFEF vlink=FFFFEF>
+END
+
+$| = 1; # Cache von Perl ausschalten
+
+#############################
+##BEGRÜSSUNGSTEXT SCHREIBEN##
+#############################
+
+my $msgfile;
+
+ print
+ $q->font( { -size=>1,
+ -color=>"ffffff",
+ -face=>"arial"},
+ "$title Copyright by Paul C. Bütow 2k $tmp\n");
+
+if ($var eq "push_logs_html") {
+ $msgfile = $tmp;
+ print "<hr><font size=2 color=ffffff face=arial>";
+} elsif ($var eq "clear_screen") {
+ $msgfile = "data/msgs/$alias";
+ &write_file_new($msgfile);
+ print DATEI $q->br;
+ close DATEI;
+} else {
+ $msgfile = "data/msgs/$alias";
+ print $q->br;
+}
+
+open (MSGFILE, $msgfile);
+
+#################################
+##ENDLOSSCHLEIFE FÜR DEN STREAM##
+#################################
+
+my ($times,$online) = (0,"false");
+for (;;) {
+ for ($curpos = tell(MSGFILE); <MSGFILE>; $curpos = tell(MSGFILE)) {
+ print $_ ;
+ }
+ $times++;
+ if ($times > 29) { # Nach 30 Sekunden
+ print "\n<!--PING//-->"; # Ping zum Browser senden
+ $times = 0; # Sekundenzahl auf 0 zurücksetzen
+ $online = "true" if (-e "data/online/users/$alias");
+ if ($online eq "false") {
+ print "<font size=2 color=red>Aus technischen Gründen bitte auf <a href=\"push.pl?alias=$alias&room=$room&var=clear_screen\">Weiterchatten</a> klicken.</font>";
+ exit;
+ }
+ }
+ sleep 1;
+ seek(MSGFILE, $curpos, 0); # Position wiederherstellen
+}
+
+print "<font size=2 color=red>Aus technischen Gründen bitte auf <a href=\"push.pl?alias=$alias&room=$room&var=clear_screen\">Weiterchatten</a> klicken.</font>";
diff --git a/0.2.3/setup.sh b/0.2.3/setup.sh
new file mode 100644
index 0000000..c5e369e
--- /dev/null
+++ b/0.2.3/setup.sh
@@ -0,0 +1,42 @@
+#!/bin/sh
+mkdir data
+mkdir data/logs
+chmod 777 data/logs
+mkdir data/msgs
+chmod 777 data/msgs
+mkdir data/logs/ow
+chmod 777 data/logs/ow
+mkdir data/user
+chmod 777 data/user
+mkdir data/user/counts
+chmod 777 data/user/counts
+mkdir data/user/options
+chmod 777 data/user/options
+mkdir data/user/profiles
+chmod 777 data/user/profiles
+mkdir data/user/gbooks
+chmod 777 data/user/gbooks
+mkdir data/online
+chmod 777 data/online
+mkdir data/online/rooms
+chmod 777 data/online/rooms
+mkdir data/online/users
+chmod 777 data/online/users
+mkdir data/online/ident
+chmod 777 data/online/ident
+mkdir data/htdocs
+chmod 777 data/htdocs
+mv help_html data/htdocs
+mv logs_html data/htdocs
+chmod 777 data/htdocs/*
+chmod 777 *
+mkdir dokus/
+mv *.txt dokus/
+mkdir ../../htdocs/yChat/
+mv *.gif ../../htdocs/yChat/
+mv *.jpg ../../htdocs/yChat/
+echo
+echo yChat Setup beendet ...
+echo Created and copyrighted by Paul C. Bütow aka Snooper
+echo
+rm setup.sh
diff --git a/0.2.3/unten.gif b/0.2.3/unten.gif
new file mode 100644
index 0000000..285fb53
--- /dev/null
+++ b/0.2.3/unten.gif
Binary files differ
diff --git a/0.2.3/yBanner.gif b/0.2.3/yBanner.gif
new file mode 100644
index 0000000..e4b691e
--- /dev/null
+++ b/0.2.3/yBanner.gif
Binary files differ
diff --git a/0.2.3/yChat.jpg b/0.2.3/yChat.jpg
new file mode 100644
index 0000000..61eabfb
--- /dev/null
+++ b/0.2.3/yChat.jpg
Binary files differ
diff --git a/0.2.4a/INSTALL.txt b/0.2.4a/INSTALL.txt
new file mode 100644
index 0000000..13fb7bb
--- /dev/null
+++ b/0.2.4a/INSTALL.txt
@@ -0,0 +1,107 @@
+#############################################################################
+## yChat.de Version 0.2.4 by CXG.de: The chatters of the next generation ##
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+yChat findest Du im Internet unter der Adresse www.yChat.de. Bei Kritik,
+Anregungen oder Fragen bitte in das dort vorhandene Board posten oder eine
+E-Mail an die oben stehende Adresse senden. Ich bemühe mich, yChat so gut wie
+möglich zu machen und bin über Ratschläge immer sehr erfreut :-) ...
+
+Die Installation kann auf Unix-Systemen voll automatisch duchgeführt werden.
+Allerdings ist dafür ein Telnet-Zugang notwendig. Kopiere alle vorhandenen
+Dateien in das Verzeichnis cgi-bin/yChat und führe dann das Shellskript
+setup.sh mit dem Befehl ./setup.sh aus. Alle Verzeichnisse werden
+automatisch erstellt. Dies wurde allerdings nur auf SuSE Linux Systemen
+mit root-Zugriff getestet. Solltest Du ein anderes System verwenden oder
+den Chat auf einen virtuellen Webserver installieren wollen, dann mußt Du
+unter umständen das Verzeichnis "../../htdocs/yChat" nach "../../yChat"
+in der setup.sh umbenennen. Ansonsten werden die dazugehörigen Grafikdateien
+falsch oder garnicht kopiert.
+
+Wenn Du keinen Telnet-Zugang hast, kannst Du hier die Verzeichnisse manuell
+erstellen:
+
+Folgende Basis-Dateien sind im Chat enthalten und müssen in das cgi-bin
+Verzeichnis kopiert werden. Z.B. nach ./cgi-bin/yChat/:
+
+config.pm => Configurationsdatei ("Shared subs")
+htdocs.pl => HTML-Dokumentdateien (Nicht unbedingt erforderlich)
+index.pl => Startskript (Registrierung, Frameset, Login, Daten edit.)
+main.pl => Hauptskript (Alle Hauptfunktionen des Chats)
+main2.pl => Skript für editieren der Benutzerdaten etc.
+online.pl => Anzeige und Überprüfung der eingelogten Benutzer
+push.pl => Server-Push-Routine
+setup.sh => Dient zur automatischen Einrichtung des Chats.
+LIESMICH.txt => Beinhaltet wichtige Informationen
+UPDATES.txt => Updateliste der verschiedenen Versionen
+INSTALL.txt => Dieses Dokument
+
+Folgende Verzeichnisse müssen erstellt werden (chmod 777 sollte
+funktionieren):
+
+- Hier befinden sich alle für den Chat notwenidgen Daten:
+ ./cgi-bin/yChat/data/*
+
+- Hier befinden sich alle für den Chat notwendigen HTML-Dokumente:
+ ./cgi-bin/yChat/data/htdocs/*
+
+ Folgende Dateien müssen in das "data/htdocs" verzeichnis bewegt werden:
+
+ help_html => 101 Hilfedatei
+ logs_html => 101 Logbeschreibung
+
+- Hier befinden sich alle Logdateien, die vom Chat erstellt werden:
+ ./cgi-bin/yChat/data/logs/*
+
+- Hier befinden sich alle Oberwächter-Logdateien:
+ ./cgi-bin/yChat/data/logs/ow/*
+
+- Hier befinden sich die Message-Dateien der eingelogten Benutzer:
+ ./cgi-bin/yChat/data/msgs/*
+
+- Hier befinden sich alle Daten der registrierten Benutzer:
+ ./cgi-bin/yChat/data/user/*
+
+- Hier wird abgespeichert, wie oft ein Benutzerprofil insgesant schon
+ aufgerufen wurde:
+ ./cgi-bin/yChat/data/user/counts/*
+
+- Hier befinden sich alle Chat-Optionen und Passwörter der registrierten
+ Benutzer:
+ ./cgi-bin/yChat/data/user/options/*
+
+- Hier befinden sich alle Benutzerprofile der Benutzer:
+ ./cgi-bin/yChat/data/user/profiles/*
+
+- Hier befinden sich alle Gästebucheinträge der Benutzer:
+ ./cgi-bin/yChat/data/user/gbooks/*
+
+- Hier befinden sich alle Daten zu den aktuellen Chaträumen und User die online sind
+ ./cgi-bin/yChat/data/online/*
+
+- Hier befinden sich alle offnenen Räume
+ ./cgi-bin/yChat/data/online/rooms/*
+
+- Hier befinden sich die Chatter, die sich in den jew. Räumen befinden
+ ./cgi-bin/yChat/data/online/rooms/RAUMNAME/*
+
+- Hier befinden sich alle Chatter, die sich z.Z. im System befinden
+ ./cgi-bin/yChat/data/online/users/*
+
+- Hier befinden sich alle IP-Nummern der eingelogten Chatter
+ ./cgi-bin/yChat/data/online/ident/*
+
+Folgende GRafikdateien sollten in ein nicht-CGI-BIN-Verzeichnis kopiert werden. Z.B.
+nach ./yChat/
+
+ bar.gif => Der gelb gestreifte Rand auf den meisten Seiten
+ unten.gif => Der Hintergrund für das Eingabeformular im Chat
+ yChat.gif => Das yChat-Logo auf der Startseite
+
+Zum schluß sollte die config.pm-Datei nach wünschen editiert werden. Allerdings sollten
+die Copyright Hinweise und die Versionsnummern nicht manipuliert werden.
+
+Folgende Dateien werden von yChat automatisch erstellt:
+
+Viel Spaß beim Chatten ...
+ Snooper \ No newline at end of file
diff --git a/0.2.4a/LIESMICH.txt b/0.2.4a/LIESMICH.txt
new file mode 100644
index 0000000..8d68f71
--- /dev/null
+++ b/0.2.4a/LIESMICH.txt
@@ -0,0 +1,33 @@
+#############################################################################
+## yChat.de Version 0.2.4 by CXG.de: The chatters of the next generation ##
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+Allgemeine Bedingungen bezgl. yChat:
+
+ - Das yChat-System darf ohne Erleubnis des Autors nicht auf irgendeiner Art
+ und Weise weitergegeben- oder eingesetzt werden.
+
+ - Wird das yChat-System eingesetzt, so darf es manipuliert werden, soweit
+ die Copyright-Hinweise des Autors, die Versionsbezeichnung und der Link
+ auf der Startseite nach servers.yChat.de unverändert bleibt.
+ Ansonsten darf der gesamte Code manipuliert werden.
+
+ - Wird das yChat-System erlaubter Weise manipuliert, so muß das veränderte
+ Skript auf Anforderung an den Autor weitergegeben werden. Dieser darf
+ die Veränderungen in das Standard-yChat-System integrieren.
+
+ - Wird das yChat-System eingesetzt, su muß dem Autor die Location bzw. die
+ URL bekanntgegeben werden. Diese wird in servers.yChat.de eingetragen.
+ und mit einer URL wwX.yChat.de verlinkt. Wobei X für die Nummer des jew.
+ Servers steht.
+
+ - Es ist verboten, Sourcecode aus dem yChat-System zu kopieren und
+ für andere, nicht von yChat abhängige Perl-Programme einzusetzen.
+
+Im Flogenden einige yChat-bezügl. Verknüpfungen:
+
+ servers.yChat.de => Liste aller laufenden yChat-Systeme
+ install.yChat.de => Installationsdokumentation
+ liesmich.yChat.de => Allgemeine Bedingungen usw.
+ updates.yChat.de => Update-dListe
+ www.yChat.de => Das Skript zum testen \ No newline at end of file
diff --git a/0.2.4a/TODO.txt b/0.2.4a/TODO.txt
new file mode 100644
index 0000000..5d8d7db
--- /dev/null
+++ b/0.2.4a/TODO.txt
@@ -0,0 +1,32 @@
+Folgende Funktionen werden demnächst in yChat implentiert:
+
+ - Räume auf/abschließen, themen geben, Raumbesetzer (vergl.
+ mit den normalen Häuptlingen aus Kilahu).
+
+ - Die Schlucht (Ein Raum wo Chatter hineingeworfen werden,
+ die sich nicht benehmen und noch nicht aus dem Chat
+ katapultiert werden sollen).
+
+ - Löschung aller Chatter, die sich seit 60 Tagen nicht mehr
+ eingelogt haben.
+
+ - IP-Adressen ver-/entbannen.
+
+ - Farbtabelle unter "Optionen".
+
+ - E-Mail zusendung bei verlorenem Passwort.
+
+ - Totale Onlinezeit der einzelnen Chatter soll protokolliert
+ werden. Daraus wird dann eine Top20 der Chatter erstellt.
+
+ - Unter "Benutzer" sollen Chatter über eine Eingabemaske nach
+ dem Anfangsbuchstaben gesucht werden können (vergl. Kilahu).
+
+ - Java-Applet-Eingabezeile für einen flüssigeren Chat
+
+ - Der Cybarkeeper (künstlich intilligenter Chatroboter, der
+ sich im Hauptraum Cyberbar aufhält, virtuelle Drinks verteilt
+ und von Real-Chattern übernommen werden kann. (Zukunftsmusik)
+
+Für weitere Vorschläge bitte in das yChat-Board unter www.yChat.de
+texten oder eine E-Mail an paul@buetow.oxg.de :-) \ No newline at end of file
diff --git a/0.2.4a/UPDATES.txt b/0.2.4a/UPDATES.txt
new file mode 100644
index 0000000..7dc7f50
--- /dev/null
+++ b/0.2.4a/UPDATES.txt
@@ -0,0 +1,43 @@
+########################### yChat.de UPDATE LIST ###########################
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+Hier sind alle Erneuerungen der Versionen dokumentiert:
+
+Update von 0.2.3 auf 0.2.4
+ - Optimierung bzw. Verbesserung der Push-Routine push.pl.
+ - Server-Ping wurde von 2-Pings-per-Second auf 4 erhöht.
+ - yChat-Banner wurde erstellt und ist unter
+ documents.yChat.de/yBanner.jpg vorzufinden.
+ - Unter der URL servers.yChat.de wurde eine Serverliste angelegt,
+ welche anzeigt wo yChat-Systeme laufen.
+ - Des weiteren wurden die URLs updates.yChat.de, install.yChat.de
+ und liesmich.yChat.de eingerichtet.
+ - Die Menüpunkte wurden zusammengefaßt, damit sie unter einer
+ Auflösung von 800x600 nur eine Zeile belegen.
+ - Einige Bugs wurden entfernt.
+
+Update von 0.2.2 auf 0.2.3 - 25.11.2k
+ - Smooth scrolling JavaScript (Vielen Dank an Andreas Buchwald).
+ - "IP#-Fehler" wurde so gut wie beseitigt.
+ - Aufrufe der einzelnen Benutzerprofile wird gezählt und angezeigt.
+ Diese werden in data/user/counts/* gespeichert.
+ - Automatische Einrichtung des Chats mit setup.sh und Telnet.
+ - Menüpunkt "Dein Profil" wurde entfernt da eigenes Profil auch
+ stets über die Onlineliste aufgerufen werden kann.
+
+Update von 0.2.1 auf 0.2.2 - 23.11.2k
+ - Einige Bugs wurden entfernt.
+ - Geschwindigkeit des Chats wurde optimiert.
+ - Eine Liste aller eingelogten Benutzer erscheint am Rand. Hierfür
+ wurde die Datei online.pl eingeführt. Sie aktuallisiert sich alle
+ 20 Sekunden.
+ - Die UPDATES.txt wurde eingeführt.
+
+Update von 0.2.0 auf 0.2.1
+ - Einige Bugs wurden entfernt.
+ - Die IP# der eingelogten Benutzer werden nun anders verwaltet.
+
+Update von Alpha XVIII auf 0.2.0
+ - Die Handhabung der eingelogten Benutzer im System wurde komplett neu
+ überarbeitet.
+ - Neue Versionsnumern wurden eingeführt. \ No newline at end of file
diff --git a/0.2.4a/bar.gif b/0.2.4a/bar.gif
new file mode 100644
index 0000000..61d02b7
--- /dev/null
+++ b/0.2.4a/bar.gif
Binary files differ
diff --git a/0.2.4a/config.pm b/0.2.4a/config.pm
new file mode 100644
index 0000000..4428e38
--- /dev/null
+++ b/0.2.4a/config.pm
@@ -0,0 +1,321 @@
+########################### Dieser Teil bestimmt die Standart-Variabeln.
+##STANDART-CONFIGURATION:## (CSS, Farben, Version etc.)
+###########################
+
+$alias = $q->param("alias");
+$var = $q->param("var");
+$room = $q->param("room");
+$col = $q->param("col");
+$secol = $q->param("secol");
+$msg = $q->param("msg");
+$tmp = $q->param("tmp");
+$id = $q->param("id");
+$room = "Cyberbar" if ($room eq "");
+$col = "ffffef" if ($col eq "");
+$secol = "ffffef" if ($secol eq "");
+$datum = "29.11.2k";
+$version = "0.2.4";
+$title = "yChat.de ($version)";
+$gfxpath = "../../yChat/";
+$style = <<ENDCSS;
+<style rel="stylesheet" type="text/css">
+ body { background-image: url("$gfxpath/bar.gif"); background-color: 000000 }
+ body.menu { background-image: none }
+ body.log { background-color: 000000 }
+ body.online { background-color: 444444; background-image: none }
+ div { font-family: arial, verdana, helvetiva; font-size: 10pt; color: ffffff }
+ div.b { font-weight: bold; color: ffa500 }
+ a { color: ffffef }
+ a:hover { color: ffffff; text-decoration: none }
+</style>
+ENDCSS
+
+############### Dieser Teil enthält Programmcode, der an verschiedenen
+##SHARED-SUBS## Stellen ausgeführt werden muß und jedem Skript zur
+############### Verfügung steht.
+
+sub printfile { # Liest eine externe Datei ein und gibt sie mit print aus
+ my ($file2print,$pagetitle,$bodyclass) = @_;
+ if ($pagetitle ne "") {
+ &start_html($pagetitle,$bodyclass);
+ }
+ print "<div><a href=\"push.pl?alias=$alias&tmp=$tmp&var=push_logs_html\">Push</a></div><hr>" if ($bodyclass eq "log");
+ &read_file($file2print);
+ @file2print = <DATEI>;
+ close DATEI;
+ print @file2print;
+}
+
+
+sub start_html { # Der HEADER einer HTML-Datei
+print "<html><head>";
+print "<meta http-equiv=\"refresh\" content=\"20\" URL=\"online.pl?room=$room\">" if ($_[1] eq "online");
+print <<END;
+ <title>
+ $title - $_[0]
+ </title>
+ $style
+ </head>
+END
+ if ($_[1] ne "") {
+ print "<body class=$_[1]>";
+ } else {
+ print "<body>";
+ }
+}
+
+sub post { # Öffentliche Nachricht im aktuellen Raum $room posten.
+ my ($msg2post,$secroom) = @_;
+ my @rooms = ($room,$secroom);
+ foreach(@rooms) {
+ my $room2post = $_;
+ &list_dir("data/online/rooms/$room2post");
+ foreach(@dir) {
+ my $alias2post = $_;
+ if (-f "data/online/rooms/$room2post/$alias2post") {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+ }
+ }
+ }
+ &log("msg","$msg2post");
+}
+
+
+sub post_all { # Öffentliche Nachricht in ALLEN Räumen gleichzeitig posten.
+ my $msg2post = $_[0];
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ my $alias2post = $_;
+ if (-f "data/online/users/$alias2post") {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+ }
+ }
+ &log("msg","$msg2post");
+}
+
+sub post_prv { # Private Nachricht posten (flüstern).
+ my $alias2post = $_[0];
+ my $msg2post = $_[1];
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+}
+
+sub log { # Protokollieren der Nachrichten etc.
+ my ($method,$msg2log) = @_;
+ &zeit;
+ if ( $method eq "msg") {
+ $log = "data/logs/$room-$day.$month.$year";
+ } elsif ($method eq "logins") {
+ $log = "data/logs/ow/logins-$day.$month.$year";
+ $syslog = "data/logs/ow/system-$day.$month.$year";
+ } elsif ($method eq "system") {
+ $log = "data/logs/ow/system-$day.$month.$year";
+ }
+ &write_file($log);
+ if ($method eq "msg") {
+ print DATEI "<br><font color=ffffef><i>($hours:$min:$sec)</i></font> $msg2log\n";
+ } elsif ($method eq "logins") {
+ print DATEI "($day.$month.-$hours:$min:$sec) User: $alias IP#: $ENV{'REMOTE_ADDR'} Agent: $ENV{'HTTP_USER_AGENT'}\n<br>";
+ close DATEI;
+ &write_file($syslog);
+ print DATEI "($day.$month.-$hours:$min:$sec) $msg2log User: $alias IP#: $ENV{'REMOTE_ADDR'}\n<br>";
+ } elsif ($method eq "system") {
+ print DATEI "($day.$month.-$hours:$min:$sec) $msg2log User: $alias IP#: $ENV{'REMOTE_ADDR'}\n<br>";
+ }
+ close DATEI;
+}
+
+
+sub zeit { # Aktuelles Datum und Uhrzeit bestimmen.
+ ($sec, $min, $hours, $day, $month, $year) = (localtime)[0..5];
+ $month += 1;
+ $hours = "0".$hours if ($hours < 10);
+ $min = "0".$min if ($min < 10);
+ $sec = "0".$sec if ($sec < 10);
+ $day = "0".$day if ($day < 10);
+ $month = "0".$month if ($month < 10);
+ $year = $year - 100;
+ if ($year < 10) {
+ $year = "200".$year;
+ } else {
+ $year = "20".$year;
+ }
+}
+
+sub count { # Zeilen in einer Datei Zählen.
+ my $file2count = $_[0];
+ &read_file($file2count);
+ my @datei = <DATEI>;
+ close DATEI;
+ $number = $#datei+1;
+}
+
+sub read_file { # Datei öffnen.
+ my $file2read = $_[0];
+ if (-e "$file2read") {
+ open (DATEI,"<$file2read") || &error("Konnte $file2read nicht öffnen");
+ }
+}
+
+sub write_file { # Text an eine Datei anhängen.
+ my $file2write = $_[0];
+ if (-e "$file2write") {
+ open (DATEI,">>$file2write") || &error("Konnte $file2write nicht öffnen");
+ } else {
+ &create_file("$file2write");
+ open (DATEI,">>$file2write") || &error("Konnte $file2write nicht öffnen");
+ }
+}
+
+sub write_file_new { # Datei neu schreiben.
+ my $file2write = $_[0];
+ if (-e "$file2write") {
+ open (DATEI,">$file2write") || &error("Konnte $file2write nicht öffnen");
+ } else {
+ &create_file("$file2write");
+ open (DATEI,">$file2write") || &error("Konnte $file2write nicht öffnen");
+ }
+}
+
+sub create_file { # Datei erstellen.
+ my $file2create = $_[0];
+ open (CREATE, ">$file2create") || &error("Konnte $file2create nicht erstellen");
+ print CREATE "";
+ close CREATE;
+}
+
+sub error { # Error-Ausgabe.
+ my $error_msg = $_[0];
+ &start_html( "Error: ($error_msg)" );
+ print $q->div( "Error: ($error_msg)" ),
+ $q->end_html;
+ exit;
+}
+
+sub remove_online { # Chatter entfernen
+ my ($alias,$room,$method) = @_;
+ unlink("data/online/users/$alias");
+ unlink("data/online/rooms/$room/$alias") if ($room ne undef);
+ unlink("data/online/ident/$alias");
+ &rm_rooms;
+ &zeit;
+ if ($method eq undef) {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias verläßt den Chat ...</font></i>");
+ } else {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500> $_ hat den Chat verlassen ... </font></i>");
+ &log("system","\"logout_$__ok\"");
+ }
+}
+
+sub rm_alias { # Chatter aus dem System entfernen, die älter als 60 Sekunden sind
+ my $dir2rm = $_[0];
+ &list_dir($dir2rm,2);
+ foreach(@dir2) {
+ if (-f "$dir2rm/$_" && $_ ne undef) {
+ &read_file("$dir2rm/$_");
+ my $timestamp = <DATEI>;
+ close DATEI;
+ if ($timestamp < (time - 60)) {
+ if ($dir2rm eq "data/online/users") {
+ &remove_online($_,undef,1);
+ } else {
+ unlink("$dir2rm/$_");
+ }
+ }
+ }
+ }
+}
+
+sub rm_rooms { # Leere Räume aus dem System entfernen
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-d "data/online/rooms/$_") {
+ &rm_alias("data/online/rooms/$_");
+ &list_dir("data/online/rooms/$_",2);
+ rmdir("data/online/rooms/$_") if ($#dir2 = 1);
+ }
+ }
+}
+
+sub secure_removeip { # Beim ausloggen die IP-Nummer aus dat/ip austragen.
+ my $alias2rm = $_[0];
+ unlink("data/online/ident/$alias2rm");
+}
+
+sub secure_checkip { # data/ip auf die eigene IP-Nummer überprüfen.
+ my ($alias2check,$method) = @_;
+ my $ip;
+ for($i=0 ;$i<=5;) {
+ &read_file("data/online/ident/$alias2check");
+ $ip = <DATEI>;
+ close DATEI;
+ if ($ip ne $ENV{'REMOTE_ADDR'}) {
+ $i++;
+ } else {
+ goto ENDCHECKIP
+ }
+ if ($i<=5) {
+ &log("system","\"secure_ip\"");
+ if ($method eq undef) {
+ &error("Du bist nicht befugt, mit der IP# $ENV{'REMOTE_ADDR'} und dem Alias \"$alias\" zu handeln. Sollte diese Meldung aufgrund eines Fehlers aufgetaucht sein, dann log Dich doch bitte neu in den Chat ein.");
+ } else {
+ &post_prv("$alias2check","<font color=red>Du bist nicht befugt, mit der IP# $ENV{'REMOTE_ADDR'} und dem Alias \"$alias\" zu handeln. Sollte diese Meldung aufgrund eines Fehlers aufgetaucht sein, dann log Dich doch bitte neu in den Chat ein.</font>");
+ &input_html("true") if ($method = 2);
+ }
+ exit;
+ }
+ }
+ENDCHECKIP:
+}
+
+sub remove_rooms { # Leere Räume entfernen.
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-d "data/online/rooms/$_") {
+ &list_dir("data/online/rooms/$_");
+ rmdir("data/online/rooms/$_") if ($#dir = 1);
+ }
+ }
+}
+
+sub list_dir { # Beliebigen Verzeichnisbaum einlesen.
+ my ($dir,$method) = @_;
+ opendir(DIR, $dir);
+ if ($method eq undef) {
+ @dir = readdir(DIR);
+ } elsif ($method = 2) {
+ @dir2 = readdir(DIR);
+ }
+ closedir(DIR);
+}
+
+sub hirachie { # Chatter nach Sonderrechte überprüfen.
+ my $alias2prove = $_[0];
+ $hirachie = "nc";
+ &read_file("data/wa");
+ @was = <DATEI>;
+ close DATEI;
+ foreach(@was) {
+ if ($_ eq $alias2prove || $_ eq "$alias2prove\n") {
+ $hirachie = "wa";
+ }
+ }
+ if ($hirachie ne "wa" || $_ eq "$alias2prove\n") {
+ &read_file("data/ow");
+ @ows = <DATEI>;
+ close DATEI;
+ foreach(@ows) {
+ if ($_ eq $alias2prove || $_ eq "$alias2prove\n") {
+ $hirachie = "ow";
+ }
+ }
+ }
+}
+
+
+
diff --git a/0.2.4a/help_html b/0.2.4a/help_html
new file mode 100644
index 0000000..79b94fa
--- /dev/null
+++ b/0.2.4a/help_html
@@ -0,0 +1,616 @@
+<div>
+ Alle Chat-Befehle:
+</div>
+<hr>
+<table width=100% bgcolor=555555>
+ <tr>
+ <th bgcolor=666666>
+ <div>
+ SU
+ </div>
+ </th>
+ <th bgcolor=666666>
+ <div>
+ Befehl
+ </div>
+ </th>
+ <th bgcolor=666666>
+ <div>
+ Beschreibung
+ </div>
+ </th>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/about
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt aktuelle Version und andere Infos der Community an
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/away
+ <font color=red>
+ Nachricht
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Abmelden mit einer
+ <font color=red>
+ Abmeldenachricht
+ </font>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/clear
+ </div>
+ </td>
+ <td>
+ <div>
+ Bildschirm wird gelöscht
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/col
+ <font color=red>
+ XXXXXX
+ </font>
+ <font color=ffa500>
+ XXXXXX
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Abmelden mit einer
+ Farbe/n (
+ <font color=red>
+ Namensfarbe
+ </font>/
+ <font color=ffa500>
+ Textfarbe
+ </font>
+ ) wechseln. Angabe in Hexadezimal. Wird
+ <font color=ffa500>
+ Textfarbe
+ </font>
+ nicht angegeben, dann hat der Text die
+ <font color=red>
+ Namensfarbe
+ </font>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /date
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt aktuelles Datum und Urzeit an
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/j
+ <font color=red>
+ Raumname
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Raum wechseln/erstellen
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /ju
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ in den Raum wechseln/folgen, wo sich
+ <font color=red>
+ Alias
+ </font>
+ befindet.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/m
+ </div>
+ </td>
+ <td>
+ <div>
+ Handeln mit 2 Farben
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/me
+ </div>
+ </td>
+ <td>
+ <div>
+ Handeln mit einer Farbe
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /msg
+ <font color=red>
+ Alias
+ </font>
+ <font color=ffa500>
+ Nachricht
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>
+ Alias
+ </font>
+ eine private
+ <font color=ffa500>
+ Nachricht
+ </font>
+ flüstern. (Wird nicht vom Chat protokolliert)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /
+ <font color=ffa500>
+ Nachricht
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Eine private
+ <font color=ffa500>
+ Nachricht
+ </font>
+ demjenigen flüstern, dem zuletzt eine geflüstert wurde. (Wird nicht vom Chat protokolliert)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+//
+ </div>
+ </td>
+ <td>
+ <div>
+ Wurde zuletzt eine öffentliche Nachricht gepostet, dann wird diese nocheinmal gepostet. (Funktioniert nicht bei Befehlen, flüstern oder schreien)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/q
+ </div>
+ </td>
+ <td>
+ <div>
+ Cumunnity verlassen
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/s <font color=red>Nachricht</font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>Nachricht</font> schreien
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/w
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt an, wer sich im aktuellen Raum befindet.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/wc
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt an, wer eingelog ist.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /wc
+ <font color=red>
+ Raum
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt an, wer sich im
+ <font color=red>
+ Raum
+ </font>
+ befindet.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /wc/
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt alle offenen Räume und deren Chatter an
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /wj
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt an, in welchen Raum sich
+ <font color=red>
+ Alias
+ </font>
+ befindet.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=ffa500>
+ WÄ
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ /k
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>
+ Alias
+ </font>
+ wird aus dem Chat katapultiert!
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+/ban
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt alle verbannten Benutzer an
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+/ban
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>
+ Alias
+ </font>
+ verbannen.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+/rban
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>
+ Alias
+ </font>
+ "entbannen"
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ /ip
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt die IP-Nummer von
+ <font color=red>
+ Alias
+ </font>
+ an.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ /wa
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>
+ Alias
+ </font>
+ zum Wächter ernennen
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ /rwa
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>
+ Alias
+ </font>
+ vom Wächter zum normalen Chatter degradieren
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ /sys
+ <font color=red>
+ Nachricht
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Systemnachricht schreiben. (Erscheint in allen bestehenden Räumen)
+ </div>
+ </td>
+ </tr>
+</table>
+<hr>
+<div>
+ Zur Erklärung: NC steht für "Normale Chatter", WÄ für "Wächter" und OW für "Oberwächter".
+ Obrige Befehle können nur von der/den jeweiligen Benutzergruppe/n oder höher ausgeführt werden.
+</div>
+</body>
+</html> \ No newline at end of file
diff --git a/0.2.4a/htdocs.pl b/0.2.4a/htdocs.pl
new file mode 100644
index 0000000..b52dd6b
--- /dev/null
+++ b/0.2.4a/htdocs.pl
@@ -0,0 +1,222 @@
+#!/usr/bin/perl -w
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+if ($var eq "help_html") {
+ &printfile("data/htdocs/help_html","Alle Chatbefehle");
+} elsif ($var eq "menu_html") {
+ &menu_html;
+} elsif ($var eq "werda_html") {
+ &werda_html;
+} elsif ($var eq "logs_html") {
+ &logs_html;
+} elsif ($var eq "view_sulogs_html") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ &start_html("Oberwächter-Logdateien");
+ print "<div><a href=\"push.pl?alias=$alias&tmp=$tmp&var=push_logs_html\">Push</a><hr>";
+ &printfile($tmp);
+ print "</div></body></html>";
+ }
+} elsif ($var eq "view_logs_html") {
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ &printfile($tmp,$tmp,"log");
+ }
+} elsif ($var eq "superuser_html") {
+ &superuser_html;
+} elsif ($var eq "bar_html") {
+ print
+ $q->start_html(-bgcolor=>"ffa500"),
+ $q->end_html;
+} else {
+ print
+ $q->start_html(-bgcolor=>"000000"),
+ $q->end_html;
+}
+
+sub menu_html {
+ if ($tmp eq "quit") {
+ print
+ $q->script( { -language=>"JavaScript" }, "window.open(\"index.pl?tmp=quit\",\"_top\")" );
+ sleep 1;
+ &remove_online($alias);
+ &secure_removeip($alias);
+ unlink("data/msgs/$alias");
+ }
+ &start_html("Menü","menu");
+print <<END;
+ <center>
+ <div>
+ [<a href="htdocs.pl?var=werda_html&alias=$alias&room=$room&col=$col&secol=$secol&&tmp=$tmp" target="werda">Wer ist da?</a>]
+ [<a href="main2.pl?var=edit_profile_html&alias=$alias" target="ProfilAendern">Profil ändern</a>]
+ [<a href="main2.pl?var=edit_options_html&alias=$alias" target="main">Optionen</a>]
+ [<a href="main2.pl?var=list_alias_html&alias=$alias" target="Benutzerliste">Benutzer</a>]
+ [<a href="htdocs.pl?var=help_html" target="Befehle">Befehle</a>]
+ [<a href="main2.pl?var=gb_html&alias=$alias" target="Board">Board</a>]
+ [<a href="htdocs.pl?var=superuser_html&alias=$alias" target="Hirachie">Superuser</a>]
+ [<a href="htdocs.pl?var=logs_html&alias=$alias" target="Logdateien">Logs</a>]
+ [<a href="push.pl?alias=$alias&room=$room&var=clear_screen" target="main">Weiterchatten</a>]
+ [<a href="htdocs.pl?var=menu_html&tmp=quit&alias=$alias">Verlassen</a>]
+ </div>
+ </center>
+</body>
+</html>
+END
+}
+
+
+sub werda_html { # Anzeige, wer eingelogt ist.
+ &start_html("Wer ist da?");
+ print <<END;
+<div>
+ $alias, schön daß Du hier bist :-)
+</div>
+<hr>
+<div>
+ Folgende Personen befinden sich im Chat:
+</div>
+<br>
+<div>
+END
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ my $room = $_;
+ &list_dir("data/online/rooms/$room",2);
+ local $nr = $#dir2-1;
+ print $q->b( $_ ),
+ "($nr)",
+ $q->br;
+ foreach(@dir2) {
+ if ($_ ne ".." && $_ ne ".") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_" }, "$_"), " ";
+ }
+ }
+ print $q->br, $q->br;
+ }
+ }
+ print
+ "</div>",
+ $q->end_html;
+}
+
+sub logs_html {
+ &secure_checkip($alias);
+ &start_html("Logdateien");
+ print <<END;
+<div>
+ Hier befinden sich alle Logdateien
+</div>
+<hr>
+END
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ if ($hirachie eq "ow") {
+ print $q->div( "Folgende Logdateien können nur von Oberwächtern (OW) gelesen werden" );
+ &printfile("data/htdocs/logs_html");
+ &list_dir("data/logs/ow");
+ my @sortedir = sort(@dir);
+ foreach(@sortedir) {
+ if (-f "data/logs/ow/$_") {
+ print $q->a( { -href=>"htdocs.pl?var=view_sulogs_html&alias=$alias&tmp=data/logs/ow/$_",
+ -target=>$_},
+ "$_" ).
+ " ",
+ }
+ }
+ print $q->hr;
+ }
+ print $q->div( "Folgende Logdateien können nur von Wächtern und Oberwächtern gelesen werden (Sortiert nach A-Z, a-z):" ),
+ $q->br;
+ &list_dir("data/logs");
+ my @sortedir = sort(@dir);
+ foreach(@sortedir) {
+ if (-f "data/logs/$_") {
+ print $q->a( { -href=>"htdocs.pl?alias=$alias&var=view_logs_html&tmp=data/logs/$_",
+ -target=>"_new" },
+ "$_" ),
+ " ";
+ }
+ }
+ if ($hirachie eq "wa") {
+ print $q->hr,
+ $q->div( "Oberwächter können zusätzlich die Systemlogdateien lesen. Du bist allerdings ein \"Wächter\" und ",
+ " bist nicht dazu berechtigt " ),
+ $q->br;
+ &printfile("data/htdocs/logs_html");
+ }
+ } else {
+ print $q->div( "Logdateien können nur von Oberwächtern (OW) und von Wächtern (WÄ) gelesen werden. Du bist jedoch ein ",
+ "\"Normaler Chatter\". Wächter können alles nachlesen, was öffentlich gechattet wurde. Oberwächter ",
+ "können folgende Systemlogdateien zusätzlich lesen:" ),
+ $q->hr;
+ &printfile("data/htdocs/logs_html");
+ }
+ print
+ $q->end_html;
+}
+
+sub superuser_html { # Zeigt an, wer Superuser ist
+ &start_html("Superuser");
+ print "<div>Hallo $alias. Du bist als ";
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ print
+ $q->b( "Oberwächter" ),
+ " (OW) eingetragen.</div>",
+ $q->hr;
+ } elsif ( $hirachie eq "wa") {
+ print
+ $q->b( "Wächter" ),
+ " (WÄ) eingetragen.</div>",
+ $q->hr;
+ } else {
+ print
+ $q->b( "normaler Chatter" ),
+ " (NC) eingetragen.</div>",
+ $q->hr;
+ }
+ my $nrow = $#ows+1;
+ print
+ "<div>",
+ $q->b( "OW" ),
+ "s ($nrow Stück)";
+ foreach(@ows) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+ my $nrwa = $#was+1;
+ print
+ "</div>",
+ $q->hr,
+ "<div>",
+ $q->b( "WÄ" ),
+ "s ($nrwa Stück)";
+ foreach(@was) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+print <<END;
+<hr>
+ Die jeweiligen Fähigkeiten der Oberwächter (OW) und der Wächter (WÄ) sind unter
+ "<a href="htdocs.pl?var=help_html">Chat-Befehle</a>"
+ dokumentiert.
+</div>
+</body>
+</html>
+END
+} \ No newline at end of file
diff --git a/0.2.4a/index.pl b/0.2.4a/index.pl
new file mode 100644
index 0000000..4f1e24d
--- /dev/null
+++ b/0.2.4a/index.pl
@@ -0,0 +1,354 @@
+#!/usr/bin/perl -w
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header; # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUFGERUFEN WERDEN?##
+#####################################
+if ($var eq "create_alias_html") {
+ &create_alias_html;
+} elsif ($var eq "create_alias") {
+ &create_alias;
+} elsif ($var eq "login_html") {
+ &login_html;
+} elsif ($alias eq "") {
+ &login_html;
+} else {
+ &checklogin;
+}
+
+sub login_html { # Erste Startseite
+local $counter = undef;
+&read_file("data/count");
+ $counter = <DATEI>;
+close DATEI;
+$counter++;
+&write_file_new("data/count");
+ print DATEI $counter;
+close DATEI;
+&start_html("Created by Paul C. Bütow 2k");
+print <<END;
+ <center>
+ <table width=400>
+ <tr>
+ <td>
+ <b>
+ <div>
+ $title - ( <a href="http://servers.yChat.de">yChat-Servers</a> )
+ <img src="$gfxpath/yChat.jpg">
+ </div>
+ </b>
+END
+ if ($tmp eq "true") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Wahrscheinlich existiert Dein Alias "$alias" nicht,
+ <br>
+ Du hast Dich verschrieben oder das Passwort ist falsch.
+ <br>
+ Versuch es erneuert !
+ </div>
+END
+ } elsif ($tmp eq "quit") {
+print <<END;
+ <div>
+ Du hast soeben den Chat verlassen.
+ <br>
+ Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ } elsif ($tmp eq "banned") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein Alias "$alias" wurde verbannt.
+ <br>
+ Z.z. kannst Du Dich leider nicht in den Chat einloggen.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($tmp eq "kick") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wurdest soeben aus dem Chat katapultiert!
+ <br>
+ Schlechtes Verhalten mag die Ursache hierfür sein.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($var eq "create_alias") {
+print "<div>Du hast sich soeben in die Datenbank eingetragen. Einfach auf \"Los Geht's\" klicken :-)</div>";
+ } else {
+print <<END;
+ <div>
+ Herzlich willkommen!
+ <br>
+ Einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ &log("system","\"first_http_ok\"");
+ }
+print <<END;
+ <hr>
+ <form action="index.pl">
+ <input type="hidden" name="tmp" value="true">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Alias:
+ <br>
+ <input name="alias" value="$alias">
+ </div>
+ </td>
+ <td>
+ <div>
+ Dein Passwort:
+ <br>
+ <input type="password" name="id" value="$id">
+ </div>
+ </td>
+ </tr>
+ </table>
+ <br>
+ <br>
+ <div>
+ Solltest Du noch keinen Nick besitzen, dann auf "Registrieren" klicken!
+ </div>
+ <br>
+ <table>
+ <tr>
+ <td>
+ <font color="ffffff">
+ <input type="submit" value="Los geht's!">
+ </font>
+ </form>
+ </td>
+ <td>
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias_html">
+ <font color="ffffff">
+ <input type="submit" value="Registrieren">
+ </font>
+ </form>
+ </td>
+ </tr>
+ </table>
+ <hr>
+ <div>
+ yChat befindet sich momentan noch in der Entwicklungsphase !
+ <br>
+ Fragen gehen an Paul Bütow (
+ <a href="mailto:paul\@buetow.oxg.de">
+ paul\@buetow.oxg.de
+ </a>
+ ) :-)
+ <br>
+ <br>
+ Diese Seite wurde schon $counter mal aufgerufen.
+ </td>
+ </tr>
+ </table>
+ </center>
+</body>
+</html>
+END
+}
+
+
+sub create_alias_html { # HTML-Form für Erstellung eines neuen Benutzers.
+my $reload = $_[0];
+&start_html("Registration");
+print <<END;
+ <center>
+ <table width=400>
+ <tr>
+ <td>
+END
+ if ($reload eq "alias_exists") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Der von Dir gewählte Benutzername "$alias" existiert in unserer Datenbank bereits. Bitte versuch es erneuert mit
+ einem anderen Benutzernamen !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "pw_wrong") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Deine beiden Passworteingaben stimmen nicht überein. Bitte geb das Passwort erneuert an um sicherzugehen, daß
+ kein falsches Passwort abgespeichert wird !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "alias_prohibited") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein gewählter Benutername "$alias" enthält illegale Zeichen. Bitte versuch einen anderen Benutzernamen!
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Hier kannst Du Dich registrieren. Bitte beachte, daß die Passworteingabefelder übereinstimmen!
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias">
+ <div>
+ Dein Alias:
+ <font color="ffa500">
+ (Muß angegeben werden)
+ </font>
+ <br>
+ <input name="alias" VALUE="$alias">
+ </div>
+ <br>
+ <div>
+ Dein gewünschtes Passwort:
+ <br>
+ <input type="password" name="id" value="$id">
+ </div>
+ <br>
+ <div>
+ Geb hier Dein Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp">
+ </div>
+ <br>
+ <font color=ffffff>
+ <input type="submit" value="Registrieren">
+ </font>
+ <br>
+ </form>
+ <hr>
+ <div>
+ Um den Chat zu betreten müssen die Daten nach der Registration auf der Startseite erneuert bestätigt werden !
+ </div>
+ </td>
+ </tr>
+ </table>
+</center>
+</body>
+</html>
+END
+}
+
+sub checklogin { # Überprüfen, ob die Login-Daten korrekt sind.
+ my $lognotexists = "true";
+ &list_dir("data/user/options");
+ for (my $i=0; $i<=$#dir; $i++) {
+ if ($dir[$i] eq $alias) {
+ &read_file("data/user/options/$alias");
+ @datei = <DATEI>;
+ close DATEI;
+ chomp($datei[0]);
+ if ($datei[0] eq $id) {
+ &read_file("data/ban"); # Überprüfen, ob Alias verbannt ist
+ @banned = <DATEI>;
+ close DATEI;
+ foreach(@banned) {
+ if ($_ eq "$alias\n") {
+ &log("system","\"login_alias_banned\"");
+ $tmp = "banned";
+ &login_html();
+ exit;
+ }
+ }
+ $col = $datei[1];
+ $secol = $datei[2];
+ &write_file_new("data/online/ident/$alias");
+ print DATEI $ENV{'REMOTE_ADDR'};
+ close DATEI;
+ &frameset_html;
+ exit;
+ } else {
+ &log("system","\"login_pw_wrong\"");
+ $lognotexists = "false";
+ }
+ }
+ }
+ if ($lognotexists eq "true") {
+ &log("system","\"login_alias_notexists\"");
+ }
+ &login_html; # Falls Login-Daten inkorrekt sind, zurück zur Startseite.
+}
+
+sub create_alias { # Erstellung eines neuen Benutzers.
+ if ($alias =~ /[\W]/ || $alias eq "") {
+ &log("system","\"reg_alias_prohibited\"");
+ &create_alias_html("alias_prohibited");;
+ exit;
+ } elsif ($id ne $tmp) {
+ &log("system","\"reg_pw_wrong\"");
+ &create_alias_html("pw_wrong");
+ exit;
+ }
+ &list_dir("data/user/options");
+ for (my $i=0; $i<=$#dir; $i++) {
+ if ($dir[$i] eq $alias) {
+ &log("system","\"reg_alias_exists\"");
+ &create_alias_html("alias_exists");
+ exit;
+ }
+ }
+ &write_file_new("data/user/options/$alias");
+ print DATEI $id."\n";
+ close DATEI;
+ &zeit;
+ &list_dir("data/user/options");
+ my $number = $#dir-1;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias [$number] hat sich soeben als neuer Benutzer registriert :-) ...</font></i>");
+ &log("system","\"reg_ok\"");
+ &login_html;
+}
+
+sub frameset_html {
+print <<END;
+<html>
+ <head>
+ <title>
+ $title - Created by Paul C. Bütow 2k
+ </title>
+ </head>
+<frameset border=0 frameborder=0 framespacing=0 rows="50,5,*,55">
+ <frame name="menu" src="htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol" scrolling="no">
+ <frame src="htdocs.pl?var=bar_html scrolling="no">
+ <frameset border=0 frameborder=0 framespacing=0 cols="150,*">
+ <frame name="online" src="online.pl?room=$room&alias=$alias">
+ <frame name="main" src="push.pl?room=$room&alias=$alias&var=clear_screen">
+ </frameset>
+ <frame name="input" src="main.pl?alias=$alias&var=input_html&room=$room&col=$col&secol=$secol&tmp=login" scrolling="no">
+</frameset>
+</html>
+END
+}
diff --git a/0.2.4a/logs_html b/0.2.4a/logs_html
new file mode 100644
index 0000000..1317062
--- /dev/null
+++ b/0.2.4a/logs_html
@@ -0,0 +1,391 @@
+<br>
+<div>
+ In der System-Logdatei tauchen folgende Ursachen auf:
+</div>
+<br>
+<table border=0 width=100% bgcolor=555555>
+ <tr>
+ <th bgcolor=666666>
+ <div>
+ Ursache
+ </div>
+ </th>
+ <th bgcolor=666666>
+ <div>
+ Beschreibung
+ </div>
+ </th>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ edit_profile_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzername hat sein Profil erfolgreich editiert.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ edit_pw_wrong
+ </div>
+ </td>
+ <td>
+ <div>
+ Beim Editieren der Chat-Optionen stimmten die beiden Passwortfelder nicht überein.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ edit_colors_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzername hat seine Chatfarben erfolgreich gewechselt.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+edit_options_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzername hat seine Chat-Optionen erfolgreich editiert.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+first_http_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Der angegebenen IP# wurde Startseite erfolgreich angezeigt. (Benutzername noch nicht vorhanden)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+login_alias_banned
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzer konnte sich nicht in das System einloggen, da sein benutzername verbannt war.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ login_alias_notexists
+ </div>
+ </td>
+ <td>
+ <div>
+ Beim Einlogversuch existierte der angegebene Benutzername nicht.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+login_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzer hat sich erfolgreich in das System eingelogt.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ login_pw_wrong
+ </div>
+ </td>
+ <td>
+ <div>
+ Beim Einloggen wurde das falsche PW eingegeben.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ logout_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzer hat sich erfolgreich (manuell) aus dem System ausgelogt. ("... verläßt den Chat ...")
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ logout_<font color=red>Alias</font>_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ User hat gemerkt, daß sich
+ <font color=red>
+ Alias
+ </font>
+ nicht mehr im Chat befindet. ("... hat den Chat verlassen ...").
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ow_ban_<font color=red>Alias</font>_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat
+ <font color=red>
+ Alias
+ </font>
+ verbannt
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ow_ban_<font color=red>Alias</font>_ow
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat ohne Erfolg versucht
+ <font color=red>
+ Alias
+ </font>
+ zu verbannen (
+ <font color=red>
+ Alias
+ </font>
+ war Oberwächter und konnte nicht verbannt werden )
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ow_rban_<font color=red>Alias</font>_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat
+ <font color=red>
+ Alias
+ </font>
+ "entbannt"
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ ow_wa_<font color=red>Alias</font>_exists
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat ohne Erfolg versucht
+ <font color=red>
+ Alias
+ </font>
+ zum Wächter zu ernennen. (
+ <font color=red>
+ Alias
+ </font>
+ war bereits als Wächter eingetragen.)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ ow_wa_<font color=red>Alias</font>_notexists
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat ohne Erfolg versucht
+ <font color=red>
+ Alias
+ </font>
+ zum Wächter zu ernennen. (
+ <font color=red>
+ Alias
+ </font>
+ existierte nicht in der Benutzerdatenbank.)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ ow_wa_<font color=red>Alias</font>_ow-exists
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat ohne Erfolg versucht
+ <font color=red>
+ Alias
+ </font>
+ zum Wächter zu ernennen. (
+ <font color=red>
+ Alias
+ </font>
+ war bereits als Oberwächter eingetragen. Oberwächter können nicht zeitgleich Wächter sein.)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ ow_wa_<font color=red>Alias</font>_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat
+ <font color=red>
+ Alias
+ </font>
+ erfolgreich zum Wächter ernannt.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ ow_rwa_<font color=red>Alias</font>_notexists
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter konnte
+ <font color=red>
+ Alias
+ </font>
+ nicht zum Wächter ernennen. (War nicht als WÄ registriert)..
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ ow_rwa_<font color=red>Alias</font>_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat
+ <font color=red>
+ Alias
+ </font>
+ vom Wächter zum normalen Chatter degradiert.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ reg_alias_exists
+ </div>
+ </td>
+ <td>
+ <div>
+ Bei der Registrierung war der Benutzername bereits vorhanden.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ reg_alias_prohibited
+ </div>
+ </td>
+ <td>
+ <div>
+ Bei der Registrierung war der angegebene Benutzername verboten (enthielt Sonderzeichen).
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ reg_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzername hat sich erfolgreich registriert.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ reg_pw_wrong
+ </div>
+ </td>
+ <td>
+ <div>
+ Bei der Registrierung wurde das PW falsch eingegeben.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ secure_ip
+ </div>
+ </td>
+ <td>
+ <div>
+ Unbefugter Zugriff der angegebenen IP# auf den angegebenen Benutzernamen.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ sys_msg_<font color=red>Raum</font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Oberwächter schreibt eine Systemnachricht aus
+ <font color=red>
+ Raum
+ </font>.
+ </div>
+ </td>
+ </tr>
+</table>
+<br> \ No newline at end of file
diff --git a/0.2.4a/main.pl b/0.2.4a/main.pl
new file mode 100644
index 0000000..36a759a
--- /dev/null
+++ b/0.2.4a/main.pl
@@ -0,0 +1,498 @@
+#!/usr/bin/perl -w
+
+use CGI; # CGI-Modul laden
+
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+if ($var eq "input_html") {
+ &input_html;
+} elsif ($var eq "post_msg") {
+ &post_msg;
+} elsif ($var eq "change_room") {
+ &change_room;
+} else {
+ &error("Parameter fehlt");
+}
+
+sub input_html { # Eingabemaske für den Chat.
+ my ($reload,$action,$whisper,$lastmsg) = @_;
+ $action = $q->param('action') if ($action eq "");
+ if ($tmp eq "away") {
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias meldet sich zurück ... </font></i>");
+ } elsif ($tmp eq "login") {
+ &remove_rooms;
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat den Chat betreten ...</font></i>");
+ &log("logins","\"login_ok\"");
+ }
+ if ($action ne "" && $action ne "whisper" && $action ne "away") {
+ print "<html><head><script language=\"JavaScript\">";
+ if ($action eq "change_room") {
+ print "open(\"online.pl?alias=$alias&room=$room\",\"online\");";
+ print "open(\"main.pl?var=input_html&alias=$alias&room=$room&col=$col&secol=$secol\",\"input\");";
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol\",\"menu\");";
+ } elsif ($action eq "change_colors") {
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol\",\"menu\");";
+ }
+ print "</script></head><body background=\"$gfxpath/unten.gif\" bgcolor=ffa500>";
+ } else {
+ print "<html><body background=\"$gfxpath/unten.gif\" bgcolor=ffa500>";
+ }
+ print "<center><form action=\"main.pl\">";
+ print "<input type=\"hidden\" name=\"tmp\" value=\"away\">" if ($action eq "away");
+ print <<END;
+ <input type="hidden" name="var" value="post_msg">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="room" value="$room">
+ <input type="hidden" name="col" value="$col">
+ <input type="hidden" name="secol" value="$secol">
+ <input type="hidden" name="id" value="$whisper">
+ <input type="hidden" name="lastmsg" value="$lastmsg">
+ <input size="70" name="msg">
+ <input type="submit" value="Texten"></form></center>
+END
+if ($reload eq "true") {
+print <<END;
+ <script language="JavaScript">
+ <!--
+ document.forms[0].msg.focus();
+ //-->
+ </script>
+END
+}
+print
+ $q->end_html;
+}
+
+sub post_msg { # Wird aufgerufen, wenn aus input_html eine Eingabe gepostet wurde.
+ $| = 1; # Cache von Perl ausschalten
+ $msg =~ s#<#&lt\;#g; # HTML-Tags deaktivieren
+ $msg =~ s#kilahu#yChat#g;
+ $msg =~ s#ooperle#per!#g;
+ if (substr($msg,0,1) ne "/") { # Überprüfen, ob Befehl oder Nachricht
+ $msg = "<b><font color=$col>$alias: <font color=$secol>".$msg."</font></font></b>";
+ $msg =~ s#"#'#g; # " in ' umtauschen für den befehl "//"
+ &input_html("true","",$id,$msg); # -> Reload=true, Action=none, Whisper=$id
+ &secure_checkip($alias,1);
+ &post($msg);
+ } else {
+ &secure_checkip($alias,2);
+ &cmd($msg);
+ }
+}
+
+sub cmd { # Alle Chatbefehle, die über input_html eingegeben werden können.
+ $_[0] = $_[0]." ";
+ $_[0] = substr($_[0], 1, length($_[0])-1);
+ my @cmd = split(/ /, $_[0]);
+ my $cmd = substr($_[0],0 , index($_[0], " "));
+ my ($reload,$action,$whisper) = ("true","",$id);
+#############>- NORMALE CHATBEFEHLE ( Alphabetisch sortiert ) -<
+#############>- DER LETZTEN ZUGEFLÜSTERTEN PERSON NOCHEINMAL FLÜSTERN -<
+ if ($cmd eq "/") {
+ &post($q->param('lastmsg'));
+#############>- INFORMATIONEN ÜBER DAS SYSTEM AUSGEBEN -<
+ } elsif ($cmd eq "about") {
+ &post_prv("$alias","<font size=2 color=ffffff>Aktuelle Version ist $title und wurde am $datum aktuallisiert. Created by Paul C. Bütow 2k.</font>");
+#############>- ABMELDEN MIT 'AWAY-NACHRICHT' -<
+ } elsif ($cmd eq "away") {
+ if ($tmp eq "away") { # Falls 2 mal hintereinander /away eingegeben wurde
+ $tmp = "";
+ }
+ for ($i=1; $i <= $#cmd; $i++) {
+ $tmp = $tmp." ".$cmd[$i];
+ }
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias meldet sich ab (<font color=red>$tmp</font> ) ...</i></font>");
+ $action = "away";
+#############>- EIGENEN CHATBILDSCHIRM LÖSCHEN -<
+ } elsif ($cmd eq "clear") {
+ &post_prv("$alias","<script language=\"JavaScript\">window.open(\"push.pl?alias=$alias&room=$room&var=clear_screen\",\"main\");</script>");
+#############>- FARBEN WECHSELN -<
+ } elsif ($cmd eq "col") {
+ $col = $cmd[1];
+ my $tmpsecol = $cmd[2];
+ if ($tmpsecol eq "") {
+ $secol = $col
+ } else {
+ $secol = $tmpsecol;
+ }
+ &read_file("data/user/options/$alias");
+ my @pro = <DATEI>;
+ close DATEI;
+ &write_file_new("data/user/options/$alias");
+ print DATEI $pro[0]."".$col."\n".$secol;
+ close DATEI;
+ &log("system","\"edit_colors_ok\"");
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat die Farbe gewechselt ...</font></i>");
+ $action = "change_colors";
+#############>- AKTUELLES DATUM UND URZEIT AUSGEBEN -<
+ } elsif ($cmd eq "date") {
+ &zeit;
+ &post_prv("$alias","<font size=2 color=ffffff>Heute ist der $day.$month. Jahr $year. Es ist genau $hours:$min Uhr und $sec Sekunden.</font>");
+#############>- EINEN NEUEN RAUM ERSTELLEN BZW. IN EINEN BESTEHENDEN RAUM WECHSELN -<
+ } elsif ($cmd eq "j") {
+ &change_room("j",$cmd[1],$room);
+ $action = "change_room";
+#############>- HANDELN -<
+ } elsif ($cmd eq "me" || $cmd eq "m") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $me_msg = $me_msg." ".$cmd[$i];
+ }
+ if ($cmd eq "m") {
+ &post("<i><font color=$col>$alias <font color=$secol>$me_msg</font></font></i>");
+ } else {
+ &post("<i><font color=$col>$alias $me_msg</font></i>");
+ }
+#############>- FLÜSTERN ( Auch mit '/' ) -<
+ } elsif ($cmd eq "msg" || $cmd eq "") {
+ my ($alias2post,$msg2post) = ($cmd[1],"");
+ if ($cmd eq "msg") {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ } else {
+ $alias2post = $id;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ }
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ if ($_ eq $alias2post) {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "<i><font color=$col>$alias flüstert <font color=ffffff>=></font><font color=$secol>$msg2post</font></font></i><br>\n";
+ close DATEI;
+ &write_file("data/msgs/$alias");
+ print DATEI "<i><font color=$col>Zu $alias2post geflüstert <font color=ffffff>=></font><font color=$secol>$msg2post</font></font></i><br>\n";
+ close DATEI;
+ &input_html($reload,"",$alias2post);
+ exit;
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2post <font color=ffffff>ist momentan nicht anwesend !</font></font>");
+#############>- DAS SYSTEM VERLASSEN -<
+ } elsif ($cmd eq "q") {
+ &post_prv("$alias","<script language=\"JavaScript\">window.open(\"index.pl?tmp=quit\",\"_top\");</script>");
+ sleep 1;
+ &remove_online($alias,$room);
+ &secure_removeip($alias);
+ unlink("data/msgs/$alias");
+ exit;
+#############>- SCHREIEN -<
+ } elsif ($cmd eq "s") {
+ my ($msg2scream,$msg2post);
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2scream = $msg2scream." ".$cmd[$i];
+ }
+ $msg2post = "\U$msg2scream";
+ &post("<font color=$col><i>$alias schreit:</i> <b><font color=$secol>".$msg2post."</font></font></b>");
+#############>- ANZEIGEN WER SICH IM AKTUELLEN RAUM BEFINDET -<
+} elsif ($cmd eq "w") {
+ &list_dir("data/online/rooms/$room");
+ my ($is,$nr) = ("t",0);
+ foreach(@dir) {
+ if (-f "data/online/rooms/$room/$_") {
+ $personen = $personen." ".$_;
+ $nr++;
+ }
+ }
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "n";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>$nr Person$nrs befinde$is sich im aktuellen Raum (\"$room\"): <font color=ffa500>$personen</font></font>");
+#############>- ANZEIGEN WER SICH IM SYSTEM BEFINDET -<
+ } elsif ($cmd eq "wc" || $cmd eq "wc/") {
+ $raum = $cmd[1];
+ if ($raum eq "" && $cmd eq "wc") {
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/users/$_");
+ }
+ my $nr = ($#dir-1);
+ my ($nrs,$is) = ("","ist");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "sind";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>$nr Person$nrs $is insgesamt eingelogt: <font color=ffa500>$personen</font></font>");
+ } elsif ($raum eq "" && $cmd eq "wc/") {
+ my $msg2post;
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ &list_dir("data/online/rooms/$_",2);
+ my $nr = $#dir2-1;
+ $msg2post = $msg2post."<tr><td><b><font size=2 color=ffffff>$_ ($nr)</font></b></td><td><font size=2 color=ffffff>";
+ foreach $chatter (@dir2) {
+ if (-f "data/online/rooms/$_/$chatter") {
+ $msg2post = $msg2post."$chatter ";
+ }
+ }
+ print "</font></td>";
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>Folgende Räume sind offen:</font><table>$msg2post</table>");
+ } elsif ($raum ne "") {
+ my $personen;
+ &list_dir("data/online/rooms/$raum");
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/rooms/$raum/$_");
+ }
+ my ($nr,$is) = (($#dir-1),"t");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "n";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff> $nr Person$nrs befinde$is sich im Raum \"$raum\": <font color=ffa500>$personen</font></font>");
+ }
+#############>- ANZEIGEN IN WELCHEN RAUM SICH JMD. BEFINDET BZW. JMD IN EINEN RAUM FOLGEN -<
+ } elsif ($cmd eq "wj" || $cmd eq "ju") {
+ my $alias2search = $cmd[1];
+ &list_dir("data/online/rooms");
+ foreach $raum (@dir) {
+ &list_dir("data/online/rooms/$raum",2) if (-d "data/online/rooms/$raum");
+ foreach $user (@dir2) {
+ if (-f "data/online/rooms/$raum/$user") {
+ if ($user eq $alias2search) {
+ if ($cmd eq "wj") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2search <font color=ffffff>befindet sich im Raum \"$raum\" !</font></font>");
+ } else {
+ $action = "change_room";
+ &change_room("ju",$raum,$room,$alias2search);
+ }
+ &input_html($reload,$action,$whisper);
+ exit;
+ }
+ }
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2search <font color=ffffff> ist nicht eingelogt !</font></font>");
+#############>- SUPERUSER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- ALIAS VERBANNEN BZW. ENTBANNEN -<
+ } elsif ($cmd eq "ban" || $cmd eq "rban") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ my ($alias2handle,$registriert) = $cmd[1];
+ &list_dir("data/user/options");
+ foreach(@dir) {
+ $registriert = "true" if ($_ eq $alias2handle);
+ }
+ if ($registriert ne "true") {
+ if ($cmd eq "ban") {
+ if ($alias2handle ne "") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> existiert nicht in der Benutzerdatenbank und kann so nich verbannt werden !</font></font>");
+ } else {
+ &read_file("data/ban");
+ my @banned = <DATEI>;
+ my ($benutzer);
+ my $nr = $#banned+1;
+ close DATEI;
+ foreach(@banned) {
+ $benutzer = $benutzer." ".$_;
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>Folgende Benutzer sind verbannt [$nr]: <font color=ffa500>$benutzer</font></font>");
+ }
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> existiert nicht in der Benutzerdatenbank und kann so nicht \"entbannt\" werden !</font></font>");
+ }
+ &input_html("true");
+ exit;
+ }
+ &read_file("data/ban");
+ my @banlist = <DATEI>;
+ close DATEI;
+ foreach(@banlist) {
+ if ($_ eq "$alias2handle\n") {
+ if ($cmd eq "ban") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> ist bereits verbannt worden !</font></font>");
+ } else {
+ my $banned = "false";
+ foreach(@banlist) {
+ $banned = "true" if ($_ eq "$alias2handle\n");
+ }
+ if ($banned eq "true") {
+ my @newbanlist;
+ foreach(@banlist) {
+ push @newbanlist,$_ if ($_ ne "$alias2handle\n");
+ }
+ &write_file_new("data/ban");
+ print DATEI @newbanlist;
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> wurde soeben \"entbannt\" !</font></font>");
+ &log("system","\"ow_rban_$alias2handle_ok\"");
+ }
+ }
+ &input_html("true");
+ exit;
+ }
+ }
+ if ($cmd eq "ban") {
+ &hirachie($alias2handle);
+ if ($hirachie ne "ow") {
+ &write_file("data/ban");
+ print DATEI "$alias2handle\n";
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> wurde soeben verbannt und kann sich nun nichtmehr in den Chat einloggen !</font>");
+ &log("system","\"ow_ban_".$alias2handle."_ok\"");
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> ist ein Oberwächter und kann deshalb nicht verbannt werden !</font></font>");
+ &log("system","\"ow_ban_".$alias2handle."_ow\"");
+ }
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> konnte nicht \"entbannt\" werden, da <font color=ffa500>$alias2handle</font> garnicht verbannt war !</font></font>");
+ }
+ }
+#############>- IP # VON ALIAS ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "ip") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ my $alias2prove = $cmd[1];
+ &list_dir("data/online/ident");
+ foreach(@dir) {
+ if ($_ eq $alias2prove) {
+ &read_file("data/online/ident/$_");
+ local $ipnr = <DATEI>;
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$_ <font color=ffffff>hat die IP-Nummer $ipnr !</font></font>");
+ }
+ }
+ }
+#############>- ALIAS AUS DEM CHAT KATAPULTIEREN -<
+ } elsif ($cmd eq "k") {
+ &hirachie($alias);
+ if ($hirachie eq "wa" || $hirachie eq "ow") {
+ my $alias2kick = $cmd[1];
+ &list_dir("data/online/rooms");
+ foreach $raum (@dir) {
+ &list_dir("data/online/rooms/$raum",2);
+ foreach $chatter (@dir2) {
+ if ($chatter eq $alias2kick) {
+ &hirachie($alias2kick);
+ if ($hirachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist Oberwächter und kann nicht \"gekickt\" werden !</font></font>");
+ &log("system","wa_k_$alias2kick_ow"); #!!
+ } elsif ($hirachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist Wächter und kann nicht \"gekickt\" werden !</font></font>");
+ &log("system","wa_k_$alias2kick_ow"); #!!
+ } else {
+ &post_prv("$alias2kick","<script language=\"JavaScript\">window.open(\"index.pl?tmp=kick\",\"_top\");</script>");
+ &zeit;
+ $_ = undef if ($room eq $_);
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias katapultiert \"$alias2kick\" aus dem Chat ...</font></i>",$_);
+ &log("system","wa_k_$alias2kick"); #!!
+ &remove_online($alias2kick,$_,"kick");
+ &secure_removeip($alias2kick);
+ }
+ &input_html("true");
+ exit;
+ }
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist nicht anwesend und kann nicht \"gekickt\" werden !</font></font>");
+ }
+#############>- SYSTEMNACHRICHT IN ALLE BESTEHENDEN RÄUME POSTEN -<
+ } elsif ($cmd eq "sys") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $sys_msg = $sys_msg." ".$cmd[$i];
+ }
+ &zeit;
+ &post_all("<i><font color=ffffff>($hours:$min:$sec)</font></i> <b><font size=2 color=red>SYSTEMNACHRICHT</font></b><i><font color=ffffff>: $sys_msg ...</font></i>");
+ &log("system","\"sys_msg_$room\"");
+ }
+#############>- ALIAS ZUM WÄCHTER ERNNENNEN BZW. ZUM NORMALEN CHATTER DEGRADIEREN -<
+ } elsif ($cmd eq "wa" || $cmd eq "rwa") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ &zeit;
+ my $alias2handle = $cmd[1];
+ if ($cmd eq "wa") {
+ my $anerkennen = "false";
+ &list_dir("data/user/options");
+ foreach(@dir) {
+ if ($_ eq $alias2handle) {
+ $anerkennen = "true";
+ }
+ }
+ if ($anerkennen eq "true") {
+ &hirachie($alias2handle);
+ if ($hirachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff>ist bereits als Wächter eingetragen. Eine erneuerte Eintragung ist nicht möglich!</font></font>");
+ &log("system","\"oh_wa_".$alias2handle."_exists\"");
+ } elsif ($hirachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff>ist schon als Oberwächter eingetragen. Oberwächter können nicht gleichzeitig Wächter sein!</font></font>");
+ &log("system","\"oh_wa_".$alias2handle."_oh-exists\"");
+ } else {
+ &write_file("data/wa");
+ print DATEI $alias2handle."\n";
+ close DATEI;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font><font color=ffa500> $alias ernennt \"$alias2handle\" zum Wächter ...</font></i>");
+ &log("system","\"oh_wa_".$alias2handle."_ok\"");
+ }
+ } else {
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2handle <font color=ffffff>kann nicht zum Wächter ernannt werden da Benutzername nicht existiert!</font></font>");
+ &log("system","\"oh_wa_".$alias2handle."_notexists\"");
+ }
+ } elsif ($cmd eq "rwa") {
+ &read_file("data/wa");
+ my @wafile = <DATEI>;
+ close DATEI;
+ my $aberkennen = "false";
+ foreach(@wafile) {
+ if ($_ ne "$alias2handle\n") {
+ push @newafile,$_;
+ } else {
+ $aberkennen = "true";
+ }
+ }
+ &write_file_new("data/wa");
+ print DATEI @newafile;
+ close DATEI;
+ if ($aberkennen eq "true") {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat \"$alias2handle\" vom Wächter zum normalen Chatter degradiert ...</font></i>");
+ &log("system","\"oh_rwa_".$alias2handle."_ok\"");
+ } else {
+ &post("<font size=2 color=ffa500>$alias2handle <font color=ffffff>konnte der Wächterstatus nicht aberkannt werden da Benutzer kein Wächter ist!</font></font>");
+ &log("system","\"oh_rwa_".$alias2handle."_notexists\"");
+ }
+ }
+ }
+#############>- ENDE DER CHATBEFEHLE -<
+}
+&input_html($reload,$action,$whisper);
+}
+
+sub change_room { # Den Chat-Raum wechseln
+ my ($method,$newroom,$oldroom,$alias2follow) = @_;
+ $room = $oldroom;
+ &secure_checkip($alias); # IP Nummer überprüfen
+ &zeit; # Zeit 'erneuern'
+ if ($method eq "j") {
+ unlink("data/online/rooms/$oldroom/$alias");
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias wechselt in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias kommt aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ &post_prv("$alias","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>Du wechselst aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ } elsif ($method eq "ju") {
+ unlink("data/online/rooms/$oldroom/$alias");
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias folgt \"$alias2follow\" in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias kommt aus dem Raum \"$oldroom\" und folgt \"$alias2follow\" herein nach \"$newroom\" ...</font></i>");
+ &post_prv("$alias","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>Du folgst \"$alias2follow\" aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ }
+ &rm_rooms;
+}
+
diff --git a/0.2.4a/main2.pl b/0.2.4a/main2.pl
new file mode 100644
index 0000000..cdc6886
--- /dev/null
+++ b/0.2.4a/main2.pl
@@ -0,0 +1,513 @@
+#!/usr/bin/perl -w
+
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+
+if ($var eq "list_alias_html") {
+ &list_alias_html;
+} elsif ($var eq "alias_html") {
+ &alias_html;
+} elsif ($var eq "edit_profile_html") {
+ &edit_html("edit_profile_html");
+} elsif ($var eq "edit_options_html") {
+ &edit_html("edit_options_html");
+} elsif ($var eq "gb_html") {
+ &gb_html;
+} elsif ($var eq "post_gb") {
+ &post_gb;
+} elsif ($var eq "rm_gb_alias") {
+ &rm_gb;
+} elsif ($var eq "edit_profile") {
+ &edit("edit_profile");
+} elsif ($var eq "edit_options") {
+ &edit("edit_options");
+} else {
+ &error("Parameter fehlt");
+}
+
+###########################
+##HAUPTTEIL DIESER DATEI:##
+###########################
+
+sub gb_html { # Das Benutzerboard/Gästebuch.
+ my $message = $_[0];
+ &start_html("Benutzerboard");
+if ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </i>
+ einen Text und poste
+ <u>dann</u>
+ !
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Vielen Dank für Deinen Beitrag. Wenn Du willst, kannst Du jetzt gleich noch einen Eintrag posten ...
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Falls Du Anregungen oder Verbesserungsvorschläge für die Community hast, dann poste doch einen kleinen Eintrag :-)
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmp" value="guestbook">
+ <input type="hidden" name="id" value="y">
+ <input size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+ if (-e "data/guestbook") {
+ open (DATEI,"<data/guestbook") || &error("Konnte dat/guestbook nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ print
+ $q->div(@datei);
+ }
+ print
+ $q->end_html;
+}
+
+
+sub post_gb { # Wenn etwas in ein Gästebuch eingetragen wird
+ &secure_checkip($alias);
+ &zeit;
+ if ($msg eq "") {
+ if ($id eq "y") { # Überprüfen, ob Benutzerboard- oder Privatgästebuch
+ &gb_html("post_empty");
+ } else {
+ &alias_html("post_empty");
+ }
+ exit;
+ }
+ $msg =~ s#<#&lt\;#g;
+ my $tmpath = "";
+ if ($id eq "y") {
+ $tmpath = "data/guestbook";
+ } else {
+ $tmpath = "data/user/gbooks/$tmp";
+ }
+ if (-e "$tmpath") {
+ &read_file("$tmpath");
+ my @datei = <DATEI>;
+ close DATEI;
+ pop(@datei) if ($#datei > 99);
+ my @newdatei = "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ @newdatei = ("@newdatei", "@datei");
+ &write_file_new("$tmpath");
+ print DATEI @newdatei;
+ close DATEI;
+ } else {
+ &write_file_new("$tmpath");
+ print DATEI "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ close DATEI;
+ }
+ if ($id eq "y") {
+ &gb_html("post_ok");
+ exit;
+ } else {
+ post_prv("$tmp","<font size=2 color=ffffff><a href=\"main2.pl?alias=$alias&var=alias_html&tmp=$alias\" target=\"_new\">$alias</a> hat soeben einen Pin in <a href=\"main2.pl?alias=$alias&var=alias_html&tmp=$tmp\" target=\"_new\">Dein Profil</a> gehängt ... </font>");
+ &alias_html;
+ exit;
+ }
+}
+
+sub rm_gb { # Gästebucheintrag entfernen
+ &secure_checkip($alias);
+ $tmp = $alias;
+ &read_file("data/user/gbooks/$alias");
+ my @gbfile = <DATEI>;
+ close DATEI;
+ my @newgbfile = ();
+ for($i=0; $i <= $#gbfile; $i++) {
+ push(@newgbfile,$gbfile[$i]) if ($i != $id);
+ }
+ &write_file_new("data/user/gbooks/$alias");
+ print DATEI @newgbfile;
+ close DATEI;
+ &alias_html("rm_ok");
+}
+
+sub list_alias_html { # Liste aller Benutzer
+ &start_html("Alle Benutzer");
+ &list_dir("data/user/options");
+ my @liste = sort(@dir);
+ my $nr = $#dir-1;
+print <<END;
+ <div>
+ Es sind z.Z. genau $nr Benutzernamen in der Datenbank vorhanden! (Sortiert nach #, A-Z, a-z)
+ </div>
+ <hr>
+ <div>
+END
+ foreach(@liste) {
+ if (-f "data/user/options/$_") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_" },
+ "$_"),
+ " ";
+ }
+ }
+print <<END;
+ </div>
+</body>
+</html>
+END
+}
+
+sub alias_html { # Anzeigen eines Benutzerprofils
+ my $message = $_[0];
+ local $counter = undef;
+ &read_file("data/user/counts/$tmp");
+ $counter = <DATEI>;
+ close DATEI;
+ $counter++;
+ &write_file_new("data/user/counts/$tmp");
+ print DATEI $counter;
+ close DATEI;
+ &start_html($tmp);
+print <<END;
+<div>
+ <a href="htdocs.pl?var=werda_html&alias=$alias">Hier</a>
+ gehts zur Gesamtübersicht !
+</div>
+<hr>
+END
+if ($message eq "rm_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Der von Dir gewählte Eintrag wurde erfolgreich gelöscht.
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </u>
+ einen Text und poste
+ <u>dann</u>
+ !
+ <hr>
+END
+}
+ &read_file("data/user/profiles/$tmp");
+ @data = <DATEI>;
+ close DATEI;
+print <<END;
+ <div>
+ Dieses Profil wurde insgesamt schon $counter mal aufgerufen !
+ <br>
+ <br>
+ Alias: $tmp
+ <br>
+ <br>
+ Nachname: $data[0]
+ <br>
+ <br>
+ Vorname: $data[1]
+ <br>
+ <br>
+ Alter: $data[2]
+ <br>
+ <br>
+ Wohnort: $data[3]
+ <br>
+ <br>
+ E-Mail:
+ <a href="mailto:$data[4]">$data[4]</a>
+ <br>
+ <br>
+ ICQ-Nummer: $data[5]
+ <br>
+ <br>
+ Homepage:
+ <a href="$data[6]" target="_new">$data[6]</a>
+ <br>
+ <br>
+ Weiteres:
+ <br>
+ $data[7]
+ <hr>
+ Hier kannst Du $tmp eine Nachricht hinterlassen!
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input type="text" size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+if (-e "data/user/gbooks/$tmp") {
+ open (DATEI,"<data/user/gbooks/$tmp") || &error("Konnte data/user/gbooks/$tmp nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ if ($alias ne $tmp) {
+ print @datei;
+ } else {
+print <<END;
+ <table>
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="rm_gb_alias">
+ <input type="hidden" name="alias" value="$alias">
+END
+for($i=0; $i <= $#datei; $i++) {
+print <<END;
+ <tr>
+ <td>
+ <input type="radio" name="id" value="$i">
+ </td>
+ <td>
+ <div class=q>
+ $datei[$i]
+ </div>
+ </td>
+ </tr>
+END
+}
+print <<END;
+ </table>
+ <table>
+ <tr>
+ <td>
+ <font color=ffffff>
+ <input type="submit" value="Makierten Eintrag löschen">
+ </font>
+ </td>
+ <td>
+ <font color=ffffff>
+ <input type="reset" value="Makierung rückgängig machen">
+ </font>
+ </td>
+ </tr>
+ </table>
+ </form>
+END
+}
+}
+ print
+ $q->end_html;
+}
+
+sub edit_html { # Chat-Optionen / Benutzerprofil editieren
+ my ($method,$message) = @_;
+ &secure_checkip($alias);
+ &start_html("Benutzerprofil ändern");
+ if ($method eq "edit_options_html") {
+ &read_file("data/user/options/$alias");
+ } elsif ($method eq "edit_profile_html") {
+ &read_file("data/user/profiles/$alias");
+ }
+ @data = <DATEI>;
+ close DATEI;
+ if ($method eq "edit_options_html") {
+ chomp($data[0]);
+ if ($message eq "edit_options_ok") {
+print <<END;
+<script language="JavaScript">
+ open("main.pl?var=input_html&alias=$alias&room=$room&col=$col&secol=$secol","input");
+ open("htdocs.pl?var=menu_html&alias=$alias&room=$room&col=$col&secol=$secol","menu");
+</script>
+<div class=b>
+ Hinweis:
+</div>
+<div>
+ Du hast soeben Deine Chat-Optionen erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren. Um
+ weiterzuchatten einfach auf <a href="push.pl?alias=$alias&room=$room">Weiterchatten</a> klicken.
+</div>
+<hr>
+END
+ } elsif ($message eq "edit_pw_wrong") {
+print <<END;
+<div class=b>
+ ACHTUNG!
+</div>
+<div>
+ Du hast soeben versucht, dein Passwort zu ändern. Jedoch stimmte die Erste Eingabe nicht mit der Zweiten überein.
+ Bitte versuch es erneuert ...
+</div>
+<hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Deine Chat-Optionen editieren!" ),
+ $q->hr;
+ }
+print <<END;
+<form action="main2.pl">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="var" value="edit_options">
+ <div>
+ Dein Passwort
+ <font color=ffa500>
+ (Gut merken !!)
+ </font>
+ <br>
+ <input type="password" name="id" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ Geb hier das Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ "Deine Farbe (Farbe Deines Nicks, Angabe in Hexadezimal):
+ <br>
+ <input type="text" name="col" value="$data[1]">
+ </div>
+ <br>
+ <div>
+ Deine zweite Farbe (Farbe Deiner Nachrichten, Angabe in Hexadezimal):
+ <br>
+ <input type="text" name="secol" value="$data[2]">
+ </div>
+ <br>
+END
+ } elsif ($method eq "edit_profile_html") {
+ if ($message eq "edit_profile_ok") {
+print <<END;
+ <div class=b>
+ Hinweis:
+ </div>
+ <div>
+ Du hast soeben Dein Profil erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren:
+ <hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Dein Profil editieren!" ),
+ $q->hr;
+ }
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="var" value="edit_profile">
+ <div>
+ Dein Nachname:
+ <br>
+ <input name="nachname" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ Dein Vorname:
+ <br>
+ <input name="vorname" value="$data[1]">
+ </div>
+ <br>
+ <div>
+ Dein Alter:
+ <br>
+ <input name="alter" value="$data[2]">
+ </div>
+ <br>
+ <div>
+ Dein Wohnort:
+ <br>
+ <input name="wohnort" value="$data[3]">
+ </div>
+ <br>
+ <div>
+ Deine E-Mail Adresse:
+ <br>
+ <input name="email" value="$data[4]">
+ </div>
+ <br>
+ <div>
+ Deine ICQ-Nummer:
+ <br>
+ <input name="icq" value="$data[5]">
+ </div>
+ <br>
+ <div>
+ Deine Homepage:
+ <br>
+ <input name="homepage" value="$data[6]">
+ </div>
+ <br>
+ <div>
+ Weiteres:
+ <br>
+ <textarea rows="5" cols="40"name="weiteres" wrap="virtual">$data[7]</textarea>
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <font color=ffffff>
+ <input type="submit" value="Daten ändern ...">
+ </font>
+ </form>
+</body>
+</html>
+END
+}
+
+
+sub edit { # Benutzerprofil od. Chat-Optionen abspeichern
+ &secure_checkip($alias);
+ my $method = $_[0];
+ if ($method eq "edit_profile") {
+ &write_file_new("data/user/profiles/$alias");
+ print DATEI $q->param('nachname')."\n".$q->param('vorname')."\n".$q->param('alter')."\n".$q->param('wohnort')."\n".$q->param('email')."\n".$q->param('icq')."\n".$q->param('homepage')."\n".$q->param('weiteres');
+ close DATEI;
+ &log("system","\"edit_profile_ok\"");
+ &edit_html("edit_profile_html","edit_profile_ok");
+ } elsif ($method eq "edit_options") {
+ if ($id ne $tmp) {
+ &log("system","\"edit_pw_wrong\"");
+ &edit_html("edit_options_html","edit_pw_wrong");
+ exit;
+ }
+ &secure_checkip($alias);
+ &write_file_new("data/user/options/$alias");
+ print DATEI $id."\n".$col."\n".$secol;
+ close DATEI;
+ &log("system","\"edit_options_ok\"");
+ &edit_html("edit_options_html","edit_options_ok");
+ }
+}
diff --git a/0.2.4a/online.pl b/0.2.4a/online.pl
new file mode 100644
index 0000000..2e8bf8d
--- /dev/null
+++ b/0.2.4a/online.pl
@@ -0,0 +1,52 @@
+#!/usr/bin/perl -w
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+&secure_checkip($alias);
+&start_html("Online","online");
+&online($alias,$room);
+&list_dir("data/online/rooms/".$room);
+print
+ $q->div( "$room:" ),
+ "<font size=1 color=ffffef face=arial>";
+ foreach $online (@dir) {
+ if (-f "data/online/rooms/$room/$online") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$online",
+ -target=>"$online" }, "$online"), $q->br;
+ }
+ }
+print
+ "</font>",
+ $q->end_html;
+
+sub online { # Benutzer in die Onlineliste hinzufügen bzw. erneuern
+ my ($alias,$room) = @_;
+ &write_file_new("data/online/users/$alias");
+ print DATEI time;
+ close DATEI;
+ if (-e "data/online/rooms/$room") {
+ } else {
+ mkdir "data/online/rooms/$room", 0777;
+ }
+ &write_file_new("data/online/rooms/$room/$alias");
+ print DATEI time;
+ close DATEI;
+ &read_file("data/online/prove"); # Räume und Chatter auf Existenz überprüfen
+ my $provetime = <DATEI>;
+ close DATEI;
+ if ($provetime < (time - 30)) {
+ &write_file_new("data/online/prove");
+ print DATEI time;
+ close DATEI;
+ &rm_alias("data/online/users");
+ &rm_rooms;
+ }
+}
+
diff --git a/0.2.4a/push.pl b/0.2.4a/push.pl
new file mode 100644
index 0000000..af96017
--- /dev/null
+++ b/0.2.4a/push.pl
@@ -0,0 +1,96 @@
+#!/usr/bin/perl -w
+use CGI;
+#use CGI qw/:push -nph/;
+CGI->compile(':all');
+$q = new CGI;
+
+
+print
+ $q->header; # HTML-Header erzeugen
+
+require config;
+
+&secure_checkip($alias);
+
+########################################
+##ANFANG DER ZU STREAMENDEN HTML-DATEI##
+########################################
+
+print <<END;
+<html>
+ <head>
+<script language="JavaScript">
+<!--
+// Scroll-Routine von Anklepper (http://www.anklepper.de)
+// speziell für yChat (http://www.yChat.de), Copyright 2000
+scrolling = true;
+moves_steps = 4; // Schrittgröße
+moves_interval = 4; // Schrittgeschwindigkeit
+
+function moves()
+{
+ if( scrolling != false )
+ window.scrollBy( 0, moves_steps );
+ window.setTimeout( "moves()", moves_interval );
+}
+
+moves();
+//-->
+</script>
+ </head>
+<body bgcolor=000000 link=FFFFFF alink=FFFFEF vlink=FFFFEF>
+END
+
+$| = 1; # Cache von Perl ausschalten
+
+#############################
+##BEGRÜSSUNGSTEXT SCHREIBEN##
+#############################
+
+my $msgfile;
+
+ print
+ $q->font( { -size=>1,
+ -color=>"ffffff",
+ -face=>"arial"},
+ "$title Copyright by Paul C. Bütow 2k $tmp\n");
+
+if ($var eq "push_logs_html") {
+ $msgfile = $tmp;
+ print "<hr><font size=2 color=ffffff face=arial>";
+} elsif ($var eq "clear_screen") {
+ $msgfile = "data/msgs/$alias";
+ &write_file_new($msgfile);
+ print DATEI $q->br;
+ close DATEI;
+} else {
+ $msgfile = "data/msgs/$alias";
+ print $q->br;
+}
+
+open (MSGFILE, $msgfile);
+
+###############################
+##ENDLOSSCHLEIFE FÜR DEN PUSH##
+###############################
+
+my ($times,$online) = (0,"false");
+for (;;) {
+ for ($curpos = tell(MSGFILE); <MSGFILE>; $curpos = tell(MSGFILE)) {
+ print $_ ;
+ }
+ $times++;
+ if ($times > 14) { # Nach 15 Sekunden
+ print "\n<!--PING//-->"; # Ping zum Browser senden
+ $times = 0; # Sekundenzahl auf 0 zurücksetzen
+ $online = "true" if (-e "data/online/users/$alias");
+ if ($online eq "false") {
+ print "<font size=2 color=red>Aus technischen Gründen bitte auf <a href=\"push.pl?alias=$alias&room=$room&var=clear_screen\">Weiterchatten</a> klicken.</font>";
+ exit;
+ }
+ $online = "false"
+ }
+ sleep 1;
+ seek(MSGFILE, $curpos, 0); # Position wiederherstellen
+}
+
diff --git a/0.2.4a/setup.sh b/0.2.4a/setup.sh
new file mode 100644
index 0000000..c5e369e
--- /dev/null
+++ b/0.2.4a/setup.sh
@@ -0,0 +1,42 @@
+#!/bin/sh
+mkdir data
+mkdir data/logs
+chmod 777 data/logs
+mkdir data/msgs
+chmod 777 data/msgs
+mkdir data/logs/ow
+chmod 777 data/logs/ow
+mkdir data/user
+chmod 777 data/user
+mkdir data/user/counts
+chmod 777 data/user/counts
+mkdir data/user/options
+chmod 777 data/user/options
+mkdir data/user/profiles
+chmod 777 data/user/profiles
+mkdir data/user/gbooks
+chmod 777 data/user/gbooks
+mkdir data/online
+chmod 777 data/online
+mkdir data/online/rooms
+chmod 777 data/online/rooms
+mkdir data/online/users
+chmod 777 data/online/users
+mkdir data/online/ident
+chmod 777 data/online/ident
+mkdir data/htdocs
+chmod 777 data/htdocs
+mv help_html data/htdocs
+mv logs_html data/htdocs
+chmod 777 data/htdocs/*
+chmod 777 *
+mkdir dokus/
+mv *.txt dokus/
+mkdir ../../htdocs/yChat/
+mv *.gif ../../htdocs/yChat/
+mv *.jpg ../../htdocs/yChat/
+echo
+echo yChat Setup beendet ...
+echo Created and copyrighted by Paul C. Bütow aka Snooper
+echo
+rm setup.sh
diff --git a/0.2.4a/unten.gif b/0.2.4a/unten.gif
new file mode 100644
index 0000000..285fb53
--- /dev/null
+++ b/0.2.4a/unten.gif
Binary files differ
diff --git a/0.2.4a/yBanner.gif b/0.2.4a/yBanner.gif
new file mode 100644
index 0000000..e4b691e
--- /dev/null
+++ b/0.2.4a/yBanner.gif
Binary files differ
diff --git a/0.2.4a/yChat.jpg b/0.2.4a/yChat.jpg
new file mode 100644
index 0000000..61eabfb
--- /dev/null
+++ b/0.2.4a/yChat.jpg
Binary files differ
diff --git a/0.2.4c/INSTALL.txt b/0.2.4c/INSTALL.txt
new file mode 100644
index 0000000..13fb7bb
--- /dev/null
+++ b/0.2.4c/INSTALL.txt
@@ -0,0 +1,107 @@
+#############################################################################
+## yChat.de Version 0.2.4 by CXG.de: The chatters of the next generation ##
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+yChat findest Du im Internet unter der Adresse www.yChat.de. Bei Kritik,
+Anregungen oder Fragen bitte in das dort vorhandene Board posten oder eine
+E-Mail an die oben stehende Adresse senden. Ich bemühe mich, yChat so gut wie
+möglich zu machen und bin über Ratschläge immer sehr erfreut :-) ...
+
+Die Installation kann auf Unix-Systemen voll automatisch duchgeführt werden.
+Allerdings ist dafür ein Telnet-Zugang notwendig. Kopiere alle vorhandenen
+Dateien in das Verzeichnis cgi-bin/yChat und führe dann das Shellskript
+setup.sh mit dem Befehl ./setup.sh aus. Alle Verzeichnisse werden
+automatisch erstellt. Dies wurde allerdings nur auf SuSE Linux Systemen
+mit root-Zugriff getestet. Solltest Du ein anderes System verwenden oder
+den Chat auf einen virtuellen Webserver installieren wollen, dann mußt Du
+unter umständen das Verzeichnis "../../htdocs/yChat" nach "../../yChat"
+in der setup.sh umbenennen. Ansonsten werden die dazugehörigen Grafikdateien
+falsch oder garnicht kopiert.
+
+Wenn Du keinen Telnet-Zugang hast, kannst Du hier die Verzeichnisse manuell
+erstellen:
+
+Folgende Basis-Dateien sind im Chat enthalten und müssen in das cgi-bin
+Verzeichnis kopiert werden. Z.B. nach ./cgi-bin/yChat/:
+
+config.pm => Configurationsdatei ("Shared subs")
+htdocs.pl => HTML-Dokumentdateien (Nicht unbedingt erforderlich)
+index.pl => Startskript (Registrierung, Frameset, Login, Daten edit.)
+main.pl => Hauptskript (Alle Hauptfunktionen des Chats)
+main2.pl => Skript für editieren der Benutzerdaten etc.
+online.pl => Anzeige und Überprüfung der eingelogten Benutzer
+push.pl => Server-Push-Routine
+setup.sh => Dient zur automatischen Einrichtung des Chats.
+LIESMICH.txt => Beinhaltet wichtige Informationen
+UPDATES.txt => Updateliste der verschiedenen Versionen
+INSTALL.txt => Dieses Dokument
+
+Folgende Verzeichnisse müssen erstellt werden (chmod 777 sollte
+funktionieren):
+
+- Hier befinden sich alle für den Chat notwenidgen Daten:
+ ./cgi-bin/yChat/data/*
+
+- Hier befinden sich alle für den Chat notwendigen HTML-Dokumente:
+ ./cgi-bin/yChat/data/htdocs/*
+
+ Folgende Dateien müssen in das "data/htdocs" verzeichnis bewegt werden:
+
+ help_html => 101 Hilfedatei
+ logs_html => 101 Logbeschreibung
+
+- Hier befinden sich alle Logdateien, die vom Chat erstellt werden:
+ ./cgi-bin/yChat/data/logs/*
+
+- Hier befinden sich alle Oberwächter-Logdateien:
+ ./cgi-bin/yChat/data/logs/ow/*
+
+- Hier befinden sich die Message-Dateien der eingelogten Benutzer:
+ ./cgi-bin/yChat/data/msgs/*
+
+- Hier befinden sich alle Daten der registrierten Benutzer:
+ ./cgi-bin/yChat/data/user/*
+
+- Hier wird abgespeichert, wie oft ein Benutzerprofil insgesant schon
+ aufgerufen wurde:
+ ./cgi-bin/yChat/data/user/counts/*
+
+- Hier befinden sich alle Chat-Optionen und Passwörter der registrierten
+ Benutzer:
+ ./cgi-bin/yChat/data/user/options/*
+
+- Hier befinden sich alle Benutzerprofile der Benutzer:
+ ./cgi-bin/yChat/data/user/profiles/*
+
+- Hier befinden sich alle Gästebucheinträge der Benutzer:
+ ./cgi-bin/yChat/data/user/gbooks/*
+
+- Hier befinden sich alle Daten zu den aktuellen Chaträumen und User die online sind
+ ./cgi-bin/yChat/data/online/*
+
+- Hier befinden sich alle offnenen Räume
+ ./cgi-bin/yChat/data/online/rooms/*
+
+- Hier befinden sich die Chatter, die sich in den jew. Räumen befinden
+ ./cgi-bin/yChat/data/online/rooms/RAUMNAME/*
+
+- Hier befinden sich alle Chatter, die sich z.Z. im System befinden
+ ./cgi-bin/yChat/data/online/users/*
+
+- Hier befinden sich alle IP-Nummern der eingelogten Chatter
+ ./cgi-bin/yChat/data/online/ident/*
+
+Folgende GRafikdateien sollten in ein nicht-CGI-BIN-Verzeichnis kopiert werden. Z.B.
+nach ./yChat/
+
+ bar.gif => Der gelb gestreifte Rand auf den meisten Seiten
+ unten.gif => Der Hintergrund für das Eingabeformular im Chat
+ yChat.gif => Das yChat-Logo auf der Startseite
+
+Zum schluß sollte die config.pm-Datei nach wünschen editiert werden. Allerdings sollten
+die Copyright Hinweise und die Versionsnummern nicht manipuliert werden.
+
+Folgende Dateien werden von yChat automatisch erstellt:
+
+Viel Spaß beim Chatten ...
+ Snooper \ No newline at end of file
diff --git a/0.2.4c/LIESMICH.txt b/0.2.4c/LIESMICH.txt
new file mode 100644
index 0000000..8d68f71
--- /dev/null
+++ b/0.2.4c/LIESMICH.txt
@@ -0,0 +1,33 @@
+#############################################################################
+## yChat.de Version 0.2.4 by CXG.de: The chatters of the next generation ##
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+Allgemeine Bedingungen bezgl. yChat:
+
+ - Das yChat-System darf ohne Erleubnis des Autors nicht auf irgendeiner Art
+ und Weise weitergegeben- oder eingesetzt werden.
+
+ - Wird das yChat-System eingesetzt, so darf es manipuliert werden, soweit
+ die Copyright-Hinweise des Autors, die Versionsbezeichnung und der Link
+ auf der Startseite nach servers.yChat.de unverändert bleibt.
+ Ansonsten darf der gesamte Code manipuliert werden.
+
+ - Wird das yChat-System erlaubter Weise manipuliert, so muß das veränderte
+ Skript auf Anforderung an den Autor weitergegeben werden. Dieser darf
+ die Veränderungen in das Standard-yChat-System integrieren.
+
+ - Wird das yChat-System eingesetzt, su muß dem Autor die Location bzw. die
+ URL bekanntgegeben werden. Diese wird in servers.yChat.de eingetragen.
+ und mit einer URL wwX.yChat.de verlinkt. Wobei X für die Nummer des jew.
+ Servers steht.
+
+ - Es ist verboten, Sourcecode aus dem yChat-System zu kopieren und
+ für andere, nicht von yChat abhängige Perl-Programme einzusetzen.
+
+Im Flogenden einige yChat-bezügl. Verknüpfungen:
+
+ servers.yChat.de => Liste aller laufenden yChat-Systeme
+ install.yChat.de => Installationsdokumentation
+ liesmich.yChat.de => Allgemeine Bedingungen usw.
+ updates.yChat.de => Update-dListe
+ www.yChat.de => Das Skript zum testen \ No newline at end of file
diff --git a/0.2.4c/UPDATES.txt b/0.2.4c/UPDATES.txt
new file mode 100644
index 0000000..7dc7f50
--- /dev/null
+++ b/0.2.4c/UPDATES.txt
@@ -0,0 +1,43 @@
+########################### yChat.de UPDATE LIST ###########################
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+Hier sind alle Erneuerungen der Versionen dokumentiert:
+
+Update von 0.2.3 auf 0.2.4
+ - Optimierung bzw. Verbesserung der Push-Routine push.pl.
+ - Server-Ping wurde von 2-Pings-per-Second auf 4 erhöht.
+ - yChat-Banner wurde erstellt und ist unter
+ documents.yChat.de/yBanner.jpg vorzufinden.
+ - Unter der URL servers.yChat.de wurde eine Serverliste angelegt,
+ welche anzeigt wo yChat-Systeme laufen.
+ - Des weiteren wurden die URLs updates.yChat.de, install.yChat.de
+ und liesmich.yChat.de eingerichtet.
+ - Die Menüpunkte wurden zusammengefaßt, damit sie unter einer
+ Auflösung von 800x600 nur eine Zeile belegen.
+ - Einige Bugs wurden entfernt.
+
+Update von 0.2.2 auf 0.2.3 - 25.11.2k
+ - Smooth scrolling JavaScript (Vielen Dank an Andreas Buchwald).
+ - "IP#-Fehler" wurde so gut wie beseitigt.
+ - Aufrufe der einzelnen Benutzerprofile wird gezählt und angezeigt.
+ Diese werden in data/user/counts/* gespeichert.
+ - Automatische Einrichtung des Chats mit setup.sh und Telnet.
+ - Menüpunkt "Dein Profil" wurde entfernt da eigenes Profil auch
+ stets über die Onlineliste aufgerufen werden kann.
+
+Update von 0.2.1 auf 0.2.2 - 23.11.2k
+ - Einige Bugs wurden entfernt.
+ - Geschwindigkeit des Chats wurde optimiert.
+ - Eine Liste aller eingelogten Benutzer erscheint am Rand. Hierfür
+ wurde die Datei online.pl eingeführt. Sie aktuallisiert sich alle
+ 20 Sekunden.
+ - Die UPDATES.txt wurde eingeführt.
+
+Update von 0.2.0 auf 0.2.1
+ - Einige Bugs wurden entfernt.
+ - Die IP# der eingelogten Benutzer werden nun anders verwaltet.
+
+Update von Alpha XVIII auf 0.2.0
+ - Die Handhabung der eingelogten Benutzer im System wurde komplett neu
+ überarbeitet.
+ - Neue Versionsnumern wurden eingeführt. \ No newline at end of file
diff --git a/0.2.4c/bar.gif b/0.2.4c/bar.gif
new file mode 100644
index 0000000..61d02b7
--- /dev/null
+++ b/0.2.4c/bar.gif
Binary files differ
diff --git a/0.2.4c/config.pm b/0.2.4c/config.pm
new file mode 100644
index 0000000..5c08fbc
--- /dev/null
+++ b/0.2.4c/config.pm
@@ -0,0 +1,321 @@
+########################### Dieser Teil bestimmt die Standart-Variabeln.
+##STANDART-CONFIGURATION:## (CSS, Farben, Version etc.)
+###########################
+
+$alias = $q->param("alias");
+$var = $q->param("var");
+$room = $q->param("room");
+$col = $q->param("col");
+$secol = $q->param("secol");
+$msg = $q->param("msg");
+$tmp = $q->param("tmp");
+$id = $q->param("id");
+$room = "ChatPipe" if ($room eq "");
+$col = "ffffef" if ($col eq "");
+$secol = "ffffef" if ($secol eq "");
+$datum = "29.11.2k";
+$version = "0.2.4";
+$title = "yChat.de ($version)";
+$gfxpath = "../../gfx/";
+$style = <<ENDCSS;
+<style rel="stylesheet" type="text/css">
+ body { background-image: url("$gfxpath/bar.gif"); background-color: 000000 }
+ body.menu { background-image: none }
+ body.log { background-color: 000000 }
+ body.online { background-color: 444444; background-image: none }
+ div { font-family: arial, verdana, helvetiva; font-size: 10pt; color: ffffff }
+ div.b { font-weight: bold; color: ffa500 }
+ a { color: ffffef }
+ a:hover { color: ffffff; text-decoration: none }
+</style>
+ENDCSS
+
+############### Dieser Teil enthält Programmcode, der an verschiedenen
+##SHARED-SUBS## Stellen ausgeführt werden muß und jedem Skript zur
+############### Verfügung steht.
+
+sub printfile { # Liest eine externe Datei ein und gibt sie mit print aus
+ my ($file2print,$pagetitle,$bodyclass) = @_;
+ if ($pagetitle ne "") {
+ &start_html($pagetitle,$bodyclass);
+ }
+ print "<div><a href=\"push.pl?alias=$alias&tmp=$tmp&var=push_logs_html\">Push</a></div><hr>" if ($bodyclass eq "log");
+ &read_file($file2print);
+ @file2print = <DATEI>;
+ close DATEI;
+ print @file2print;
+}
+
+
+sub start_html { # Der HEADER einer HTML-Datei
+print "<html><head>";
+print "<meta http-equiv=\"refresh\" content=\"20\" URL=\"online.pl?room=$room\">" if ($_[1] eq "online");
+print <<END;
+ <title>
+ $title - $_[0]
+ </title>
+ $style
+ </head>
+END
+ if ($_[1] ne "") {
+ print "<body class=$_[1]>";
+ } else {
+ print "<body>";
+ }
+}
+
+sub post { # Öffentliche Nachricht im aktuellen Raum $room posten.
+ my ($msg2post,$secroom) = @_;
+ my @rooms = ($room,$secroom);
+ foreach(@rooms) {
+ my $room2post = $_;
+ &list_dir("data/online/rooms/$room2post");
+ foreach(@dir) {
+ my $alias2post = $_;
+ if (-f "data/online/rooms/$room2post/$alias2post") {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+ }
+ }
+ }
+ &log("msg","$msg2post");
+}
+
+
+sub post_all { # Öffentliche Nachricht in ALLEN Räumen gleichzeitig posten.
+ my $msg2post = $_[0];
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ my $alias2post = $_;
+ if (-f "data/online/users/$alias2post") {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+ }
+ }
+ &log("msg","$msg2post");
+}
+
+sub post_prv { # Private Nachricht posten (flüstern).
+ my $alias2post = $_[0];
+ my $msg2post = $_[1];
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+}
+
+sub log { # Protokollieren der Nachrichten etc.
+ my ($method,$msg2log) = @_;
+ &zeit;
+ if ( $method eq "msg") {
+ $log = "data/logs/$room-$day.$month.$year";
+ } elsif ($method eq "logins") {
+ $log = "data/logs/ow/logins-$day.$month.$year";
+ $syslog = "data/logs/ow/system-$day.$month.$year";
+ } elsif ($method eq "system") {
+ $log = "data/logs/ow/system-$day.$month.$year";
+ }
+ &write_file($log);
+ if ($method eq "msg") {
+ print DATEI "<br><font color=ffffef><i>($hours:$min:$sec)</i></font> $msg2log\n";
+ } elsif ($method eq "logins") {
+ print DATEI "($day.$month.-$hours:$min:$sec) User: $alias IP#: $ENV{'REMOTE_ADDR'} Agent: $ENV{'HTTP_USER_AGENT'}\n<br>";
+ close DATEI;
+ &write_file($syslog);
+ print DATEI "($day.$month.-$hours:$min:$sec) $msg2log User: $alias IP#: $ENV{'REMOTE_ADDR'}\n<br>";
+ } elsif ($method eq "system") {
+ print DATEI "($day.$month.-$hours:$min:$sec) $msg2log User: $alias IP#: $ENV{'REMOTE_ADDR'}\n<br>";
+ }
+ close DATEI;
+}
+
+
+sub zeit { # Aktuelles Datum und Uhrzeit bestimmen.
+ ($sec, $min, $hours, $day, $month, $year) = (localtime)[0..5];
+ $month += 1;
+ $hours = "0".$hours if ($hours < 10);
+ $min = "0".$min if ($min < 10);
+ $sec = "0".$sec if ($sec < 10);
+ $day = "0".$day if ($day < 10);
+ $month = "0".$month if ($month < 10);
+ $year = $year - 100;
+ if ($year < 10) {
+ $year = "200".$year;
+ } else {
+ $year = "20".$year;
+ }
+}
+
+sub count { # Zeilen in einer Datei Zählen.
+ my $file2count = $_[0];
+ &read_file($file2count);
+ my @datei = <DATEI>;
+ close DATEI;
+ $number = $#datei+1;
+}
+
+sub read_file { # Datei öffnen.
+ my $file2read = $_[0];
+ if (-e "$file2read") {
+ open (DATEI,"<$file2read") || &error("Konnte $file2read nicht öffnen");
+ }
+}
+
+sub write_file { # Text an eine Datei anhängen.
+ my $file2write = $_[0];
+ if (-e "$file2write") {
+ open (DATEI,">>$file2write") || &error("Konnte $file2write nicht öffnen");
+ } else {
+ &create_file("$file2write");
+ open (DATEI,">>$file2write") || &error("Konnte $file2write nicht öffnen");
+ }
+}
+
+sub write_file_new { # Datei neu schreiben.
+ my $file2write = $_[0];
+ if (-e "$file2write") {
+ open (DATEI,">$file2write") || &error("Konnte $file2write nicht öffnen");
+ } else {
+ &create_file("$file2write");
+ open (DATEI,">$file2write") || &error("Konnte $file2write nicht öffnen");
+ }
+}
+
+sub create_file { # Datei erstellen.
+ my $file2create = $_[0];
+ open (CREATE, ">$file2create") || &error("Konnte $file2create nicht erstellen");
+ print CREATE "";
+ close CREATE;
+}
+
+sub error { # Error-Ausgabe.
+ my $error_msg = $_[0];
+ &start_html( "Error: ($error_msg)" );
+ print $q->div( "Error: ($error_msg)" ),
+ $q->end_html;
+ exit;
+}
+
+sub remove_online { # Chatter entfernen
+ my ($alias,$room,$method) = @_;
+ unlink("data/online/users/$alias");
+ unlink("data/online/rooms/$room/$alias") if ($room ne undef);
+ unlink("data/online/ident/$alias");
+ &rm_rooms;
+ &zeit;
+ if ($method eq undef) {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias verläßt den Chat ...</font></i>");
+ } else {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500> $_ hat den Chat verlassen ... </font></i>");
+ &log("system","\"logout_$__ok\"");
+ }
+}
+
+sub rm_alias { # Chatter aus dem System entfernen, die älter als 60 Sekunden sind
+ my $dir2rm = $_[0];
+ &list_dir($dir2rm,2);
+ foreach(@dir2) {
+ if (-f "$dir2rm/$_" && $_ ne undef) {
+ &read_file("$dir2rm/$_");
+ my $timestamp = <DATEI>;
+ close DATEI;
+ if ($timestamp < (time - 60)) {
+ if ($dir2rm eq "data/online/users") {
+ &remove_online($_,undef,1);
+ } else {
+ unlink("$dir2rm/$_");
+ }
+ }
+ }
+ }
+}
+
+sub rm_rooms { # Leere Räume aus dem System entfernen
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-d "data/online/rooms/$_") {
+ &rm_alias("data/online/rooms/$_");
+ &list_dir("data/online/rooms/$_",2);
+ rmdir("data/online/rooms/$_") if ($#dir2 = 1);
+ }
+ }
+}
+
+sub secure_removeip { # Beim ausloggen die IP-Nummer aus dat/ip austragen.
+ my $alias2rm = $_[0];
+ unlink("data/online/ident/$alias2rm");
+}
+
+sub secure_checkip { # data/ip auf die eigene IP-Nummer überprüfen.
+ my ($alias2check,$method) = @_;
+ my $ip;
+ for($i=0 ;$i<=5;) {
+ &read_file("data/online/ident/$alias2check");
+ $ip = <DATEI>;
+ close DATEI;
+ if ($ip ne $ENV{'REMOTE_ADDR'}) {
+ $i++;
+ } else {
+ goto ENDCHECKIP
+ }
+ if ($i<=5) {
+ &log("system","\"secure_ip\"");
+ if ($method eq undef) {
+ &error("Du bist nicht befugt, mit der IP# $ENV{'REMOTE_ADDR'} und dem Alias \"$alias\" zu handeln. Sollte diese Meldung aufgrund eines Fehlers aufgetaucht sein, dann log Dich doch bitte neu in den Chat ein.");
+ } else {
+ &post_prv("$alias2check","<font color=red>Du bist nicht befugt, mit der IP# $ENV{'REMOTE_ADDR'} und dem Alias \"$alias\" zu handeln. Sollte diese Meldung aufgrund eines Fehlers aufgetaucht sein, dann log Dich doch bitte neu in den Chat ein.</font>");
+ &input_html("true") if ($method = 2);
+ }
+ exit;
+ }
+ }
+ENDCHECKIP:
+}
+
+sub remove_rooms { # Leere Räume entfernen.
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-d "data/online/rooms/$_") {
+ &list_dir("data/online/rooms/$_");
+ rmdir("data/online/rooms/$_") if ($#dir = 1);
+ }
+ }
+}
+
+sub list_dir { # Beliebigen Verzeichnisbaum einlesen.
+ my ($dir,$method) = @_;
+ opendir(DIR, $dir);
+ if ($method eq undef) {
+ @dir = readdir(DIR);
+ } elsif ($method = 2) {
+ @dir2 = readdir(DIR);
+ }
+ closedir(DIR);
+}
+
+sub hirachie { # Chatter nach Sonderrechte überprüfen.
+ my $alias2prove = $_[0];
+ $hirachie = "nc";
+ &read_file("data/wa");
+ @was = <DATEI>;
+ close DATEI;
+ foreach(@was) {
+ if ($_ eq $alias2prove || $_ eq "$alias2prove\n") {
+ $hirachie = "wa";
+ }
+ }
+ if ($hirachie ne "wa" || $_ eq "$alias2prove\n") {
+ &read_file("data/ow");
+ @ows = <DATEI>;
+ close DATEI;
+ foreach(@ows) {
+ if ($_ eq $alias2prove || $_ eq "$alias2prove\n") {
+ $hirachie = "ow";
+ }
+ }
+ }
+}
+
+
+
diff --git a/0.2.4c/help_html b/0.2.4c/help_html
new file mode 100644
index 0000000..79b94fa
--- /dev/null
+++ b/0.2.4c/help_html
@@ -0,0 +1,616 @@
+<div>
+ Alle Chat-Befehle:
+</div>
+<hr>
+<table width=100% bgcolor=555555>
+ <tr>
+ <th bgcolor=666666>
+ <div>
+ SU
+ </div>
+ </th>
+ <th bgcolor=666666>
+ <div>
+ Befehl
+ </div>
+ </th>
+ <th bgcolor=666666>
+ <div>
+ Beschreibung
+ </div>
+ </th>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/about
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt aktuelle Version und andere Infos der Community an
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/away
+ <font color=red>
+ Nachricht
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Abmelden mit einer
+ <font color=red>
+ Abmeldenachricht
+ </font>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/clear
+ </div>
+ </td>
+ <td>
+ <div>
+ Bildschirm wird gelöscht
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/col
+ <font color=red>
+ XXXXXX
+ </font>
+ <font color=ffa500>
+ XXXXXX
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Abmelden mit einer
+ Farbe/n (
+ <font color=red>
+ Namensfarbe
+ </font>/
+ <font color=ffa500>
+ Textfarbe
+ </font>
+ ) wechseln. Angabe in Hexadezimal. Wird
+ <font color=ffa500>
+ Textfarbe
+ </font>
+ nicht angegeben, dann hat der Text die
+ <font color=red>
+ Namensfarbe
+ </font>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /date
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt aktuelles Datum und Urzeit an
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/j
+ <font color=red>
+ Raumname
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Raum wechseln/erstellen
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /ju
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ in den Raum wechseln/folgen, wo sich
+ <font color=red>
+ Alias
+ </font>
+ befindet.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/m
+ </div>
+ </td>
+ <td>
+ <div>
+ Handeln mit 2 Farben
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/me
+ </div>
+ </td>
+ <td>
+ <div>
+ Handeln mit einer Farbe
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /msg
+ <font color=red>
+ Alias
+ </font>
+ <font color=ffa500>
+ Nachricht
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>
+ Alias
+ </font>
+ eine private
+ <font color=ffa500>
+ Nachricht
+ </font>
+ flüstern. (Wird nicht vom Chat protokolliert)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /
+ <font color=ffa500>
+ Nachricht
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Eine private
+ <font color=ffa500>
+ Nachricht
+ </font>
+ demjenigen flüstern, dem zuletzt eine geflüstert wurde. (Wird nicht vom Chat protokolliert)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+//
+ </div>
+ </td>
+ <td>
+ <div>
+ Wurde zuletzt eine öffentliche Nachricht gepostet, dann wird diese nocheinmal gepostet. (Funktioniert nicht bei Befehlen, flüstern oder schreien)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/q
+ </div>
+ </td>
+ <td>
+ <div>
+ Cumunnity verlassen
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/s <font color=red>Nachricht</font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>Nachricht</font> schreien
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/w
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt an, wer sich im aktuellen Raum befindet.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+/wc
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt an, wer eingelog ist.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /wc
+ <font color=red>
+ Raum
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt an, wer sich im
+ <font color=red>
+ Raum
+ </font>
+ befindet.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /wc/
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt alle offenen Räume und deren Chatter an
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ NC
+ </div>
+ </td>
+ <td>
+ <div>
+ /wj
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt an, in welchen Raum sich
+ <font color=red>
+ Alias
+ </font>
+ befindet.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=ffa500>
+ WÄ
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ /k
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>
+ Alias
+ </font>
+ wird aus dem Chat katapultiert!
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+/ban
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt alle verbannten Benutzer an
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+/ban
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>
+ Alias
+ </font>
+ verbannen.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+/rban
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>
+ Alias
+ </font>
+ "entbannen"
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ /ip
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Zeigt die IP-Nummer von
+ <font color=red>
+ Alias
+ </font>
+ an.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ /wa
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>
+ Alias
+ </font>
+ zum Wächter ernennen
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ /rwa
+ <font color=red>
+ Alias
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ <font color=red>
+ Alias
+ </font>
+ vom Wächter zum normalen Chatter degradieren
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ <font color=green>
+ OW
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ /sys
+ <font color=red>
+ Nachricht
+ </font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Systemnachricht schreiben. (Erscheint in allen bestehenden Räumen)
+ </div>
+ </td>
+ </tr>
+</table>
+<hr>
+<div>
+ Zur Erklärung: NC steht für "Normale Chatter", WÄ für "Wächter" und OW für "Oberwächter".
+ Obrige Befehle können nur von der/den jeweiligen Benutzergruppe/n oder höher ausgeführt werden.
+</div>
+</body>
+</html> \ No newline at end of file
diff --git a/0.2.4c/htdocs.pl b/0.2.4c/htdocs.pl
new file mode 100644
index 0000000..b52dd6b
--- /dev/null
+++ b/0.2.4c/htdocs.pl
@@ -0,0 +1,222 @@
+#!/usr/bin/perl -w
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+if ($var eq "help_html") {
+ &printfile("data/htdocs/help_html","Alle Chatbefehle");
+} elsif ($var eq "menu_html") {
+ &menu_html;
+} elsif ($var eq "werda_html") {
+ &werda_html;
+} elsif ($var eq "logs_html") {
+ &logs_html;
+} elsif ($var eq "view_sulogs_html") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ &start_html("Oberwächter-Logdateien");
+ print "<div><a href=\"push.pl?alias=$alias&tmp=$tmp&var=push_logs_html\">Push</a><hr>";
+ &printfile($tmp);
+ print "</div></body></html>";
+ }
+} elsif ($var eq "view_logs_html") {
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ &printfile($tmp,$tmp,"log");
+ }
+} elsif ($var eq "superuser_html") {
+ &superuser_html;
+} elsif ($var eq "bar_html") {
+ print
+ $q->start_html(-bgcolor=>"ffa500"),
+ $q->end_html;
+} else {
+ print
+ $q->start_html(-bgcolor=>"000000"),
+ $q->end_html;
+}
+
+sub menu_html {
+ if ($tmp eq "quit") {
+ print
+ $q->script( { -language=>"JavaScript" }, "window.open(\"index.pl?tmp=quit\",\"_top\")" );
+ sleep 1;
+ &remove_online($alias);
+ &secure_removeip($alias);
+ unlink("data/msgs/$alias");
+ }
+ &start_html("Menü","menu");
+print <<END;
+ <center>
+ <div>
+ [<a href="htdocs.pl?var=werda_html&alias=$alias&room=$room&col=$col&secol=$secol&&tmp=$tmp" target="werda">Wer ist da?</a>]
+ [<a href="main2.pl?var=edit_profile_html&alias=$alias" target="ProfilAendern">Profil ändern</a>]
+ [<a href="main2.pl?var=edit_options_html&alias=$alias" target="main">Optionen</a>]
+ [<a href="main2.pl?var=list_alias_html&alias=$alias" target="Benutzerliste">Benutzer</a>]
+ [<a href="htdocs.pl?var=help_html" target="Befehle">Befehle</a>]
+ [<a href="main2.pl?var=gb_html&alias=$alias" target="Board">Board</a>]
+ [<a href="htdocs.pl?var=superuser_html&alias=$alias" target="Hirachie">Superuser</a>]
+ [<a href="htdocs.pl?var=logs_html&alias=$alias" target="Logdateien">Logs</a>]
+ [<a href="push.pl?alias=$alias&room=$room&var=clear_screen" target="main">Weiterchatten</a>]
+ [<a href="htdocs.pl?var=menu_html&tmp=quit&alias=$alias">Verlassen</a>]
+ </div>
+ </center>
+</body>
+</html>
+END
+}
+
+
+sub werda_html { # Anzeige, wer eingelogt ist.
+ &start_html("Wer ist da?");
+ print <<END;
+<div>
+ $alias, schön daß Du hier bist :-)
+</div>
+<hr>
+<div>
+ Folgende Personen befinden sich im Chat:
+</div>
+<br>
+<div>
+END
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ my $room = $_;
+ &list_dir("data/online/rooms/$room",2);
+ local $nr = $#dir2-1;
+ print $q->b( $_ ),
+ "($nr)",
+ $q->br;
+ foreach(@dir2) {
+ if ($_ ne ".." && $_ ne ".") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_" }, "$_"), " ";
+ }
+ }
+ print $q->br, $q->br;
+ }
+ }
+ print
+ "</div>",
+ $q->end_html;
+}
+
+sub logs_html {
+ &secure_checkip($alias);
+ &start_html("Logdateien");
+ print <<END;
+<div>
+ Hier befinden sich alle Logdateien
+</div>
+<hr>
+END
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ if ($hirachie eq "ow") {
+ print $q->div( "Folgende Logdateien können nur von Oberwächtern (OW) gelesen werden" );
+ &printfile("data/htdocs/logs_html");
+ &list_dir("data/logs/ow");
+ my @sortedir = sort(@dir);
+ foreach(@sortedir) {
+ if (-f "data/logs/ow/$_") {
+ print $q->a( { -href=>"htdocs.pl?var=view_sulogs_html&alias=$alias&tmp=data/logs/ow/$_",
+ -target=>$_},
+ "$_" ).
+ " ",
+ }
+ }
+ print $q->hr;
+ }
+ print $q->div( "Folgende Logdateien können nur von Wächtern und Oberwächtern gelesen werden (Sortiert nach A-Z, a-z):" ),
+ $q->br;
+ &list_dir("data/logs");
+ my @sortedir = sort(@dir);
+ foreach(@sortedir) {
+ if (-f "data/logs/$_") {
+ print $q->a( { -href=>"htdocs.pl?alias=$alias&var=view_logs_html&tmp=data/logs/$_",
+ -target=>"_new" },
+ "$_" ),
+ " ";
+ }
+ }
+ if ($hirachie eq "wa") {
+ print $q->hr,
+ $q->div( "Oberwächter können zusätzlich die Systemlogdateien lesen. Du bist allerdings ein \"Wächter\" und ",
+ " bist nicht dazu berechtigt " ),
+ $q->br;
+ &printfile("data/htdocs/logs_html");
+ }
+ } else {
+ print $q->div( "Logdateien können nur von Oberwächtern (OW) und von Wächtern (WÄ) gelesen werden. Du bist jedoch ein ",
+ "\"Normaler Chatter\". Wächter können alles nachlesen, was öffentlich gechattet wurde. Oberwächter ",
+ "können folgende Systemlogdateien zusätzlich lesen:" ),
+ $q->hr;
+ &printfile("data/htdocs/logs_html");
+ }
+ print
+ $q->end_html;
+}
+
+sub superuser_html { # Zeigt an, wer Superuser ist
+ &start_html("Superuser");
+ print "<div>Hallo $alias. Du bist als ";
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ print
+ $q->b( "Oberwächter" ),
+ " (OW) eingetragen.</div>",
+ $q->hr;
+ } elsif ( $hirachie eq "wa") {
+ print
+ $q->b( "Wächter" ),
+ " (WÄ) eingetragen.</div>",
+ $q->hr;
+ } else {
+ print
+ $q->b( "normaler Chatter" ),
+ " (NC) eingetragen.</div>",
+ $q->hr;
+ }
+ my $nrow = $#ows+1;
+ print
+ "<div>",
+ $q->b( "OW" ),
+ "s ($nrow Stück)";
+ foreach(@ows) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+ my $nrwa = $#was+1;
+ print
+ "</div>",
+ $q->hr,
+ "<div>",
+ $q->b( "WÄ" ),
+ "s ($nrwa Stück)";
+ foreach(@was) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+print <<END;
+<hr>
+ Die jeweiligen Fähigkeiten der Oberwächter (OW) und der Wächter (WÄ) sind unter
+ "<a href="htdocs.pl?var=help_html">Chat-Befehle</a>"
+ dokumentiert.
+</div>
+</body>
+</html>
+END
+} \ No newline at end of file
diff --git a/0.2.4c/index.pl b/0.2.4c/index.pl
new file mode 100644
index 0000000..5a465c4
--- /dev/null
+++ b/0.2.4c/index.pl
@@ -0,0 +1,354 @@
+#!/usr/bin/perl -w
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header; # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUFGERUFEN WERDEN?##
+#####################################
+if ($var eq "create_alias_html") {
+ &create_alias_html;
+} elsif ($var eq "create_alias") {
+ &create_alias;
+} elsif ($var eq "login_html") {
+ &login_html;
+} elsif ($alias eq "") {
+ &login_html;
+} else {
+ &checklogin;
+}
+
+sub login_html { # Erste Startseite
+local $counter = undef;
+&read_file("data/count");
+ $counter = <DATEI>;
+close DATEI;
+$counter++;
+&write_file_new("data/count");
+ print DATEI $counter;
+close DATEI;
+&start_html("Created by Paul C. Bütow 2k");
+print <<END;
+ <center>
+ <table width=400>
+ <tr>
+ <td>
+ <b>
+ <div>
+ $title - ( <a href="http://servers.yChat.de">yChat-Servers</a> )
+ <img src="$gfxpath/yChat.jpg">
+ </div>
+ </b>
+END
+ if ($tmp eq "true") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Wahrscheinlich existiert Dein Alias "$alias" nicht,
+ <br>
+ Du hast Dich verschrieben oder das Passwort ist falsch.
+ <br>
+ Versuch es erneuert !
+ </div>
+END
+ } elsif ($tmp eq "quit") {
+print <<END;
+ <div>
+ Du hast soeben den Chat verlassen.
+ <br>
+ Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ } elsif ($tmp eq "banned") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein Alias "$alias" wurde verbannt.
+ <br>
+ Z.z. kannst Du Dich leider nicht in den Chat einloggen.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($tmp eq "kick") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wurdest soeben aus dem Chat katapultiert!
+ <br>
+ Schlechtes Verhalten mag die Ursache hierfür sein.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($var eq "create_alias") {
+print "<div>Du hast sich soeben in die Datenbank eingetragen. Einfach auf \"Los Geht's\" klicken :-)</div>";
+ } else {
+print <<END;
+ <div>
+ Herzlich willkommen!
+ <br>
+ Einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ &log("system","\"first_http_ok\"");
+ }
+print <<END;
+ <hr>
+ <form action="index.pl">
+ <input type="hidden" name="tmp" value="true">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Alias:
+ <br>
+ <input name="alias" value="$alias">
+ </div>
+ </td>
+ <td>
+ <div>
+ Dein Passwort:
+ <br>
+ <input type="password" name="id" value="$id">
+ </div>
+ </td>
+ </tr>
+ </table>
+ <br>
+ <br>
+ <div>
+ Solltest Du noch keinen Nick besitzen, dann auf "Registrieren" klicken!
+ </div>
+ <br>
+ <table>
+ <tr>
+ <td>
+ <font color="ffffff">
+ <input type="submit" value="Los geht's!">
+ </font>
+ </form>
+ </td>
+ <td>
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias_html">
+ <font color="ffffff">
+ <input type="submit" value="Registrieren">
+ </font>
+ </form>
+ </td>
+ </tr>
+ </table>
+ <hr>
+ <div>
+ yChat befindet sich momentan noch in der Entwicklungsphase !
+ <br>
+ Fragen gehen an Paul Bütow (
+ <a href="mailto:paul\@buetow.oxg.de">
+ paul\@buetow.oxg.de
+ </a>
+ ) :-)
+ <br>
+ <br>
+ Diese Seite wurde schon $counter mal aufgerufen.
+ </td>
+ </tr>
+ </table>
+ </center>
+</body>
+</html>
+END
+}
+
+
+sub create_alias_html { # HTML-Form für Erstellung eines neuen Benutzers.
+my $reload = $_[0];
+&start_html("Registration");
+print <<END;
+ <center>
+ <table width=400>
+ <tr>
+ <td>
+END
+ if ($reload eq "alias_exists") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Der von Dir gewählte Benutzername "$alias" existiert in unserer Datenbank bereits. Bitte versuch es erneuert mit
+ einem anderen Benutzernamen !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "pw_wrong") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Deine beiden Passworteingaben stimmen nicht überein. Bitte geb das Passwort erneuert an um sicherzugehen, daß
+ kein falsches Passwort abgespeichert wird !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "alias_prohibited") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein gewählter Benutername "$alias" enthält illegale Zeichen. Bitte versuch einen anderen Benutzernamen!
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Hier kannst Du Dich registrieren. Bitte beachte, daß die Passworteingabefelder übereinstimmen!
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias">
+ <div>
+ Dein Alias:
+ <font color="ffa500">
+ (Muß angegeben werden)
+ </font>
+ <br>
+ <input name="alias" VALUE="$alias">
+ </div>
+ <br>
+ <div>
+ Dein gewünschtes Passwort:
+ <br>
+ <input type="password" name="id" value="$id">
+ </div>
+ <br>
+ <div>
+ Geb hier Dein Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp">
+ </div>
+ <br>
+ <font color=ffffff>
+ <input type="submit" value="Registrieren">
+ </font>
+ <br>
+ </form>
+ <hr>
+ <div>
+ Um den Chat zu betreten müssen die Daten nach der Registration auf der Startseite erneuert bestätigt werden !
+ </div>
+ </td>
+ </tr>
+ </table>
+</center>
+</body>
+</html>
+END
+}
+
+sub checklogin { # Überprüfen, ob die Login-Daten korrekt sind.
+ my $lognotexists = "true";
+ &list_dir("data/user/options");
+ for (my $i=0; $i<=$#dir; $i++) {
+ if ($dir[$i] eq $alias) {
+ &read_file("data/user/options/$alias");
+ @datei = <DATEI>;
+ close DATEI;
+ chomp($datei[0]);
+ if ($datei[0] eq $id) {
+ &read_file("data/ban"); # Überprüfen, ob Alias verbannt ist
+ @banned = <DATEI>;
+ close DATEI;
+ foreach(@banned) {
+ if ($_ eq "$alias\n") {
+ &log("system","\"login_alias_banned\"");
+ $tmp = "banned";
+ &login_html();
+ exit;
+ }
+ }
+ $col = $datei[1];
+ $secol = $datei[2];
+ &write_file_new("data/online/ident/$alias");
+ print DATEI $ENV{'REMOTE_ADDR'};
+ close DATEI;
+ &frameset_html;
+ exit;
+ } else {
+ &log("system","\"login_pw_wrong\"");
+ $lognotexists = "false";
+ }
+ }
+ }
+ if ($lognotexists eq "true") {
+ &log("system","\"login_alias_notexists\"");
+ }
+ &login_html; # Falls Login-Daten inkorrekt sind, zurück zur Startseite.
+}
+
+sub create_alias { # Erstellung eines neuen Benutzers.
+ if ($alias =~ /[\W]/ || $alias eq "") {
+ &log("system","\"reg_alias_prohibited\"");
+ &create_alias_html("alias_prohibited");;
+ exit;
+ } elsif ($id ne $tmp) {
+ &log("system","\"reg_pw_wrong\"");
+ &create_alias_html("pw_wrong");
+ exit;
+ }
+ &list_dir("data/user/options");
+ for (my $i=0; $i<=$#dir; $i++) {
+ if ($dir[$i] eq $alias) {
+ &log("system","\"reg_alias_exists\"");
+ &create_alias_html("alias_exists");
+ exit;
+ }
+ }
+ &write_file_new("data/user/options/$alias");
+ print DATEI $id."\n";
+ close DATEI;
+ &zeit;
+ &list_dir("data/user/options");
+ my $number = $#dir-1;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias [$number] hat sich soeben als neuer Benutzer registriert :-) ...</font></i>");
+ &log("system","\"reg_ok\"");
+ &login_html;
+}
+
+sub frameset_html {
+print <<END;
+<html>
+ <head>
+ <title>
+ Willkommen auf der Chat Pipe
+ </title>
+ </head>
+<frameset border=0 frameborder=0 framespacing=0 rows="50,1,*,66">
+ <frame name="menu" src="htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol" scrolling="no">
+ <frame src="htdocs.pl?var=bar_html scrolling="no">
+ <frameset border=0 frameborder=0 framespacing=0 cols="110,*">
+ <frame name="online" src="online.pl?room=$room&alias=$alias">
+ <frame name="main" src="push.pl?room=$room&alias=$alias&var=clear_screen">
+ </frameset>
+ <frame name="input" src="main.pl?alias=$alias&var=input_html&room=$room&col=$col&secol=$secol&tmp=login" scrolling="no">
+</frameset>
+</html>
+END
+}
diff --git a/0.2.4c/logs_html b/0.2.4c/logs_html
new file mode 100644
index 0000000..1317062
--- /dev/null
+++ b/0.2.4c/logs_html
@@ -0,0 +1,391 @@
+<br>
+<div>
+ In der System-Logdatei tauchen folgende Ursachen auf:
+</div>
+<br>
+<table border=0 width=100% bgcolor=555555>
+ <tr>
+ <th bgcolor=666666>
+ <div>
+ Ursache
+ </div>
+ </th>
+ <th bgcolor=666666>
+ <div>
+ Beschreibung
+ </div>
+ </th>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ edit_profile_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzername hat sein Profil erfolgreich editiert.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ edit_pw_wrong
+ </div>
+ </td>
+ <td>
+ <div>
+ Beim Editieren der Chat-Optionen stimmten die beiden Passwortfelder nicht überein.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ edit_colors_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzername hat seine Chatfarben erfolgreich gewechselt.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+edit_options_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzername hat seine Chat-Optionen erfolgreich editiert.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+first_http_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Der angegebenen IP# wurde Startseite erfolgreich angezeigt. (Benutzername noch nicht vorhanden)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+login_alias_banned
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzer konnte sich nicht in das System einloggen, da sein benutzername verbannt war.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ login_alias_notexists
+ </div>
+ </td>
+ <td>
+ <div>
+ Beim Einlogversuch existierte der angegebene Benutzername nicht.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+login_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzer hat sich erfolgreich in das System eingelogt.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ login_pw_wrong
+ </div>
+ </td>
+ <td>
+ <div>
+ Beim Einloggen wurde das falsche PW eingegeben.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ logout_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzer hat sich erfolgreich (manuell) aus dem System ausgelogt. ("... verläßt den Chat ...")
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ logout_<font color=red>Alias</font>_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ User hat gemerkt, daß sich
+ <font color=red>
+ Alias
+ </font>
+ nicht mehr im Chat befindet. ("... hat den Chat verlassen ...").
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ow_ban_<font color=red>Alias</font>_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat
+ <font color=red>
+ Alias
+ </font>
+ verbannt
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ow_ban_<font color=red>Alias</font>_ow
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat ohne Erfolg versucht
+ <font color=red>
+ Alias
+ </font>
+ zu verbannen (
+ <font color=red>
+ Alias
+ </font>
+ war Oberwächter und konnte nicht verbannt werden )
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ow_rban_<font color=red>Alias</font>_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat
+ <font color=red>
+ Alias
+ </font>
+ "entbannt"
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ ow_wa_<font color=red>Alias</font>_exists
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat ohne Erfolg versucht
+ <font color=red>
+ Alias
+ </font>
+ zum Wächter zu ernennen. (
+ <font color=red>
+ Alias
+ </font>
+ war bereits als Wächter eingetragen.)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ ow_wa_<font color=red>Alias</font>_notexists
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat ohne Erfolg versucht
+ <font color=red>
+ Alias
+ </font>
+ zum Wächter zu ernennen. (
+ <font color=red>
+ Alias
+ </font>
+ existierte nicht in der Benutzerdatenbank.)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ ow_wa_<font color=red>Alias</font>_ow-exists
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat ohne Erfolg versucht
+ <font color=red>
+ Alias
+ </font>
+ zum Wächter zu ernennen. (
+ <font color=red>
+ Alias
+ </font>
+ war bereits als Oberwächter eingetragen. Oberwächter können nicht zeitgleich Wächter sein.)
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ ow_wa_<font color=red>Alias</font>_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat
+ <font color=red>
+ Alias
+ </font>
+ erfolgreich zum Wächter ernannt.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ ow_rwa_<font color=red>Alias</font>_notexists
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter konnte
+ <font color=red>
+ Alias
+ </font>
+ nicht zum Wächter ernennen. (War nicht als WÄ registriert)..
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ ow_rwa_<font color=red>Alias</font>_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Oberwächter hat
+ <font color=red>
+ Alias
+ </font>
+ vom Wächter zum normalen Chatter degradiert.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ reg_alias_exists
+ </div>
+ </td>
+ <td>
+ <div>
+ Bei der Registrierung war der Benutzername bereits vorhanden.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ reg_alias_prohibited
+ </div>
+ </td>
+ <td>
+ <div>
+ Bei der Registrierung war der angegebene Benutzername verboten (enthielt Sonderzeichen).
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ reg_ok
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Benutzername hat sich erfolgreich registriert.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ reg_pw_wrong
+ </div>
+ </td>
+ <td>
+ <div>
+ Bei der Registrierung wurde das PW falsch eingegeben.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ secure_ip
+ </div>
+ </td>
+ <td>
+ <div>
+ Unbefugter Zugriff der angegebenen IP# auf den angegebenen Benutzernamen.
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div>
+ sys_msg_<font color=red>Raum</font>
+ </div>
+ </td>
+ <td>
+ <div>
+ Angegebener Oberwächter schreibt eine Systemnachricht aus
+ <font color=red>
+ Raum
+ </font>.
+ </div>
+ </td>
+ </tr>
+</table>
+<br> \ No newline at end of file
diff --git a/0.2.4c/main.pl b/0.2.4c/main.pl
new file mode 100644
index 0000000..99206d5
--- /dev/null
+++ b/0.2.4c/main.pl
@@ -0,0 +1,560 @@
+#!/usr/bin/perl -w
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+if ($var eq "input_html") {
+ &input_html;
+} elsif ($var eq "post_msg") {
+ &post_msg;
+} elsif ($var eq "change_room") {
+ &change_room;
+} else {
+ &error("Parameter fehlt");
+}
+
+sub input_html { # Eingabemaske für den Chat.
+ my ($reload,$action,$whisper,$lastmsg) = @_;
+ $action = $q->param('action') if ($action eq "");
+ if ($tmp eq "away") {
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias meldet sich zurück ... </font></i>");
+ } elsif ($tmp eq "login") {
+ &remove_rooms;
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat den Chat betreten ...</font></i>");
+ &log("logins","\"login_ok\"");
+ }
+ if ($action ne "" && $action ne "whisper" && $action ne "away") {
+ print "<html><head><script language=\"JavaScript\">";
+ if ($action eq "change_room") {
+ print "open(\"online.pl?alias=$alias&room=$room\",\"online\");";
+ print "open(\"main.pl?var=input_html&alias=$alias&room=$room&col=$col&secol=$secol\",\"input\");";
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol\",\"menu\");";
+ } elsif ($action eq "change_colors") {
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol\",\"menu\");";
+ }
+ print "</script></head><body background=\"$gfxpath/unten.gif\" bgcolor=ffa500>";
+ } else {
+ print "<html><body background=\"$gfxpath/unten.gif\" bgcolor=ffa500>";
+ }
+ print "<form action=\"main.pl\">";
+ print "<input type=\"hidden\" name=\"tmp\" value=\"away\">" if ($action eq "away");
+ print <<END;
+ <select NAME="col" size="1">
+ <option selected value="$col">Nickfarbe ($col)</option>
+ <option value="0000FF">Blau (1)</option>
+ <option value="008000">Grün</option>
+ <option value="000000">Schwarz</option>
+ <option value="808000">Oliv</option>
+ <option value="000080">Marineblau</option>
+ <option value="800080">Purpur</option>
+ <option value="808080">Braun</option>
+ <option value="FF00FF">Fuchsia</option>
+ <option value="008080">Stahlblau</option>
+ <option value="333333">Mittelschwarz</option>
+ <option value="003399">BärBlau</option>
+ <option value="0066CC">Blau (2)</option>
+ <option value="009933">Grün</option>
+ <option value="006666">Oliv</option>
+ <option value="FF0000">VollRot</option>
+ <option value="CC0000">RostRot</option>
+ <option value="990099">Lila</option>
+ <option value="FF00FF">Pink</option>
+ <option value="FF9900">Orange</option>
+ <option value="CC6600">Ocker</option>
+ <option value="996600">Braun</option>
+ <option value="666666">Grau</option>
+ <option value="0A6307">Dunkelgrün</option>
+ <option value="9C1B7C">Dunkellila</option>
+ <option value="3D0DB9">Dunkelblau</option>
+ <option value="8FA5ED">Hellblau</option>
+ <option value="FFFF00">Gelb</option>
+ <option value="3D4863">?????</option>
+ </select>
+ <select NAME="secol" size="1">
+ <option selected value="$secol">Schriftfarbe ($secol)</option>
+ <option value="0000FF">Blau (1)</option>
+ <option value="008000">Grün</option>
+ <option value="000000">Schwarz</option>
+ <option value="808000">Oliv</option>
+ <option value="000080">Marineblau</option>
+ <option value="800080">Purpur</option>
+ <option value="808080">Braun</option>
+ <option value="FF00FF">Fuchsia</option>
+ <option value="008080">Stahlblau</option>
+ <option value="333333">Mittelschwarz</option>
+ <option value="003399">BärBlau</option>
+ <option value="0066CC">Blau (2)</option>
+ <option value="009933">Grün</option>
+ <option value="006666">Oliv</option>
+ <option value="FF0000">VollRot</option>
+ <option value="CC0000">RostRot</option>
+ <option value="990099">Lila</option>
+ <option value="FF00FF">Pink</option>
+ <option value="FF9900">Orange</option>
+ <option value="CC6600">Ocker</option>
+ <option value="996600">Braun</option>
+ <option value="666666">Grau</option>
+ <option value="0A6307">Dunkelgrün</option>
+ <option value="9C1B7C">Dunkellila</option>
+ <option value="3D0DB9">Dunkelblau</option>
+ <option value="8FA5ED">Hellblau</option>
+ <option value="FFFF00">Gelb</option>
+ <option value="3D4863">?????</option>
+ </select>
+ <input type="hidden" name="var" value="post_msg">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="room" value="$room">
+ <input type="hidden" name="id" value="$whisper">
+ <input type="hidden" name="lastmsg" value="$lastmsg">
+ <br>
+ <input size="80" maxlength="250" name="msg">
+ <input type="submit" value="Texten">
+
+</form>
+END
+if ($reload eq "true") {
+print <<END;
+ <script language="JavaScript">
+ <!--
+ document.forms[0].msg.focus();
+ //-->
+ </script>
+END
+}
+print
+ $q->end_html;
+}
+
+sub post_msg { # Wird aufgerufen, wenn aus input_html eine Eingabe gepostet wurde.
+ $| = 1; # Cache von Perl ausschalten
+ $msg =~ s#<#&lt\;#g; # HTML-Tags deaktivieren
+ $msg =~ s#kilahu#yChat#g;
+ $msg =~ s#ooperle#per!#g;
+ if (substr($msg,0,1) ne "/") { # Überprüfen, ob Befehl oder Nachricht
+ $msg = "<b><font color=$col>$alias: <font color=$secol>".$msg."</font></font></b>";
+ $msg =~ s#"#'#g; # " in ' umtauschen für den befehl "//"
+ &input_html("true","",$id,$msg); # -> Reload=true, Action=none, Whisper=$id
+ &secure_checkip($alias,1);
+ &post($msg);
+ } else {
+ &secure_checkip($alias,2);
+ &cmd($msg);
+ }
+}
+
+sub cmd { # Alle Chatbefehle, die über input_html eingegeben werden können.
+ $_[0] = $_[0]." ";
+ $_[0] = substr($_[0], 1, length($_[0])-1);
+ my @cmd = split(/ /, $_[0]);
+ my $cmd = substr($_[0],0 , index($_[0], " "));
+ my ($reload,$action,$whisper) = ("true","",$id);
+#############>- NORMALE CHATBEFEHLE ( Alphabetisch sortiert ) -<
+#############>- DER LETZTEN ZUGEFLÜSTERTEN PERSON NOCHEINMAL FLÜSTERN -<
+ if ($cmd eq "/") {
+ &post($q->param('lastmsg'));
+#############>- INFORMATIONEN ÜBER DAS SYSTEM AUSGEBEN -<
+ } elsif ($cmd eq "about") {
+ &post_prv("$alias","<font size=2 color=ffffff>Aktuelle Version ist $title und wurde am $datum aktuallisiert. Created by Paul C. Bütow 2k.</font>");
+#############>- ABMELDEN MIT 'AWAY-NACHRICHT' -<
+ } elsif ($cmd eq "away") {
+ if ($tmp eq "away") { # Falls 2 mal hintereinander /away eingegeben wurde
+ $tmp = "";
+ }
+ for ($i=1; $i <= $#cmd; $i++) {
+ $tmp = $tmp." ".$cmd[$i];
+ }
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias meldet sich ab (<font color=red>$tmp</font> ) ...</i></font>");
+ $action = "away";
+#############>- EIGENEN CHATBILDSCHIRM LÖSCHEN -<
+ } elsif ($cmd eq "clear") {
+ &post_prv("$alias","<script language=\"JavaScript\">window.open(\"push.pl?alias=$alias&room=$room&var=clear_screen\",\"main\");</script>");
+#############>- FARBEN WECHSELN -<
+ } elsif ($cmd eq "col") {
+ $col = $cmd[1];
+ my $tmpsecol = $cmd[2];
+ if ($tmpsecol eq "") {
+ $secol = $col
+ } else {
+ $secol = $tmpsecol;
+ }
+ &read_file("data/user/options/$alias");
+ my @pro = <DATEI>;
+ close DATEI;
+ &write_file_new("data/user/options/$alias");
+ print DATEI $pro[0]."".$col."\n".$secol;
+ close DATEI;
+ &log("system","\"edit_colors_ok\"");
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat die Farbe gewechselt ...</font></i>");
+ $action = "change_colors";
+#############>- AKTUELLES DATUM UND URZEIT AUSGEBEN -<
+ } elsif ($cmd eq "date") {
+ &zeit;
+ &post_prv("$alias","<font size=2 color=ffffff>Heute ist der $day.$month. Jahr $year. Es ist genau $hours:$min Uhr und $sec Sekunden.</font>");
+#############>- EINEN NEUEN RAUM ERSTELLEN BZW. IN EINEN BESTEHENDEN RAUM WECHSELN -<
+ } elsif ($cmd eq "j") {
+ &change_room("j",$cmd[1],$room);
+ $action = "change_room";
+#############>- HANDELN -<
+ } elsif ($cmd eq "me" || $cmd eq "m") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $me_msg = $me_msg." ".$cmd[$i];
+ }
+ if ($cmd eq "m") {
+ &post("<i><font color=$col>$alias <font color=$secol>$me_msg</font></font></i>");
+ } else {
+ &post("<i><font color=$col>$alias $me_msg</font></i>");
+ }
+#############>- FLÜSTERN ( Auch mit '/' ) -<
+ } elsif ($cmd eq "msg" || $cmd eq "") {
+ my ($alias2post,$msg2post) = ($cmd[1],"");
+ if ($cmd eq "msg") {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ } else {
+ $alias2post = $id;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ }
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ if ($_ eq $alias2post) {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "<i><font color=$col>$alias flüstert <font color=ffffff>=></font><font color=$secol>$msg2post</font></font></i><br>\n";
+ close DATEI;
+ &write_file("data/msgs/$alias");
+ print DATEI "<i><font color=$col>Zu $alias2post geflüstert <font color=ffffff>=></font><font color=$secol>$msg2post</font></font></i><br>\n";
+ close DATEI;
+ &input_html($reload,"",$alias2post);
+ exit;
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2post <font color=ffffff>ist momentan nicht anwesend !</font></font>");
+#############>- DAS SYSTEM VERLASSEN -<
+ } elsif ($cmd eq "q") {
+ &post_prv("$alias","<script language=\"JavaScript\">window.open(\"index.pl?tmp=quit\",\"_top\");</script>");
+ sleep 1;
+ &remove_online($alias,$room);
+ &secure_removeip($alias);
+ unlink("data/msgs/$alias");
+ exit;
+#############>- SCHREIEN -<
+ } elsif ($cmd eq "s") {
+ my $msg2scream,$msg2post;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2scream = $msg2scream." ".$cmd[$i];
+ }
+ $msg2post = "\U$msg2scream";
+ &post("<font color=$col><i>$alias schreit:</i> <b><font color=$secol>".$msg2post."</font></font></b>");
+#############>- ANZEIGEN WER SICH IM AKTUELLEN RAUM BEFINDET -<
+} elsif ($cmd eq "w") {
+ &list_dir("data/online/rooms/$room");
+ my ($is,$nr) = ("t",0);
+ foreach(@dir) {
+ if (-f "data/online/rooms/$room/$_") {
+ $personen = $personen." ".$_;
+ $nr++;
+ }
+ }
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "n";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>$nr Person$nrs befinde$is sich im aktuellen Raum (\"$room\"): <font color=ffa500>$personen</font></font>");
+#############>- ANZEIGEN WER SICH IM SYSTEM BEFINDET -<
+ } elsif ($cmd eq "wc" || $cmd eq "wc/") {
+ $raum = $cmd[1];
+ if ($raum eq "" && $cmd eq "wc") {
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/users/$_");
+ }
+ my $nr = ($#dir-1);
+ my ($nrs,$is) = ("","ist");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "sind";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>$nr Person$nrs $is insgesamt eingelogt: <font color=ffa500>$personen</font></font>");
+ } elsif ($raum eq "" && $cmd eq "wc/") {
+ my $msg2post;
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ &list_dir("data/online/rooms/$_",2);
+ my $nr = $#dir2-1;
+ $msg2post = $msg2post."<tr><td><b><font size=2 color=ffffff>$_ ($nr)</font></b></td><td><font size=2 color=ffffff>";
+ foreach $chatter (@dir2) {
+ if (-f "data/online/rooms/$_/$chatter") {
+ $msg2post = $msg2post."$chatter ";
+ }
+ }
+ print "</font></td>";
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>Folgende Räume sind offen:</font><table>$msg2post</table>");
+ } elsif ($raum ne "") {
+ my $personen;
+ &list_dir("data/online/rooms/$raum");
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/rooms/$raum/$_");
+ }
+ my ($nr,$is) = (($#dir-1),"t");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "n";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff> $nr Person$nrs befinde$is sich im Raum \"$raum\": <font color=ffa500>$personen</font></font>");
+ }
+#############>- ANZEIGEN IN WELCHEN RAUM SICH JMD. BEFINDET BZW. JMD IN EINEN RAUM FOLGEN -<
+ } elsif ($cmd eq "wj" || $cmd eq "ju") {
+ my $alias2search = $cmd[1];
+ &list_dir("data/online/rooms");
+ foreach $raum (@dir) {
+ &list_dir("data/online/rooms/$raum",2) if (-d "data/online/rooms/$raum");
+ foreach $user (@dir2) {
+ if (-f "data/online/rooms/$raum/$user") {
+ if ($user eq $alias2search) {
+ if ($cmd eq "wj") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2search <font color=ffffff>befindet sich im Raum \"$raum\" !</font></font>");
+ } else {
+ $action = "change_room";
+ &change_room("ju",$raum,$room,$alias2search);
+ }
+ &input_html($reload,$action,$whisper);
+ exit;
+ }
+ }
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2search <font color=ffffff> ist nicht eingelogt !</font></font>");
+#############>- SUPERUSER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- ALIAS VERBANNEN BZW. ENTBANNEN -<
+ } elsif ($cmd eq "ban" || $cmd eq "rban") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ my ($alias2handle,$registriert) = $cmd[1];
+ &list_dir("data/user/options");
+ foreach(@dir) {
+ $registriert = "true" if ($_ eq $alias2handle);
+ }
+ if ($registriert ne "true") {
+ if ($cmd eq "ban") {
+ if ($alias2handle ne "") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> existiert nicht in der Benutzerdatenbank und kann so nich verbannt werden !</font></font>");
+ } else {
+ &read_file("data/ban");
+ my @banned = <DATEI>;
+ my ($benutzer);
+ my $nr = $#banned+1;
+ close DATEI;
+ foreach(@banned) {
+ $benutzer = $benutzer." ".$_;
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>Folgende Benutzer sind verbannt [$nr]: <font color=ffa500>$benutzer</font></font>");
+ }
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> existiert nicht in der Benutzerdatenbank und kann so nicht \"entbannt\" werden !</font></font>");
+ }
+ &input_html("true");
+ exit;
+ }
+ &read_file("data/ban");
+ my @banlist = <DATEI>;
+ close DATEI;
+ foreach(@banlist) {
+ if ($_ eq "$alias2handle\n") {
+ if ($cmd eq "ban") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> ist bereits verbannt worden !</font></font>");
+ } else {
+ my $banned = "false";
+ foreach(@banlist) {
+ $banned = "true" if ($_ eq "$alias2handle\n");
+ }
+ if ($banned eq "true") {
+ my @newbanlist;
+ foreach(@banlist) {
+ push @newbanlist,$_ if ($_ ne "$alias2handle\n");
+ }
+ &write_file_new("data/ban");
+ print DATEI @newbanlist;
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> wurde soeben \"entbannt\" !</font></font>");
+ &log("system","\"ow_rban_$alias2handle_ok\"");
+ }
+ }
+ &input_html("true");
+ exit;
+ }
+ }
+ if ($cmd eq "ban") {
+ &hirachie($alias2handle);
+ if ($hirachie ne "ow") {
+ &write_file("data/ban");
+ print DATEI "$alias2handle\n";
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> wurde soeben verbannt und kann sich nun nichtmehr in den Chat einloggen !</font>");
+ &log("system","\"ow_ban_".$alias2handle."_ok\"");
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> ist ein Oberwächter und kann deshalb nicht verbannt werden !</font></font>");
+ &log("system","\"ow_ban_".$alias2handle."_ow\"");
+ }
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> konnte nicht \"entbannt\" werden, da <font color=ffa500>$alias2handle</font> garnicht verbannt war !</font></font>");
+ }
+ }
+#############>- IP # VON ALIAS ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "ip") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ my $alias2prove = $cmd[1];
+ &list_dir("data/online/ident");
+ foreach(@dir) {
+ if ($_ eq $alias2prove) {
+ &read_file("data/online/ident/$_");
+ local $ipnr = <DATEI>;
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$_ <font color=ffffff>hat die IP-Nummer $ipnr !</font></font>");
+ }
+ }
+ }
+#############>- ALIAS AUS DEM CHAT KATAPULTIEREN -<
+ } elsif ($cmd eq "k") {
+ &hirachie($alias);
+ if ($hirachie eq "wa" || $hirachie eq "ow") {
+ my $alias2kick = $cmd[1];
+ &list_dir("data/online/rooms");
+ foreach $raum (@dir) {
+ &list_dir("data/online/rooms/$raum",2);
+ foreach $chatter (@dir2) {
+ if ($chatter eq $alias2kick) {
+ &hirachie($alias2kick);
+ if ($hirachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist Oberwächter und kann nicht \"gekickt\" werden !</font></font>");
+ &log("system","wa_k_$alias2kick_ow"); #!!
+ } elsif ($hirachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist Wächter und kann nicht \"gekickt\" werden !</font></font>");
+ &log("system","wa_k_$alias2kick_ow"); #!!
+ } else {
+ &post_prv("$alias2kick","<script language=\"JavaScript\">window.open(\"index.pl?tmp=kick\",\"_top\");</script>");
+ &zeit;
+ $_ = undef if ($room eq $_);
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias katapultiert \"$alias2kick\" aus dem Chat ...</font></i>",$_);
+ &log("system","wa_k_$alias2kick"); #!!
+ &remove_online($alias2kick,$_,"kick");
+ &secure_removeip($alias2kick);
+ }
+ &input_html("true");
+ exit;
+ }
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist nicht anwesend und kann nicht \"gekickt\" werden !</font></font>");
+ }
+#############>- SYSTEMNACHRICHT IN ALLE BESTEHENDEN RÄUME POSTEN -<
+ } elsif ($cmd eq "sys") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $sys_msg = $sys_msg." ".$cmd[$i];
+ }
+ &zeit;
+ &post_all("<i><font color=ffffff>($hours:$min:$sec)</font></i> <b><font size=2 color=red>Systemnachricht von $alias für alle</font></b><i><font color=ffffff>: $sys_msg ...</font></i>");
+ &log("system","\"sys_msg_$room\"");
+ }
+#############>- ALIAS ZUM WÄCHTER ERNNENNEN BZW. ZUM NORMALEN CHATTER DEGRADIEREN -<
+ } elsif ($cmd eq "wa" || $cmd eq "rwa") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ &zeit;
+ my $alias2handle = $cmd[1];
+ if ($cmd eq "wa") {
+ my $anerkennen = "false";
+ &list_dir("data/user/options");
+ foreach(@dir) {
+ if ($_ eq $alias2handle) {
+ $anerkennen = "true";
+ }
+ }
+ if ($anerkennen eq "true") {
+ &hirachie($alias2handle);
+ if ($hirachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff>ist bereits als Wächter eingetragen. Eine erneuerte Eintragung ist nicht möglich!</font></font>");
+ &log("system","\"oh_wa_".$alias2handle."_exists\"");
+ } elsif ($hirachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff>ist schon als Oberwächter eingetragen. Oberwächter können nicht gleichzeitig Wächter sein!</font></font>");
+ &log("system","\"oh_wa_".$alias2handle."_oh-exists\"");
+ } else {
+ &write_file("data/wa");
+ print DATEI $alias2handle."\n";
+ close DATEI;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font><font color=ffa500> $alias ernennt \"$alias2handle\" zum Wächter ...</font></i>");
+ &log("system","\"oh_wa_".$alias2handle."_ok\"");
+ }
+ } else {
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2handle <font color=ffffff>kann nicht zum Wächter ernannt werden da Benutzername nicht existiert!</font></font>");
+ &log("system","\"oh_wa_".$alias2handle."_notexists\"");
+ }
+ } elsif ($cmd eq "rwa") {
+ &read_file("data/wa");
+ my @wafile = <DATEI>;
+ close DATEI;
+ my $aberkennen = "false";
+ foreach(@wafile) {
+ if ($_ ne "$alias2handle\n") {
+ push @newafile,$_;
+ } else {
+ $aberkennen = "true";
+ }
+ }
+ &write_file_new("data/wa");
+ print DATEI @newafile;
+ close DATEI;
+ if ($aberkennen eq "true") {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat \"$alias2handle\" vom Wächter zum normalen Chatter degradiert ...</font></i>");
+ &log("system","\"oh_rwa_".$alias2handle."_ok\"");
+ } else {
+ &post("<font size=2 color=ffa500>$alias2handle <font color=ffffff>konnte der Wächterstatus nicht aberkannt werden da Benutzer kein Wächter ist!</font></font>");
+ &log("system","\"oh_rwa_".$alias2handle."_notexists\"");
+ }
+ }
+ }
+#############>- ENDE DER CHATBEFEHLE -<
+}
+&input_html($reload,$action,$whisper);
+}
+
+sub change_room { # Den Chat-Raum wechseln
+ my ($method,$newroom,$oldroom,$alias2follow) = @_;
+ $room = $oldroom;
+ &secure_checkip($alias); # IP Nummer überprüfen
+ &zeit; # Zeit 'erneuern'
+ if ($method eq "j") {
+ unlink("data/online/rooms/$oldroom/$alias");
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias wechselt in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias kommt aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ &post_prv("$alias","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>Du wechselst aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ } elsif ($method eq "ju") {
+ unlink("data/online/rooms/$oldroom/$alias");
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias folgt \"$alias2follow\" in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias kommt aus dem Raum \"$oldroom\" und folgt \"$alias2follow\" herein nach \"$newroom\" ...</font></i>");
+ &post_prv("$alias","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>Du folgst \"$alias2follow\" aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ }
+ &rm_rooms;
+}
+
diff --git a/0.2.4c/main2.pl b/0.2.4c/main2.pl
new file mode 100644
index 0000000..7691aef
--- /dev/null
+++ b/0.2.4c/main2.pl
@@ -0,0 +1,561 @@
+#!/usr/bin/perl -w
+
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+
+if ($var eq "list_alias_html") {
+ &list_alias_html;
+} elsif ($var eq "alias_html") {
+ &alias_html;
+} elsif ($var eq "edit_profile_html") {
+ &edit_html("edit_profile_html");
+} elsif ($var eq "edit_options_html") {
+ &edit_html("edit_options_html");
+} elsif ($var eq "gb_html") {
+ &gb_html;
+} elsif ($var eq "post_gb") {
+ &post_gb;
+} elsif ($var eq "rm_gb_alias") {
+ &rm_gb;
+} elsif ($var eq "edit_profile") {
+ &edit("edit_profile");
+} elsif ($var eq "edit_options") {
+ &edit("edit_options");
+} else {
+ &error("Parameter fehlt");
+}
+
+###########################
+##HAUPTTEIL DIESER DATEI:##
+###########################
+
+sub gb_html { # Das Benutzerboard/Gästebuch.
+ my $message = $_[0];
+ &start_html("Benutzerboard");
+if ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </i>
+ einen Text und poste
+ <u>dann</u>
+ !
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Vielen Dank für Deinen Beitrag. Wenn Du willst, kannst Du jetzt gleich noch einen Eintrag posten ...
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Falls Du Anregungen oder Verbesserungsvorschläge für die Community hast, dann poste doch einen kleinen Eintrag :-)
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmp" value="guestbook">
+ <input type="hidden" name="id" value="y">
+ <input size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+ if (-e "data/guestbook") {
+ open (DATEI,"<data/guestbook") || &error("Konnte dat/guestbook nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ print
+ $q->div(@datei);
+ }
+ print
+ $q->end_html;
+}
+
+
+sub post_gb { # Wenn etwas in ein Gästebuch eingetragen wird
+ &secure_checkip($alias);
+ &zeit;
+ if ($msg eq "") {
+ if ($id eq "y") { # Überprüfen, ob Benutzerboard- oder Privatgästebuch
+ &gb_html("post_empty");
+ } else {
+ &alias_html("post_empty");
+ }
+ exit;
+ }
+ $msg =~ s#<#&lt\;#g;
+ my $tmpath = "";
+ if ($id eq "y") {
+ $tmpath = "data/guestbook";
+ } else {
+ $tmpath = "data/user/gbooks/$tmp";
+ }
+ if (-e "$tmpath") {
+ &read_file("$tmpath");
+ my @datei = <DATEI>;
+ close DATEI;
+ pop(@datei) if ($#datei > 99);
+ my @newdatei = "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ @newdatei = ("@newdatei", "@datei");
+ &write_file_new("$tmpath");
+ print DATEI @newdatei;
+ close DATEI;
+ } else {
+ &write_file_new("$tmpath");
+ print DATEI "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ close DATEI;
+ }
+ if ($id eq "y") {
+ &gb_html("post_ok");
+ exit;
+ } else {
+ post_prv("$tmp","<font size=2 color=ffffff><a href=\"main2.pl?alias=$alias&var=alias_html&tmp=$alias\" target=\"_new\">$alias</a> hat soeben einen Pin in <a href=\"main2.pl?alias=$alias&var=alias_html&tmp=$tmp\" target=\"_new\">Dein Profil</a> gehängt ... </font>");
+ &alias_html;
+ exit;
+ }
+}
+
+sub rm_gb { # Gästebucheintrag entfernen
+ &secure_checkip($alias);
+ $tmp = $alias;
+ &read_file("data/user/gbooks/$alias");
+ my @gbfile = <DATEI>;
+ close DATEI;
+ my @newgbfile = ();
+ for($i=0; $i <= $#gbfile; $i++) {
+ push(@newgbfile,$gbfile[$i]) if ($i != $id);
+ }
+ &write_file_new("data/user/gbooks/$alias");
+ print DATEI @newgbfile;
+ close DATEI;
+ &alias_html("rm_ok");
+}
+
+sub list_alias_html { # Liste aller Benutzer
+ &start_html("Alle Benutzer");
+ &list_dir("data/user/options");
+ my @liste = sort(@dir);
+ my $nr = $#dir-1;
+print <<END;
+ <div>
+ Es sind z.Z. genau $nr Benutzernamen in der Datenbank vorhanden! (Sortiert nach #, A-Z, a-z)
+ </div>
+ <hr>
+ <div>
+END
+ foreach(@liste) {
+ if (-f "data/user/options/$_") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_" },
+ "$_"),
+ " ";
+ }
+ }
+print <<END;
+ </div>
+</body>
+</html>
+END
+}
+
+sub alias_html { # Anzeigen eines Benutzerprofils
+ my $message = $_[0];
+ local $counter = undef;
+ &read_file("data/user/counts/$tmp");
+ $counter = <DATEI>;
+ close DATEI;
+ $counter++;
+ &write_file_new("data/user/counts/$tmp");
+ print DATEI $counter;
+ close DATEI;
+ &start_html($tmp);
+print <<END;
+<div>
+ <a href="htdocs.pl?var=werda_html&alias=$alias">Hier</a>
+ gehts zur Gesamtübersicht !
+</div>
+<hr>
+END
+if ($message eq "rm_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Der von Dir gewählte Eintrag wurde erfolgreich gelöscht.
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </u>
+ einen Text und poste
+ <u>dann</u>
+ !
+ <hr>
+END
+}
+ &read_file("data/user/profiles/$tmp");
+ @data = <DATEI>;
+ close DATEI;
+print <<END;
+ <div>
+ Dieses Profil wurde insgesamt schon $counter mal aufgerufen !
+ <br>
+ <br>
+ Alias: $tmp
+ <br>
+ <br>
+ Geschlecht: $data[0]
+ <br>
+ <br>
+ BH größe *g*: <b>$data[1]</b>
+ <br>
+ <br>
+ Nachname: $data[2]
+ <br>
+ <br>
+ Vorname: $data[3]
+ <br>
+ <br>
+ Alter: $data[4]
+ <br>
+ <br>
+ Land: $data[5]
+ <br>
+ <br>
+ Wohnort: $data[6]
+ <br>
+ <br>
+ E-Mail:
+ <a href="mailto:$data[7]">$data[7]</a>
+ <br>
+ <br>
+ ICQ-Nummer: $data[8]
+ <br>
+ <br>
+ Homepage:
+ <a href="$data[9]" target="_new">$data[9]</a>
+ <br>
+ <br>
+ Sternzeichen:
+ $data[10]
+ <br>
+ <br>
+ Weiteres:
+ <br>
+ <br>
+ $data[11]
+ <hr>
+ Hier kannst Du $tmp eine Nachricht hinterlassen!
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input type="text" size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+if (-e "data/user/gbooks/$tmp") {
+ open (DATEI,"<data/user/gbooks/$tmp") || &error("Konnte data/user/gbooks/$tmp nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ if ($alias ne $tmp) {
+ print @datei;
+ } else {
+print <<END;
+ <table>
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="rm_gb_alias">
+ <input type="hidden" name="alias" value="$alias">
+END
+for($i=0; $i <= $#datei; $i++) {
+print <<END;
+ <tr>
+ <td>
+ <input type="radio" name="id" value="$i">
+ </td>
+ <td>
+ <div class=q>
+ $datei[$i]
+ </div>
+ </td>
+ </tr>
+END
+}
+print <<END;
+ </table>
+ <table>
+ <tr>
+ <td>
+ <font color=ffffff>
+ <input type="submit" value="Makierten Eintrag löschen">
+ </font>
+ </td>
+ <td>
+ <font color=ffffff>
+ <input type="reset" value="Makierung rückgängig machen">
+ </font>
+ </td>
+ </tr>
+ </table>
+ </form>
+END
+}
+}
+ print
+ $q->end_html;
+}
+
+sub edit_html { # Chat-Optionen / Benutzerprofil editieren
+ my ($method,$message) = @_;
+ &secure_checkip($alias);
+ &start_html("Benutzerprofil ändern");
+ if ($method eq "edit_options_html") {
+ &read_file("data/user/options/$alias");
+ } elsif ($method eq "edit_profile_html") {
+ &read_file("data/user/profiles/$alias");
+ }
+ @data = <DATEI>;
+ close DATEI;
+ if ($method eq "edit_options_html") {
+ chomp($data[0]);
+ if ($message eq "edit_options_ok") {
+print <<END;
+<script language="JavaScript">
+ open("main.pl?var=input_html&alias=$alias&room=$room&col=$col&secol=$secol","input");
+ open("htdocs.pl?var=menu_html&alias=$alias&room=$room&col=$col&secol=$secol","menu");
+</script>
+<div class=b>
+ Hinweis:
+</div>
+<div>
+ Du hast soeben Deine Chat-Optionen erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren. Um
+ weiterzuchatten einfach auf <a href="push.pl?alias=$alias&room=$room">Weiterchatten</a> klicken.
+</div>
+<hr>
+END
+ } elsif ($message eq "edit_pw_wrong") {
+print <<END;
+<div class=b>
+ ACHTUNG!
+</div>
+<div>
+ Du hast soeben versucht, dein Passwort zu ändern. Jedoch stimmte die Erste Eingabe nicht mit der Zweiten überein.
+ Bitte versuch es erneuert ...
+</div>
+<hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Deine Chat-Optionen editieren!" ),
+ $q->hr;
+ }
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="var" value="edit_profile">
+ <br>
+ <div>
+ Geschlecht:
+ <br>
+<select NAME="mw" size="1">
+ <option selected value="$data[0]">$data[0]</option>
+ <option value="Männlich">Männlich</option>
+ <option value="Weiblich">Weiblich</option>
+ </select>
+ </div>
+<br>
+ <div>
+ BH größe *fg* (<b>Nur Angeben wenn Weiblich gewählt</b>):
+ <br>
+ <input name="bh" value="$data[1]">
+ </div>
+<br>
+<div>
+ Dein Nachname:
+ <br>
+ <input name="nachname" value="$data[2]">
+ </div>
+ <br>
+ <div>
+ Dein Vorname:
+ <br>
+ <input name="vorname" value="$data[3]">
+ </div>
+ <br>
+ <div>
+ Dein Alter:
+ <br>
+ <input name="alter" value="$data[4]">
+ </div>
+ <br>
+ <div>
+ Wohnort:
+ <br>
+ <select NAME="wohnort" size="1">
+<option selected value="$data[5]">$data[5]</option>
+<option value="Wohnsitz nicht in Deutschland">Wohnsitz nicht in Deutschland</option>
+<option value="Baden-W&uuml;rttemberg">Baden-Württemberg</option>
+<option value="Bayern">Bayern</option>
+<option value="Berlin">Berlin</option>
+<option value="Brandenburg">Brandenburg</option>
+<option value="Bremen">Bremen</option>
+<option value="Hamburg">Hamburg</option>
+<option value="Hessen">Hessen</option>
+<option value="Mecklenburg-Vorpommern">Mecklenburg-Vorpommern</option>
+<option value="Niedersachsen">Niedersachsen</option>
+<option value="Nordrhein-Westfalen">Nordrhein-Westfalen</option>
+<option value="Rheinland-Pfalz">Rheinland-Pfalz</option>
+<option value="Saarland">Saarland</option>
+<option value="Sachsen">Sachsen</option>
+<option value="Sachsen-Anhalt">Sachsen-Anhalt</option>
+<option value="Schleswig-Holstein">Schleswig-Holstein</option>
+<option value="Th&uuml;ringen">Thüringen</option>
+ </select>
+ </div>
+<br>
+ <div>
+ Land:
+ <br>
+<select NAME="land" size="1">
+<option selected value="$data[6]">$data[6]</option>
+<option value="Deutschland">Deutschland </option>
+<option value="Österreich">Österreich </option>
+<option value="Schweiz">Schweiz </option>
+<option value="Liechtenstein">Liechtenstein </option>
+<option value="Wohne in einem anderen Land"> Wohne in einem anderen Land </option>
+ </select>
+ </div>
+ <br>
+ <div>
+ Deine E-Mail Adresse:
+ <br>
+ <input name="email" value="$data[7]">
+ </div>
+ <br>
+ <div>
+ Deine ICQ-Nummer:
+ <br>
+ <input name="icq" value="$data[8]">
+ </div>
+ <br>
+ <div>
+ Deine Homepage:
+ <br>
+ <input name="homepage" value="$data[9]">
+ </div>
+ <br>
+ <div>
+ Sternzeichen:
+ <br>
+<select NAME="stern" size="1">
+ <option selected value="$data[10]">$data[10]</option>
+ <option value="Wassermann">Wassermann</option>
+ <option value="Löwe">Löwe</option>
+ <option value="Widder">Widder</option>
+ <option value="Zwillinge">Zwillinge</option>
+ <option value="Stier">Stier</option>
+ <option value="Waage">Waage</option>
+ <option value="Fische">Fische</option>
+ <option value="Krebs">Krebs</option>
+ <option value="Jungfrau">Jungfrau</option>
+ <option value="Skorpion">Skorpion</option>
+ <option value="Schütze">Schütze</option>
+ <option value="Steinbock">Steinbock</option>
+ </select>
+ </div>
+ <br>
+ <div>
+ Weiteres:
+ <br>
+ <textarea rows="5" cols="40"name="weiteres" wrap="virtual">$data[11]</textarea>
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <font color=ffffff>
+ <input type="submit" value="Daten ändern ...">
+ </font>
+ </form>
+</body>
+</html>
+END
+}
+
+
+sub edit { # Benutzerprofil od. Chat-Optionen abspeichern
+ &secure_checkip($alias);
+ my $method = $_[0];
+ if ($method eq "edit_profile") {
+ &write_file_new("data/user/profiles/$alias");
+ print DATEI
+ $q->param('mw')."\n"
+.$q->param('bh')."\n"
+.$q->param('nachname')."\n"
+.$q->param('vorname')."\n"
+.$q->param('alter')."\n"
+.$q->param('wohnort')."\n"
+.$q->param('land')."\n"
+.$q->param('email')."\n"
+.$q->param('icq')."\n"
+.$q->param('homepage')."\n"
+.$q->param('stern')."\n"
+.$q->param('weiteres');
+ close DATEI;
+ &log("system","\"edit_profile_ok\"");
+ &edit_html("edit_profile_html","edit_profile_ok");
+ } elsif ($method eq "edit_options") {
+ if ($id ne $tmp) {
+ &log("system","\"edit_pw_wrong\"");
+ &edit_html("edit_options_html","edit_pw_wrong");
+ exit;
+ }
+ &secure_checkip($alias);
+ &write_file_new("data/user/options/$alias");
+ print DATEI $id."\n".$col."\n".$secol;
+ close DATEI;
+ &log("system","\"edit_options_ok\"");
+ &edit_html("edit_options_html","edit_options_ok");
+ }
+}
diff --git a/0.2.4c/online.pl b/0.2.4c/online.pl
new file mode 100644
index 0000000..2e8bf8d
--- /dev/null
+++ b/0.2.4c/online.pl
@@ -0,0 +1,52 @@
+#!/usr/bin/perl -w
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+&secure_checkip($alias);
+&start_html("Online","online");
+&online($alias,$room);
+&list_dir("data/online/rooms/".$room);
+print
+ $q->div( "$room:" ),
+ "<font size=1 color=ffffef face=arial>";
+ foreach $online (@dir) {
+ if (-f "data/online/rooms/$room/$online") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$online",
+ -target=>"$online" }, "$online"), $q->br;
+ }
+ }
+print
+ "</font>",
+ $q->end_html;
+
+sub online { # Benutzer in die Onlineliste hinzufügen bzw. erneuern
+ my ($alias,$room) = @_;
+ &write_file_new("data/online/users/$alias");
+ print DATEI time;
+ close DATEI;
+ if (-e "data/online/rooms/$room") {
+ } else {
+ mkdir "data/online/rooms/$room", 0777;
+ }
+ &write_file_new("data/online/rooms/$room/$alias");
+ print DATEI time;
+ close DATEI;
+ &read_file("data/online/prove"); # Räume und Chatter auf Existenz überprüfen
+ my $provetime = <DATEI>;
+ close DATEI;
+ if ($provetime < (time - 30)) {
+ &write_file_new("data/online/prove");
+ print DATEI time;
+ close DATEI;
+ &rm_alias("data/online/users");
+ &rm_rooms;
+ }
+}
+
diff --git a/0.2.4c/push.pl b/0.2.4c/push.pl
new file mode 100644
index 0000000..af96017
--- /dev/null
+++ b/0.2.4c/push.pl
@@ -0,0 +1,96 @@
+#!/usr/bin/perl -w
+use CGI;
+#use CGI qw/:push -nph/;
+CGI->compile(':all');
+$q = new CGI;
+
+
+print
+ $q->header; # HTML-Header erzeugen
+
+require config;
+
+&secure_checkip($alias);
+
+########################################
+##ANFANG DER ZU STREAMENDEN HTML-DATEI##
+########################################
+
+print <<END;
+<html>
+ <head>
+<script language="JavaScript">
+<!--
+// Scroll-Routine von Anklepper (http://www.anklepper.de)
+// speziell für yChat (http://www.yChat.de), Copyright 2000
+scrolling = true;
+moves_steps = 4; // Schrittgröße
+moves_interval = 4; // Schrittgeschwindigkeit
+
+function moves()
+{
+ if( scrolling != false )
+ window.scrollBy( 0, moves_steps );
+ window.setTimeout( "moves()", moves_interval );
+}
+
+moves();
+//-->
+</script>
+ </head>
+<body bgcolor=000000 link=FFFFFF alink=FFFFEF vlink=FFFFEF>
+END
+
+$| = 1; # Cache von Perl ausschalten
+
+#############################
+##BEGRÜSSUNGSTEXT SCHREIBEN##
+#############################
+
+my $msgfile;
+
+ print
+ $q->font( { -size=>1,
+ -color=>"ffffff",
+ -face=>"arial"},
+ "$title Copyright by Paul C. Bütow 2k $tmp\n");
+
+if ($var eq "push_logs_html") {
+ $msgfile = $tmp;
+ print "<hr><font size=2 color=ffffff face=arial>";
+} elsif ($var eq "clear_screen") {
+ $msgfile = "data/msgs/$alias";
+ &write_file_new($msgfile);
+ print DATEI $q->br;
+ close DATEI;
+} else {
+ $msgfile = "data/msgs/$alias";
+ print $q->br;
+}
+
+open (MSGFILE, $msgfile);
+
+###############################
+##ENDLOSSCHLEIFE FÜR DEN PUSH##
+###############################
+
+my ($times,$online) = (0,"false");
+for (;;) {
+ for ($curpos = tell(MSGFILE); <MSGFILE>; $curpos = tell(MSGFILE)) {
+ print $_ ;
+ }
+ $times++;
+ if ($times > 14) { # Nach 15 Sekunden
+ print "\n<!--PING//-->"; # Ping zum Browser senden
+ $times = 0; # Sekundenzahl auf 0 zurücksetzen
+ $online = "true" if (-e "data/online/users/$alias");
+ if ($online eq "false") {
+ print "<font size=2 color=red>Aus technischen Gründen bitte auf <a href=\"push.pl?alias=$alias&room=$room&var=clear_screen\">Weiterchatten</a> klicken.</font>";
+ exit;
+ }
+ $online = "false"
+ }
+ sleep 1;
+ seek(MSGFILE, $curpos, 0); # Position wiederherstellen
+}
+
diff --git a/0.2.4c/setup.sh b/0.2.4c/setup.sh
new file mode 100644
index 0000000..c5e369e
--- /dev/null
+++ b/0.2.4c/setup.sh
@@ -0,0 +1,42 @@
+#!/bin/sh
+mkdir data
+mkdir data/logs
+chmod 777 data/logs
+mkdir data/msgs
+chmod 777 data/msgs
+mkdir data/logs/ow
+chmod 777 data/logs/ow
+mkdir data/user
+chmod 777 data/user
+mkdir data/user/counts
+chmod 777 data/user/counts
+mkdir data/user/options
+chmod 777 data/user/options
+mkdir data/user/profiles
+chmod 777 data/user/profiles
+mkdir data/user/gbooks
+chmod 777 data/user/gbooks
+mkdir data/online
+chmod 777 data/online
+mkdir data/online/rooms
+chmod 777 data/online/rooms
+mkdir data/online/users
+chmod 777 data/online/users
+mkdir data/online/ident
+chmod 777 data/online/ident
+mkdir data/htdocs
+chmod 777 data/htdocs
+mv help_html data/htdocs
+mv logs_html data/htdocs
+chmod 777 data/htdocs/*
+chmod 777 *
+mkdir dokus/
+mv *.txt dokus/
+mkdir ../../htdocs/yChat/
+mv *.gif ../../htdocs/yChat/
+mv *.jpg ../../htdocs/yChat/
+echo
+echo yChat Setup beendet ...
+echo Created and copyrighted by Paul C. Bütow aka Snooper
+echo
+rm setup.sh
diff --git a/0.2.4c/unten.gif b/0.2.4c/unten.gif
new file mode 100644
index 0000000..285fb53
--- /dev/null
+++ b/0.2.4c/unten.gif
Binary files differ
diff --git a/0.2.4c/yBanner.gif b/0.2.4c/yBanner.gif
new file mode 100644
index 0000000..e4b691e
--- /dev/null
+++ b/0.2.4c/yBanner.gif
Binary files differ
diff --git a/0.2.4c/yChat.jpg b/0.2.4c/yChat.jpg
new file mode 100644
index 0000000..61eabfb
--- /dev/null
+++ b/0.2.4c/yChat.jpg
Binary files differ
diff --git a/0.2.5a2/INSTALL.txt b/0.2.5a2/INSTALL.txt
new file mode 100644
index 0000000..77c4628
--- /dev/null
+++ b/0.2.5a2/INSTALL.txt
@@ -0,0 +1,103 @@
+#############################################################################
+## yChat.de Version 0.2.5 by CXG.de: The chatters of the next generation ##
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+yChat findest Du im Internet unter der Adresse www.yChat.de. Bei Kritik,
+Anregungen oder Fragen bitte in das dort vorhandene Board posten oder eine
+E-Mail an die oben stehende Adresse senden. Ich bemühe mich, yChat so gut wie
+möglich zu machen und bin über Ratschläge immer sehr erfreut :-) ...
+
+Die Installation kann auf Unix-Systemen voll automatisch duchgeführt werden.
+Allerdings ist dafür ein Telnet-Zugang notwendig. Kopiere alle vorhandenen
+Dateien in das Verzeichnis cgi-bin/yChat und führe dann das Shellskript
+setup.sh mit dem Befehl ./setup.sh aus. Alle Verzeichnisse werden
+automatisch erstellt. Dies wurde allerdings nur auf SuSE Linux Systemen
+mit root-Zugriff getestet. Solltest Du ein anderes System verwenden oder
+den Chat auf einen virtuellen Webserver installieren wollen, dann mußt Du
+unter umständen das Verzeichnis "../../htdocs/yChat" nach "../../yChat"
+in der setup.sh umbenennen. Ansonsten werden die dazugehörigen Grafikdateien
+falsch oder garnicht kopiert.
+
+Wenn Du keinen Telnet-Zugang hast, kannst Du hier die Verzeichnisse manuell
+erstellen:
+
+Folgende Basis-Dateien sind im Chat enthalten und müssen in das cgi-bin
+Verzeichnis kopiert werden. Z.B. nach ./cgi-bin/yChat/:
+
+config.pm => Configurationsdatei ("Shared subs")
+htdocs.pl => HTML-Dokumentdateien (Nicht unbedingt erforderlich)
+index.pl => Startskript (Registrierung, Frameset, Login, Daten edit.)
+main.pl => Hauptskript (Alle Hauptfunktionen des Chats)
+main2.pl => Skript für editieren der Benutzerdaten etc.
+online.pl => Anzeige und Überprüfung der eingelogten Benutzer
+push.pl => Server-Push-Routine
+setup.sh => Dient zur automatischen Einrichtung des Chats.
+LIESMICH.txt => Beinhaltet wichtige Informationen
+UPDATES.txt => Updateliste der verschiedenen Versionen
+INSTALL.txt => Dieses Dokument
+help.sno => Datei beinhaltet alle Chatbefehle
+
+Folgende Verzeichnisse müssen erstellt werden (chmod 777 sollte
+funktionieren):
+
+- Hier befinden sich alle für den Chat notwenidgen Daten:
+ ./cgi-bin/yChat/data/*
+
+- Hier befinden sich alle Logdateien, die vom Chat erstellt werden:
+ ./cgi-bin/yChat/data/logs/*
+
+- Hier befinden sich die Message-Dateien der eingelogten Benutzer:
+ ./cgi-bin/yChat/data/msgs/*
+
+- Hier befinden sich alle Daten der registrierten Benutzer:
+ ./cgi-bin/yChat/data/user/*
+
+- Hier wird abgespeichert, wie oft ein Benutzerprofil insgesant schon
+ aufgerufen wurde:
+ ./cgi-bin/yChat/data/user/counts/*
+
+- Hier befinden sich alle Chat-Optionen und Passwörter der registrierten
+ Benutzer:
+ ./cgi-bin/yChat/data/user/options/*
+
+- Hier befinden sich alle Benutzerprofile der Benutzer:
+ ./cgi-bin/yChat/data/user/profiles/*
+
+- Hier befinden sich alle Gästebucheinträge der Benutzer:
+ ./cgi-bin/yChat/data/user/gbooks/*
+
+- Hier wird Protokolliert, wann sich die Benutzer zum letzten mal eingelogt haben:
+ ./cgi-bin/yChat/data/user/lastlogin/*
+
+- Hier befinden sich alle Daten zu den aktuellen Chaträumen und User die online sind
+ ./cgi-bin/yChat/data/online/*
+
+- Hier befinden sich alle offnenen Räume
+ ./cgi-bin/yChat/data/online/rooms/*
+
+- Hier befinden sich die Chatter, die sich in den jew. Räumen befinden. Die
+ Verzeichnisse der Räume werden automatisch erstellt.
+ ./cgi-bin/yChat/data/online/rooms/RAUMNAME/*
+
+- Hier befinden sich alle Chatter, die sich z.Z. im System befinden
+ ./cgi-bin/yChat/data/online/users/*
+
+- Hier befinden sich alle IP-Nummern der eingelogten Chatter
+ ./cgi-bin/yChat/data/online/ident/*
+
+Folgende GRafikdateien sollten in ein nicht-CGI-BIN-Verzeichnis kopiert werden. Z.B.
+nach ./yChat/
+
+ bar.gif => Der gelb gestreifte Rand auf den meisten Seiten
+ unten.gif => Der Hintergrund für das Eingabeformular im Chat
+ yChat.gif => Das yChat-Logo auf der Startseite
+ yBanner.gif => 400x40 yChat-Banner
+ yBanner2.gif => 88x31 yChat-Banner
+
+Zum schluß sollte die config.pm-Datei nach wünschen editiert werden. Allerdings sollten
+die Copyright Hinweise und die Versionsnummern nicht manipuliert werden.
+
+Folgende Dateien werden von yChat automatisch erstellt:
+
+Viel Spaß beim Chatten ...
+ Snooper \ No newline at end of file
diff --git a/0.2.5a2/LIESMICH.txt b/0.2.5a2/LIESMICH.txt
new file mode 100644
index 0000000..1bfe3d9
--- /dev/null
+++ b/0.2.5a2/LIESMICH.txt
@@ -0,0 +1,45 @@
+#############################################################################
+## yChat.de Version 0.2.5 by CXG.de: The chatters of the next generation ##
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+Allgemeine Bedingungen bezgl. yChat:
+
+ - Das yChat-System darf ohne Erleubnis des Autors nicht auf irgendeiner Art
+ und Weise weitergegeben- oder eingesetzt werden.
+
+ - Wird das yChat-System eingesetzt, so darf es manipuliert werden, soweit
+ die Copyright-Hinweise des Autors, die Versionsbezeichnung und der Link
+ auf der Startseite nach servers.yChat.de unverändert bleibt.
+ Ansonsten darf der gesamte Code manipuliert werden.
+
+ - Wird das yChat-System erlaubter Weise manipuliert, so muß das veränderte
+ Skript auf Anforderung an den Autor weitergegeben werden. Dieser darf
+ die Veränderungen in das Standard-yChat-System integrieren.
+
+ - Wird das yChat-System eingesetzt, su muß dem Autor die Location bzw. die
+ URL bekanntgegeben werden. Diese wird in servers.yChat.de eingetragen.
+ und mit einer URL wwX.yChat.de verlinkt. Wobei X für die Nummer des jew.
+ Servers steht.
+
+ - Es ist verboten, Sourcecode aus dem yChat-System zu kopieren und
+ für andere, nicht von yChat abhängige Perl-Programme einzusetzen.
+
+Im Flogenden einige yChat-bezügl. Verknüpfungen:
+
+ www.servers.yChat.de => Liste aller laufenden yChat-Systeme
+ www.install.yChat.de => Installationsdokumentation
+ www.liesmich.yChat.de => Allgemeine Bedingungen usw.
+ www.todo.yChat.de => Funktionen, die später integriert werden
+ www.updates.yChat.de => Update-Liste
+ www.yChat.de => Das Skript zum testen
+
+Vielen Dank an:
+
+ - Andreas Buchwald für die Programmierung des "Nach-UntenScroll-JavaScripts"
+ (www.anklepper.de).
+
+ - Michi aka Snoopy für die Erstellung und Anregung der Farbtabelle
+ (www.berlin-singeltreff.de).
+
+ - Peacemaker für die Erstellung des yChat-Logos
+ (www.peaceplace.de).
diff --git a/0.2.5a2/TODO.txt b/0.2.5a2/TODO.txt
new file mode 100644
index 0000000..80440ce
--- /dev/null
+++ b/0.2.5a2/TODO.txt
@@ -0,0 +1,27 @@
+Folgende Funktionen werden demnächst in yChat integriert:
+
+ - Die Schlucht (Ein Raum wo Chatter hineingeworfen werden,
+ die sich nicht benehmen und noch nicht aus dem Chat
+ katapultiert werden sollen).
+
+ - Löschung aller Chatter, die sich seit 60 Tagen nicht mehr
+ eingelogt haben.
+
+ - IP-Adressen ver-/entbannen.
+
+ - E-Mail zusendung bei verlorenem Passwort.
+
+ - Totale Onlinezeit der einzelnen Chatter soll protokolliert
+ werden. Daraus wird dann eine Top20 der Chatter erstellt.
+
+ - Unter "Benutzer" sollen Chatter über eine Eingabemaske nach
+ dem Anfangsbuchstaben gesucht werden können (vergl. Kilahu).
+
+ - Java-Applet-Eingabezeile für einen flüssigeren Chat
+
+ - Der Cybarkeeper (künstlich intilligenter Chatroboter, der
+ sich im Hauptraum Cyberbar aufhält, virtuelle Drinks verteilt
+ und von Real-Chattern übernommen werden kann. (Zukunftsmusik)
+
+Für weitere Vorschläge bitte in das yChat-Board unter www.yChat.de
+texten oder eine E-Mail an paul@buetow.oxg.de :-) \ No newline at end of file
diff --git a/0.2.5a2/UPDATES.txt b/0.2.5a2/UPDATES.txt
new file mode 100644
index 0000000..f746a96
--- /dev/null
+++ b/0.2.5a2/UPDATES.txt
@@ -0,0 +1,75 @@
+########################### yChat.de UPDATE LIST ###########################
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+Hier sind alle Erneuerungen der Versionen dokumentiert:
+
+Update von 0.2.4 auf 0.2.5 vom 15.12.2k
+ - Derjenige, der einen Raum zuerst betritt, hat Raumbesetzerrechte.
+ - Raumbesetzer, Wächter und Oberwächte können weitere Raumbesetzer
+ bestimmen. Diese können Raumbeseter auch wieder degradieren.
+ - Raumbesetzer, Wächter und Oberwächter können dem aktuellen Raum
+ auf/absperren und Themen geben. Wächter und Oberwächter können
+ abgesperrte Räume betreten.
+ - Das Verzeichnis ".data/htdocs" wurde entfernt. Die Datei help_html
+ heist nun help.sno und befindet sich im yChat-Hauptverzeichnis.
+ - Das Verzeichnis ".data/user/lastlogin" wurde hinzugefügt. Hier
+ wird beim erfolgreichen Einloggen ein "Timestamp" gesetzt. Später
+ sollen Oberwächter "veraltete" Benutzer entfernen können.
+ - Neuer Oberwächterbefehl: "/kill Alias" entfernt Alias ganz und gar
+ vom System. Oberwächter und Wächter können nicht entfernt werden.
+ - Perl-Cache wurde im gesamten System komplett deaktiviert ( Weniger
+ Ladezeiten der HTML-Dokumente ).
+ - Nur Nachrichten aus dem Raum "Cyberbar" werden gelogt.
+ Selbsterstellte Räume werden nichtmehr gelogt. Viele Logfunktionen
+ wurden entfernt (weniger Serverbalast).
+ - Beseitigung einiger kleinen Bugs.
+ - Unter "Optionen" im Chat wir die Farbe nun mit einem Drop-Down-Menü
+ ausgewählt ( Vielen dank an Michi aka Snoopy ).
+ - Auf der Startseite wird nun angezeigt wieviele Benutzer eingelogt
+ sind. Ist keiner eingelogt, dann wird das System "aufgeräumt". D.h.
+ Dateien die nicht mehr gebraucht werden und noch nicht gelöscht
+ wurden werden entfernt ( z.B. Nachrichtendateien der einzelnen
+ Chatter und die Dateien die die IP-Nummern der eingelogten Benutzer
+ beinhalteten usw.).
+ - Hunzufügung einer TODO-Liste. Hier sind mehrere Funktionen
+ vermerkt, die in späteren yChat-Versionen eingebaut werden sollen.
+ (www.todo.yChat.de oder TODO.txt).
+
+Update von 0.2.3 auf 0.2.4 - 30.11.2k
+ - Optimierung bzw. Verbesserung der Push-Routine push.pl.
+ - Server-Ping wurde von 2-Pings-per-Minute auf 4 erhöht.
+ - yChat-Banner wurde erstellt und ist unter
+ documents.yChat.de/yBanner.jpg vorzufinden.
+ - Unter der URL servers.yChat.de wurde eine Serverliste angelegt,
+ welche anzeigt wo yChat-Systeme laufen.
+ - Des weiteren wurden die URLs updates.yChat.de, install.yChat.de
+ und liesmich.yChat.de eingerichtet.
+ - Die Menüpunkte wurden zusammengefaßt, damit sie unter einer
+ Auflösung von 800x600 nur eine Zeile belegen.
+ - Einige Bugs wurden entfernt.
+
+Update von 0.2.2 auf 0.2.3 - 25.11.2k
+ - Smooth scrolling JavaScript ( Vielen Dank an Andreas Buchwald ).
+ - "IP#-Fehler" wurde so gut wie beseitigt.
+ - Aufrufe der einzelnen Benutzerprofile wird gezählt und angezeigt.
+ Diese werden in data/user/counts/* gespeichert.
+ - Automatische Einrichtung des Chats mit setup.sh und Telnet.
+ - Menüpunkt "Dein Profil" wurde entfernt da eigenes Profil auch
+ stets über die Onlineliste aufgerufen werden kann.
+
+Update von 0.2.1 auf 0.2.2 - 23.11.2k
+ - Einige Bugs wurden entfernt.
+ - Geschwindigkeit des Chats wurde optimiert.
+ - Eine Liste aller eingelogten Benutzer erscheint am Rand. Hierfür
+ wurde die Datei online.pl eingeführt. Sie aktuallisiert sich alle
+ 20 Sekunden.
+ - Die UPDATES.txt wurde eingeführt.
+
+Update von 0.2.0 auf 0.2.1
+ - Einige Bugs wurden entfernt.
+ - Die IP# der eingelogten Benutzer werden nun anders verwaltet.
+
+Update von Alpha XVIII auf 0.2.0
+ - Die Handhabung der eingelogten Benutzer im System wurde komplett neu
+ überarbeitet.
+ - Neue Versionsnumern wurden eingeführt. \ No newline at end of file
diff --git a/0.2.5a2/bar.gif b/0.2.5a2/bar.gif
new file mode 100644
index 0000000..61d02b7
--- /dev/null
+++ b/0.2.5a2/bar.gif
Binary files differ
diff --git a/0.2.5a2/config.pm b/0.2.5a2/config.pm
new file mode 100644
index 0000000..029394a
--- /dev/null
+++ b/0.2.5a2/config.pm
@@ -0,0 +1,320 @@
+# yChat - Copyright by Paul C. Bütow
+
+########################### Dieser Teil bestimmt die Standart-Variabeln.
+##STANDART-CONFIGURATION:## (CSS, Farben, Version etc.)
+###########################
+$alias = $q->param("alias");
+$var = $q->param("var");
+$room = $q->param("room");
+$col = $q->param("col");
+$secol = $q->param("secol");
+$msg = $q->param("msg");
+$tmp = $q->param("tmp");
+$id = $q->param("id");
+$room = "Cyberbar" if ($room eq "");
+$col = "ffffef" if ($col eq "");
+$secol = "ffffef" if ($secol eq "");
+$datum = "16.12.2k";
+$version = "0.2.5a2";
+$title = "yChat.de ($version)";
+$gfxpath = "../../yChat/";
+$style = <<ENDCSS;
+<style rel="stylesheet" type="text/css">
+ body { background-image: url("$gfxpath/bar.gif"); background-color: 000000 }
+ body.menu { background-image: none }
+ body.log { background-color: 000000 }
+ body.online { background-color: 444444; background-image: none }
+ div { font-family: arial, verdana, helvetiva; font-size: 10pt; color: ffffff }
+ div.b { font-weight: bold; color: ffa500 }
+ a { color: ffffef }
+ a:hover { color: ffffff; text-decoration: none }
+</style>
+ENDCSS
+
+############### Dieser Teil enthält Programmcode, der an verschiedenen
+##SHARED-SUBS## Stellen ausgeführt werden muß und jedem Skript zur
+############### Verfügung steht.
+
+sub printfile { # Liest eine externe Datei ein und gibt sie mit print aus
+ my ($file2print,$pagetitle,$bodyclass) = @_;
+ if ($pagetitle ne "") {
+ &start_html($pagetitle,$bodyclass);
+ }
+ print "<div><a href=\"push.pl?alias=$alias&tmp=$tmp&var=push_logs_html\">Push</a></div><hr>" if ($bodyclass eq "log");
+ &read_file($file2print);
+ @file2print = <DATEI>;
+ close DATEI;
+ print @file2print;
+}
+
+
+sub start_html { # Der HEADER einer HTML-Datei
+print "<html><head>";
+print "<meta http-equiv=\"refresh\" content=\"20\" URL=\"online.pl?room=$room\">" if ($_[1] eq "online");
+print <<END;
+ <title>
+ $title - $_[0]
+ </title>
+ $style
+ </head>
+END
+ if ($_[1] ne "") {
+ print "<body class=$_[1]>";
+ } else {
+ print "<body>";
+ }
+}
+
+sub post { # Öffentliche Nachricht im aktuellen Raum $room posten.
+ my ($msg2post,$secroom) = @_;
+ my @rooms = ($room,$secroom);
+ foreach(@rooms) {
+ my $room2post = $_;
+ &list_dir("data/online/rooms/$room2post");
+ foreach(@dir) {
+ my $alias2post = $_;
+ if (-f "data/online/rooms/$room2post/$alias2post") {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+ }
+ }
+ }
+ &log("$msg2post") if ($room eq "Cyberbar");
+}
+
+
+sub post_all { # Öffentliche Nachricht in ALLEN Räumen gleichzeitig posten.
+ my $msg2post = $_[0];
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ my $alias2post = $_;
+ if (-f "data/online/users/$alias2post") {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+ }
+ }
+ &log("$msg2post");
+}
+
+sub post_prv { # Private Nachricht posten (flüstern).
+ my $alias2post = $_[0];
+ my $msg2post = $_[1];
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+}
+
+sub log { # Protokollieren der Nachrichten etc.
+ my ($msg2log) = @_;
+ &zeit;
+ &write_file("data/logs/$day.$month.$year");
+ print DATEI "<br><font color=ffffef><i>($hours:$min:$sec)</i></font> $msg2log\n";
+ close DATEI;
+}
+
+
+sub zeit { # Aktuelles Datum und Uhrzeit bestimmen.
+ ($sec, $min, $hours, $day, $month, $year) = (localtime)[0..5];
+ $month += 1;
+ $hours = "0".$hours if ($hours < 10);
+ $min = "0".$min if ($min < 10);
+ $sec = "0".$sec if ($sec < 10);
+ $day = "0".$day if ($day < 10);
+ $month = "0".$month if ($month < 10);
+ $year = $year - 100;
+ if ($year < 10) {
+ $year = "200".$year;
+ } else {
+ $year = "20".$year;
+ }
+}
+
+sub count { # Zeilen in einer Datei Zählen.
+ my $file2count = $_[0];
+ &read_file($file2count);
+ my @datei = <DATEI>;
+ close DATEI;
+ $number = $#datei+1;
+}
+
+sub read_file { # Datei öffnen.
+ my $file2read = $_[0];
+ if (-e "$file2read") {
+ open (DATEI,"<$file2read") || &error("Konnte $file2read nicht öffnen");
+ }
+}
+
+sub write_file { # Text an eine Datei anhängen.
+ my $file2write = $_[0];
+ if (-e "$file2write") {
+ open (DATEI,">>$file2write") || &error("Konnte $file2write nicht öffnen");
+ } else {
+ &create_file("$file2write");
+ open (DATEI,">>$file2write") || &error("Konnte $file2write nicht öffnen");
+ }
+}
+
+sub write_file_new { # Datei neu schreiben.
+ my $file2write = $_[0];
+ if (-e "$file2write") {
+ open (DATEI,">$file2write") || &error("Konnte $file2write nicht öffnen");
+ } else {
+ &create_file("$file2write");
+ open (DATEI,">$file2write") || &error("Konnte $file2write nicht öffnen");
+ }
+}
+
+sub create_file { # Datei erstellen.
+ my $file2create = $_[0];
+ open (CREATE, ">$file2create") || &error("Konnte $file2create nicht erstellen!");
+ print CREATE "";
+ close CREATE;
+}
+
+sub error { # Error-Ausgabe.
+ my $error_msg = $_[0];
+ &start_html( "Error: ($error_msg)" );
+ print $q->div( "Error: ($error_msg)" ),
+ $q->end_html;
+ exit;
+}
+
+sub remove_online { # Chatter entfernen
+ my ($alias,$room,$method) = @_;
+ unlink("data/online/users/$alias");
+ unlink("data/online/rooms/$room/$alias") if ($room ne undef);
+ unlink("data/online/ident/$alias");
+ &rm_rooms;
+ &zeit;
+ if ($method eq undef) {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias verläßt den Chat ...</font></i>");
+ } elsif ($method ne "kick") {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500> $_ hat den Chat verlassen ... </font></i>");
+ }
+ &rm_rstat($room,$alias) if ($room ne undef);
+}
+
+sub rm_alias { # Chatter aus dem System entfernen, dessen Timestamps älter als 60 Sekunden sind
+ my ($dir2rm,$rstatroom) = @_;
+ &list_dir($dir2rm,2);
+ foreach(@dir2) {
+ if (-f "$dir2rm/$_" && $_ ne undef) {
+ &read_file("$dir2rm/$_");
+ my $timestamp = <DATEI>;
+ close DATEI;
+ if ($timestamp < (time - 60)) {
+ if ($dir2rm eq "data/online/users") {
+ &remove_online($_,undef,1);
+ } else {
+ unlink("$dir2rm/$_");
+ &rm_rstat($rstatroom,$_) if ($rstatroom ne undef);
+ }
+ }
+ }
+ }
+}
+
+sub rm_rooms { # Leere Räume aus dem System entfernen
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-d "data/online/rooms/$_") {
+ &rm_alias("data/online/rooms/$_",$_);
+ &list_dir("data/online/rooms/$_",2);
+ if ($#dir2 = 1) {
+ rmdir("data/online/rooms/$_");
+ }
+ }
+ }
+}
+
+sub rm_rstat { # Benutzer als Raumbesetzer austragen
+ my ($rstatroom,$r_alias) = @_;
+ &read_file("data/online/rstat/$rstatroom");
+ my @rstat = <DATEI>;
+ close DATEI;
+ my $newfile = $rstat[0].$rstat[1];
+ for ($i=2;$i<=$#rstat;$i++) {
+ $newfile = $newfile."\n".$rstat[$i] if ($rstat[$i] ne $r_alias."\n");
+ }
+ write_file_new("data/online/rstat/$rstatroom");
+ print DATEI $newfile;
+ close DATEI;
+}
+
+sub secure_removeip { # Beim ausloggen die IP-Nummer aus dat/ip austragen.
+ my $alias2rm = $_[0];
+ unlink("data/online/ident/$alias2rm");
+}
+
+sub secure_checkip { # data/ip auf die eigene IP-Nummer überprüfen.
+ my ($alias2check,$method) = @_;
+ my $ip;
+ for($i=0 ;$i<=5;) {
+ &read_file("data/online/ident/$alias2check");
+ $ip = <DATEI>;
+ close DATEI;
+ if ($ip ne $ENV{'REMOTE_ADDR'}) {
+ $i++;
+ } else {
+ goto ENDCHECKIP
+ }
+ if ($i<=5) {
+ if ($method eq undef) {
+ &error("Du bist nicht befugt, mit der IP# $ENV{'REMOTE_ADDR'} und dem Alias \"$alias\" zu handeln. Sollte diese Meldung aufgrund eines Fehlers aufgetaucht sein, dann log Dich doch bitte neu in den Chat ein.");
+ } else {
+ &post_prv("$alias2check","<font color=red>Du bist nicht befugt, mit der IP# $ENV{'REMOTE_ADDR'} und dem Alias \"$alias\" zu handeln. Sollte diese Meldung aufgrund eines Fehlers aufgetaucht sein, dann log Dich doch bitte neu in den Chat ein.</font>");
+ &input_html("true") if ($method = 2);
+ }
+ exit;
+ }
+ }
+ENDCHECKIP:
+}
+
+sub remove_rooms { # Leere Räume entfernen.
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-d "data/online/rooms/$_") {
+ &list_dir("data/online/rooms/$_");
+ rmdir("data/online/rooms/$_") if ($#dir = 1);
+ }
+ }
+}
+
+sub list_dir { # Beliebigen Verzeichnisbaum einlesen.
+ my ($dir,$method) = @_;
+ opendir(DIR, $dir);
+ if ($method eq undef) {
+ @dir = readdir(DIR);
+ } elsif ($method = 2) {
+ @dir2 = readdir(DIR);
+ }
+ closedir(DIR);
+}
+
+sub hirachie { # Chatter nach Sonderrechte überprüfen.
+ my $alias2prove = $_[0];
+ $hirachie = undef;
+ &read_file("data/wa");
+ @was = <DATEI>;
+ close DATEI;
+ foreach(@was) {
+ if ($_ eq $alias2prove || $_ eq "$alias2prove\n") {
+ $hirachie = "wa";
+ }
+ }
+ &read_file("data/ow");
+ @ows = <DATEI>;
+ close DATEI;
+ if ($hirachie ne "wa" || $_ eq "$alias2prove\n") {
+ foreach(@ows) {
+ if ($_ eq $alias2prove || $_ eq "$alias2prove\n") {
+ $hirachie = "ow";
+ }
+ }
+ }
+}
+
+$| = 1; # Cache von Perl ausschalten \ No newline at end of file
diff --git a/0.2.5a2/help.sno b/0.2.5a2/help.sno
new file mode 100644
index 0000000..8fe0455
--- /dev/null
+++ b/0.2.5a2/help.sno
@@ -0,0 +1,54 @@
+<div>
+ Alle Chat-Befehle:
+</div>
+<hr>
+<table width=100% bgcolor=555555>
+<tr><th bgcolor=666666><div>SU</div></th><th bgcolor=666666><div>Befehl</div></th><th bgcolor=666666><div>Beschreibung</div></th></tr>
+<tr><td><div>NC</div></td><td><div>/about</div></td><td><div>Zeigt aktuelle Version und andere Infos der Community an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/away <font color=red>Nachricht</font></div></td><td><div>Abmelden mit einer<font color=red>Abmeldenachricht</font></div></td></tr>
+<tr><td><div>NC</div></td><td><div>/clear</div></td><td><div>Bildschirm wird gelöscht</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/col <font color=red>XXXXXX</font> <font color=ffa500>XXXXXX</font></div></td><td><div>Farbe/n (<font color=red>Namensfarbe</font> / <font color=ffa500>Textfarbe</font>) wechseln. Angabe in Hexadezimal.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/date</div></td><td><div>Zeigt aktuelles Datum und Urzeit an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/j <font color=red>Raumname</font></div></td><td><div>Raum wechseln/erstellen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ju <font color=red>Alias</font></div></td><td><div>In den Raum wechseln/folgen, wo sich <font color=red>Alias</font> befindet.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/m <font color=red>Aktion</font></div></td><td><div>Handeln mit 2 Farben</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/me <font color=red>Aktion</font></div></td><td><div>Handeln mit einer Farbe</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/msg <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine private <font color=ffa500>Nachricht</font> flüstern.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ <font color=ffa500>Nachricht</font></div></td><td><div>Eine private <font color=ffa500>Nachricht</font> demjenigen flüstern, dem zuletzt eine geflüstert wurde</div></td></tr>
+<tr><td><div>NC</div></td><td><div>//</div></td><td><div>Wurde zuletzt eine öffentliche Nachricht gepostet, dann wird diese nocheinmal gepostet (Funktioniert nicht bei und nach Befehlen, flüstern oder schreien)</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/q</div></td><td><div>Cumunnity verlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/s <font color=red>Nachricht</font></div></td><td><div><font color=red>Nachricht</font> schreien</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/w</div></td><td><div>Zeigt an, wer sich im aktuellen Raum befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc <font color=red>Raum</font></div></td><td><div>Zeigt an, wer sich im <font color=red>Raum</font> befindet. Wird kein Raum angegeben, dann wird jedeglich angezeigt, wer sich im System befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc/</div></td><td><div>Zeigt alle offenen Räume und deren Chatter an</div></td></tr>
+<tr><td><div>NC</div></td><td> <div>/wj <font color=red>Alias</font></div></td><td><div>Zeigt an, in welchen Raum sich <font color=red>Alias</font> befindet</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/l</div></td><td><div>Der aktuelle Raum wird ab- bzw. aufgesperrt</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/rsu <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> die Raumbesetzerrechte entnehmen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/su <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Raumbesetzer ernennen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/t <font color=red>Thema</font></div></td><td><div>Dem aktuellen Raum wird ein <font color=red>Thema</font> gegeben</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/k <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird aus dem Chat katapultiert!</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/ban</div></td><td><div>Zeigt alle verbannten Benutzer an</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/ban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> verbannen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/rban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> "entbannen"</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/ip <font color=red>Alias</font></div></td><td><div>Zeigt die IP-Nummer von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/kill <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird ganz und gar aus dem System entfernt</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/wa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Wächter ernennen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/rwa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom Wächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/sys <font color=red>Nachricht</font></div></td>
+<td><div>Systemnachricht schreiben. (Erscheint in allen existierenden Räumen)</div></td></tr>
+</table><hr>
+<div>
+ Zur Erklärung: NC steht für "Normale Chatter", RB für "Raumbesetzer", WÄ für "Wächter" und OW für "Oberwächter".
+ Obrige Befehle können nur von der/den jeweiligen Benutzergruppe/n werden.<br><br>
+ Allerdings gibt es folgendes zu beachten: Oberwächter verfügen über alle Chatbefehle. Normale Wächter über alle Chatbefehle, außer über die der Oberwächter.
+ Raumbesetzer können nur Raumbesetzerbefehle und die Befehle der normalen Chatter durchführen. Normale Chatter haben jedeglich die Standardbefehle zu verwenden.<br><br>
+ Weitere Besonderheiten der Wächter und Oberwächter:<br><br>
+ Wächter und Oberwächter können ....<br>
+ ... abgesperrte Chaträume problemlos betreten.<br>
+ ... nicht gekickt, verbannt oder gekillt werden.<br>
+ ... Logdateien der Cyberbar lesen.<br><br>
+
+ Des weiteren: Oberwächter ernennt nur der Systemadministrator!
+</div>
+</body>
+</html> \ No newline at end of file
diff --git a/0.2.5a2/htdocs.pl b/0.2.5a2/htdocs.pl
new file mode 100644
index 0000000..c1008a7
--- /dev/null
+++ b/0.2.5a2/htdocs.pl
@@ -0,0 +1,206 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+if ($var eq "help_html") {
+ &printfile("help.sno","Alle Chatbefehle");
+} elsif ($var eq "menu_html") {
+ &menu_html;
+} elsif ($var eq "werda_html") {
+ &werda_html;
+} elsif ($var eq "logs_html") {
+ &logs_html;
+} elsif ($var eq "view_sulogs_html") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ &start_html("Oberwächter-Logdateien");
+ print "<div><a href=\"push.pl?alias=$alias&tmp=$tmp&var=push_logs_html\">Push</a><hr>";
+ &printfile($tmp);
+ print "</div></body></html>";
+ }
+} elsif ($var eq "view_logs_html") {
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ &printfile($tmp,$tmp,"log");
+ }
+} elsif ($var eq "superuser_html") {
+ &superuser_html;
+} elsif ($var eq "bar_html") {
+ print
+ $q->start_html(-bgcolor=>"ffa500"),
+ $q->end_html;
+} else {
+ print
+ $q->start_html(-bgcolor=>"000000"),
+ $q->end_html;
+}
+
+sub menu_html {
+ if ($tmp eq "quit") {
+ print
+ $q->script( { -language=>"JavaScript" }, "window.open(\"index.pl?tmp=quit\",\"_top\")" );
+ sleep 1;
+ &remove_online($alias);
+ &secure_removeip($alias);
+ unlink("data/msgs/$alias");
+ }
+ &start_html("Menü","menu");
+print <<END;
+ <center>
+ <div>
+ [<a href="htdocs.pl?var=werda_html&alias=$alias&room=$room&col=$col&secol=$secol&&tmp=$tmp" target="werda">Wer ist da?</a>]
+ [<a href="main2.pl?var=edit_profile_html&alias=$alias" target="ProfilAendern">Profil ändern</a>]
+ [<a href="main2.pl?var=edit_options_html&alias=$alias" target="main">Optionen</a>]
+ [<a href="main2.pl?var=list_alias_html&alias=$alias" target="Benutzerliste">Benutzer</a>]
+ [<a href="htdocs.pl?var=help_html" target="Befehle">Befehle</a>]
+ [<a href="main2.pl?var=gb_html&alias=$alias" target="Board">Board</a>]
+ [<a href="htdocs.pl?var=superuser_html&alias=$alias" target="Hirachie">Superuser</a>]
+ [<a href="htdocs.pl?var=logs_html&alias=$alias" target="Logdateien">Logs</a>]
+ [<a href="push.pl?alias=$alias&room=$room&var=clear_screen" target="main">Weiterchatten</a>]
+ [<a href="htdocs.pl?var=menu_html&tmp=quit&alias=$alias">Verlassen</a>]
+ </div>
+ </center>
+</body>
+</html>
+END
+}
+
+
+sub werda_html { # Anzeige, wer eingelogt ist.
+ &start_html("Wer ist da?");
+ print <<END;
+<div>
+ $alias, schön daß Du hier bist :-)
+</div>
+<hr>
+<div>
+ Folgende Personen befinden sich im Chat:
+</div>
+<br>
+<div>
+END
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ my $room = $_;
+ &read_file("data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ &list_dir("data/online/rooms/$room",2);
+ local $nr = $#dir2-1;
+ print $q->b( $_ ),
+ " $door ($nr) Raumthema: $rstat[1]",
+ $q->br;
+ foreach(@dir2) {
+ if ($_ ne ".." && $_ ne ".") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_" }, "$_"), " ";
+ }
+ }
+ print $q->br, $q->br;
+ }
+ }
+ print
+ "</div>",
+ $q->end_html;
+}
+
+sub logs_html {
+ &secure_checkip($alias);
+ &start_html("Logdateien");
+ print <<END;
+<div>
+ Hier befinden sich alle Logdateien
+</div>
+<hr>
+END
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ print $q->div( "Folgende Logdateien des Raumes \"Cyberbar\" können nur von Wächtern und Oberwächtern gelesen werden (Sortiert nach A-Z, a-z):" ),
+ $q->br;
+ &list_dir("data/logs");
+ my @sortedir = sort(@dir);
+ foreach(@sortedir) {
+ if (-f "data/logs/$_") {
+ print $q->a( { -href=>"htdocs.pl?alias=$alias&var=view_logs_html&tmp=data/logs/$_",
+ -target=>"_new" },
+ "$_" ),
+ " ";
+ }
+ }
+ } else {
+ print $q->div( "Logdateien können nur von Oberwächtern (OW) und von Wächtern (WÄ) gelesen werden. Du bist jedoch ein ",
+ "\"Normaler Chatter\". Wächter können alles nachlesen, was öffentlich gechattet wurde." ),
+ $q->hr;
+ &printfile("data/htdocs/logs_html");
+ }
+ print
+ $q->end_html;
+}
+
+sub superuser_html { # Zeigt an, wer Superuser ist
+ &start_html("Superuser");
+ print "<div>Hallo $alias. Du bist als ";
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ print
+ $q->b( "Oberwächter" ),
+ " (OW) eingetragen.</div>",
+ $q->hr;
+ } elsif ( $hirachie eq "wa") {
+ print
+ $q->b( "Wächter" ),
+ " (WÄ) eingetragen.</div>",
+ $q->hr;
+ } else {
+ print
+ $q->b( "normaler Chatter" ),
+ " (NC) eingetragen.</div>",
+ $q->hr;
+ }
+
+ my $nrow = $#ows+1;
+ print
+ "<div>",
+ $q->b( "OW" ),
+ "s ($nrow Stück)";
+ foreach(@ows) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+ my $nrwa = $#was+1;
+ print
+ "</div>",
+ $q->hr,
+ "<div>",
+ $q->b( "WÄ" ),
+ "s ($nrwa Stück)";
+ foreach(@was) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+print <<END;
+<hr>
+ Die jeweiligen Fähigkeiten der Oberwächter (OW) und der Wächter (WÄ) sind unter
+ "<a href="htdocs.pl?var=help_html">Chat-Befehle</a>"
+ dokumentiert.
+</div>
+</body>
+</html>
+END
+} \ No newline at end of file
diff --git a/0.2.5a2/index.pl b/0.2.5a2/index.pl
new file mode 100644
index 0000000..bd2ce53
--- /dev/null
+++ b/0.2.5a2/index.pl
@@ -0,0 +1,368 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header; # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUFGERUFEN WERDEN?##
+#####################################
+if ($var eq "create_alias_html") {
+ &create_alias_html;
+} elsif ($var eq "create_alias") {
+ &create_alias;
+} elsif ($var eq "login_html") {
+ &login_html;
+} elsif ($alias eq "") {
+ &login_html;
+} else {
+ &checklogin;
+}
+
+sub login_html { # Erste Startseite
+local $counter = undef;
+&read_file("data/count");
+ $counter = <DATEI>;
+close DATEI;
+$counter++;
+&write_file_new("data/count");
+ print DATEI $counter;
+close DATEI;
+&list_dir("data/online/users");
+my $logtin = $#dir-1;
+&start_html("Created by Paul C. Bütow 2k");
+print <<END;
+ <center>
+ <table width=400>
+ <tr>
+ <td>
+ <b>
+ <div>
+ $title - ( <a href="http://servers.yChat.de">yChat-Servers</a> )
+ <img src="$gfxpath/yChat.jpg">
+ </div>
+ </b>
+END
+ if ($tmp eq "true") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Wahrscheinlich existiert Dein Alias "$alias" nicht,
+ <br>
+ Du hast Dich verschrieben oder das Passwort ist falsch.
+ <br>
+ Versuch es erneuert !
+ </div>
+END
+ } elsif ($tmp eq "quit") {
+print <<END;
+ <div>
+ Du hast soeben den Chat verlassen.
+ <br>
+ Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ } elsif ($tmp eq "banned") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein Alias "$alias" wurde verbannt.
+ <br>
+ Z.z. kannst Du Dich leider nicht in den Chat einloggen.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($tmp eq "kick") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wurdest soeben aus dem Chat katapultiert!
+ <br>
+ Schlechtes Verhalten mag die Ursache hierfür sein.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($var eq "create_alias") {
+print "<div>Du hast sich soeben in die Datenbank eingetragen. Einfach auf \"Los Geht's\" klicken :-)</div>";
+ } else {
+print <<END;
+ <div>
+ Herzlich willkommen!
+ <br>
+ Einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <form action="index.pl">
+ <input type="hidden" name="tmp" value="true">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Alias:
+ <br>
+ <input name="alias" value="$alias">
+ </div>
+ </td>
+ <td>
+ <div>
+ Dein Passwort:
+ <br>
+ <input type="password" name="id" value="$id">
+ </div>
+ </td>
+ </tr>
+ </table>
+ <br>
+ <br>
+ <div>
+ Solltest Du noch keinen Nick besitzen, dann auf "Registrieren" klicken!
+ </div>
+ <br>
+ <table>
+ <tr>
+ <td>
+ <font color="ffffff">
+ <input type="submit" value="Los geht's!">
+ </font>
+ </form>
+ </td>
+ <td>
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias_html">
+ <font color="ffffff">
+ <input type="submit" value="Registrieren">
+ </font>
+ </form>
+ </td>
+ </tr>
+ </table>
+ <hr>
+ <div>
+ yChat befindet sich momentan noch in der Entwicklungsphase !
+ <br>
+ Fragen gehen an Paul Bütow (
+ <a href="mailto:paul\@buetow.oxg.de">
+ paul\@buetow.oxg.de
+ </a>
+ ) :-)
+ <br>
+ <br>
+ Diese Seite wurde schon $counter mal aufgerufen. Es sind z.Z. $logtin Benutzer online.
+ </td>
+ </tr>
+ </table>
+ </center>
+</body>
+</html>
+END
+ if ($logtin == 0) {
+ &list_dir("data/msgs");
+ &list_dir("data/online/rstat",2);
+ foreach(@dir) {
+ unlink("data/msgs/$_");
+ unlink("data/online/ident/$_");
+ }
+ foreach(@dir2) {
+ unlink("data/online/rstat/$_");
+ }
+ }
+ # Falls d. Skript das Raumverz. gelöscht hat, neu anlegen
+ if (-d "data/online/rooms") {
+ } else {
+ mkdir "data/online/rooms", 0777;
+ }
+}
+
+
+sub create_alias_html { # HTML-Form für Erstellung eines neuen Benutzers.
+my $reload = $_[0];
+&start_html("Registration");
+print <<END;
+ <center>
+ <table width=400>
+ <tr>
+ <td>
+END
+ if ($reload eq "alias_exists") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Der von Dir gewählte Benutzername "$alias" existiert in unserer Datenbank bereits. Bitte versuch es erneuert mit
+ einem anderen Benutzernamen !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "pw_wrong") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Deine beiden Passworteingaben stimmen nicht überein. Bitte geb das Passwort erneuert an um sicherzugehen, daß
+ kein falsches Passwort abgespeichert wird !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "alias_prohibited") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein gewählter Benutername "$alias" enthält illegale Zeichen. Bitte versuch einen anderen Benutzernamen!
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Hier kannst Du Dich registrieren. Bitte beachte, daß die Passworteingabefelder übereinstimmen!
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias">
+ <div>
+ Dein Alias:
+ <font color="ffa500">
+ (Muß angegeben werden)
+ </font>
+ <br>
+ <input name="alias" VALUE="$alias">
+ </div>
+ <br>
+ <div>
+ Dein gewünschtes Passwort:
+ <br>
+ <input type="password" name="id" value="$id">
+ </div>
+ <br>
+ <div>
+ Geb hier Dein Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp">
+ </div>
+ <br>
+ <font color=ffffff>
+ <input type="submit" value="Registrieren">
+ </font>
+ <br>
+ </form>
+ <hr>
+ <div>
+ Um den Chat zu betreten müssen die Daten nach der Registration auf der Startseite erneuert bestätigt werden !
+ </div>
+ </td>
+ </tr>
+ </table>
+</center>
+</body>
+</html>
+END
+}
+
+sub checklogin { # Überprüfen, ob die Login-Daten korrekt sind.
+ my $lognotexists = "true";
+ &list_dir("data/user/options");
+ for (my $i=0; $i<=$#dir; $i++) {
+ if ($dir[$i] eq $alias) {
+ &read_file("data/user/options/$alias");
+ @datei = <DATEI>;
+ close DATEI;
+ chomp($datei[0]);
+ if ($datei[0] eq $id) {
+ &read_file("data/ban"); # Überprüfen, ob Alias verbannt ist
+ @banned = <DATEI>;
+ close DATEI;
+ foreach(@banned) {
+ if ($_ eq "$alias\n") {
+ $tmp = "banned";
+ &login_html();
+ exit;
+ }
+ }
+ $col = $datei[1];
+ $secol = $datei[2];
+ &write_file_new("data/online/ident/$alias");
+ print DATEI $ENV{'REMOTE_ADDR'};
+ close DATEI;
+ &write_file_new("data/user/lastlogin/$alias");
+ print DATEI time;
+ close DATEI;
+ &frameset_html;
+ exit;
+ } else {
+ $lognotexists = "false";
+ }
+ }
+ }
+ if ($lognotexists eq "true") {
+ }
+ &login_html; # Falls Login-Daten inkorrekt sind, zurück zur Startseite.
+}
+
+sub create_alias { # Erstellung eines neuen Benutzers.
+ if ($alias =~ /[\W]/ || $alias eq "") {
+ &create_alias_html("alias_prohibited");;
+ exit;
+ } elsif ($id ne $tmp) {
+ &create_alias_html("pw_wrong");
+ exit;
+ }
+ &list_dir("data/user/options");
+ for (my $i=0; $i<=$#dir; $i++) {
+ if ($dir[$i] eq $alias) {
+ &create_alias_html("alias_exists");
+ exit;
+ }
+ }
+ &write_file_new("data/user/options/$alias");
+ print DATEI $id."\n";
+ close DATEI;
+ &zeit;
+ &list_dir("data/user/options");
+ my $number = $#dir-1;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias [$number] hat sich soeben als neuer Benutzer registriert :-) ...</font></i>");
+ &login_html;
+}
+
+sub frameset_html {
+print <<END;
+<html>
+ <head>
+ <title>
+ $title - Created by Paul C. Bütow 2k
+ </title>
+ </head>
+<frameset border=0 frameborder=0 framespacing=0 rows="50,*,55">
+ <frame name="menu" src="htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol" scrolling="no">
+ <frameset border=0 frameborder=0 framespacing=0 cols="150,*">
+ <frame name="online" src="online.pl?room=$room&alias=$alias">
+ <frame name="main" src="push.pl?room=$room&alias=$alias&var=clear_screen">
+ </frameset>
+ <frame name="input" src="main.pl?alias=$alias&var=input_html&room=$room&col=$col&secol=$secol&tmp=login" scrolling="no">
+</frameset>
+</html>
+END
+}
diff --git a/0.2.5a2/main.pl b/0.2.5a2/main.pl
new file mode 100644
index 0000000..3934423
--- /dev/null
+++ b/0.2.5a2/main.pl
@@ -0,0 +1,633 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI; # CGI-Modul laden
+
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+if ($var eq "input_html") {
+ &input_html;
+} elsif ($var eq "post_msg") {
+ &post_msg;
+} elsif ($var eq "change_room") {
+ &change_room;
+} else {
+ &error("Parameter fehlt");
+}
+
+sub input_html { # Eingabemaske für den Chat.
+ my ($reload,$action,$whisper,$lastmsg) = @_;
+ $action = $q->param('action') if ($action eq "");
+ if ($tmp eq "away") {
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias meldet sich zurück ... </font></i>");
+ } elsif ($tmp eq "login") {
+ &remove_rooms;
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat den Chat betreten ...</font></i>");
+ }
+ if ($action ne "" && $action ne "whisper" && $action ne "away") {
+ print "<html><head><script language=\"JavaScript\">";
+ if ($action eq "change_room") {
+ print "open(\"online.pl?alias=$alias&room=$room\",\"online\");";
+ print "open(\"main.pl?var=input_html&alias=$alias&room=$room&col=$col&secol=$secol\",\"input\");";
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol\",\"menu\");";
+ } elsif ($action eq "change_colors") {
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol\",\"menu\");";
+ }
+ print "</script></head><body background=\"$gfxpath/unten.gif\" bgcolor=ffa500>";
+ } else {
+ print "<html><body background=\"$gfxpath/unten.gif\" bgcolor=ffa500>";
+ }
+ print "<form action=\"main.pl\">";
+ print "<input type=\"hidden\" name=\"tmp\" value=\"away\">" if ($action eq "away");
+ print <<END;
+ <input type="hidden" name="var" value="post_msg">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="room" value="$room">
+ <input type="hidden" name="col" value="$col">
+ <input type="hidden" name="secol" value="$secol">
+ <input type="hidden" name="id" value="$whisper">
+ <input type="hidden" name="lastmsg" value="$lastmsg">
+ <input size="70" name="msg">
+ <input type="submit" value="Texten"></form>
+END
+if ($reload eq "true") {
+print <<END;
+ <script language="JavaScript">
+ <!--
+ document.forms[0].msg.focus();
+ //-->
+ </script>
+END
+}
+print
+ $q->end_html;
+}
+
+sub post_msg { # Wird aufgerufen, wenn aus input_html eine Eingabe gepostet wurde.
+ $msg =~ s#<#&lt\;#g; # HTML-Tags deaktivieren
+ $msg =~ s#kilahu#yChat#g;
+ $msg =~ s#ooperle#ooper!#g;
+ if (substr($msg,0,1) ne "/") { # Überprüfen, ob Befehl oder Nachricht
+ $msg = "<b><font color=$col>$alias: <font color=$secol>".$msg."</font></font></b>";
+ $msg =~ s#"#''#g; # " in '' umtauschen für den Befehl "//"
+ &input_html("true","",$id,$msg); # -> Reload=true, Action=none, Whisper=$id
+ &secure_checkip($alias,1);
+ &post($msg);
+ } else {
+ &secure_checkip($alias,2);
+ &cmd($msg);
+ }
+}
+
+sub cmd { # Alle Chatbefehle, die über input_html eingegeben werden können.
+ $_[0] = $_[0]." ";
+ $_[0] = substr($_[0], 1, length($_[0])-1);
+ my @cmd = split(/ /, $_[0]);
+ my $cmd = substr($_[0],0 , index($_[0], " "));
+ my ($reload,$action,$whisper) = ("true","",$id);
+#############>- NORMALE CHATBEFEHLE ( Alphabetisch sortiert ) -<
+#############>- DER LETZTEN ZUGEFLÜSTERTEN PERSON NOCHEINMAL FLÜSTERN -<
+ if ($cmd eq "/") {
+ &post($q->param('lastmsg'));
+#############>- INFORMATIONEN ÜBER DAS SYSTEM AUSGEBEN -<
+ } elsif ($cmd eq "about") {
+ &post_prv("$alias","<font size=2 color=ffffff>Aktuelle Version ist $title und wurde am $datum aktuallisiert. Created by Paul C. Bütow 2k.</font>");
+#############>- ABMELDEN MIT 'AWAY-NACHRICHT' -<
+ } elsif ($cmd eq "away") {
+ if ($tmp eq "away") { # Falls 2 mal hintereinander /away eingegeben wurde
+ $tmp = "";
+ }
+ for ($i=1; $i <= $#cmd; $i++) {
+ $tmp = $tmp." ".$cmd[$i];
+ }
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias meldet sich ab (<font color=red>$tmp</font> ) ...</i></font>");
+ $action = "away";
+#############>- EIGENEN CHATBILDSCHIRM LÖSCHEN -<
+ } elsif ($cmd eq "clear") {
+ &post_prv("$alias","<script language=\"JavaScript\">window.open(\"push.pl?alias=$alias&room=$room&var=clear_screen\",\"main\");</script>");
+#############>- FARBEN WECHSELN -<
+ } elsif ($cmd eq "col") {
+ $col = $cmd[1];
+ my $tmpsecol = $cmd[2];
+ if ($tmpsecol eq "") {
+ $secol = $col
+ } else {
+ $secol = $tmpsecol;
+ }
+ &read_file("data/user/options/$alias");
+ my @pro = <DATEI>;
+ close DATEI;
+ &write_file_new("data/user/options/$alias");
+ print DATEI $pro[0]."".$col."\n".$secol;
+ close DATEI;
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat die Farbe gewechselt ...</font></i>");
+ $action = "change_colors";
+#############>- AKTUELLES DATUM UND URZEIT AUSGEBEN -<
+ } elsif ($cmd eq "date") {
+ &zeit;
+ &post_prv("$alias","<font size=2 color=ffffff>Heute ist der $day.$month. Jahr $year. Es ist genau $hours:$min Uhr und $sec Sekunden.</font>");
+#############>- EINEN NEUEN RAUM ERSTELLEN BZW. IN EINEN BESTEHENDEN RAUM WECHSELN -<
+ } elsif ($cmd eq "j") {
+ &change_room("j",$cmd[1],$room);
+ $action = "change_room";
+#############>- HANDELN -<
+ } elsif ($cmd eq "me" || $cmd eq "m") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $me_msg = $me_msg." ".$cmd[$i];
+ }
+ if ($cmd eq "m") {
+ &post("<i><font color=$col>$alias <font color=$secol>$me_msg</font></font></i>");
+ } else {
+ &post("<i><font color=$col>$alias $me_msg</font></i>");
+ }
+#############>- FLÜSTERN ( Auch mit '/' ) -<
+ } elsif ($cmd eq "msg" || $cmd eq "") {
+ my ($alias2post,$msg2post) = ($cmd[1],"");
+ if ($cmd eq "msg") {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ } else {
+ $alias2post = $id;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ }
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ if ($_ eq $alias2post) {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "<i><font color=$col>$alias flüstert <font color=ffffff>=></font><font color=$secol>$msg2post</font></font></i><br>\n";
+ close DATEI;
+ &write_file("data/msgs/$alias");
+ print DATEI "<i><font color=$col>Zu $alias2post geflüstert <font color=ffffff>=></font><font color=$secol>$msg2post</font></font></i><br>\n";
+ close DATEI;
+ &input_html($reload,"",$alias2post);
+ exit;
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2post <font color=ffffff>ist momentan nicht anwesend !</font></font>");
+#############>- DAS SYSTEM VERLASSEN -<
+ } elsif ($cmd eq "q") {
+ &post_prv("$alias","<script language=\"JavaScript\">window.open(\"index.pl?tmp=quit\",\"_top\");</script>");
+ sleep 1;
+ &remove_online($alias,$room);
+ &secure_removeip($alias);
+ unlink("data/msgs/$alias");
+ exit;
+#############>- SCHREIEN -<
+ } elsif ($cmd eq "s") {
+ my ($msg2scream,$msg2post);
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2scream = $msg2scream." ".$cmd[$i];
+ }
+ $msg2post = "\U$msg2scream";
+ &post("<font color=$col><i>$alias schreit:</i> <b><font color=$secol>".$msg2post."</font></font></b>");
+#############>- ANZEIGEN WER SICH IM AKTUELLEN RAUM BEFINDET -<
+} elsif ($cmd eq "w") {
+ &list_dir("data/online/rooms/$room");
+ &read_file("data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ my ($is,$nr) = ("t",0);
+ foreach(@dir) {
+ if (-f "data/online/rooms/$room/$_") {
+ $personen = $personen." ".$_;
+ $nr++;
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>$room $door ($nr) [".$rstat[1]."] : <font color=ffa500>$personen</font></font>");
+
+ #############>- ANZEIGEN WER SICH IM SYSTEM BEFINDET -<
+ } elsif ($cmd eq "wc" || $cmd eq "wc/") {
+ $raum = $cmd[1];
+ if ($raum eq "" && $cmd eq "wc") {
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/users/$_");
+ }
+ my $nr = ($#dir-1);
+ my ($nrs,$is) = ("","ist");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "sind";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>$nr Person$nrs $is insgesamt eingelogt: <font color=ffa500>$personen</font></font>");
+ } elsif ($raum eq "" && $cmd eq "wc/") {
+ my $msg2post;
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ &list_dir("data/online/rooms/$_",2);
+ &read_file("data/online/rstat/$_");
+ my @rstat = <DATEI>;
+ close DATEI;
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ my $nr = $#dir2-1;
+ $msg2post = $msg2post."<tr><td><b><font size=2 color=ffffff>$_ $door ($nr) [".$rstat[1]."] </font></b></td><td><font size=2 color=ffffff>";
+ foreach $chatter (@dir2) {
+ if (-f "data/online/rooms/$_/$chatter") {
+ $msg2post = $msg2post."$chatter ";
+ }
+ }
+ print "</font></td>";
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>Folgende Räume sind offen:</font><table>$msg2post</table>");
+ } elsif ($raum ne "") {
+ my $personen;
+ &list_dir("data/online/rooms/$raum");
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/rooms/$raum/$_");
+ }
+ my ($nr,$is) = (($#dir-1),"t");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "n";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff> $nr Person$nrs befinde$is sich im Raum \"$raum\": <font color=ffa500>$personen</font></font>");
+ }
+#############>- ANZEIGEN IN WELCHEN RAUM SICH JMD. BEFINDET BZW. JMD IN EINEN RAUM FOLGEN -<
+ } elsif ($cmd eq "wj" || $cmd eq "ju") {
+ my $alias2search = $cmd[1];
+ &list_dir("data/online/rooms");
+ foreach $raum (@dir) {
+ &list_dir("data/online/rooms/$raum",2) if (-d "data/online/rooms/$raum");
+ foreach $user (@dir2) {
+ if (-f "data/online/rooms/$raum/$user") {
+ if ($user eq $alias2search) {
+ if ($cmd eq "wj") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2search <font color=ffffff>befindet sich im Raum \"$raum\" !</font></font>");
+ } else {
+ $action = "change_room";
+ &change_room("ju",$raum,$room,$alias2search);
+ }
+ &input_html($reload,$action,$whisper);
+ exit;
+ }
+ }
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2search <font color=ffffff> ist nicht eingelogt !</font></font>");
+#############>- RAUMNESETZER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- RAUM ABSCHLIESSEN/AUFSCHLIESSEN -<
+ } elsif ($cmd eq "l") {
+ &prove_besetzer($alias,$room);
+ &hirachie($alias);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ my $lock = "0\n";
+ &zeit;
+ if ($room eq "Cyberbar") {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum ohne Erfolg ab ...</font></i>");
+ } else {
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum ab ...</font></i>");
+ } else {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum auf ...</font></i>");
+ }
+ for ($i=1;$i<=$#r_stat;$i++) {
+ $lock = $lock.$r_stat[$i];
+ }
+ write_file_new("data/online/rstat/$room");
+ print DATEI $lock;
+ close DATEI;
+ }
+ }
+#############>- RAUMBESETZER ERNENNEN -<
+ } elsif ($cmd eq "su") {
+ &prove_besetzer($alias,$room);
+ &hirachie($alias);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ my $alias2su = $cmd[1];
+ &list_dir("data/online/rooms/$room");
+ foreach(@dir) {
+ if ($_ eq $alias2su) {
+ &read_file("data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ &hirachie($alias2su);
+ &prove_besetzer($alias2su,$room);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ &input_html($reload,$action,$whisper);
+ &post_prv($alias,"<font color=ffa500>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist bereits RB, WÄ oder OW)</font>");
+ exit;
+ }
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias ernennt \"$alias2su\" zum Raumbesetzer ...</font></i>");
+ &write_file("data/online/rstat/$room");
+ print DATEI $alias2su."\n";
+ close DATEI;
+ &input_html("true",$action,$whisper);
+ exit;
+ }
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist nicht anwesend)</font>");
+ }
+#############>- RAUMBESETZER ENTNENNEN -<
+ } elsif ($cmd eq "rsu") {
+ &prove_besetzer($alias,$room);
+ &hirachie($alias);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ my $alias2rsu = $cmd[1];
+ &read_file("data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ &prove_besetzer($alias2rsu,$room);
+ if ($r_besetzer eq "true") {
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias entzieht \"$alias2rsu\" die Raumbesetzerrechte ...</font></i>");
+ my $newrstat = $rstat[0].$rstat[1];
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $newrstat = $newrstat.$r_stat[$i] if ($r_stat[$i] ne $alias2rsu."\n");
+ }
+ &write_file_new("data/online/rstat/$room");
+ print DATEI $newrstat;
+ close DATEI;
+ } else {
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2rsu <font color=ffffff>ist kein Raumbesetzer und kann dieser Status auch nicht aberkannt werden !</font></font>");
+ }
+ }
+#############>- RAUM EIN THEMA GEBEN -<
+ } elsif ($cmd eq "t") {
+ &prove_besetzer($alias,$room);
+ &hirachie($alias);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ my $theme;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $theme = $theme." ".$cmd[$i];
+ }
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias gibt dem Raum das Thema <font color=red>( $theme )</font> ...</font></i>");
+ $theme = $r_stat[0].$theme."\n";
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $theme = $theme.$r_stat[$i];
+ }
+ write_file_new("data/online/rstat/$room");
+ print DATEI $theme;
+ close DATEI;
+ }
+#############>- SUPERUSER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- ALIAS VERBANNEN BZW. ENTBANNEN -<
+ } elsif ($cmd eq "ban" || $cmd eq "rban") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ my ($alias2handle,$registriert) = $cmd[1];
+ &list_dir("data/user/options");
+ foreach(@dir) {
+ $registriert = "true" if ($_ eq $alias2handle);
+ }
+ if ($registriert ne "true") {
+ if ($cmd eq "ban") {
+ if ($alias2handle ne "") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> existiert nicht in der Benutzerdatenbank und kann so nich verbannt werden !</font></font>");
+ } else {
+ &read_file("data/ban");
+ my @banned = <DATEI>;
+ my ($benutzer);
+ my $nr = $#banned+1;
+ close DATEI;
+ foreach(@banned) {
+ $benutzer = $benutzer." ".$_;
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>Folgende Benutzer sind verbannt [$nr]: <font color=ffa500>$benutzer</font></font>");
+ }
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> existiert nicht in der Benutzerdatenbank und kann so nicht \"entbannt\" werden !</font></font>");
+ }
+ &input_html("true");
+ exit;
+ }
+ &read_file("data/ban");
+ my @banlist = <DATEI>;
+ close DATEI;
+ foreach(@banlist) {
+ if ($_ eq "$alias2handle\n") {
+ if ($cmd eq "ban") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> ist bereits verbannt worden !</font></font>");
+ } else {
+ my $banned = "false";
+ foreach(@banlist) {
+ $banned = "true" if ($_ eq "$alias2handle\n");
+ }
+ if ($banned eq "true") {
+ my @newbanlist;
+ foreach(@banlist) {
+ push @newbanlist,$_ if ($_ ne "$alias2handle\n");
+ }
+ &write_file_new("data/ban");
+ print DATEI @newbanlist;
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> wurde soeben \"entbannt\" !</font></font>");
+ }
+ }
+ &input_html("true");
+ exit;
+ }
+ }
+ if ($cmd eq "ban") {
+ &hirachie($alias2handle);
+ if ($hirachie ne "ow") {
+ &write_file("data/ban");
+ print DATEI "$alias2handle\n";
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> wurde soeben verbannt und kann sich nun nichtmehr in den Chat einloggen !</font>");
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> ist ein Oberwächter und kann deshalb nicht verbannt werden !</font></font>");
+ }
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> konnte nicht \"entbannt\" werden, da <font color=ffa500>$alias2handle</font> garnicht verbannt war !</font></font>");
+ }
+ }
+#############>- IP # VON ALIAS ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "ip") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ my $alias2prove = $cmd[1];
+ &list_dir("data/online/ident");
+ foreach(@dir) {
+ if ($_ eq $alias2prove) {
+ &read_file("data/online/ident/$_");
+ local $ipnr = <DATEI>;
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$_ <font color=ffffff>hat die IP-Nummer $ipnr !</font></font>");
+ }
+ }
+ }
+#############>- ALIAS AUS DEM CHAT KATAPULTIEREN -<
+ } elsif ($cmd eq "k") {
+ &hirachie($alias);
+ if ($hirachie eq "wa" || $hirachie eq "ow") {
+ my $alias2kick = $cmd[1];
+ &list_dir("data/online/rooms");
+ foreach $raum (@dir) {
+ &list_dir("data/online/rooms/$raum",2);
+ foreach $chatter (@dir2) {
+ if ($chatter eq $alias2kick) {
+ &hirachie($alias2kick);
+ if ($hirachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist Oberwächter und kann nicht \"gekickt\" werden !</font></font>");
+ } elsif ($hirachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist Wächter und kann nicht \"gekickt\" werden !</font></font>");
+ } else {
+ &post_prv("$alias2kick","<script language=\"JavaScript\">window.open(\"index.pl?tmp=kick\",\"_top\");</script>");
+ &zeit;
+ $_ = undef if ($room eq $_);
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias katapultiert \"$alias2kick\" aus dem Chat ...</font></i>",$_);
+ &remove_online($alias2kick,$_,"kick");
+ &secure_removeip($alias2kick);
+ }
+ &input_html("true");
+ exit;
+ }
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist nicht anwesend und kann nicht \"gekickt\" werden !</font></font>");
+ }
+#############>- EINEN BENUTZER AUS DEM SYSTEM LÖSCHEN -<
+ } elsif ($cmd eq "kill") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ my $alias2kill = $cmd[1];
+ &hirachie($alias2kill);
+ if ($hirachie eq "ow") {
+ &post_prv($alias,"<font size color=ffa500>$alias2kill</font> <font color=ffffff>ist Oberwächter und kann nicht aus dem System entfernt werden !</font>");
+ } elsif ($hirachie eq "wa") {
+ &post_prv($alias,"<font size color=ffa500>$alias2kill</font> <font color=ffffff>ist Wächter und kann nicht aus dem System entfernt werden !</font>");
+ } else {
+ unlink("data/user/options/$alias2kill");
+ unlink("data/user/profiles/$alias2kill");
+ unlink("data/user/gbooks/$alias2kill");
+ unlink("data/user/counts/$alias2kill");
+ unlink("data/user/lastlogin/$alias2kill");
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias killt \"$alias2kill\" ganz und gar aus dem System ...</font></i>");
+ }
+ }
+ #############>- SYSTEMNACHRICHT IN ALLE BESTEHENDEN RÄUME POSTEN -<
+ } elsif ($cmd eq "sys") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $sys_msg = $sys_msg." ".$cmd[$i];
+ }
+ &zeit;
+ &post_all("<i><font color=ffffff>($hours:$min:$sec)</font></i> <b><font size=2 color=red>SYSTEMNACHRICHT</font></b><i><font color=ffffff>: $sys_msg ...</font></i>");
+ }
+#############>- ALIAS ZUM WÄCHTER ERNNENNEN BZW. ZUM NORMALEN CHATTER DEGRADIEREN -<
+ } elsif ($cmd eq "wa" || $cmd eq "rwa") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ &zeit;
+ my $alias2handle = $cmd[1];
+ if ($cmd eq "wa") {
+ my $anerkennen = "false";
+ &list_dir("data/user/options");
+ foreach(@dir) {
+ if ($_ eq $alias2handle) {
+ $anerkennen = "true";
+ }
+ }
+ if ($anerkennen eq "true") {
+ &hirachie($alias2handle);
+ if ($hirachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff>ist bereits als Wächter eingetragen. Eine erneuerte Eintragung ist nicht möglich!</font></font>");
+ } elsif ($hirachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff>ist schon als Oberwächter eingetragen. Oberwächter können nicht gleichzeitig Wächter sein!</font></font>");
+ } else {
+ &write_file("data/wa");
+ print DATEI $alias2handle."\n";
+ close DATEI;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font><font color=ffa500> $alias ernennt \"$alias2handle\" zum Wächter ...</font></i>");
+ }
+ } else {
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2handle <font color=ffffff>kann nicht zum Wächter ernannt werden da Benutzername nicht existiert!</font></font>");
+ }
+ } elsif ($cmd eq "rwa") {
+ &read_file("data/wa");
+ my @wafile = <DATEI>;
+ close DATEI;
+ my $aberkennen = "false";
+ foreach(@wafile) {
+ if ($_ ne "$alias2handle\n") {
+ push @newafile,$_;
+ } else {
+ $aberkennen = "true";
+ }
+ }
+ &write_file_new("data/wa");
+ print DATEI @newafile;
+ close DATEI;
+ if ($aberkennen eq "true") {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat \"$alias2handle\" vom Wächter zum normalen Chatter degradiert ...</font></i>");
+ } else {
+ &post("<font size=2 color=ffa500>$alias2handle <font color=ffffff>konnte der Wächterstatus nicht aberkannt werden da Benutzer kein Wächter ist!</font></font>");
+ }
+ }
+ }
+#############>- ENDE DER CHATBEFEHLE -<
+}
+&input_html($reload,$action,$whisper);
+}
+
+sub change_room { # Den Chat-Raum wechseln
+ my ($method,$newroom,$oldroom,$alias2follow) = @_;
+ # Überprüfen, ob Alias Raum betreten darf
+ &read_file("data/online/rstat/$newroom");
+ my @rstat = <DATEI>;
+ close DATEI;
+ if ($rstat[0] eq "1\n") {
+ &hirachie($alias);
+ if ($hirachie eq "wa" || $hirachie eq "ow") {
+ } else {
+ &post_prv("$alias","<font size=2 color=ffffff>Der Raum \"<font color=ffa500>$newroom</font>\" ist leider abgesperrt!</font>");
+ &input_html("true",$action,$id);
+ exit;
+ }
+ }
+ $room = $oldroom;
+ &secure_checkip($alias); # IP Nummer überprüfen
+ &zeit; # Zeit 'erneuern'
+ if ($method eq "j") {
+ unlink("data/online/rooms/$oldroom/$alias");
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias wechselt in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias kommt aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ &post_prv("$alias","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>Du wechselst aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ } elsif ($method eq "ju") {
+ unlink("data/online/rooms/$oldroom/$alias");
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias folgt \"$alias2follow\" in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias kommt aus dem Raum \"$oldroom\" und folgt \"$alias2follow\" herein nach \"$newroom\" ...</font></i>");
+ &post_prv("$alias","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>Du folgst \"$alias2follow\" aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ }
+ # Sicherheitshalber Alias erneuert entf.
+ unlink("data/online/rooms/$oldroom/$alias");
+ &rm_rstat($oldroom,$alias);
+ &rm_rooms;
+}
+
+sub prove_besetzer { # Prüfen, ob Benutzer Raumbesetzerrechte hat
+ my ($r_alias,$r_room) = @_;
+ $r_besetzer = "false";
+ &read_file("data/online/rstat/$r_room");
+ @r_stat = <DATEI>;
+ close DATEI;
+ for($i=2;$i<=$#r_stat;$i++) {
+ $r_besetzer = "true" if ($r_stat[$i] eq $r_alias || $r_stat[$i] eq $r_alias."\n");
+ }
+} \ No newline at end of file
diff --git a/0.2.5a2/main2.pl b/0.2.5a2/main2.pl
new file mode 100644
index 0000000..76f161b
--- /dev/null
+++ b/0.2.5a2/main2.pl
@@ -0,0 +1,571 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+
+if ($var eq "list_alias_html") {
+ &list_alias_html;
+} elsif ($var eq "alias_html") {
+ &alias_html;
+} elsif ($var eq "edit_profile_html") {
+ &edit_html("edit_profile_html");
+} elsif ($var eq "edit_options_html") {
+ &edit_html("edit_options_html");
+} elsif ($var eq "gb_html") {
+ &gb_html;
+} elsif ($var eq "post_gb") {
+ &post_gb;
+} elsif ($var eq "rm_gb_alias") {
+ &rm_gb;
+} elsif ($var eq "edit_profile") {
+ &edit("edit_profile");
+} elsif ($var eq "edit_options") {
+ &edit("edit_options");
+} else {
+ &error("Parameter fehlt");
+}
+
+###########################
+##HAUPTTEIL DIESER DATEI:##
+###########################
+
+sub gb_html { # Das Benutzerboard/Gästebuch.
+ my $message = $_[0];
+ &start_html("Benutzerboard");
+if ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </i>
+ einen Text und poste
+ <u>dann</u>
+ !
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Vielen Dank für Deinen Beitrag. Wenn Du willst, kannst Du jetzt gleich noch einen Eintrag posten ...
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Falls Du Anregungen oder Verbesserungsvorschläge für die Community hast, dann poste doch einen kleinen Eintrag :-)
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmp" value="guestbook">
+ <input type="hidden" name="id" value="y">
+ <input size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+ if (-e "data/guestbook") {
+ open (DATEI,"<data/guestbook") || &error("Konnte dat/guestbook nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ print
+ $q->div(@datei);
+ }
+ print
+ $q->end_html;
+}
+
+
+sub post_gb { # Wenn etwas in ein Gästebuch eingetragen wird
+ &secure_checkip($alias);
+ &zeit;
+ if ($msg eq "") {
+ if ($id eq "y") { # Überprüfen, ob Benutzerboard- oder Privatgästebuch
+ &gb_html("post_empty");
+ } else {
+ &alias_html("post_empty");
+ }
+ exit;
+ }
+ $msg =~ s#<#&lt\;#g;
+ my $tmpath = "";
+ if ($id eq "y") {
+ $tmpath = "data/guestbook";
+ } else {
+ $tmpath = "data/user/gbooks/$tmp";
+ }
+ if (-e "$tmpath") {
+ &read_file("$tmpath");
+ my @datei = <DATEI>;
+ close DATEI;
+ pop(@datei) if ($#datei > 99);
+ my @newdatei = "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ @newdatei = ("@newdatei", "@datei");
+ &write_file_new("$tmpath");
+ print DATEI @newdatei;
+ close DATEI;
+ } else {
+ &write_file_new("$tmpath");
+ print DATEI "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ close DATEI;
+ }
+ if ($id eq "y") {
+ &gb_html("post_ok");
+ exit;
+ } else {
+ post_prv("$tmp","<font size=2 color=ffffff><a href=\"main2.pl?alias=$alias&var=alias_html&tmp=$alias\" target=\"_new\">$alias</a> hat soeben einen Pin in <a href=\"main2.pl?alias=$alias&var=alias_html&tmp=$tmp\" target=\"_new\">Dein Profil</a> gehängt ... </font>");
+ &alias_html;
+ exit;
+ }
+}
+
+sub rm_gb { # Gästebucheintrag entfernen
+ &secure_checkip($alias);
+ $tmp = $alias;
+ &read_file("data/user/gbooks/$alias");
+ my @gbfile = <DATEI>;
+ close DATEI;
+ my @newgbfile = ();
+ for($i=0; $i <= $#gbfile; $i++) {
+ push(@newgbfile,$gbfile[$i]) if ($i != $id);
+ }
+ &write_file_new("data/user/gbooks/$alias");
+ print DATEI @newgbfile;
+ close DATEI;
+ &alias_html("rm_ok");
+}
+
+sub list_alias_html { # Liste aller Benutzer
+ &start_html("Alle Benutzer");
+ &list_dir("data/user/options");
+ my @liste = sort(@dir);
+ my $nr = $#dir-1;
+print <<END;
+ <div>
+ Es sind z.Z. genau $nr Benutzernamen in der Datenbank vorhanden! (Sortiert nach #, A-Z, a-z)
+ </div>
+ <hr>
+ <div>
+END
+ foreach(@liste) {
+ if (-f "data/user/options/$_") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_" },
+ "$_"),
+ " ";
+ }
+ }
+print <<END;
+ </div>
+</body>
+</html>
+END
+}
+
+sub alias_html { # Anzeigen eines Benutzerprofils
+ my $message = $_[0];
+ local $counter = undef;
+ &read_file("data/user/counts/$tmp");
+ $counter = <DATEI>;
+ close DATEI;
+ $counter++;
+ &write_file_new("data/user/counts/$tmp");
+ print DATEI $counter;
+ close DATEI;
+ &start_html($tmp);
+print <<END;
+<div>
+ <a href="htdocs.pl?var=werda_html&alias=$alias">Hier</a>
+ gehts zur Gesamtübersicht !
+</div>
+<hr>
+END
+if ($message eq "rm_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Der von Dir gewählte Eintrag wurde erfolgreich gelöscht.
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </u>
+ einen Text und poste
+ <u>dann</u>
+ !
+ <hr>
+END
+}
+ &read_file("data/user/profiles/$tmp");
+ @data = <DATEI>;
+ close DATEI;
+print <<END;
+ <div>
+ Dieses Profil wurde insgesamt schon $counter mal aufgerufen !
+ <br>
+ <br>
+ Alias: $tmp
+ <br>
+ <br>
+ Nachname: $data[0]
+ <br>
+ <br>
+ Vorname: $data[1]
+ <br>
+ <br>
+ Alter: $data[2]
+ <br>
+ <br>
+ Wohnort: $data[3]
+ <br>
+ <br>
+ E-Mail:
+ <a href="mailto:$data[4]">$data[4]</a>
+ <br>
+ <br>
+ ICQ-Nummer: $data[5]
+ <br>
+ <br>
+ Homepage:
+ <a href="$data[6]" target="_new">$data[6]</a>
+ <br>
+ <br>
+ Weiteres:
+ <br>
+ $data[7]
+ <hr>
+ Hier kannst Du $tmp eine Nachricht hinterlassen!
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input type="text" size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+if (-e "data/user/gbooks/$tmp") {
+ open (DATEI,"<data/user/gbooks/$tmp") || &error("Konnte data/user/gbooks/$tmp nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ if ($alias ne $tmp) {
+ print @datei;
+ } else {
+print <<END;
+ <table>
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="rm_gb_alias">
+ <input type="hidden" name="alias" value="$alias">
+END
+for($i=0; $i <= $#datei; $i++) {
+print <<END;
+ <tr>
+ <td>
+ <input type="radio" name="id" value="$i">
+ </td>
+ <td>
+ <div class=q>
+ $datei[$i]
+ </div>
+ </td>
+ </tr>
+END
+}
+print <<END;
+ </table>
+ <table>
+ <tr>
+ <td>
+ <font color=ffffff>
+ <input type="submit" value="Makierten Eintrag löschen">
+ </font>
+ </td>
+ <td>
+ <font color=ffffff>
+ <input type="reset" value="Makierung rückgängig machen">
+ </font>
+ </td>
+ </tr>
+ </table>
+ </form>
+END
+}
+}
+ print
+ $q->end_html;
+}
+
+sub edit_html { # Chat-Optionen / Benutzerprofil editieren
+ my ($method,$message) = @_;
+ &secure_checkip($alias);
+ &start_html("Benutzerprofil ändern");
+ if ($method eq "edit_options_html") {
+ &read_file("data/user/options/$alias");
+ } elsif ($method eq "edit_profile_html") {
+ &read_file("data/user/profiles/$alias");
+ }
+ @data = <DATEI>;
+ close DATEI;
+ if ($method eq "edit_options_html") {
+ chomp($data[0]);
+ if ($message eq "edit_options_ok") {
+print <<END;
+<script language="JavaScript">
+ open("main.pl?var=input_html&alias=$alias&room=$room&col=$col&secol=$secol","input");
+ open("htdocs.pl?var=menu_html&alias=$alias&room=$room&col=$col&secol=$secol","menu");
+</script>
+<div class=b>
+ Hinweis:
+</div>
+<div>
+ Du hast soeben Deine Chat-Optionen erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren. Um
+ weiterzuchatten einfach auf <a href="push.pl?alias=$alias&room=$room">Weiterchatten</a> klicken.
+</div>
+<hr>
+END
+ } elsif ($message eq "edit_pw_wrong") {
+print <<END;
+<div class=b>
+ ACHTUNG!
+</div>
+<div>
+ Du hast soeben versucht, dein Passwort zu ändern. Jedoch stimmte die Erste Eingabe nicht mit der Zweiten überein.
+ Bitte versuch es erneuert ...
+</div>
+<hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Deine Chat-Optionen editieren!" ),
+ $q->hr;
+ }
+print <<END;
+<form action="main2.pl">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="var" value="edit_options">
+ <div>
+ Dein Passwort
+ <font color=ffa500>
+ (Gut merken !!)
+ </font>
+ <br>
+ <input type="password" name="id" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ Geb hier das Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ "Deine Farbe (Farbe Deines Nicks):
+ <br>
+ <select NAME="col" size="1">
+ <option selected value="$col">($data[1])</option>
+ <option value="0000FF">Blau (1)</option>
+ <option value="008000">Grün</option>
+ <option value="000000">Schwarz</option>
+ <option value="808000">Oliv</option>
+ <option value="000080">Marineblau</option>
+ <option value="800080">Purpur</option>
+ <option value="808080">Braun</option>
+ <option value="FF00FF">Fuchsia</option>
+ <option value="008080">Stahlblau</option>
+ <option value="333333">Mittelschwarz</option>
+ <option value="003399">BärBlau</option>
+ <option value="0066CC">Blau (2)</option>
+ <option value="009933">Grün</option>
+ <option value="006666">Oliv</option>
+ <option value="FF0000">VollRot</option>
+ <option value="CC0000">RostRot</option>
+ <option value="990099">Lila</option>
+ <option value="FF00FF">Pink</option>
+ <option value="FF9900">Orange</option>
+ <option value="CC6600">Ocker</option>
+ <option value="996600">Braun</option>
+ <option value="666666">Grau</option>
+ <option value="0A6307">Dunkelgrün</option>
+ <option value="9C1B7C">Dunkellila</option>
+ <option value="3D0DB9">Dunkelblau</option>
+ <option value="8FA5ED">Hellblau</option>
+ <option value="FFFF00">Gelb</option>
+ <option value="3D4863">?????</option>
+ </select>
+ </div>
+ <br>
+ <div>
+ Deine zweite Farbe (Farbe Deiner Nachrichten):
+ <br>
+ <select NAME="secol" size="1">
+ <option selected value="$col">($data[2])</option>
+ <option value="0000FF">Blau (1)</option>
+ <option value="008000">Grün</option>
+ <option value="000000">Schwarz</option>
+ <option value="808000">Oliv</option>
+ <option value="000080">Marineblau</option>
+ <option value="800080">Purpur</option>
+ <option value="808080">Braun</option>
+ <option value="FF00FF">Fuchsia</option>
+ <option value="008080">Stahlblau</option>
+ <option value="333333">Mittelschwarz</option>
+ <option value="003399">BärBlau</option>
+ <option value="0066CC">Blau (2)</option>
+ <option value="009933">Grün</option>
+ <option value="006666">Oliv</option>
+ <option value="FF0000">VollRot</option>
+ <option value="CC0000">RostRot</option>
+ <option value="990099">Lila</option>
+ <option value="FF00FF">Pink</option>
+ <option value="FF9900">Orange</option>
+ <option value="CC6600">Ocker</option>
+ <option value="996600">Braun</option>
+ <option value="666666">Grau</option>
+ <option value="0A6307">Dunkelgrün</option>
+ <option value="9C1B7C">Dunkellila</option>
+ <option value="3D0DB9">Dunkelblau</option>
+ <option value="8FA5ED">Hellblau</option>
+ <option value="FFFF00">Gelb</option>
+ <option value="3D4863">?????</option>
+ </select>
+ </div>
+ <br>
+END
+ } elsif ($method eq "edit_profile_html") {
+ if ($message eq "edit_profile_ok") {
+print <<END;
+ <div class=b>
+ Hinweis:
+ </div>
+ <div>
+ Du hast soeben Dein Profil erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren:
+ <hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Dein Profil editieren!" ),
+ $q->hr;
+ }
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="var" value="edit_profile">
+ <div>
+ Dein Nachname:
+ <br>
+ <input name="nachname" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ Dein Vorname:
+ <br>
+ <input name="vorname" value="$data[1]">
+ </div>
+ <br>
+ <div>
+ Dein Alter:
+ <br>
+ <input name="alter" value="$data[2]">
+ </div>
+ <br>
+ <div>
+ Dein Wohnort:
+ <br>
+ <input name="wohnort" value="$data[3]">
+ </div>
+ <br>
+ <div>
+ Deine E-Mail Adresse:
+ <br>
+ <input name="email" value="$data[4]">
+ </div>
+ <br>
+ <div>
+ Deine ICQ-Nummer:
+ <br>
+ <input name="icq" value="$data[5]">
+ </div>
+ <br>
+ <div>
+ Deine Homepage:
+ <br>
+ <input name="homepage" value="$data[6]">
+ </div>
+ <br>
+ <div>
+ Weiteres:
+ <br>
+ <textarea rows="5" cols="40"name="weiteres" wrap="virtual">$data[7]</textarea>
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <font color=ffffff>
+ <input type="submit" value="Daten ändern ...">
+ </font>
+ </form>
+</body>
+</html>
+END
+}
+
+
+sub edit { # Benutzerprofil od. Chat-Optionen abspeichern
+ &secure_checkip($alias);
+ my $method = $_[0];
+ if ($method eq "edit_profile") {
+ &write_file_new("data/user/profiles/$alias");
+ print DATEI $q->param('nachname')."\n".$q->param('vorname')."\n".$q->param('alter')."\n".$q->param('wohnort')."\n".$q->param('email')."\n".$q->param('icq')."\n".$q->param('homepage')."\n".$q->param('weiteres');
+ close DATEI;
+ &edit_html("edit_profile_html","edit_profile_ok");
+ } elsif ($method eq "edit_options") {
+ if ($id ne $tmp) {
+ &edit_html("edit_options_html","edit_pw_wrong");
+ exit;
+ }
+ &secure_checkip($alias);
+ &write_file_new("data/user/options/$alias");
+ print DATEI $id."\n".$col."\n".$secol;
+ close DATEI;
+ &edit_html("edit_options_html","edit_options_ok");
+ }
+}
diff --git a/0.2.5a2/online.pl b/0.2.5a2/online.pl
new file mode 100644
index 0000000..cdc0d43
--- /dev/null
+++ b/0.2.5a2/online.pl
@@ -0,0 +1,56 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+&secure_checkip($alias);
+&start_html("Online","online");
+&online($alias,$room);
+&list_dir("data/online/rooms/".$room);
+print
+ $q->div( "$room:" ),
+ "<font size=1 color=ffffef face=arial>";
+ foreach $online (@dir) {
+ if (-f "data/online/rooms/$room/$online") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$online",
+ -target=>"$online" }, "$online"), $q->br;
+ }
+ }
+print
+ "</font>",
+ $q->end_html;
+
+sub online { # Benutzer in die Onlineliste hinzufügen bzw. erneuern
+ my ($alias,$room) = @_;
+ &write_file_new("data/online/users/$alias");
+ print DATEI time;
+ close DATEI;
+ if (-e "data/online/rooms/$room") { # Falls Raum nicht existiert anlegen
+ } else {
+ &write_file_new("data/online/rstat/$room"); # Raumbesetzerstatus setzen
+ print DATEI "0\n\n$alias\n";
+ close DATEI;
+ mkdir "data/online/rooms/$room", 0777;
+ }
+ &write_file_new("data/online/rooms/$room/$alias");
+ print DATEI time;
+ close DATEI;
+ &read_file("data/online/prove"); # Räume und Chatter auf Existenz überprüfen
+ my $provetime = <DATEI>;
+ close DATEI;
+ if ($provetime < (time - 30)) {
+ &write_file_new("data/online/prove");
+ print DATEI time;
+ close DATEI;
+ &rm_alias("data/online/users");
+ &rm_rooms;
+ }
+}
diff --git a/0.2.5a2/push.pl b/0.2.5a2/push.pl
new file mode 100644
index 0000000..1cc55f0
--- /dev/null
+++ b/0.2.5a2/push.pl
@@ -0,0 +1,97 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+CGI->compile(':all');
+$q = new CGI;
+
+$| = 1; # Cache von Perl ausschalten
+
+print
+ $q->header; # HTML-Header erzeugen
+
+require config;
+
+&secure_checkip($alias);
+
+########################################
+##ANFANG DER ZU STREAMENDEN HTML-DATEI##
+########################################
+
+print <<END;
+<html>
+ <head>
+<script language="JavaScript">
+<!--
+// Scroll-Routine von Anklepper (http://www.anklepper.de)
+// speziell für yChat (http://www.yChat.de), Copyright 2000
+scrolling = true;
+moves_steps = 4; // Schrittgröße
+moves_interval = 4; // Schrittgeschwindigkeit
+
+function moves()
+{
+ if( scrolling != false )
+ window.scrollBy( 0, moves_steps );
+ window.setTimeout( "moves()", moves_interval );
+}
+
+moves();
+//-->
+</script>
+ </head>
+<body bgcolor=000000 link=FFFFFF alink=FFFFEF vlink=FFFFEF>
+END
+
+#############################
+##BEGRÜSSUNGSTEXT SCHREIBEN##
+#############################
+
+my $msgfile;
+
+ print
+ $q->font( { -size=>1,
+ -color=>"ffffff",
+ -face=>"arial"},
+ "$title Created & Copyright by Paul C. Bütow $tmp\n");
+
+if ($var eq "push_logs_html") {
+ $msgfile = $tmp;
+ print "<hr><font size=2 color=ffffff face=arial>";
+} elsif ($var eq "clear_screen") {
+ $msgfile = "data/msgs/$alias";
+ &write_file_new($msgfile);
+ print DATEI $q->br;
+ close DATEI;
+} else {
+ $msgfile = "data/msgs/$alias";
+ print $q->br;
+}
+
+open (MSGFILE, $msgfile);
+
+###############################
+##ENDLOSSCHLEIFE FÜR DEN PUSH##
+###############################
+
+my ($times,$online) = (0,"false");
+for (;;) {
+ for ($curpos = tell(MSGFILE); <MSGFILE>; $curpos = tell(MSGFILE)) {
+ print $_ ;
+ }
+ $times++;
+ if ($times > 14) { # Nach 15 Sekunden
+ print "\n<!--PING//-->"; # Ping zum Browser senden
+ $times = 0; # Sekundenzahl auf 0 zurücksetzen
+ $online = "true" if (-e "data/online/users/$alias");
+ if ($online eq "false") {
+ print "<font size=2 color=red>Aus technischen Gründen bitte auf <a href=\"push.pl?alias=$alias&room=$room&var=clear_screen\">Weiterchatten</a> klicken.</font>";
+ exit;
+ }
+ $online = "false"
+ }
+ sleep 1;
+ seek(MSGFILE, $curpos, 0); # Position wiederherstellen
+}
+
diff --git a/0.2.5a2/setup.sh b/0.2.5a2/setup.sh
new file mode 100644
index 0000000..71d0b60
--- /dev/null
+++ b/0.2.5a2/setup.sh
@@ -0,0 +1,40 @@
+#!/bin/sh
+mkdir data
+mkdir data/logs
+chmod 777 data/logs
+mkdir data/msgs
+chmod 777 data/msgs
+mkdir data/user
+chmod 777 data/user
+mkdir data/user/counts
+chmod 777 data/user/counts
+mkdir data/user/options
+chmod 777 data/user/options
+mkdir data/user/profiles
+chmod 777 data/user/profiles
+mkdir data/user/gbooks
+chmod 777 data/user/gbooks
+mkdir data/user/lastlogin
+chmod 777 data/user/lastlogin
+mkdir data/online
+chmod 777 data/online
+mkdir data/online/rooms
+chmod 777 data/online/rooms
+mkdir data/online/rstat
+chmod 777 data/online/rstat
+mkdir data/online/users
+chmod 777 data/online/users
+mkdir data/online/ident
+chmod 777 data/online/ident
+chmod 777 data/htdocs/*
+chmod 777 *
+mkdir dokus/
+mv *.txt dokus/
+mkdir ../../htdocs/yChat/
+mv *.gif ../../htdocs/yChat/
+mv *.jpg ../../htdocs/yChat/
+echo
+echo yChat Setup beendet ...
+echo Created and copyrighted by Paul C. Bütow aka Snooper
+echo
+
diff --git a/0.2.5a2/unten.gif b/0.2.5a2/unten.gif
new file mode 100644
index 0000000..285fb53
--- /dev/null
+++ b/0.2.5a2/unten.gif
Binary files differ
diff --git a/0.2.5a2/yBanner.gif b/0.2.5a2/yBanner.gif
new file mode 100644
index 0000000..e4b691e
--- /dev/null
+++ b/0.2.5a2/yBanner.gif
Binary files differ
diff --git a/0.2.5a2/yBanner2.gif b/0.2.5a2/yBanner2.gif
new file mode 100644
index 0000000..0e9684e
--- /dev/null
+++ b/0.2.5a2/yBanner2.gif
Binary files differ
diff --git a/0.2.5a2/yChat.jpg b/0.2.5a2/yChat.jpg
new file mode 100644
index 0000000..61eabfb
--- /dev/null
+++ b/0.2.5a2/yChat.jpg
Binary files differ
diff --git a/0.2.6a/INSTALL.txt b/0.2.6a/INSTALL.txt
new file mode 100644
index 0000000..534014d
--- /dev/null
+++ b/0.2.6a/INSTALL.txt
@@ -0,0 +1,106 @@
+#############################################################################
+## yChat.de Version 0.2.6 by CXG.de: The chatters of the next generation ##
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+yChat findest Du im Internet unter der Adresse www.yChat.de. Bei Kritik,
+Anregungen oder Fragen bitte in das dort vorhandene Board posten oder eine
+E-Mail an die oben stehende Adresse senden. Ich bemühe mich, yChat so gut wie
+möglich zu machen und bin über Ratschläge immer sehr erfreut :-) ...
+
+Die Installation kann auf Unix-Systemen voll automatisch duchgeführt werden.
+Allerdings ist dafür ein Telnet-Zugang notwendig. Kopiere alle vorhandenen
+Dateien in das Verzeichnis cgi-bin/yChat und führe dann das Shellskript
+setup.sh mit dem Befehl ./setup.sh aus. Alle Verzeichnisse werden
+automatisch erstellt. Dies wurde allerdings nur auf SuSE Linux Systemen
+mit root-Zugriff getestet. Solltest Du ein anderes System verwenden oder
+den Chat auf einen virtuellen Webserver installieren wollen, dann mußt Du
+unter umständen das Verzeichnis "../../htdocs/yChat" nach "../../yChat"
+in der setup.sh umbenennen. Ansonsten werden die dazugehörigen Grafikdateien
+falsch oder garnicht kopiert.
+
+Wenn Du keinen Telnet-Zugang hast, kannst Du hier die Verzeichnisse manuell
+erstellen:
+
+Folgende Basis-Dateien sind im Chat enthalten und müssen in das cgi-bin
+Verzeichnis kopiert werden. Z.B. nach ./cgi-bin/yChat/:
+
+config.pm => Configurationsdatei ("Shared subs")
+htdocs.pl => HTML-Dokumentdateien (Nicht unbedingt erforderlich)
+index.pl => Startskript (Registrierung, Frameset, Login, Daten edit.)
+main.pl => Hauptskript (Alle Hauptfunktionen des Chats)
+main2.pl => Skript für editieren der Benutzerdaten etc.
+online.pl => Anzeige und Überprüfung der eingelogten Benutzer
+push.pl => Server-Push-Routine
+setup.sh => Dient zur automatischen Einrichtung des Chats.
+LIESMICH.txt => Beinhaltet wichtige Informationen
+UPDATES.txt => Updateliste der verschiedenen Versionen
+INSTALL.txt => Dieses Dokument
+help.sno => Datei beinhaltet alle Chatbefehle
+
+Folgende Verzeichnisse müssen erstellt werden (chmod 777 sollte
+funktionieren):
+
+- Hier befinden sich alle für den Chat notwenidgen Daten:
+ ./cgi-bin/yChat/data/*
+
+- Hier befinden sich alle Logdateien, die vom Chat erstellt werden:
+ ./cgi-bin/yChat/data/logs/*
+
+- Hier befinden sich die Message-Dateien der eingelogten Benutzer:
+ ./cgi-bin/yChat/data/msgs/*
+
+- Hier befinden sich alle Daten der registrierten Benutzer:
+ ./cgi-bin/yChat/data/user/*
+
+- Hier wird abgespeichert, wie oft ein Benutzerprofil insgesant schon
+ aufgerufen wurde:
+ ./cgi-bin/yChat/data/user/counts/*
+
+- Hier werden alle Memos abgespeichert.
+ ./cgi-bin/yChat/data/user/memos/*
+
+- Hier befinden sich alle Chat-Optionen und Passwörter der registrierten
+ Benutzer:
+ ./cgi-bin/yChat/data/user/options/*
+
+- Hier befinden sich alle Benutzerprofile der Benutzer:
+ ./cgi-bin/yChat/data/user/profiles/*
+
+- Hier befinden sich alle Gästebucheinträge der Benutzer:
+ ./cgi-bin/yChat/data/user/gbooks/*
+
+- Hier wird Protokolliert, wann sich die Benutzer zum letzten mal eingelogt haben:
+ ./cgi-bin/yChat/data/user/lastlogin/*
+
+- Hier befinden sich alle Daten zu den aktuellen Chaträumen und User die online sind
+ ./cgi-bin/yChat/data/online/*
+
+- Hier befinden sich alle offnenen Räume
+ ./cgi-bin/yChat/data/online/rooms/*
+
+- Hier befinden sich die Chatter, die sich in den jew. Räumen befinden. Die
+ Verzeichnisse der Räume werden automatisch erstellt.
+ ./cgi-bin/yChat/data/online/rooms/RAUMNAME/*
+
+- Hier befinden sich alle Chatter, die sich z.Z. im System befinden
+ ./cgi-bin/yChat/data/online/users/*
+
+- Hier befinden sich alle IP-Nummern der eingelogten Chatter
+ ./cgi-bin/yChat/data/online/ident/*
+
+Folgende GRafikdateien sollten in ein nicht-CGI-BIN-Verzeichnis kopiert werden. Z.B.
+nach ./yChat/
+
+ bar.gif => Der gelb gestreifte Rand auf den meisten Seiten
+ unten.gif => Der Hintergrund für das Eingabeformular im Chat
+ yChat.gif => Das yChat-Logo auf der Startseite
+ yBanner.gif => 400x40 yChat-Banner
+ yBanner2.gif => 88x31 yChat-Banner
+
+Zum schluß sollte die config.pm-Datei nach wünschen editiert werden. Allerdings sollten
+die Copyright Hinweise und die Versionsnummern nicht manipuliert werden.
+
+Folgende Dateien werden von yChat automatisch erstellt:
+
+Viel Spaß beim Chatten ...
+ Snooper \ No newline at end of file
diff --git a/0.2.6a/LIESMICH.txt b/0.2.6a/LIESMICH.txt
new file mode 100644
index 0000000..4f92a14
--- /dev/null
+++ b/0.2.6a/LIESMICH.txt
@@ -0,0 +1,45 @@
+#############################################################################
+## yChat.de Version 0.2.6 by CXG.de: The chatters of the next generation ##
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+Allgemeine Bedingungen bezgl. yChat:
+
+ - Das yChat-System darf ohne Erleubnis des Autors nicht auf irgendeiner Art
+ und Weise weitergegeben- oder eingesetzt werden.
+
+ - Wird das yChat-System eingesetzt, so darf es manipuliert werden, soweit
+ die Copyright-Hinweise des Autors, die Versionsbezeichnung und der Link
+ auf der Startseite nach servers.yChat.de unverändert bleibt.
+ Ansonsten darf der gesamte Code manipuliert werden.
+
+ - Wird das yChat-System erlaubter Weise manipuliert, so muß das veränderte
+ Skript auf Anforderung an den Autor weitergegeben werden. Dieser darf
+ die Veränderungen in das Standard-yChat-System integrieren.
+
+ - Wird das yChat-System eingesetzt, su muß dem Autor die Location bzw. die
+ URL bekanntgegeben werden. Diese wird in servers.yChat.de eingetragen.
+ und mit einer URL wwX.yChat.de verlinkt. Wobei X für die Nummer des jew.
+ Servers steht.
+
+ - Es ist verboten, Sourcecode aus dem yChat-System zu kopieren und
+ für andere, nicht von yChat abhängige Perl-Programme einzusetzen.
+
+Im Flogenden einige yChat-bezügl. Verknüpfungen:
+
+ www.servers.yChat.de => Liste aller laufenden yChat-Systeme
+ www.install.yChat.de => Installationsdokumentation
+ www.liesmich.yChat.de => Allgemeine Bedingungen usw.
+ www.todo.yChat.de => Funktionen, die später integriert werden
+ www.updates.yChat.de => Update-Liste
+ www.yChat.de => Das Skript zum testen
+
+Vielen Dank an:
+
+ - Andreas Buchwald für die Programmierung des "Nach-UntenScroll-JavaScripts"
+ (www.anklepper.de).
+
+ - Michi aka Snoopy für die Erstellung und Anregung der Farbtabelle
+ (www.berlin-singeltreff.de).
+
+ - Peacemaker für die Erstellung des yChat-Logos
+ (www.peaceplace.de).
diff --git a/0.2.6a/TODO.txt b/0.2.6a/TODO.txt
new file mode 100644
index 0000000..c2ed8e0
--- /dev/null
+++ b/0.2.6a/TODO.txt
@@ -0,0 +1,25 @@
+Folgende Funktionen werden demnächst in yChat integriert:
+
+ - Die Schlucht (Ein Raum wo Chatter hineingeworfen werden,
+ die sich nicht benehmen und noch nicht aus dem Chat
+ katapultiert werden sollen).
+
+ - Löschung aller Chatter, die sich seit 60 Tagen nicht mehr
+ eingelogt haben.
+
+ - IP-Adressen ver-/entbannen.
+
+ - E-Mail zusendung bei verlorenem Passwort.
+
+ - Totale Onlinezeit der einzelnen Chatter soll protokolliert
+ werden. Daraus wird dann eine Top20 der Chatter erstellt.
+
+ - Unter "Benutzer" sollen Chatter über eine Eingabemaske nach
+ dem Anfangsbuchstaben gesucht werden können (vergl. Kilahu).
+
+ - Der Cybarkeeper (künstlich intilligenter Chatroboter, der
+ sich im Hauptraum Cyberbar aufhält, virtuelle Drinks verteilt
+ und von Real-Chattern übernommen werden kann. (Zukunftsmusik)
+
+Für weitere Vorschläge bitte in das yChat-Board unter www.yChat.de
+texten oder eine E-Mail an paul@buetow.oxg.de :-) \ No newline at end of file
diff --git a/0.2.6a/UPDATES.txt b/0.2.6a/UPDATES.txt
new file mode 100644
index 0000000..227afc1
--- /dev/null
+++ b/0.2.6a/UPDATES.txt
@@ -0,0 +1,91 @@
+########################### yChat.de UPDATE LIST ###########################
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+Hier sind alle Erneuerungen der Versionen dokumentiert:
+
+Update von 0.2.5 auf 0.2.6 vom 17.12.2k
+ - Das Eingabeframe reloaded sich nicht mehr nach jedem Posting.
+ Vielen Dank an Truhe aka Dave und Klepper aka Andreas Buchwald!
+ Bei den Chatbefehlen /col /away /j und /ju muß sich das
+ Eingabeframe weiterhin reloaden.
+ - Der Befehl // wurde entfernt. Dieser war nicht mehr erforderlich.
+ weil Nachrichten werden nur noch sehr selten verschluckt. Dieser
+ Chatbefehl postete die letzte Nachricht nocheinmal.
+ - Neuer Befehl: mit "/memo Alias hier der Text" hinterläßt man
+ Alias eine Memo. Logt sich Alias in den Chat ein, dann erhält
+ er diese sofort. Dafür wurde das Verzeichnis ".data/user/memos/"
+ angelegt.
+ - Programmcode wurde ein wenig optimiert.
+ - Das Design wurde ein wenig geändert.
+ - Beseitigung diverser Bugs.
+
+Update von 0.2.4 auf 0.2.5 vom 15.12.2k
+ - Derjenige, der einen Raum zuerst betritt, hat Raumbesetzerrechte.
+ - Raumbesetzer, Wächter und Oberwächte können weitere Raumbesetzer
+ bestimmen. Diese können Raumbeseter auch wieder degradieren.
+ - Raumbesetzer, Wächter und Oberwächter können dem aktuellen Raum
+ auf/absperren und Themen geben. Wächter und Oberwächter können
+ abgesperrte Räume betreten.
+ - Das Verzeichnis ".data/htdocs" wurde entfernt. Die Datei help_html
+ heist nun help.sno und befindet sich im yChat-Hauptverzeichnis.
+ - Das Verzeichnis ".data/user/lastlogin" wurde hinzugefügt. Hier
+ wird beim erfolgreichen Einloggen ein "Timestamp" gesetzt. Später
+ sollen Oberwächter "veraltete" Benutzer entfernen können.
+ - Neuer Oberwächterbefehl: "/kill Alias" entfernt Alias ganz und gar
+ vom System. Oberwächter und Wächter können nicht entfernt werden.
+ - Perl-Cache wurde im gesamten System komplett deaktiviert ( Weniger
+ Ladezeiten der HTML-Dokumente ).
+ - Nur Nachrichten aus dem Raum "Cyberbar" werden gelogt.
+ Selbsterstellte Räume werden nichtmehr gelogt. Viele Logfunktionen
+ wurden entfernt (weniger Serverbalast).
+ - Beseitigung einiger kleinen Bugs.
+ - Unter "Optionen" im Chat wir die Farbe nun mit einem Drop-Down-Menü
+ ausgewählt ( Vielen dank an Michi aka Snoopy ).
+ - Auf der Startseite wird nun angezeigt wieviele Benutzer eingelogt
+ sind. Ist keiner eingelogt, dann wird das System "aufgeräumt". D.h.
+ Dateien die nicht mehr gebraucht werden und noch nicht gelöscht
+ wurden werden entfernt ( z.B. Nachrichtendateien der einzelnen
+ Chatter und die Dateien die die IP-Nummern der eingelogten Benutzer
+ beinhalteten usw.).
+ - Hunzufügung einer TODO-Liste. Hier sind mehrere Funktionen
+ vermerkt, die in späteren yChat-Versionen eingebaut werden sollen.
+ (www.todo.yChat.de oder TODO.txt).
+
+Update von 0.2.3 auf 0.2.4 - 30.11.2k
+ - Optimierung bzw. Verbesserung der Push-Routine push.pl.
+ - Server-Ping wurde von 2-Pings-per-Minute auf 4 erhöht.
+ - yChat-Banner wurde erstellt und ist unter
+ documents.yChat.de/yBanner.jpg vorzufinden.
+ - Unter der URL servers.yChat.de wurde eine Serverliste angelegt,
+ welche anzeigt wo yChat-Systeme laufen.
+ - Des weiteren wurden die URLs updates.yChat.de, install.yChat.de
+ und liesmich.yChat.de eingerichtet.
+ - Die Menüpunkte wurden zusammengefaßt, damit sie unter einer
+ Auflösung von 800x600 nur eine Zeile belegen.
+ - Einige Bugs wurden entfernt.
+
+Update von 0.2.2 auf 0.2.3 - 25.11.2k
+ - Smooth scrolling JavaScript ( Vielen Dank an Andreas Buchwald ).
+ - "IP#-Fehler" wurde so gut wie beseitigt.
+ - Aufrufe der einzelnen Benutzerprofile wird gezählt und angezeigt.
+ Diese werden in data/user/counts/* gespeichert.
+ - Automatische Einrichtung des Chats mit setup.sh und Telnet.
+ - Menüpunkt "Dein Profil" wurde entfernt da eigenes Profil auch
+ stets über die Onlineliste aufgerufen werden kann.
+
+Update von 0.2.1 auf 0.2.2 - 23.11.2k
+ - Einige Bugs wurden entfernt.
+ - Geschwindigkeit des Chats wurde optimiert.
+ - Eine Liste aller eingelogten Benutzer erscheint am Rand. Hierfür
+ wurde die Datei online.pl eingeführt. Sie aktuallisiert sich alle
+ 20 Sekunden.
+ - Die UPDATES.txt wurde eingeführt.
+
+Update von 0.2.0 auf 0.2.1
+ - Einige Bugs wurden entfernt.
+ - Die IP# der eingelogten Benutzer werden nun anders verwaltet.
+
+Update von Alpha XVIII auf 0.2.0
+ - Die Handhabung der eingelogten Benutzer im System wurde komplett neu
+ überarbeitet.
+ - Neue Versionsnumern wurden eingeführt. \ No newline at end of file
diff --git a/0.2.6a/bar.gif b/0.2.6a/bar.gif
new file mode 100644
index 0000000..61d02b7
--- /dev/null
+++ b/0.2.6a/bar.gif
Binary files differ
diff --git a/0.2.6a/config.pm b/0.2.6a/config.pm
new file mode 100644
index 0000000..c3f701f
--- /dev/null
+++ b/0.2.6a/config.pm
@@ -0,0 +1,321 @@
+# yChat - Copyright by Paul C. Bütow
+
+########################### Dieser Teil bestimmt die Standart-Variabeln.
+##STANDART-CONFIGURATION:## (CSS, Farben, Version etc.)
+###########################
+$alias = $q->param("alias");
+$var = $q->param("var");
+$room = $q->param("room");
+$col = $q->param("col");
+$secol = $q->param("secol");
+$msg = $q->param("msg");
+$tmp = $q->param("tmp");
+$id = $q->param("id");
+$room = "Cyberbar" if ($room eq "");
+$col = "ffffef" if ($col eq "");
+$secol = "ffffef" if ($secol eq "");
+$datum = "19.12.2k";
+$version = "0.2.6a";
+$title = "yChat.de ($version)";
+$gfxpath = "../../yChat/";
+$style = <<ENDCSS;
+<style rel="stylesheet" type="text/css">
+ body { background-image: url("$gfxpath/bar.gif"); background-color: 000000 }
+ body.menu { background-image: none }
+ body.log { background-color: 000000 }
+ body.online { background-color: 444444; background-image: none }
+ div { font-family: arial, verdana, helvetiva; font-size: 10pt; color: ffffff }
+ div.b { font-weight: bold; color: ffa500 }
+ a { color: ffffef }
+ a:hover { color: ffffff; text-decoration: none }
+</style>
+ENDCSS
+
+############### Dieser Teil enthält Programmcode, der an verschiedenen
+##SHARED-SUBS## Stellen ausgeführt werden muß und jedem Skript zur
+############### Verfügung steht.
+
+sub printfile { # Liest eine externe Datei ein und gibt sie mit print aus
+ my ($file2print,$pagetitle,$bodyclass) = @_;
+ if ($pagetitle ne "") {
+ &start_html($pagetitle,$bodyclass);
+ }
+ print "<div><a href=\"push.pl?alias=$alias&tmp=$tmp&var=push_logs_html\">Push</a></div><hr>" if ($bodyclass eq "log");
+ &read_file($file2print);
+ @file2print = <DATEI>;
+ close DATEI;
+ print @file2print;
+}
+
+
+sub start_html { # Der HEADER einer HTML-Datei
+print "<html><head>";
+print "<meta http-equiv=\"refresh\" content=\"20\" URL=\"online.pl?room=$room\">" if ($_[1] eq "online");
+print <<END;
+ <title>
+ $title - $_[0]
+ </title>
+ $style
+ </head>
+END
+ if ($_[1] ne "") {
+ print "<body class=$_[1]>";
+ } else {
+ print "<body>";
+ }
+}
+
+sub post { # Öffentliche Nachricht im aktuellen Raum $room posten.
+ my ($msg2post,$secroom) = @_;
+ my @rooms = ($room,$secroom);
+ foreach(@rooms) {
+ my $room2post = $_;
+ &list_dir("data/online/rooms/$room2post");
+ foreach(@dir) {
+ my $alias2post = $_;
+ if (-f "data/online/rooms/$room2post/$alias2post") {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+ }
+ }
+ }
+ &log("$msg2post") if ($room eq "Cyberbar");
+}
+
+
+sub post_all { # Öffentliche Nachricht in ALLEN Räumen gleichzeitig posten.
+ my $msg2post = $_[0];
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ my $alias2post = $_;
+ if (-f "data/online/users/$alias2post") {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+ }
+ }
+ &log("$msg2post");
+}
+
+sub post_prv { # Private Nachricht posten (flüstern).
+ my $alias2post = $_[0];
+ my $msg2post = $_[1];
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+}
+
+sub log { # Protokollieren der Nachrichten etc.
+ my ($msg2log) = @_;
+ &zeit;
+ &write_file("data/logs/$day.$month.$year");
+ print DATEI "<br><font color=ffffef><i>($hours:$min:$sec)</i></font> $msg2log\n";
+ close DATEI;
+}
+
+
+sub zeit { # Aktuelles Datum und Uhrzeit bestimmen.
+ ($sec, $min, $hours, $day, $month, $year) = (localtime)[0..5];
+ $month += 1;
+ $hours = "0".$hours if ($hours < 10);
+ $min = "0".$min if ($min < 10);
+ $sec = "0".$sec if ($sec < 10);
+ $day = "0".$day if ($day < 10);
+ $month = "0".$month if ($month < 10);
+ $year = $year - 100;
+ if ($year < 10) {
+ $year = "200".$year;
+ } else {
+ $year = "20".$year;
+ }
+}
+
+sub count { # Zeilen in einer Datei Zählen.
+ my $file2count = $_[0];
+ &read_file($file2count);
+ my @datei = <DATEI>;
+ close DATEI;
+ $number = $#datei+1;
+}
+
+sub read_file { # Datei öffnen.
+ my $file2read = $_[0];
+ if (-e "$file2read") {
+ open (DATEI,"<$file2read") || &error("Konnte $file2read nicht öffnen");
+ }
+}
+
+sub write_file { # Text an eine Datei anhängen.
+ my $file2write = $_[0];
+ if (-e "$file2write") {
+ open (DATEI,">>$file2write") || &error("Konnte $file2write nicht öffnen");
+ } else {
+ &create_file("$file2write");
+ open (DATEI,">>$file2write") || &error("Konnte $file2write nicht öffnen");
+ }
+}
+
+sub write_file_new { # Datei neu schreiben.
+ my $file2write = $_[0];
+ if (-e "$file2write") {
+ open (DATEI,">$file2write") || &error("Konnte $file2write nicht öffnen");
+ } else {
+ &create_file("$file2write");
+ open (DATEI,">$file2write") || &error("Konnte $file2write nicht öffnen");
+ }
+}
+
+sub create_file { # Datei erstellen.
+ my $file2create = $_[0];
+ open (CREATE, ">$file2create") || &error("Konnte $file2create nicht erstellen!");
+ print CREATE "";
+ close CREATE;
+}
+
+sub error { # Error-Ausgabe.
+ my $error_msg = $_[0];
+ &start_html( "Error: ($error_msg)" );
+ print $q->div( "Error: ($error_msg)" ),
+ $q->end_html;
+ exit;
+}
+
+sub remove_online { # Chatter entfernen
+ my ($alias,$room,$method) = @_;
+ unlink("data/online/users/$alias");
+ unlink("data/online/rooms/$room/$alias") if ($room ne undef);
+ unlink("data/online/ident/$alias");
+ unlink("data/msgs/$alias");
+ &rm_rooms;
+ &zeit;
+ if ($method eq undef) {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias verläßt den Chat ...</font></i>");
+ } elsif ($method ne "kick") {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500> $_ hat den Chat verlassen ... </font></i>");
+ }
+ &rm_rstat($room,$alias) if ($room ne undef);
+}
+
+sub rm_alias { # Chatter aus dem System entfernen, dessen Timestamps älter als 60 Sekunden sind
+ my ($dir2rm,$rstatroom) = @_;
+ &list_dir($dir2rm,2);
+ foreach(@dir2) {
+ if (-f "$dir2rm/$_" && $_ ne undef) {
+ &read_file("$dir2rm/$_");
+ my $timestamp = <DATEI>;
+ close DATEI;
+ if ($timestamp < (time - 60)) {
+ if ($dir2rm eq "data/online/users") {
+ &remove_online($_,undef,1);
+ } else {
+ unlink("$dir2rm/$_");
+ &rm_rstat($rstatroom,$_) if ($rstatroom ne undef);
+ }
+ }
+ }
+ }
+}
+
+sub rm_rooms { # Leere Räume aus dem System entfernen
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-d "data/online/rooms/$_") {
+ &rm_alias("data/online/rooms/$_",$_);
+ &list_dir("data/online/rooms/$_",2);
+ if ($#dir2 = 1) {
+ rmdir("data/online/rooms/$_");
+ }
+ }
+ }
+}
+
+sub rm_rstat { # Benutzer als Raumbesetzer austragen
+ my ($rstatroom,$r_alias) = @_;
+ &read_file("data/online/rstat/$rstatroom");
+ my @rstat = <DATEI>;
+ close DATEI;
+ my $newfile = $rstat[0].$rstat[1];
+ for ($i=2;$i<=$#rstat;$i++) {
+ $newfile = $newfile."\n".$rstat[$i] if ($rstat[$i] ne $r_alias."\n");
+ }
+ write_file_new("data/online/rstat/$rstatroom");
+ print DATEI $newfile;
+ close DATEI;
+}
+
+sub secure_removeip { # Beim ausloggen die IP-Nummer aus dat/ip austragen.
+ my $alias2rm = $_[0];
+ unlink("data/online/ident/$alias2rm");
+}
+
+sub secure_checkip { # data/ip auf die eigene IP-Nummer überprüfen.
+ my ($alias2check,$method) = @_;
+ my $ip;
+ for($i=0 ;$i<=5;) {
+ &read_file("data/online/ident/$alias2check");
+ $ip = <DATEI>;
+ close DATEI;
+ if ($ip ne $ENV{'REMOTE_ADDR'}) {
+ $i++;
+ } else {
+ goto ENDCHECKIP
+ }
+ if ($i<=5) {
+ if ($method eq undef) {
+ &error("Du bist nicht befugt, mit der IP# $ENV{'REMOTE_ADDR'} und dem Alias \"$alias\" zu handeln. Sollte diese Meldung aufgrund eines Fehlers aufgetaucht sein, dann log Dich doch bitte neu in den Chat ein.");
+ } else {
+ &post_prv("$alias2check","<font color=red>Du bist nicht befugt, mit der IP# $ENV{'REMOTE_ADDR'} und dem Alias \"$alias\" zu handeln. Sollte diese Meldung aufgrund eines Fehlers aufgetaucht sein, dann log Dich doch bitte neu in den Chat ein.</font>");
+ &input_html("true") if ($method = 2);
+ }
+ exit;
+ }
+ }
+ENDCHECKIP:
+}
+
+sub remove_rooms { # Leere Räume entfernen.
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-d "data/online/rooms/$_") {
+ &list_dir("data/online/rooms/$_");
+ rmdir("data/online/rooms/$_") if ($#dir = 1);
+ }
+ }
+}
+
+sub list_dir { # Beliebigen Verzeichnisbaum einlesen.
+ my ($dir,$method) = @_;
+ opendir(DIR, $dir);
+ if ($method eq undef) {
+ @dir = readdir(DIR);
+ } elsif ($method = 2) {
+ @dir2 = readdir(DIR);
+ }
+ closedir(DIR);
+}
+
+sub hirachie { # Chatter nach Sonderrechte überprüfen.
+ my $alias2prove = $_[0];
+ $hirachie = undef;
+ &read_file("data/wa");
+ @was = <DATEI>;
+ close DATEI;
+ foreach(@was) {
+ if ($_ eq $alias2prove || $_ eq "$alias2prove\n") {
+ $hirachie = "wa";
+ }
+ }
+ &read_file("data/ow");
+ @ows = <DATEI>;
+ close DATEI;
+ if ($hirachie ne "wa" || $_ eq "$alias2prove\n") {
+ foreach(@ows) {
+ if ($_ eq $alias2prove || $_ eq "$alias2prove\n") {
+ $hirachie = "ow";
+ }
+ }
+ }
+}
+
+$| = 1; # Cache von Perl ausschalten \ No newline at end of file
diff --git a/0.2.6a/help.sno b/0.2.6a/help.sno
new file mode 100644
index 0000000..2543c5c
--- /dev/null
+++ b/0.2.6a/help.sno
@@ -0,0 +1,54 @@
+<div>
+ Alle Chat-Befehle:
+</div>
+<hr>
+<table width=100% bgcolor=555555>
+<tr><th bgcolor=666666><div>SU</div></th><th bgcolor=666666><div>Befehl</div></th><th bgcolor=666666><div>Beschreibung</div></th></tr>
+<tr><td><div>NC</div></td><td><div>/about</div></td><td><div>Zeigt aktuelle Version und andere Infos der Community an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/away <font color=red>Nachricht</font></div></td><td><div>Abmelden mit einer<font color=red>Abmeldenachricht</font></div></td></tr>
+<tr><td><div>NC</div></td><td><div>/clear</div></td><td><div>Bildschirm wird gelöscht</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/col <font color=red>XXXXXX</font> <font color=ffa500>XXXXXX</font></div></td><td><div>Farbe/n (<font color=red>Namensfarbe</font> / <font color=ffa500>Textfarbe</font>) wechseln. Angabe in Hexadezimal.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/date</div></td><td><div>Zeigt aktuelles Datum und Urzeit an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/j <font color=red>Raumname</font></div></td><td><div>Raum wechseln/erstellen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ju <font color=red>Alias</font></div></td><td><div>In den Raum wechseln/folgen, wo sich <font color=red>Alias</font> befindet.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/m <font color=red>Aktion</font></div></td><td><div>Handeln mit 2 Farben</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/me <font color=red>Aktion</font></div></td><td><div>Handeln mit einer Farbe</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/memo <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine <font color=ffa500>Memonachricht</font> hinterlassen.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/msg <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine private <font color=ffa500>Nachricht</font> flüstern.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ <font color=ffa500>Nachricht</font></div></td><td><div>Eine private <font color=ffa500>Nachricht</font> demjenigen flüstern, dem zuletzt eine geflüstert wurde</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/q</div></td><td><div>Cumunnity verlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/s <font color=red>Nachricht</font></div></td><td><div><font color=red>Nachricht</font> schreien</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/w</div></td><td><div>Zeigt an, wer sich im aktuellen Raum befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc <font color=red>Raum</font></div></td><td><div>Zeigt an, wer sich im <font color=red>Raum</font> befindet. Wird kein Raum angegeben, dann wird jedeglich angezeigt, wer sich im System befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc/</div></td><td><div>Zeigt alle offenen Räume und deren Chatter an</div></td></tr>
+<tr><td><div>NC</div></td><td> <div>/wj <font color=red>Alias</font></div></td><td><div>Zeigt an, in welchen Raum sich <font color=red>Alias</font> befindet</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/l</div></td><td><div>Der aktuelle Raum wird ab- bzw. aufgesperrt</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/rsu <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> die Raumbesetzerrechte entnehmen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/su <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Raumbesetzer ernennen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/t <font color=red>Thema</font></div></td><td><div>Dem aktuellen Raum wird ein <font color=red>Thema</font> gegeben</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/k <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird aus dem Chat katapultiert!</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/ban</div></td><td><div>Zeigt alle verbannten Benutzer an</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/ban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> verbannen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/rban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> "entbannen"</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/ip <font color=red>Alias</font></div></td><td><div>Zeigt die IP-Nummer von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/kill <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird ganz und gar aus dem System entfernt</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/wa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Wächter ernennen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/rwa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom Wächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/sys <font color=red>Nachricht</font></div></td>
+<td><div>Systemnachricht schreiben. (Erscheint in allen existierenden Räumen)</div></td></tr>
+</table><hr>
+<div>
+ Zur Erklärung: NC steht für "Normale Chatter", RB für "Raumbesetzer", WÄ für "Wächter" und OW für "Oberwächter".
+ Obrige Befehle können nur von der/den jeweiligen Benutzergruppe/n werden.<br><br>
+ Allerdings gibt es folgendes zu beachten: Oberwächter verfügen über alle Chatbefehle. Normale Wächter über alle Chatbefehle, außer über die der Oberwächter.
+ Raumbesetzer können nur Raumbesetzerbefehle und die Befehle der normalen Chatter durchführen. Normale Chatter haben jedeglich die Standardbefehle zu verwenden.<br><br>
+ Weitere Besonderheiten der Wächter und Oberwächter:<br><br>
+ Wächter und Oberwächter können ....<br>
+ ... abgesperrte Chaträume problemlos betreten.<br>
+ ... nicht gekickt, verbannt oder gekillt werden.<br>
+ ... Logdateien der Cyberbar lesen.<br><br>
+
+ Des weiteren: Oberwächter ernennt nur der Systemadministrator!
+</div>
+</body>
+</html> \ No newline at end of file
diff --git a/0.2.6a/htdocs.pl b/0.2.6a/htdocs.pl
new file mode 100644
index 0000000..68c8a8a
--- /dev/null
+++ b/0.2.6a/htdocs.pl
@@ -0,0 +1,208 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+if ($var eq "help_html") {
+ &printfile("help.sno","Alle Chatbefehle");
+} elsif ($var eq "menu_html") {
+ &menu_html;
+} elsif ($var eq "blank_html") {
+ print "<html><body bgcolor=000000>",$q->end_html;
+} elsif ($var eq "werda_html") {
+ &werda_html;
+} elsif ($var eq "logs_html") {
+ &logs_html;
+} elsif ($var eq "view_sulogs_html") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ &start_html("Oberwächter-Logdateien");
+ print "<div><a href=\"push.pl?alias=$alias&tmp=$tmp&var=push_logs_html\">Push</a><hr>";
+ &printfile($tmp);
+ print "</div></body></html>";
+ }
+} elsif ($var eq "view_logs_html") {
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ &printfile($tmp,$tmp,"log");
+ }
+} elsif ($var eq "superuser_html") {
+ &superuser_html;
+} elsif ($var eq "bar_html") {
+ print
+ $q->start_html(-bgcolor=>"ffa500"),
+ $q->end_html;
+} else {
+ print
+ $q->start_html(-bgcolor=>"000000"),
+ $q->end_html;
+}
+
+sub menu_html {
+ if ($tmp eq "quit") {
+ print
+ $q->script( { -language=>"JavaScript" }, "window.open(\"index.pl?tmp=quit\",\"_top\")" );
+ sleep 1;
+ &remove_online($alias);
+ &secure_removeip($alias);
+ unlink("data/msgs/$alias");
+ }
+ &start_html("Menü","menu");
+print <<END;
+ <center>
+ <div>
+ [<a href="htdocs.pl?var=werda_html&alias=$alias&room=$room&col=$col&secol=$secol&&tmp=$tmp" target="werda">Wer ist da?</a>]
+ [<a href="main2.pl?var=edit_profile_html&alias=$alias" target="ProfilAendern">Profil ändern</a>]
+ [<a href="main2.pl?var=edit_options_html&alias=$alias" target="main">Optionen</a>]
+ [<a href="main2.pl?var=list_alias_html&alias=$alias" target="Benutzerliste">Benutzer</a>]
+ [<a href="htdocs.pl?var=help_html" target="Befehle">Befehle</a>]
+ [<a href="main2.pl?var=gb_html&alias=$alias" target="Board">Board</a>]
+ [<a href="htdocs.pl?var=superuser_html&alias=$alias" target="Hirachie">Superuser</a>]
+ [<a href="htdocs.pl?var=logs_html&alias=$alias" target="Logdateien">Logs</a>]
+ [<a href="push.pl?alias=$alias&room=$room&var=clear_screen" target="main">Weiterchatten</a>]
+ [<a href="htdocs.pl?var=menu_html&tmp=quit&alias=$alias">Verlassen</a>]
+ </div>
+ </center>
+</body>
+</html>
+END
+}
+
+
+sub werda_html { # Anzeige, wer eingelogt ist.
+ &start_html("Wer ist da?");
+ print <<END;
+<div>
+ $alias, schön daß Du hier bist :-)
+</div>
+<hr>
+<div>
+ Folgende Personen befinden sich im Chat:
+</div>
+<br>
+<div>
+END
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ my $room = $_;
+ &read_file("data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ &list_dir("data/online/rooms/$room",2);
+ local $nr = $#dir2-1;
+ print $q->b( $_ ),
+ " $door ($nr) Raumthema: $rstat[1]",
+ $q->br;
+ foreach(@dir2) {
+ if ($_ ne ".." && $_ ne ".") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_" }, "$_"), " ";
+ }
+ }
+ print $q->br, $q->br;
+ }
+ }
+ print
+ "</div>",
+ $q->end_html;
+}
+
+sub logs_html {
+ &secure_checkip($alias);
+ &start_html("Logdateien");
+ print <<END;
+<div>
+ Hier befinden sich alle Logdateien
+</div>
+<hr>
+END
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ print $q->div( "Folgende Logdateien des Raumes \"Cyberbar\" können nur von Wächtern und Oberwächtern gelesen werden (Sortiert nach A-Z, a-z):" ),
+ $q->br;
+ &list_dir("data/logs");
+ my @sortedir = sort(@dir);
+ foreach(@sortedir) {
+ if (-f "data/logs/$_") {
+ print $q->a( { -href=>"htdocs.pl?alias=$alias&var=view_logs_html&tmp=data/logs/$_",
+ -target=>"_new" },
+ "$_" ),
+ " ";
+ }
+ }
+ } else {
+ print $q->div( "Logdateien können nur von Oberwächtern (OW) und von Wächtern (WÄ) gelesen werden. Du bist jedoch ein ",
+ "\"Normaler Chatter\". Wächter können alles nachlesen, was öffentlich gechattet wurde." ),
+ $q->hr;
+ &printfile("data/htdocs/logs_html");
+ }
+ print
+ $q->end_html;
+}
+
+sub superuser_html { # Zeigt an, wer Superuser ist
+ &start_html("Superuser");
+ print "<div>Hallo $alias. Du bist als ";
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ print
+ $q->b( "Oberwächter" ),
+ " (OW) eingetragen.</div>",
+ $q->hr;
+ } elsif ( $hirachie eq "wa") {
+ print
+ $q->b( "Wächter" ),
+ " (WÄ) eingetragen.</div>",
+ $q->hr;
+ } else {
+ print
+ $q->b( "normaler Chatter" ),
+ " (NC) eingetragen.</div>",
+ $q->hr;
+ }
+
+ my $nrow = $#ows+1;
+ print
+ "<div>",
+ $q->b( "OW" ),
+ "s ($nrow Stück)";
+ foreach(@ows) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+ my $nrwa = $#was+1;
+ print
+ "</div>",
+ $q->hr,
+ "<div>",
+ $q->b( "WÄ" ),
+ "s ($nrwa Stück)";
+ foreach(@was) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+print <<END;
+<hr>
+ Die jeweiligen Fähigkeiten der Oberwächter (OW) und der Wächter (WÄ) sind unter
+ "<a href="htdocs.pl?var=help_html">Chat-Befehle</a>"
+ dokumentiert.
+</div>
+</body>
+</html>
+END
+} \ No newline at end of file
diff --git a/0.2.6a/index.pl b/0.2.6a/index.pl
new file mode 100644
index 0000000..838ff44
--- /dev/null
+++ b/0.2.6a/index.pl
@@ -0,0 +1,369 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header; # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUFGERUFEN WERDEN?##
+#####################################
+if ($var eq "create_alias_html") {
+ &create_alias_html;
+} elsif ($var eq "create_alias") {
+ &create_alias;
+} elsif ($var eq "login_html") {
+ &login_html;
+} elsif ($alias eq "") {
+ &login_html;
+} else {
+ &checklogin;
+}
+
+sub login_html { # Erste Startseite
+local $counter = undef;
+&read_file("data/count");
+ $counter = <DATEI>;
+close DATEI;
+$counter++;
+&write_file_new("data/count");
+ print DATEI $counter;
+close DATEI;
+&list_dir("data/online/users");
+my $logtin = $#dir-1;
+&start_html("Created by Paul C. Bütow 2k");
+print <<END;
+ <center>
+ <table width=400>
+ <tr>
+ <td>
+ <b>
+ <div>
+ $title - ( <a href="http://servers.yChat.de">yChat-Servers</a> )
+ <img src="$gfxpath/yChat.jpg">
+ </div>
+ </b>
+END
+ if ($tmp eq "true") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Wahrscheinlich existiert Dein Alias "$alias" nicht,
+ <br>
+ Du hast Dich verschrieben oder das Passwort ist falsch.
+ <br>
+ Versuch es erneuert !
+ </div>
+END
+ } elsif ($tmp eq "quit") {
+print <<END;
+ <div>
+ Du hast soeben den Chat verlassen.
+ <br>
+ Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ } elsif ($tmp eq "banned") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein Alias "$alias" wurde verbannt.
+ <br>
+ Z.z. kannst Du Dich leider nicht in den Chat einloggen.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($tmp eq "kick") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wurdest soeben aus dem Chat katapultiert!
+ <br>
+ Schlechtes Verhalten mag die Ursache hierfür sein.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($var eq "create_alias") {
+print "<div>Du hast sich soeben in die Datenbank eingetragen. Einfach auf \"Los Geht's\" klicken :-)</div>";
+ } else {
+print <<END;
+ <div>
+ Herzlich willkommen!
+ <br>
+ Einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <form action="index.pl">
+ <input type="hidden" name="tmp" value="true">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Alias:
+ <br>
+ <input name="alias" value="$alias">
+ </div>
+ </td>
+ <td>
+ <div>
+ Dein Passwort:
+ <br>
+ <input type="password" name="id" value="$id">
+ </div>
+ </td>
+ </tr>
+ </table>
+ <br>
+ <br>
+ <div>
+ Solltest Du noch keinen Nick besitzen, dann auf "Registrieren" klicken!
+ </div>
+ <br>
+ <table>
+ <tr>
+ <td>
+ <font color="ffffff">
+ <input type="submit" value="Los geht's!">
+ </font>
+ </form>
+ </td>
+ <td>
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias_html">
+ <font color="ffffff">
+ <input type="submit" value="Registrieren">
+ </font>
+ </form>
+ </td>
+ </tr>
+ </table>
+ <hr>
+ <div>
+ yChat befindet sich momentan noch in der Entwicklungsphase !
+ <br>
+ Fragen gehen an Paul Bütow (
+ <a href="mailto:paul\@buetow.oxg.de">
+ paul\@buetow.oxg.de
+ </a>
+ ) :-)
+ <br>
+ <br>
+ Diese Seite wurde schon $counter mal aufgerufen. Es sind z.Z. $logtin Benutzer online.
+ </td>
+ </tr>
+ </table>
+ </center>
+</body>
+</html>
+END
+ if ($logtin == 0) {
+ &list_dir("data/msgs");
+ &list_dir("data/online/rstat",2);
+ foreach(@dir) {
+ unlink("data/msgs/$_");
+ unlink("data/online/ident/$_");
+ }
+ foreach(@dir2) {
+ unlink("data/online/rstat/$_");
+ }
+ }
+ # Falls d. Skript das Raumverz. gelöscht hat, neu anlegen
+ if (-d "data/online/rooms") {
+ } else {
+ mkdir "data/online/rooms", 0777;
+ }
+}
+
+
+sub create_alias_html { # HTML-Form für Erstellung eines neuen Benutzers.
+my $reload = $_[0];
+&start_html("Registration");
+print <<END;
+ <center>
+ <table width=400>
+ <tr>
+ <td>
+END
+ if ($reload eq "alias_exists") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Der von Dir gewählte Benutzername "$alias" existiert in unserer Datenbank bereits. Bitte versuch es erneuert mit
+ einem anderen Benutzernamen !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "pw_wrong") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Deine beiden Passworteingaben stimmen nicht überein. Bitte geb das Passwort erneuert an um sicherzugehen, daß
+ kein falsches Passwort abgespeichert wird !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "alias_prohibited") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein gewählter Benutername "$alias" enthält illegale Zeichen. Bitte versuch einen anderen Benutzernamen!
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Hier kannst Du Dich registrieren. Bitte beachte, daß die Passworteingabefelder übereinstimmen!
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias">
+ <div>
+ Dein Alias:
+ <font color="ffa500">
+ (Muß angegeben werden)
+ </font>
+ <br>
+ <input name="alias" VALUE="$alias">
+ </div>
+ <br>
+ <div>
+ Dein gewünschtes Passwort:
+ <br>
+ <input type="password" name="id" value="$id">
+ </div>
+ <br>
+ <div>
+ Geb hier Dein Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp">
+ </div>
+ <br>
+ <font color=ffffff>
+ <input type="submit" value="Registrieren">
+ </font>
+ <br>
+ </form>
+ <hr>
+ <div>
+ Um den Chat zu betreten müssen die Daten nach der Registration auf der Startseite erneuert bestätigt werden !
+ </div>
+ </td>
+ </tr>
+ </table>
+</center>
+</body>
+</html>
+END
+}
+
+sub checklogin { # Überprüfen, ob die Login-Daten korrekt sind.
+ my $lognotexists = "true";
+ &list_dir("data/user/options");
+ for (my $i=0; $i<=$#dir; $i++) {
+ if ($dir[$i] eq $alias) {
+ &read_file("data/user/options/$alias");
+ @datei = <DATEI>;
+ close DATEI;
+ chomp($datei[0]);
+ if ($datei[0] eq $id) {
+ &read_file("data/ban"); # Überprüfen, ob Alias verbannt ist
+ @banned = <DATEI>;
+ close DATEI;
+ foreach(@banned) {
+ if ($_ eq "$alias\n") {
+ $tmp = "banned";
+ &login_html();
+ exit;
+ }
+ }
+ $col = $datei[1];
+ $secol = $datei[2];
+ &write_file_new("data/online/ident/$alias");
+ print DATEI $ENV{'REMOTE_ADDR'};
+ close DATEI;
+ &write_file_new("data/user/lastlogin/$alias");
+ print DATEI time;
+ close DATEI;
+ &frameset_html;
+ exit;
+ } else {
+ $lognotexists = "false";
+ }
+ }
+ }
+ if ($lognotexists eq "true") {
+ }
+ &login_html; # Falls Login-Daten inkorrekt sind, zurück zur Startseite.
+}
+
+sub create_alias { # Erstellung eines neuen Benutzers.
+ if ($alias =~ /[\W]/ || $alias eq "") {
+ &create_alias_html("alias_prohibited");;
+ exit;
+ } elsif ($id ne $tmp) {
+ &create_alias_html("pw_wrong");
+ exit;
+ }
+ &list_dir("data/user/options");
+ for (my $i=0; $i<=$#dir; $i++) {
+ if ($dir[$i] eq $alias) {
+ &create_alias_html("alias_exists");
+ exit;
+ }
+ }
+ &write_file_new("data/user/options/$alias");
+ print DATEI $id."\n";
+ close DATEI;
+ &zeit;
+ &list_dir("data/user/options");
+ my $number = $#dir-1;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias [$number] hat sich soeben als neuer Benutzer registriert :-) ...</font></i>");
+ &login_html;
+}
+
+sub frameset_html {
+print <<END;
+<html>
+ <head>
+ <title>
+ $title - Created & Copyright by Paul C. Bütow
+ </title>
+ </head>
+<frameset border=0 frameborder=0 framespacing=0 rows="50,*,55,0">
+ <frame name="menu" src="htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol" scrolling="no">
+ <frameset border=0 frameborder=0 framespacing=0 cols="150,*">
+ <frame name="online" src="online.pl?room=$room&alias=$alias">
+ <frame name="main" src="push.pl?room=$room&alias=$alias&var=clear_screen">
+ </frameset>
+ <frame name="input" src="main.pl?alias=$alias&var=input_html&room=$room&col=$col&secol=$secol&tmp=login" scrolling="no">
+ <frame name="reload" src="htdocs.pl?var=blank_html" scrolling="no">
+</frameset>
+</html>
+END
+}
diff --git a/0.2.6a/main.pl b/0.2.6a/main.pl
new file mode 100644
index 0000000..a59800d
--- /dev/null
+++ b/0.2.6a/main.pl
@@ -0,0 +1,698 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI; # CGI-Modul laden
+
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+if ($var eq "input_html") {
+ &input_html;
+} elsif ($var eq "reload_html") {
+ &reload_html;
+} elsif ($var eq "post_msg") {
+ &post_msg;
+} elsif ($var eq "change_room") {
+ &change_room;
+} else {
+ &error("Parameter fehlt");
+}
+
+sub input_html { # Eingabemaske für den Chat.
+ if ($tmp eq "login") {
+ &remove_rooms;
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat den Chat betreten ...</font></i>");
+ }
+ my $whisper = @_;
+ $whisper = $q->param('whisper') if ($whisper == 0);
+print <<END;
+<html>
+ <head>
+ <script language="JavaScript">
+ function delout()
+ {
+ document.inf.submit();
+ document.inf.msg.focus();
+ document.inf.msg.select();
+ return false;
+ }
+ </script>
+ </head>
+<body bgcolor=000000>
+ <form name="inf" target="reload" action="main.pl" method="GET" onsubmit="return delout()">
+END
+ print <<END;
+ <input type="hidden" name="var" value="post_msg">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="room" value="$room">
+ <input type="hidden" name="col" value="$col">
+ <input type="hidden" name="secol" value="$secol">
+ <input type="hidden" name="id" value="$whisper">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input size="80" name="msg">
+ <input type="submit" value="Texten">
+ </form>
+</body>
+</html>
+END
+}
+
+sub reload_html { # Wird neugeladen, wenn eine Nachricht getextet wird!
+ my ($whisper,$action) = @_;
+ print "<html><head><script language=\"JavaScript\">";
+ if ($action eq "change_room") {
+ print "open(\"online.pl?alias=$alias&room=$room\",\"online\");";
+ print "open(\"main.pl?var=input_html&alias=$alias&room=$room&col=$col&secol=$secol&whisper=$whisper\",\"input\");";
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol\",\"menu\");";
+ } elsif ($action eq "change_colors") {
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol\",\"menu\");";
+ print "open(\"main.pl?var=input_html&alias=$alias&room=$room&col=$col&secol=$secol&whisper=$whisper\",\"input\");";
+ } elsif ($action eq "away") {
+ print "open(\"main.pl?var=input_html&alias=$alias&col=$col&secol=$secol&room=$room&tmp=noaway&whisper=$whisper\",\"input\");";
+ } elsif ($action eq "whisper") {
+ print "open(\"main.pl?var=input_html&alias=$alias&col=$col&secol=$secol&room=$room&whisper=$whisper\",\"input\");";
+ }
+ print "</script></head><body bgcolor=000000>";
+ print
+ $q->end_html;
+}
+
+sub post_msg { # Wird aufgerufen, wenn aus input_html eine Eingabe gepostet wurde.
+ if ($tmp eq "noaway") {
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias meldet sich zurück ... </font></i>");
+ &post("<script language=\"JavaScript\">open(\"main.pl?var=input_html&alias=$alias&col=$col&secol=$secol&room=$room&whisper=$whisper\",\"input\");</script>");
+ }
+ $msg =~ s#<#&lt\;#g; # HTML-Tags deaktivieren
+ if (substr($msg,0,1) ne "/") { # Überprüfen, ob Befehl oder Nachricht
+ $msg = "<b><font color=$col>$alias: <font color=$secol>".$msg."</font></font></b>";
+ &reload_html($id,$tmp); # -> Action=none, Whisper=$id, $tmp =? noaway
+ &secure_checkip($alias,1);
+ &post($msg);
+ } else {
+ &secure_checkip($alias,2);
+ &cmd($msg);
+ }
+}
+
+sub cmd { # Alle Chatbefehle, die über input_html eingegeben werden können.
+ $_[0] = $_[0]." ";
+ $_[0] = substr($_[0], 1, length($_[0])-1);
+ my @cmd = split(/ /, $_[0]);
+ my $cmd = substr($_[0],0 , index($_[0], " "));
+ my ($whisper,$action) = ($id);
+#############>- NORMALE CHATBEFEHLE ( Alphabetisch sortiert ) -<
+#############>- INFORMATIONEN ÜBER DAS SYSTEM AUSGEBEN -<
+ if ($cmd eq "about") {
+ &post_prv("$alias","<font size=2 color=ffffff>Aktuelle Version ist $title und wurde am $datum aktuallisiert. Created by Paul C. Bütow 2k.</font>");
+#############>- ABMELDEN MIT 'AWAY-NACHRICHT' -<
+ } elsif ($cmd eq "away") {
+ if ($tmp eq "away") { # Falls 2 mal hintereinander /away eingegeben wurde
+ my $away_msg = "";
+ }
+ for ($i=1; $i <= $#cmd; $i++) {
+ $away_msg = $away_msg." ".$cmd[$i];
+ }
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias meldet sich ab (<font color=red>$away_msg</font> ) ...</i></font>");
+ &reload_html($whisper,"away");
+ exit;
+#############>- EIGENEN CHATBILDSCHIRM LÖSCHEN -<
+ } elsif ($cmd eq "clear") {
+ &post_prv("$alias","<script language=\"JavaScript\">window.open(\"push.pl?alias=$alias&room=$room&var=clear_screen\",\"main\");</script>");
+ &reload_html($whisper);
+ exit;
+#############>- FARBEN WECHSELN -<
+ } elsif ($cmd eq "col") {
+ $col = $cmd[1];
+ my $tmpsecol = $cmd[2];
+ if ($tmpsecol eq "") {
+ $secol = $col
+ } else {
+ $secol = $tmpsecol;
+ }
+ &read_file("data/user/options/$alias");
+ my @pro = <DATEI>;
+ close DATEI;
+ &write_file_new("data/user/options/$alias");
+ print DATEI $pro[0]."".$col."\n".$secol;
+ close DATEI;
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat die Farbe gewechselt ...</font></i>");
+ &reload_html($whisper,"change_colors");
+ exit;
+#############>- AKTUELLES DATUM UND URZEIT AUSGEBEN -<
+ } elsif ($cmd eq "date") {
+ &zeit;
+ &post_prv("$alias","<font size=2 color=ffffff>Heute ist der $day.$month. Jahr $year. Es ist genau $hours:$min Uhr und $sec Sekunden.</font>");
+ &reload_html($whisper);
+ exit;
+#############>- EINEN NEUEN RAUM ERSTELLEN BZW. IN EINEN BESTEHENDEN RAUM WECHSELN -<
+ } elsif ($cmd eq "j") {
+ &change_room("j",$cmd[1],$room);
+ &reload_html($whisper,"change_room");
+ exit;
+#############>- HANDELN -<
+ } elsif ($cmd eq "me" || $cmd eq "m") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $me_msg = $me_msg." ".$cmd[$i];
+ }
+ if ($cmd eq "m") {
+ &post("<i><font color=$col>$alias <font color=$secol>$me_msg</font></font></i>");
+ } else {
+ &post("<i><font color=$col>$alias $me_msg</font></i>");
+ }
+ &reload_html($whisper);
+ exit;
+#############>- MEMO SCHREIBEN -<
+ } elsif ($cmd eq "memo") {
+ my $alias2memo = $cmd[1];
+ &list_dir("data/user/options");
+ foreach(@dir) {
+ if(-f "data/user/options/$alias2memo") {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $memo_msg = $memo_msg." ".$cmd[$i];
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2memo <font color=ffffff>wurde folgende memo erfolgreich hinterlassen: $memo_msg</font></font>");
+ &zeit;
+ &write_file("data/user/memos/$alias2memo");
+ print DATEI "<font size=2 color=ffffff>(<font color=red>$day.$month. - $hours:$min:$sec</font>) $alias hat Dir eine Memo hinterlassen: <font color=ffa500>$memo_msg</font></font><br>";
+ close DATEI;
+ &reload_html($whisper);
+ exit;
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2memo <font color=ffffff>existiert in der Datenbank nicht !</font></font>");
+ &reload_html($whisper);
+ exit;
+#############>- FLÜSTERN ( Auch mit '/' ) -<
+ } elsif ($cmd eq "msg" || $cmd eq "") {
+ my ($alias2post,$msg2post) = ($cmd[1],"");
+ if ($cmd eq "msg") {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ $action = "whisper";
+ } else {
+ $alias2post = $id;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ }
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ if ($_ eq $alias2post) {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "<i><font color=$col>$alias flüstert <font color=ffffff>=></font><font color=$secol>$msg2post</font></font></i><br>\n";
+ close DATEI;
+ &write_file("data/msgs/$alias");
+ print DATEI "<i><font color=$col>Zu $alias2post geflüstert <font color=ffffff>=></font><font color=$secol>$msg2post</font></font></i><br>\n";
+ close DATEI;
+ &reload_html($alias2post,$action);
+ exit;
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2post <font color=ffffff>ist momentan nicht anwesend !</font></font>");
+#############>- DAS SYSTEM VERLASSEN -<
+ } elsif ($cmd eq "q") {
+ &post_prv("$alias","<script language=\"JavaScript\">window.open(\"index.pl?tmp=quit\",\"_top\");</script>");
+ sleep 2;
+ &remove_online($alias,$room);
+ &secure_removeip($alias);
+ exit;
+#############>- SCHREIEN -<
+ } elsif ($cmd eq "s") {
+ my ($msg2scream,$msg2post);
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2scream = $msg2scream." ".$cmd[$i];
+ }
+ $msg2post = "\U$msg2scream";
+ &post("<font color=$col><i>$alias schreit:</i> <b><font color=$secol>".$msg2post."</font></font></b>");
+ &reload_html($whisper);
+ exit;
+#############>- ANZEIGEN WER SICH IM AKTUELLEN RAUM BEFINDET -<
+} elsif ($cmd eq "w") {
+ &list_dir("data/online/rooms/$room");
+ &read_file("data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ my ($is,$nr) = ("t",0);
+ foreach(@dir) {
+ if (-f "data/online/rooms/$room/$_") {
+ $personen = $personen." ".$_;
+ $nr++;
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>$room $door ($nr) [".$rstat[1]."] : <font color=ffa500>$personen</font></font>");
+ &reload_html($whisper);
+ exit;
+ #############>- ANZEIGEN WER SICH IM SYSTEM BEFINDET -<
+ } elsif ($cmd eq "wc" || $cmd eq "wc/") {
+ $raum = $cmd[1];
+ if ($raum eq "" && $cmd eq "wc") {
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/users/$_");
+ }
+ my $nr = ($#dir-1);
+ my ($nrs,$is) = ("","ist");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "sind";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>$nr Person$nrs $is insgesamt eingelogt: <font color=ffa500>$personen</font></font>");
+ } elsif ($raum eq "" && $cmd eq "wc/") {
+ my $msg2post;
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ &list_dir("data/online/rooms/$_",2);
+ &read_file("data/online/rstat/$_");
+ my @rstat = <DATEI>;
+ close DATEI;
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ my $nr = $#dir2-1;
+ $msg2post = $msg2post."<tr><td><b><font size=2 color=ffffff>$_ $door ($nr) [".$rstat[1]."] </font></b></td><td><font size=2 color=ffffff>";
+ foreach $chatter (@dir2) {
+ if (-f "data/online/rooms/$_/$chatter") {
+ $msg2post = $msg2post."$chatter ";
+ }
+ }
+ print "</font></td>";
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>Folgende Räume sind offen:</font><table>$msg2post</table>");
+ } elsif ($raum ne "") {
+ my $personen;
+ &list_dir("data/online/rooms/$raum");
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/rooms/$raum/$_");
+ }
+ my ($nr,$is) = (($#dir-1),"t");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "n";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff> $nr Person$nrs befinde$is sich im Raum \"$raum\": <font color=ffa500>$personen</font></font>");
+ }
+ &reload_html($whisper);
+ exit;
+#############>- ANZEIGEN IN WELCHEN RAUM SICH JMD. BEFINDET BZW. JMD IN EINEN RAUM FOLGEN -<
+ } elsif ($cmd eq "wj" || $cmd eq "ju") {
+ my $alias2search = $cmd[1];
+ &list_dir("data/online/rooms");
+ foreach $raum (@dir) {
+ &list_dir("data/online/rooms/$raum",2) if (-d "data/online/rooms/$raum");
+ foreach $user (@dir2) {
+ if (-f "data/online/rooms/$raum/$user") {
+ if ($user eq $alias2search) {
+ if ($cmd eq "wj") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2search <font color=ffffff>befindet sich im Raum \"$raum\" !</font></font>");
+ } else {
+ &change_room("ju",$raum,$room,$alias2search);
+ }
+ &reload_html($whisper,"change_room");
+ exit;
+ }
+ }
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2search <font color=ffffff> ist nicht eingelogt !</font></font>");
+ &reload_html($whisper);
+ exit;
+#############>- RAUMNESETZER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- RAUM ABSCHLIESSEN/AUFSCHLIESSEN -<
+ } elsif ($cmd eq "l") {
+ &prove_besetzer($alias,$room);
+ &hirachie($alias);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ my $lock = "0\n";
+ &zeit;
+ if ($room eq "Cyberbar") {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum ohne Erfolg ab ...</font></i>");
+ } else {
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum ab ...</font></i>");
+ } else {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum auf ...</font></i>");
+ }
+ for ($i=1;$i<=$#r_stat;$i++) {
+ $lock = $lock.$r_stat[$i];
+ }
+ write_file_new("data/online/rstat/$room");
+ print DATEI $lock;
+ close DATEI;
+ }
+ }
+ &reload_html($whisper);
+ exit;
+#############>- RAUMBESETZER ERNENNEN -<
+ } elsif ($cmd eq "su") {
+ &prove_besetzer($alias,$room);
+ &hirachie($alias);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ my $alias2su = $cmd[1];
+ &list_dir("data/online/rooms/$room");
+ foreach(@dir) {
+ if ($_ eq $alias2su) {
+ &read_file("data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ &hirachie($alias2su);
+ &prove_besetzer($alias2su,$room);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ &reload_html($whisper);
+ &post_prv($alias,"<font color=ffa500>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist bereits RB, WÄ oder OW)</font>");
+ exit;
+ }
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias ernennt \"$alias2su\" zum Raumbesetzer ...</font></i>");
+ &write_file("data/online/rstat/$room");
+ print DATEI $alias2su."\n";
+ close DATEI;
+ &reload_html($whisper);
+ exit;
+ }
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist nicht anwesend)</font>");
+ }
+ &reload_html($whisper);
+ exit;
+#############>- RAUMBESETZER ENTNENNEN -<
+ } elsif ($cmd eq "rsu") {
+ &prove_besetzer($alias,$room);
+ &hirachie($alias);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ my $alias2rsu = $cmd[1];
+ &read_file("data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ &prove_besetzer($alias2rsu,$room);
+ if ($r_besetzer eq "true") {
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias entzieht \"$alias2rsu\" die Raumbesetzerrechte ...</font></i>");
+ my $newrstat = $rstat[0].$rstat[1];
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $newrstat = $newrstat.$r_stat[$i] if ($r_stat[$i] ne $alias2rsu."\n");
+ }
+ &write_file_new("data/online/rstat/$room");
+ print DATEI $newrstat;
+ close DATEI;
+ } else {
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2rsu <font color=ffffff>ist kein Raumbesetzer und kann dieser Status auch nicht aberkannt werden !</font></font>");
+ }
+ }
+ &reload_html($whisper);
+ exit;
+#############>- RAUM EIN THEMA GEBEN -<
+ } elsif ($cmd eq "t") {
+ &prove_besetzer($alias,$room);
+ &hirachie($alias);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ my $theme;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $theme = $theme." ".$cmd[$i];
+ }
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias gibt dem Raum das Thema <font color=red>( $theme )</font> ...</font></i>");
+ $theme = $r_stat[0].$theme."\n";
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $theme = $theme.$r_stat[$i];
+ }
+ write_file_new("data/online/rstat/$room");
+ print DATEI $theme;
+ close DATEI;
+ }
+ &reload_html($whisper);
+ exit;
+#############>- SUPERUSER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- ALIAS VERBANNEN BZW. ENTBANNEN -<
+ } elsif ($cmd eq "ban" || $cmd eq "rban") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ my ($alias2handle,$registriert) = $cmd[1];
+ &list_dir("data/user/options");
+ foreach(@dir) {
+ $registriert = "true" if ($_ eq $alias2handle);
+ }
+ if ($registriert ne "true") {
+ if ($cmd eq "ban") {
+ if ($alias2handle ne "") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> existiert nicht in der Benutzerdatenbank und kann so nich verbannt werden !</font></font>");
+ } else {
+ &read_file("data/ban");
+ my @banned = <DATEI>;
+ my ($benutzer);
+ my $nr = $#banned+1;
+ close DATEI;
+ foreach(@banned) {
+ $benutzer = $benutzer." ".$_;
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>Folgende Benutzer sind verbannt [$nr]: <font color=ffa500>$benutzer</font></font>");
+ }
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> existiert nicht in der Benutzerdatenbank und kann so nicht \"entbannt\" werden !</font></font>");
+ }
+ &reload_html($whisper);
+ exit;
+ }
+ &read_file("data/ban");
+ my @banlist = <DATEI>;
+ close DATEI;
+ foreach(@banlist) {
+ if ($_ eq "$alias2handle\n") {
+ if ($cmd eq "ban") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> ist bereits verbannt worden !</font></font>");
+ } else {
+ my $banned = "false";
+ foreach(@banlist) {
+ $banned = "true" if ($_ eq "$alias2handle\n");
+ }
+ if ($banned eq "true") {
+ my @newbanlist;
+ foreach(@banlist) {
+ push @newbanlist,$_ if ($_ ne "$alias2handle\n");
+ }
+ &write_file_new("data/ban");
+ print DATEI @newbanlist;
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> wurde soeben \"entbannt\" !</font></font>");
+ }
+ }
+ &reload_html($whisper);
+ exit;
+ }
+ }
+ if ($cmd eq "ban") {
+ &hirachie($alias2handle);
+ if ($hirachie ne "ow") {
+ &write_file("data/ban");
+ print DATEI "$alias2handle\n";
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> wurde soeben verbannt und kann sich nun nichtmehr in den Chat einloggen !</font>");
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> ist ein Oberwächter und kann deshalb nicht verbannt werden !</font></font>");
+ }
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> konnte nicht \"entbannt\" werden, da <font color=ffa500>$alias2handle</font> garnicht verbannt war !</font></font>");
+ }
+ }
+ &reload_html($whisper);
+ exit;
+#############>- IP # VON ALIAS ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "ip") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ my $alias2prove = $cmd[1];
+ &list_dir("data/online/ident");
+ foreach(@dir) {
+ if ($_ eq $alias2prove) {
+ &read_file("data/online/ident/$_");
+ local $ipnr = <DATEI>;
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$_ <font color=ffffff>hat die IP-Nummer $ipnr !</font></font>");
+ }
+ }
+ }
+ &reload_html($whisper);
+ exit;
+#############>- ALIAS AUS DEM CHAT KATAPULTIEREN -<
+ } elsif ($cmd eq "k") {
+ &hirachie($alias);
+ if ($hirachie eq "wa" || $hirachie eq "ow") {
+ my $alias2kick = $cmd[1];
+ &list_dir("data/online/rooms");
+ foreach $raum (@dir) {
+ &list_dir("data/online/rooms/$raum",2);
+ foreach $chatter (@dir2) {
+ if ($chatter eq $alias2kick) {
+ &hirachie($alias2kick);
+ if ($hirachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist Oberwächter und kann nicht \"gekickt\" werden !</font></font>");
+ } elsif ($hirachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist Wächter und kann nicht \"gekickt\" werden !</font></font>");
+ } else {
+ &post_prv("$alias2kick","<script language=\"JavaScript\">window.open(\"index.pl?tmp=kick\",\"_top\");</script>");
+ &zeit;
+ $_ = undef if ($room eq $_);
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias katapultiert \"$alias2kick\" aus dem Chat ...</font></i>",$_);
+ &remove_online($alias2kick,$_,"kick");
+ &secure_removeip($alias2kick);
+ }
+ &reload_html($whisper);
+ exit;
+ }
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist nicht anwesend und kann nicht \"gekickt\" werden !</font></font>");
+ }
+ &reload_html($whisper);
+ exit;
+#############>- EINEN BENUTZER AUS DEM SYSTEM LÖSCHEN -<
+ } elsif ($cmd eq "kill") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ my $alias2kill = $cmd[1];
+ &hirachie($alias2kill);
+ if ($hirachie eq "ow") {
+ &post_prv($alias,"<font size color=ffa500>$alias2kill</font> <font color=ffffff>ist Oberwächter und kann nicht aus dem System entfernt werden !</font>");
+ } elsif ($hirachie eq "wa") {
+ &post_prv($alias,"<font size color=ffa500>$alias2kill</font> <font color=ffffff>ist Wächter und kann nicht aus dem System entfernt werden !</font>");
+ } else {
+ unlink("data/user/options/$alias2kill");
+ unlink("data/user/profiles/$alias2kill");
+ unlink("data/user/gbooks/$alias2kill");
+ unlink("data/user/counts/$alias2kill");
+ unlink("data/user/lastlogin/$alias2kill");
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias killt \"$alias2kill\" ganz und gar aus dem System ...</font></i>");
+ }
+ }
+ &reload_html($whisper);
+ exit;
+ #############>- SYSTEMNACHRICHT IN ALLE BESTEHENDEN RÄUME POSTEN -<
+ } elsif ($cmd eq "sys") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $sys_msg = $sys_msg." ".$cmd[$i];
+ }
+ &zeit;
+ &post_all("<i><font color=ffffff>($hours:$min:$sec)</font></i> <b><font size=2 color=red>SYSTEMNACHRICHT</font></b><i><font color=ffffff>: $sys_msg ...</font></i>");
+ }
+ &reload_html($whisper);
+ exit;
+#############>- ALIAS ZUM WÄCHTER ERNNENNEN BZW. ZUM NORMALEN CHATTER DEGRADIEREN -<
+ } elsif ($cmd eq "wa" || $cmd eq "rwa") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ &zeit;
+ my $alias2handle = $cmd[1];
+ if ($cmd eq "wa") {
+ my $anerkennen = "false";
+ &list_dir("data/user/options");
+ foreach(@dir) {
+ if ($_ eq $alias2handle) {
+ $anerkennen = "true";
+ }
+ }
+ if ($anerkennen eq "true") {
+ &hirachie($alias2handle);
+ if ($hirachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff>ist bereits als Wächter eingetragen. Eine erneuerte Eintragung ist nicht möglich!</font></font>");
+ } elsif ($hirachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff>ist schon als Oberwächter eingetragen. Oberwächter können nicht gleichzeitig Wächter sein!</font></font>");
+ } else {
+ &write_file("data/wa");
+ print DATEI $alias2handle."\n";
+ close DATEI;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font><font color=ffa500> $alias ernennt \"$alias2handle\" zum Wächter ...</font></i>");
+ }
+ } else {
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2handle <font color=ffffff>kann nicht zum Wächter ernannt werden da Benutzername nicht existiert!</font></font>");
+ }
+ } elsif ($cmd eq "rwa") {
+ &read_file("data/wa");
+ my @wafile = <DATEI>;
+ close DATEI;
+ my $aberkennen = "false";
+ foreach(@wafile) {
+ if ($_ ne "$alias2handle\n") {
+ push @newafile,$_;
+ } else {
+ $aberkennen = "true";
+ }
+ }
+ &write_file_new("data/wa");
+ print DATEI @newafile;
+ close DATEI;
+ if ($aberkennen eq "true") {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat \"$alias2handle\" vom Wächter zum normalen Chatter degradiert ...</font></i>");
+ } else {
+ &post("<font size=2 color=ffa500>$alias2handle <font color=ffffff>konnte der Wächterstatus nicht aberkannt werden da Benutzer kein Wächter ist!</font></font>");
+ }
+ }
+ }
+#############>- ENDE DER CHATBEFEHLE -<
+}
+&reload_html($whisper,$action);
+}
+
+sub change_room { # Den Chat-Raum wechseln
+ my ($method,$newroom,$oldroom,$alias2follow) = @_;
+ # Überprüfen, ob Alias Raum betreten darf
+ &read_file("data/online/rstat/$newroom");
+ my @rstat = <DATEI>;
+ close DATEI;
+ if ($rstat[0] eq "1\n") {
+ &hirachie($alias);
+ if ($hirachie eq "wa" || $hirachie eq "ow") {
+ } else {
+ &post_prv("$alias","<font size=2 color=ffffff>Der Raum \"<font color=ffa500>$newroom</font>\" ist leider abgesperrt!</font>");
+ &reload_html($id,$action);
+ exit;
+ }
+ }
+ $room = $oldroom;
+ &secure_checkip($alias); # IP Nummer überprüfen
+ &zeit; # Zeit 'erneuern'
+ if ($method eq "j") {
+ unlink("data/online/rooms/$oldroom/$alias");
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias wechselt in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias kommt aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ &post_prv("$alias","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>Du wechselst aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ } elsif ($method eq "ju") {
+ unlink("data/online/rooms/$oldroom/$alias");
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias folgt \"$alias2follow\" in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias kommt aus dem Raum \"$oldroom\" und folgt \"$alias2follow\" herein nach \"$newroom\" ...</font></i>");
+ &post_prv("$alias","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>Du folgst \"$alias2follow\" aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ }
+ # Sicherheitshalber Alias erneuert entf.
+ unlink("data/online/rooms/$oldroom/$alias");
+ &rm_rstat($oldroom,$alias);
+ &rm_rooms;
+}
+
+sub prove_besetzer { # Prüfen, ob Benutzer Raumbesetzerrechte hat
+ my ($r_alias,$r_room) = @_;
+ $r_besetzer = "false";
+ &read_file("data/online/rstat/$r_room");
+ @r_stat = <DATEI>;
+ close DATEI;
+ for($i=2;$i<=$#r_stat;$i++) {
+ $r_besetzer = "true" if ($r_stat[$i] eq $r_alias || $r_stat[$i] eq $r_alias."\n");
+ }
+} \ No newline at end of file
diff --git a/0.2.6a/main2.pl b/0.2.6a/main2.pl
new file mode 100644
index 0000000..76f161b
--- /dev/null
+++ b/0.2.6a/main2.pl
@@ -0,0 +1,571 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+
+if ($var eq "list_alias_html") {
+ &list_alias_html;
+} elsif ($var eq "alias_html") {
+ &alias_html;
+} elsif ($var eq "edit_profile_html") {
+ &edit_html("edit_profile_html");
+} elsif ($var eq "edit_options_html") {
+ &edit_html("edit_options_html");
+} elsif ($var eq "gb_html") {
+ &gb_html;
+} elsif ($var eq "post_gb") {
+ &post_gb;
+} elsif ($var eq "rm_gb_alias") {
+ &rm_gb;
+} elsif ($var eq "edit_profile") {
+ &edit("edit_profile");
+} elsif ($var eq "edit_options") {
+ &edit("edit_options");
+} else {
+ &error("Parameter fehlt");
+}
+
+###########################
+##HAUPTTEIL DIESER DATEI:##
+###########################
+
+sub gb_html { # Das Benutzerboard/Gästebuch.
+ my $message = $_[0];
+ &start_html("Benutzerboard");
+if ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </i>
+ einen Text und poste
+ <u>dann</u>
+ !
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Vielen Dank für Deinen Beitrag. Wenn Du willst, kannst Du jetzt gleich noch einen Eintrag posten ...
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Falls Du Anregungen oder Verbesserungsvorschläge für die Community hast, dann poste doch einen kleinen Eintrag :-)
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmp" value="guestbook">
+ <input type="hidden" name="id" value="y">
+ <input size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+ if (-e "data/guestbook") {
+ open (DATEI,"<data/guestbook") || &error("Konnte dat/guestbook nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ print
+ $q->div(@datei);
+ }
+ print
+ $q->end_html;
+}
+
+
+sub post_gb { # Wenn etwas in ein Gästebuch eingetragen wird
+ &secure_checkip($alias);
+ &zeit;
+ if ($msg eq "") {
+ if ($id eq "y") { # Überprüfen, ob Benutzerboard- oder Privatgästebuch
+ &gb_html("post_empty");
+ } else {
+ &alias_html("post_empty");
+ }
+ exit;
+ }
+ $msg =~ s#<#&lt\;#g;
+ my $tmpath = "";
+ if ($id eq "y") {
+ $tmpath = "data/guestbook";
+ } else {
+ $tmpath = "data/user/gbooks/$tmp";
+ }
+ if (-e "$tmpath") {
+ &read_file("$tmpath");
+ my @datei = <DATEI>;
+ close DATEI;
+ pop(@datei) if ($#datei > 99);
+ my @newdatei = "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ @newdatei = ("@newdatei", "@datei");
+ &write_file_new("$tmpath");
+ print DATEI @newdatei;
+ close DATEI;
+ } else {
+ &write_file_new("$tmpath");
+ print DATEI "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ close DATEI;
+ }
+ if ($id eq "y") {
+ &gb_html("post_ok");
+ exit;
+ } else {
+ post_prv("$tmp","<font size=2 color=ffffff><a href=\"main2.pl?alias=$alias&var=alias_html&tmp=$alias\" target=\"_new\">$alias</a> hat soeben einen Pin in <a href=\"main2.pl?alias=$alias&var=alias_html&tmp=$tmp\" target=\"_new\">Dein Profil</a> gehängt ... </font>");
+ &alias_html;
+ exit;
+ }
+}
+
+sub rm_gb { # Gästebucheintrag entfernen
+ &secure_checkip($alias);
+ $tmp = $alias;
+ &read_file("data/user/gbooks/$alias");
+ my @gbfile = <DATEI>;
+ close DATEI;
+ my @newgbfile = ();
+ for($i=0; $i <= $#gbfile; $i++) {
+ push(@newgbfile,$gbfile[$i]) if ($i != $id);
+ }
+ &write_file_new("data/user/gbooks/$alias");
+ print DATEI @newgbfile;
+ close DATEI;
+ &alias_html("rm_ok");
+}
+
+sub list_alias_html { # Liste aller Benutzer
+ &start_html("Alle Benutzer");
+ &list_dir("data/user/options");
+ my @liste = sort(@dir);
+ my $nr = $#dir-1;
+print <<END;
+ <div>
+ Es sind z.Z. genau $nr Benutzernamen in der Datenbank vorhanden! (Sortiert nach #, A-Z, a-z)
+ </div>
+ <hr>
+ <div>
+END
+ foreach(@liste) {
+ if (-f "data/user/options/$_") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_" },
+ "$_"),
+ " ";
+ }
+ }
+print <<END;
+ </div>
+</body>
+</html>
+END
+}
+
+sub alias_html { # Anzeigen eines Benutzerprofils
+ my $message = $_[0];
+ local $counter = undef;
+ &read_file("data/user/counts/$tmp");
+ $counter = <DATEI>;
+ close DATEI;
+ $counter++;
+ &write_file_new("data/user/counts/$tmp");
+ print DATEI $counter;
+ close DATEI;
+ &start_html($tmp);
+print <<END;
+<div>
+ <a href="htdocs.pl?var=werda_html&alias=$alias">Hier</a>
+ gehts zur Gesamtübersicht !
+</div>
+<hr>
+END
+if ($message eq "rm_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Der von Dir gewählte Eintrag wurde erfolgreich gelöscht.
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </u>
+ einen Text und poste
+ <u>dann</u>
+ !
+ <hr>
+END
+}
+ &read_file("data/user/profiles/$tmp");
+ @data = <DATEI>;
+ close DATEI;
+print <<END;
+ <div>
+ Dieses Profil wurde insgesamt schon $counter mal aufgerufen !
+ <br>
+ <br>
+ Alias: $tmp
+ <br>
+ <br>
+ Nachname: $data[0]
+ <br>
+ <br>
+ Vorname: $data[1]
+ <br>
+ <br>
+ Alter: $data[2]
+ <br>
+ <br>
+ Wohnort: $data[3]
+ <br>
+ <br>
+ E-Mail:
+ <a href="mailto:$data[4]">$data[4]</a>
+ <br>
+ <br>
+ ICQ-Nummer: $data[5]
+ <br>
+ <br>
+ Homepage:
+ <a href="$data[6]" target="_new">$data[6]</a>
+ <br>
+ <br>
+ Weiteres:
+ <br>
+ $data[7]
+ <hr>
+ Hier kannst Du $tmp eine Nachricht hinterlassen!
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input type="text" size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+if (-e "data/user/gbooks/$tmp") {
+ open (DATEI,"<data/user/gbooks/$tmp") || &error("Konnte data/user/gbooks/$tmp nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ if ($alias ne $tmp) {
+ print @datei;
+ } else {
+print <<END;
+ <table>
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="rm_gb_alias">
+ <input type="hidden" name="alias" value="$alias">
+END
+for($i=0; $i <= $#datei; $i++) {
+print <<END;
+ <tr>
+ <td>
+ <input type="radio" name="id" value="$i">
+ </td>
+ <td>
+ <div class=q>
+ $datei[$i]
+ </div>
+ </td>
+ </tr>
+END
+}
+print <<END;
+ </table>
+ <table>
+ <tr>
+ <td>
+ <font color=ffffff>
+ <input type="submit" value="Makierten Eintrag löschen">
+ </font>
+ </td>
+ <td>
+ <font color=ffffff>
+ <input type="reset" value="Makierung rückgängig machen">
+ </font>
+ </td>
+ </tr>
+ </table>
+ </form>
+END
+}
+}
+ print
+ $q->end_html;
+}
+
+sub edit_html { # Chat-Optionen / Benutzerprofil editieren
+ my ($method,$message) = @_;
+ &secure_checkip($alias);
+ &start_html("Benutzerprofil ändern");
+ if ($method eq "edit_options_html") {
+ &read_file("data/user/options/$alias");
+ } elsif ($method eq "edit_profile_html") {
+ &read_file("data/user/profiles/$alias");
+ }
+ @data = <DATEI>;
+ close DATEI;
+ if ($method eq "edit_options_html") {
+ chomp($data[0]);
+ if ($message eq "edit_options_ok") {
+print <<END;
+<script language="JavaScript">
+ open("main.pl?var=input_html&alias=$alias&room=$room&col=$col&secol=$secol","input");
+ open("htdocs.pl?var=menu_html&alias=$alias&room=$room&col=$col&secol=$secol","menu");
+</script>
+<div class=b>
+ Hinweis:
+</div>
+<div>
+ Du hast soeben Deine Chat-Optionen erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren. Um
+ weiterzuchatten einfach auf <a href="push.pl?alias=$alias&room=$room">Weiterchatten</a> klicken.
+</div>
+<hr>
+END
+ } elsif ($message eq "edit_pw_wrong") {
+print <<END;
+<div class=b>
+ ACHTUNG!
+</div>
+<div>
+ Du hast soeben versucht, dein Passwort zu ändern. Jedoch stimmte die Erste Eingabe nicht mit der Zweiten überein.
+ Bitte versuch es erneuert ...
+</div>
+<hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Deine Chat-Optionen editieren!" ),
+ $q->hr;
+ }
+print <<END;
+<form action="main2.pl">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="var" value="edit_options">
+ <div>
+ Dein Passwort
+ <font color=ffa500>
+ (Gut merken !!)
+ </font>
+ <br>
+ <input type="password" name="id" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ Geb hier das Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ "Deine Farbe (Farbe Deines Nicks):
+ <br>
+ <select NAME="col" size="1">
+ <option selected value="$col">($data[1])</option>
+ <option value="0000FF">Blau (1)</option>
+ <option value="008000">Grün</option>
+ <option value="000000">Schwarz</option>
+ <option value="808000">Oliv</option>
+ <option value="000080">Marineblau</option>
+ <option value="800080">Purpur</option>
+ <option value="808080">Braun</option>
+ <option value="FF00FF">Fuchsia</option>
+ <option value="008080">Stahlblau</option>
+ <option value="333333">Mittelschwarz</option>
+ <option value="003399">BärBlau</option>
+ <option value="0066CC">Blau (2)</option>
+ <option value="009933">Grün</option>
+ <option value="006666">Oliv</option>
+ <option value="FF0000">VollRot</option>
+ <option value="CC0000">RostRot</option>
+ <option value="990099">Lila</option>
+ <option value="FF00FF">Pink</option>
+ <option value="FF9900">Orange</option>
+ <option value="CC6600">Ocker</option>
+ <option value="996600">Braun</option>
+ <option value="666666">Grau</option>
+ <option value="0A6307">Dunkelgrün</option>
+ <option value="9C1B7C">Dunkellila</option>
+ <option value="3D0DB9">Dunkelblau</option>
+ <option value="8FA5ED">Hellblau</option>
+ <option value="FFFF00">Gelb</option>
+ <option value="3D4863">?????</option>
+ </select>
+ </div>
+ <br>
+ <div>
+ Deine zweite Farbe (Farbe Deiner Nachrichten):
+ <br>
+ <select NAME="secol" size="1">
+ <option selected value="$col">($data[2])</option>
+ <option value="0000FF">Blau (1)</option>
+ <option value="008000">Grün</option>
+ <option value="000000">Schwarz</option>
+ <option value="808000">Oliv</option>
+ <option value="000080">Marineblau</option>
+ <option value="800080">Purpur</option>
+ <option value="808080">Braun</option>
+ <option value="FF00FF">Fuchsia</option>
+ <option value="008080">Stahlblau</option>
+ <option value="333333">Mittelschwarz</option>
+ <option value="003399">BärBlau</option>
+ <option value="0066CC">Blau (2)</option>
+ <option value="009933">Grün</option>
+ <option value="006666">Oliv</option>
+ <option value="FF0000">VollRot</option>
+ <option value="CC0000">RostRot</option>
+ <option value="990099">Lila</option>
+ <option value="FF00FF">Pink</option>
+ <option value="FF9900">Orange</option>
+ <option value="CC6600">Ocker</option>
+ <option value="996600">Braun</option>
+ <option value="666666">Grau</option>
+ <option value="0A6307">Dunkelgrün</option>
+ <option value="9C1B7C">Dunkellila</option>
+ <option value="3D0DB9">Dunkelblau</option>
+ <option value="8FA5ED">Hellblau</option>
+ <option value="FFFF00">Gelb</option>
+ <option value="3D4863">?????</option>
+ </select>
+ </div>
+ <br>
+END
+ } elsif ($method eq "edit_profile_html") {
+ if ($message eq "edit_profile_ok") {
+print <<END;
+ <div class=b>
+ Hinweis:
+ </div>
+ <div>
+ Du hast soeben Dein Profil erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren:
+ <hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Dein Profil editieren!" ),
+ $q->hr;
+ }
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="var" value="edit_profile">
+ <div>
+ Dein Nachname:
+ <br>
+ <input name="nachname" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ Dein Vorname:
+ <br>
+ <input name="vorname" value="$data[1]">
+ </div>
+ <br>
+ <div>
+ Dein Alter:
+ <br>
+ <input name="alter" value="$data[2]">
+ </div>
+ <br>
+ <div>
+ Dein Wohnort:
+ <br>
+ <input name="wohnort" value="$data[3]">
+ </div>
+ <br>
+ <div>
+ Deine E-Mail Adresse:
+ <br>
+ <input name="email" value="$data[4]">
+ </div>
+ <br>
+ <div>
+ Deine ICQ-Nummer:
+ <br>
+ <input name="icq" value="$data[5]">
+ </div>
+ <br>
+ <div>
+ Deine Homepage:
+ <br>
+ <input name="homepage" value="$data[6]">
+ </div>
+ <br>
+ <div>
+ Weiteres:
+ <br>
+ <textarea rows="5" cols="40"name="weiteres" wrap="virtual">$data[7]</textarea>
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <font color=ffffff>
+ <input type="submit" value="Daten ändern ...">
+ </font>
+ </form>
+</body>
+</html>
+END
+}
+
+
+sub edit { # Benutzerprofil od. Chat-Optionen abspeichern
+ &secure_checkip($alias);
+ my $method = $_[0];
+ if ($method eq "edit_profile") {
+ &write_file_new("data/user/profiles/$alias");
+ print DATEI $q->param('nachname')."\n".$q->param('vorname')."\n".$q->param('alter')."\n".$q->param('wohnort')."\n".$q->param('email')."\n".$q->param('icq')."\n".$q->param('homepage')."\n".$q->param('weiteres');
+ close DATEI;
+ &edit_html("edit_profile_html","edit_profile_ok");
+ } elsif ($method eq "edit_options") {
+ if ($id ne $tmp) {
+ &edit_html("edit_options_html","edit_pw_wrong");
+ exit;
+ }
+ &secure_checkip($alias);
+ &write_file_new("data/user/options/$alias");
+ print DATEI $id."\n".$col."\n".$secol;
+ close DATEI;
+ &edit_html("edit_options_html","edit_options_ok");
+ }
+}
diff --git a/0.2.6a/online.pl b/0.2.6a/online.pl
new file mode 100644
index 0000000..cdc0d43
--- /dev/null
+++ b/0.2.6a/online.pl
@@ -0,0 +1,56 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+&secure_checkip($alias);
+&start_html("Online","online");
+&online($alias,$room);
+&list_dir("data/online/rooms/".$room);
+print
+ $q->div( "$room:" ),
+ "<font size=1 color=ffffef face=arial>";
+ foreach $online (@dir) {
+ if (-f "data/online/rooms/$room/$online") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$online",
+ -target=>"$online" }, "$online"), $q->br;
+ }
+ }
+print
+ "</font>",
+ $q->end_html;
+
+sub online { # Benutzer in die Onlineliste hinzufügen bzw. erneuern
+ my ($alias,$room) = @_;
+ &write_file_new("data/online/users/$alias");
+ print DATEI time;
+ close DATEI;
+ if (-e "data/online/rooms/$room") { # Falls Raum nicht existiert anlegen
+ } else {
+ &write_file_new("data/online/rstat/$room"); # Raumbesetzerstatus setzen
+ print DATEI "0\n\n$alias\n";
+ close DATEI;
+ mkdir "data/online/rooms/$room", 0777;
+ }
+ &write_file_new("data/online/rooms/$room/$alias");
+ print DATEI time;
+ close DATEI;
+ &read_file("data/online/prove"); # Räume und Chatter auf Existenz überprüfen
+ my $provetime = <DATEI>;
+ close DATEI;
+ if ($provetime < (time - 30)) {
+ &write_file_new("data/online/prove");
+ print DATEI time;
+ close DATEI;
+ &rm_alias("data/online/users");
+ &rm_rooms;
+ }
+}
diff --git a/0.2.6a/push.pl b/0.2.6a/push.pl
new file mode 100644
index 0000000..fc998c0
--- /dev/null
+++ b/0.2.6a/push.pl
@@ -0,0 +1,105 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+CGI->compile(':all');
+$q = new CGI;
+
+$| = 1; # Cache von Perl ausschalten
+
+print
+ $q->header; # HTML-Header erzeugen
+
+require config;
+
+&secure_checkip($alias);
+
+########################################
+##ANFANG DER ZU STREAMENDEN HTML-DATEI##
+########################################
+
+print <<END;
+<html>
+ <head>
+<script language="JavaScript">
+<!--
+// Scroll-Routine von Anklepper (http://www.anklepper.de)
+// speziell für yChat (http://www.yChat.de), Copyright 2000
+scrolling = true;
+moves_steps = 4; // Schrittgröße
+moves_interval = 4; // Schrittgeschwindigkeit
+
+function moves()
+{
+ if( scrolling != false )
+ window.scrollBy( 0, moves_steps );
+ window.setTimeout( "moves()", moves_interval );
+}
+
+moves();
+//-->
+</script>
+ </head>
+<body bgcolor=000000 link=FFFFFF alink=FFFFEF vlink=FFFFEF>
+END
+
+#############################
+##BEGRÜSSUNGSTEXT SCHREIBEN##
+#############################
+
+my $msgfile;
+
+ print
+ $q->font( { -size=>1,
+ -color=>"ffffff",
+ -face=>"arial"},
+ "$title - Created & Copyright by Paul C. Bütow $tmp\n");
+
+if ($var eq "push_logs_html") {
+ $msgfile = $tmp;
+ print "<hr><font size=2 color=ffffff face=arial>";
+} elsif ($var eq "clear_screen") {
+ if (-f "data/user/memos/$alias") { # Nach Memonachrichten checken!
+ print "\n<br>";
+ &read_file("data/user/memos/$alias");
+ my $memos = <DATEI>;
+ close DATEI;
+ print $memos;
+ unlink("data/user/memos/$alias");
+ }
+ $msgfile = "data/msgs/$alias";
+ &write_file_new($msgfile);
+ print DATEI $q->br;
+ close DATEI;
+} else {
+ print $q->br;
+ $msgfile = "data/msgs/$alias";
+}
+
+open (MSGFILE, $msgfile);
+
+###############################
+##ENDLOSSCHLEIFE FÜR DEN PUSH##
+###############################
+
+my ($times,$online) = (0,"false");
+for (;;) {
+ for ($curpos = tell(MSGFILE); <MSGFILE>; $curpos = tell(MSGFILE)) {
+ print $_ ;
+ }
+ $times++;
+ if ($times > 14) { # Nach 15 Sekunden
+ print "\n<!--PING//-->"; # Ping zum Browser senden
+ $times = 0; # Sekundenzahl auf 0 zurücksetzen
+ $online = "true" if (-e "data/online/users/$alias");
+ if ($online eq "false") {
+ print "<font size=2 color=red>Aus technischen Gründen bitte auf <a href=\"push.pl?alias=$alias&room=$room&var=clear_screen\">Weiterchatten</a> klicken.</font>";
+ exit;
+ }
+ $online = "false"
+ }
+ sleep 1;
+ seek(MSGFILE, $curpos, 0); # Position wiederherstellen
+}
+
diff --git a/0.2.6a/setup.sh b/0.2.6a/setup.sh
new file mode 100644
index 0000000..d076ded
--- /dev/null
+++ b/0.2.6a/setup.sh
@@ -0,0 +1,42 @@
+#!/bin/sh
+mkdir data
+mkdir data/logs
+chmod 777 data/logs
+mkdir data/msgs
+chmod 777 data/msgs
+mkdir data/user
+chmod 777 data/user
+mkdir data/user/counts
+chmod 777 data/user/counts
+mkdir data/user/memos
+chmod 777 data/user/memos
+mkdir data/user/options
+chmod 777 data/user/options
+mkdir data/user/profiles
+chmod 777 data/user/profiles
+mkdir data/user/gbooks
+chmod 777 data/user/gbooks
+mkdir data/user/lastlogin
+chmod 777 data/user/lastlogin
+mkdir data/online
+chmod 777 data/online
+mkdir data/online/rooms
+chmod 777 data/online/rooms
+mkdir data/online/rstat
+chmod 777 data/online/rstat
+mkdir data/online/users
+chmod 777 data/online/users
+mkdir data/online/ident
+chmod 777 data/online/ident
+chmod 777 data/htdocs/*
+chmod 777 *
+mkdir dokus/
+mv *.txt dokus/
+mkdir ../../htdocs/yChat/
+mv *.gif ../../htdocs/yChat/
+mv *.jpg ../../htdocs/yChat/
+echo
+echo yChat Setup beendet ...
+echo Created and copyrighted by Paul C. Bütow aka Snooper
+echo
+
diff --git a/0.2.6a/yBanner.gif b/0.2.6a/yBanner.gif
new file mode 100644
index 0000000..e4b691e
--- /dev/null
+++ b/0.2.6a/yBanner.gif
Binary files differ
diff --git a/0.2.6a/yBanner2.gif b/0.2.6a/yBanner2.gif
new file mode 100644
index 0000000..0e9684e
--- /dev/null
+++ b/0.2.6a/yBanner2.gif
Binary files differ
diff --git a/0.2.6a/yChat.jpg b/0.2.6a/yChat.jpg
new file mode 100644
index 0000000..61eabfb
--- /dev/null
+++ b/0.2.6a/yChat.jpg
Binary files differ
diff --git a/0.4.0a/INSTALL.txt b/0.4.0a/INSTALL.txt
new file mode 100644
index 0000000..14b5d0a
--- /dev/null
+++ b/0.4.0a/INSTALL.txt
@@ -0,0 +1,107 @@
+#############################################################################
+## yChat.de Version 0.4.0 by CXG.de: The chatters of the next generation ##
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+yChat findest Du im Internet unter der Adresse www.yChat.de. Bei Kritik,
+Anregungen oder Fragen bitte in das dort vorhandene Board posten oder eine
+E-Mail an die oben stehende Adresse senden. Ich bemühe mich, yChat so gut wie
+möglich zu machen und bin über Ratschläge immer sehr erfreut :-) ...
+
+Die Installation kann auf Unix-Systemen voll automatisch duchgeführt werden.
+Allerdings ist dafür ein Telnet-Zugang notwendig. Kopiere alle vorhandenen
+Dateien in das Verzeichnis cgi-bin/yChat und führe dann das Shellskript
+setup.sh mit dem Befehl ./setup.sh aus. Alle Verzeichnisse werden
+automatisch erstellt. Dies wurde allerdings nur auf SuSE Linux Systemen
+mit root-Zugriff getestet. Solltest Du ein anderes System verwenden oder
+den Chat auf einen virtuellen Webserver installieren wollen, dann mußt Du
+unter umständen das Verzeichnis "../../htdocs/yChat" nach "../../yChat"
+in der setup.sh umbenennen. Ansonsten werden die dazugehörigen Grafikdateien
+falsch oder garnicht kopiert.
+
+Wenn Du keinen Telnet-Zugang hast, kannst Du hier die Verzeichnisse manuell
+erstellen:
+
+Folgende Basis-Dateien sind im Chat enthalten und müssen in das cgi-bin
+Verzeichnis kopiert werden. Z.B. nach ./cgi-bin/yChat/:
+
+config.pm => Configurationsdatei ("Shared subs")
+htdocs.pl => HTML-Dokumentdateien (Nicht unbedingt erforderlich)
+index.pl => Startskript (Registrierung, Frameset, Login, Daten edit.)
+main.pl => Hauptskript (Alle Hauptfunktionen des Chats)
+main2.pl => Skript für editieren der Benutzerdaten etc.
+online.pl => Anzeige und Überprüfung der eingelogten Benutzer
+push.pl => Server-Push-Routine
+setup.sh => Dient zur automatischen Einrichtung des Chats.
+LIESMICH.txt => Beinhaltet wichtige Informationen
+UPDATES.txt => Updateliste der verschiedenen Versionen
+INSTALL.txt => Dieses Dokument
+help.sno => Datei beinhaltet alle Chatbefehle
+
+Folgende Verzeichnisse müssen erstellt werden (chmod 777 sollte
+funktionieren):
+
+- Hier befinden sich alle für den Chat notwenidgen Daten:
+ ./cgi-bin/yChat/data/*
+
+- Hier befinden sich alle Logdateien, die vom Chat erstellt werden:
+ ./cgi-bin/yChat/data/logs/*
+
+- Hier befinden sich die Message-Dateien der eingelogten Benutzer:
+ ./cgi-bin/yChat/data/msgs/*
+
+- Hier befinden sich alle Daten der registrierten Benutzer:
+ ./cgi-bin/yChat/data/user/*
+
+- Hier wird abgespeichert, wie oft ein Benutzerprofil insgesant schon
+ aufgerufen wurde und wie lange die Chatter schon online waren:
+ ./cgi-bin/yChat/data/user/counts/*
+
+- Hier werden alle Memos abgespeichert.
+ ./cgi-bin/yChat/data/user/memos/*
+
+- Hier befinden sich alle Chat-Optionen und Passwörter der registrierten
+ Benutzer:
+ ./cgi-bin/yChat/data/user/options/*
+
+- Hier befinden sich alle Benutzerprofile der Benutzer:
+ ./cgi-bin/yChat/data/user/profiles/*
+
+- Hier befinden sich alle Gästebucheinträge der Benutzer:
+ ./cgi-bin/yChat/data/user/gbooks/*
+
+- Hier wird abgespeichert, wann der der jew. benutzer zum letzten mal das System
+ betreten hat.
+ ./cgi-bin/yChat/data/user/lastlogin/*
+
+- Hier befinden sich alle Daten zu den aktuellen Chaträumen und User die online sind
+ ./cgi-bin/yChat/data/online/*
+
+- Hier befinden sich alle offnenen Räume
+ ./cgi-bin/yChat/data/online/rooms/*
+
+- Hier befinden sich die Chatter, die sich in den jew. Räumen befinden. Die
+ Verzeichnisse der Räume werden automatisch erstellt.
+ ./cgi-bin/yChat/data/online/rooms/RAUMNAME/*
+
+- Hier befinden sich alle Chatter, die sich z.Z. im System befinden
+ ./cgi-bin/yChat/data/online/users/*
+
+- Hier befinden sich alle IP-Nummern und TempIDs der eingelogten Chatter
+ ./cgi-bin/yChat/data/online/ident/*
+
+Folgende GRafikdateien sollten in ein nicht-CGI-BIN-Verzeichnis kopiert werden. Z.B.
+nach ./yChat/
+
+ bar.gif => Der gelb gestreifte Rand auf den meisten Seiten
+ unten.gif => Der Hintergrund für das Eingabeformular im Chat
+ yChat.gif => Das yChat-Logo auf der Startseite
+ yBanner.gif => 400x40 yChat-Banner
+ yBanner2.gif => 88x31 yChat-Banner
+
+Zum schluß sollte die config.pm-Datei nach wünschen editiert werden. Allerdings sollten
+die Copyright Hinweise und die Versionsnummern nicht manipuliert werden.
+
+Folgende Dateien werden von yChat automatisch erstellt:
+
+Viel Spaß beim Chatten ...
+ Snooper \ No newline at end of file
diff --git a/0.4.0a/LIESMICH.txt b/0.4.0a/LIESMICH.txt
new file mode 100644
index 0000000..97c7f1b
--- /dev/null
+++ b/0.4.0a/LIESMICH.txt
@@ -0,0 +1,45 @@
+#############################################################################
+## yChat.de Version 0.4.0 by CXG.de: The chatters of the next generation ##
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+Allgemeine Bedingungen bezgl. yChat:
+
+ - Das yChat-System darf ohne Erleubnis des Autors nicht auf irgendeiner Art
+ und Weise weitergegeben- oder eingesetzt werden.
+
+ - Wird das yChat-System eingesetzt, so darf es manipuliert werden, soweit
+ die Copyright-Hinweise des Autors, die Versionsbezeichnung und der Link
+ auf der Startseite nach servers.yChat.de unverändert bleibt.
+ Ansonsten darf der gesamte Code manipuliert werden.
+
+ - Wird das yChat-System erlaubter Weise manipuliert, so muß das veränderte
+ Skript auf Anforderung an den Autor weitergegeben werden. Dieser darf
+ die Veränderungen in das Standard-yChat-System integrieren.
+
+ - Wird das yChat-System eingesetzt, su muß dem Autor die Location bzw. die
+ URL bekanntgegeben werden. Diese wird in servers.yChat.de eingetragen.
+ und mit einer URL wwX.yChat.de verlinkt. Wobei X für die Nummer des jew.
+ Servers steht.
+
+ - Es ist verboten, Sourcecode aus dem yChat-System zu kopieren und
+ für andere, nicht von yChat abhängige Perl-Programme einzusetzen.
+
+Im Flogenden einige yChat-bezügl. Verknüpfungen:
+
+ www.servers.yChat.de => Liste aller laufenden yChat-Systeme
+ www.install.yChat.de => Installationsdokumentation
+ www.liesmich.yChat.de => Allgemeine Bedingungen usw.
+ www.todo.yChat.de => Funktionen, die später integriert werden
+ www.updates.yChat.de => Update-Liste
+ www.yChat.de => Das Skript zum testen
+
+Vielen Dank an:
+
+ - Andreas Buchwald für die Programmierung des "Nach-UntenScroll-JavaScripts"
+ (www.anklepper.de).
+
+ - Michi aka Snoopy für die Erstellung und Anregung der Farbtabelle
+ (www.berlin-singeltreff.de).
+
+ - Peacemaker für die Erstellung des yChat-Logos
+ (www.peaceplace.de).
diff --git a/0.4.0a/TODO.txt b/0.4.0a/TODO.txt
new file mode 100644
index 0000000..59d9e3e
--- /dev/null
+++ b/0.4.0a/TODO.txt
@@ -0,0 +1,24 @@
+Folgende Funktionen werden demnächst in yChat integriert:
+
+ - Die Schlucht (Ein Raum wo Chatter hineingeworfen werden,
+ die sich nicht benehmen und noch nicht aus dem Chat
+ katapultiert werden sollen).
+
+ - Löschung aller Chatter, die sich seit 60 Tagen nicht mehr
+ eingelogt haben.
+
+ - IP-Adressen ver-/entbannen.
+
+ - E-Mail zusendung bei verlorenem Passwort.
+
+ - Eine Top 20 (Onlinezeit) der Chatter
+
+ - Unter "Benutzer" sollen Chatter über eine Eingabemaske nach
+ dem Anfangsbuchstaben gesucht werden können (vergl. Kilahu).
+
+ - Der Cybarkeeper (künstlich intilligenter Chatroboter, der
+ sich im Hauptraum Cyberbar aufhält, virtuelle Drinks verteilt
+ und von Real-Chattern übernommen werden kann. (Zukunftsmusik)
+
+Für weitere Vorschläge bitte in das yChat-Board unter www.yChat.de
+texten oder eine E-Mail an paul@buetow.oxg.de :-) \ No newline at end of file
diff --git a/0.4.0a/UPDATES.txt b/0.4.0a/UPDATES.txt
new file mode 100644
index 0000000..d5e2503
--- /dev/null
+++ b/0.4.0a/UPDATES.txt
@@ -0,0 +1,102 @@
+########################### yChat.de UPDATE LIST ###########################
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+Hier sind alle Erneuerungen der Versionen dokumentiert:
+
+Update von 0.2.6 auf 0.4.0
+ - Der berüchtigte "IP-Bug" wurde beseitigt! Und zwar wurden TempIDs
+ eingeführt => Eine dauerhafte Überprüfung der Benutzer-IP-Nummer
+ ist also nicht mehr notwendig.
+ - Die totale Chat-Online-Zeit wird protokolliert und kann jew. mit
+ "/online Alias" aufgerufen werden. Die Onlinezeit wird alle 20 Sek.
+ aktualisiert.
+ - Neue Befehle: "/seen Alias" zeigt an, vor wieviel St. sich Alias
+ zuletzt in das System eingelogt hat. Der Befehle "/rmgb" entfernt
+ alle Einträge des eigenen Benutzergästebuchs im Profil.
+
+Update von 0.2.5 auf 0.2.6 vom 17.12.2k
+ - Das Eingabeframe reloaded sich nicht mehr nach jedem Posting.
+ Vielen Dank an Truhe aka Dave und Klepper aka Andreas Buchwald!
+ Bei den Chatbefehlen /col /away /j und /ju muß sich das
+ Eingabeframe weiterhin reloaden.
+ - Der Befehl // wurde entfernt. Dieser war nicht mehr erforderlich.
+ weil Nachrichten werden nur noch sehr selten verschluckt. Dieser
+ Chatbefehl postete die letzte Nachricht nocheinmal.
+ - Neuer Befehl: mit "/memo Alias hier der Text" hinterläßt man
+ Alias eine Memo. Logt sich Alias in den Chat ein, dann erhält
+ er diese sofort. Dafür wurde das Verzeichnis ".data/user/memos/"
+ angelegt.
+ - Programmcode wurde ein wenig optimiert.
+ - Das Design wurde ein wenig geändert.
+ - Beseitigung diverser Bugs.
+
+Update von 0.2.4 auf 0.2.5 vom 15.12.2k
+ - Derjenige, der einen Raum zuerst betritt, hat Raumbesetzerrechte.
+ - Raumbesetzer, Wächter und Oberwächte können weitere Raumbesetzer
+ bestimmen. Diese können Raumbeseter auch wieder degradieren.
+ - Raumbesetzer, Wächter und Oberwächter können dem aktuellen Raum
+ auf/absperren und Themen geben. Wächter und Oberwächter können
+ abgesperrte Räume betreten.
+ - Das Verzeichnis ".data/htdocs" wurde entfernt. Die Datei help_html
+ heist nun help.sno und befindet sich im yChat-Hauptverzeichnis.
+ - Das Verzeichnis ".data/user/lastlogin" wurde hinzugefügt. Hier
+ wird beim erfolgreichen Einloggen ein "Timestamp" gesetzt. Später
+ sollen Oberwächter "veraltete" Benutzer entfernen können.
+ - Neuer Oberwächterbefehl: "/kill Alias" entfernt Alias ganz und gar
+ vom System. Oberwächter und Wächter können nicht entfernt werden.
+ - Perl-Cache wurde im gesamten System komplett deaktiviert ( Weniger
+ Ladezeiten der HTML-Dokumente ).
+ - Nur Nachrichten aus dem Raum "Cyberbar" werden gelogt.
+ Selbsterstellte Räume werden nichtmehr gelogt. Viele Logfunktionen
+ wurden entfernt (weniger Serverbalast).
+ - Beseitigung einiger kleinen Bugs.
+ - Unter "Optionen" im Chat wir die Farbe nun mit einem Drop-Down-Menü
+ ausgewählt ( Vielen dank an Michi aka Snoopy ).
+ - Auf der Startseite wird nun angezeigt wieviele Benutzer eingelogt
+ sind. Ist keiner eingelogt, dann wird das System "aufgeräumt". D.h.
+ Dateien die nicht mehr gebraucht werden und noch nicht gelöscht
+ wurden werden entfernt ( z.B. Nachrichtendateien der einzelnen
+ Chatter und die Dateien die die IP-Nummern der eingelogten Benutzer
+ beinhalteten usw.).
+ - Hunzufügung einer TODO-Liste. Hier sind mehrere Funktionen
+ vermerkt, die in späteren yChat-Versionen eingebaut werden sollen.
+ (www.todo.yChat.de oder TODO.txt).
+
+Update von 0.2.3 auf 0.2.4 - 30.11.2k
+ - Optimierung bzw. Verbesserung der Push-Routine push.pl.
+ - Server-Ping wurde von 2-Pings-per-Minute auf 4 erhöht.
+ - yChat-Banner wurde erstellt und ist unter
+ documents.yChat.de/yBanner.jpg vorzufinden.
+ - Unter der URL servers.yChat.de wurde eine Serverliste angelegt,
+ welche anzeigt wo yChat-Systeme laufen.
+ - Des weiteren wurden die URLs updates.yChat.de, install.yChat.de
+ und liesmich.yChat.de eingerichtet.
+ - Die Menüpunkte wurden zusammengefaßt, damit sie unter einer
+ Auflösung von 800x600 nur eine Zeile belegen.
+ - Einige Bugs wurden entfernt.
+
+Update von 0.2.2 auf 0.2.3 - 25.11.2k
+ - Smooth scrolling JavaScript ( Vielen Dank an Andreas Buchwald ).
+ - "IP#-Fehler" wurde so gut wie beseitigt.
+ - Aufrufe der einzelnen Benutzerprofile wird gezählt und angezeigt.
+ Diese werden in data/user/counts/* gespeichert.
+ - Automatische Einrichtung des Chats mit setup.sh und Telnet.
+ - Menüpunkt "Dein Profil" wurde entfernt da eigenes Profil auch
+ stets über die Onlineliste aufgerufen werden kann.
+
+Update von 0.2.1 auf 0.2.2 - 23.11.2k
+ - Einige Bugs wurden entfernt.
+ - Geschwindigkeit des Chats wurde optimiert.
+ - Eine Liste aller eingelogten Benutzer erscheint am Rand. Hierfür
+ wurde die Datei online.pl eingeführt. Sie aktuallisiert sich alle
+ 20 Sekunden.
+ - Die UPDATES.txt wurde eingeführt.
+
+Update von 0.2.0 auf 0.2.1
+ - Einige Bugs wurden entfernt.
+ - Die IP# der eingelogten Benutzer werden nun anders verwaltet.
+
+Update von Alpha XVIII auf 0.2.0
+ - Die Handhabung der eingelogten Benutzer im System wurde komplett neu
+ überarbeitet.
+ - Neue Versionsnumern wurden eingeführt. \ No newline at end of file
diff --git a/0.4.0a/bar.gif b/0.4.0a/bar.gif
new file mode 100644
index 0000000..61d02b7
--- /dev/null
+++ b/0.4.0a/bar.gif
Binary files differ
diff --git a/0.4.0a/config.pm b/0.4.0a/config.pm
new file mode 100644
index 0000000..52aa0f2
--- /dev/null
+++ b/0.4.0a/config.pm
@@ -0,0 +1,307 @@
+# yChat - Copyright by Paul C. Bütow
+
+########################### Dieser Teil bestimmt die Standart-Variabeln.
+##STANDART-CONFIGURATION:## (CSS, Farben, Version etc.)
+###########################
+$alias = $q->param("alias");
+$var = $q->param("var");
+$room = $q->param("room");
+$col = $q->param("col");
+$secol = $q->param("secol");
+$msg = $q->param("msg");
+$tmpid = $q->param("tmpid");
+$tmp = $q->param("tmp");
+$id = $q->param("id");
+$room = "Cyberbar" if ($room eq "");
+$col = "ffffef" if ($col eq "");
+$secol = "ffffef" if ($secol eq "");
+$datum = "21.12.2k";
+$version = "0.4.0a";
+$title = "yChat.de ($version)";
+$gfxpath = "../../yChat/";
+$style = <<ENDCSS;
+<style rel="stylesheet" type="text/css">
+ body { background-image: url("$gfxpath/bar.gif"); background-color: 000000 }
+ body.menu { background-image: none }
+ body.log { background-color: 000000 }
+ body.online { background-color: 444444; background-image: none }
+ div { font-family: arial, verdana, helvetiva; font-size: 10pt; color: ffffff }
+ div.b { font-weight: bold; color: ffa500 }
+ a { color: ffffef }
+ a:hover { color: ffffff; text-decoration: none }
+</style>
+ENDCSS
+
+############### Dieser Teil enthält Programmcode, der an verschiedenen
+##SHARED-SUBS## Stellen ausgeführt werden muß und jedem Skript zur
+############### Verfügung steht.
+
+sub printfile { # Liest eine externe Datei ein und gibt sie mit print aus
+ my ($file2print,$pagetitle,$bodyclass) = @_;
+ if ($pagetitle ne "") {
+ &start_html($pagetitle,$bodyclass);
+ }
+ print "<div><a href=\"push.pl?alias=$alias&tmp=$tmp&var=push_logs_html\">Push</a></div><hr>" if ($bodyclass eq "log");
+ &read_file($file2print);
+ @file2print = <DATEI>;
+ close DATEI;
+ print @file2print;
+}
+
+
+sub start_html { # Der HEADER einer HTML-Datei
+print "<html><head>";
+print "<meta http-equiv=\"refresh\" content=\"20\" URL=\"online.pl?room=$room\">" if ($_[1] eq "online");
+print <<END;
+ <title>
+ $title - $_[0]
+ </title>
+ $style
+ </head>
+END
+ if ($_[1] ne "") {
+ print "<body class=$_[1]>";
+ } else {
+ print "<body>";
+ }
+}
+
+sub post { # Öffentliche Nachricht im aktuellen Raum $room posten.
+ my ($msg2post,$secroom) = @_;
+ my @rooms = ($room,$secroom);
+ foreach(@rooms) {
+ my $room2post = $_;
+ &list_dir("data/online/rooms/$room2post");
+ foreach(@dir) {
+ my $alias2post = $_;
+ if (-f "data/online/rooms/$room2post/$alias2post") {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+ }
+ }
+ }
+ &log("$msg2post") if ($room eq "Cyberbar");
+}
+
+
+sub post_all { # Öffentliche Nachricht in ALLEN Räumen gleichzeitig posten.
+ my $msg2post = $_[0];
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ my $alias2post = $_;
+ if (-f "data/online/users/$alias2post") {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+ }
+ }
+ &log("$msg2post");
+}
+
+sub post_prv { # Private Nachricht posten (flüstern).
+ my $alias2post = $_[0];
+ my $msg2post = $_[1];
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+}
+
+sub log { # Protokollieren der Nachrichten etc.
+ my ($msg2log) = @_;
+ &zeit;
+ &write_file("data/logs/$day.$month.$year");
+ print DATEI "<br><font color=ffffef><i>($hours:$min:$sec)</i></font> $msg2log\n";
+ close DATEI;
+}
+
+
+sub zeit { # Aktuelles Datum und Uhrzeit bestimmen.
+ ($sec, $min, $hours, $day, $month, $year) = (localtime)[0..5];
+ $month += 1;
+ $hours = "0".$hours if ($hours < 10);
+ $min = "0".$min if ($min < 10);
+ $sec = "0".$sec if ($sec < 10);
+ $day = "0".$day if ($day < 10);
+ $month = "0".$month if ($month < 10);
+ $year = $year - 100;
+ if ($year < 10) {
+ $year = "200".$year;
+ } else {
+ $year = "20".$year;
+ }
+}
+
+sub count { # Zeilen in einer Datei Zählen.
+ my $file2count = $_[0];
+ &read_file($file2count);
+ my @datei = <DATEI>;
+ close DATEI;
+ $number = $#datei+1;
+}
+
+sub read_file { # Datei öffnen.
+ my $file2read = $_[0];
+ if (-e "$file2read") {
+ open (DATEI,"<$file2read") || &error("Konnte $file2read nicht öffnen");
+ }
+}
+
+sub write_file { # Text an eine Datei anhängen.
+ my $file2write = $_[0];
+ if (-e "$file2write") {
+ open (DATEI,">>$file2write") || &error("Konnte $file2write nicht öffnen");
+ } else {
+ &create_file("$file2write");
+ open (DATEI,">>$file2write") || &error("Konnte $file2write nicht öffnen");
+ }
+}
+
+sub write_file_new { # Datei neu schreiben.
+ my $file2write = $_[0];
+ if (-e "$file2write") {
+ open (DATEI,">$file2write") || &error("Konnte $file2write nicht öffnen");
+ } else {
+ &create_file("$file2write");
+ open (DATEI,">$file2write") || &error("Konnte $file2write nicht öffnen");
+ }
+}
+
+sub create_file { # Datei erstellen.
+ my $file2create = $_[0];
+ open (CREATE, ">$file2create") || &error("Konnte $file2create nicht erstellen!");
+ print CREATE "";
+ close CREATE;
+}
+
+sub error { # Error-Ausgabe.
+ my $error_msg = $_[0];
+ &start_html( "Error: ($error_msg)" );
+ print $q->div( "Error: ($error_msg)" ),
+ $q->end_html;
+ exit;
+}
+
+sub remove_online { # Chatter entfernen
+ my ($alias,$room,$method) = @_;
+ unlink("data/online/users/$alias");
+ unlink("data/online/rooms/$room/$alias") if ($room ne undef);
+ unlink("data/online/ident/$alias");
+ unlink("data/msgs/$alias");
+ &rm_rooms;
+ &zeit;
+ if ($method eq undef) {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias verläßt den Chat ...</font></i>");
+ } elsif ($method ne "kick") {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500> $_ hat den Chat verlassen ... </font></i>");
+ }
+ &rm_rstat($room,$alias) if ($room ne undef);
+}
+
+sub rm_alias { # Chatter aus dem System entfernen, dessen Timestamps älter als 60 Sekunden sind
+ my ($dir2rm,$rstatroom) = @_;
+ &list_dir($dir2rm,2);
+ foreach(@dir2) {
+ if (-f "$dir2rm/$_" && $_ ne undef) {
+ &read_file("$dir2rm/$_");
+ my $timestamp = <DATEI>;
+ close DATEI;
+ if ($timestamp < (time - 60)) {
+ if ($dir2rm eq "data/online/users") {
+ &remove_online($_,undef,1);
+ } else {
+ unlink("$dir2rm/$_");
+ &rm_rstat($rstatroom,$_) if ($rstatroom ne undef);
+ }
+ }
+ }
+ }
+}
+
+sub rm_rooms { # Leere Räume aus dem System entfernen
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-d "data/online/rooms/$_") {
+ &rm_alias("data/online/rooms/$_",$_);
+ &list_dir("data/online/rooms/$_",2);
+ if ($#dir2 = 1) {
+ rmdir("data/online/rooms/$_");
+ }
+ }
+ }
+}
+
+sub rm_rstat { # Benutzer als Raumbesetzer austragen
+ my ($rstatroom,$r_alias) = @_;
+ &read_file("data/online/rstat/$rstatroom");
+ my @rstat = <DATEI>;
+ close DATEI;
+ my $newfile = $rstat[0].$rstat[1];
+ for ($i=2;$i<=$#rstat;$i++) {
+ $newfile = $newfile."\n".$rstat[$i] if ($rstat[$i] ne $r_alias."\n");
+ }
+ write_file_new("data/online/rstat/$rstatroom");
+ print DATEI $newfile;
+ close DATEI;
+}
+
+sub secure_removeid { # Beim ausloggen die IP-Nummer aus dat/ip austragen.
+ my $alias2rm = $_[0];
+ unlink("data/online/ident/$alias2rm");
+}
+
+sub secure_checkid { # TmpID überprüfen
+ my ($alias2check) = @_;
+ &read_file("data/online/ident/$alias2check");
+ my @idfile = <DATEI>;
+ close DATEI;
+ if ($idfile[1] ne $tmpid) {
+ &error("Falsche TempID ! Du bist nicht befugt zu handeln !");
+ }
+}
+
+sub remove_rooms { # Leere Räume entfernen.
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-d "data/online/rooms/$_") {
+ &list_dir("data/online/rooms/$_");
+ rmdir("data/online/rooms/$_") if ($#dir = 1);
+ }
+ }
+}
+
+sub list_dir { # Beliebigen Verzeichnisbaum einlesen.
+ my ($dir,$method) = @_;
+ opendir(DIR, $dir);
+ if ($method eq undef) {
+ @dir = readdir(DIR);
+ } elsif ($method = 2) {
+ @dir2 = readdir(DIR);
+ }
+ closedir(DIR);
+}
+
+sub hirachie { # Chatter nach Sonderrechte überprüfen.
+ my $alias2prove = $_[0];
+ $hirachie = undef;
+ &read_file("data/wa");
+ @was = <DATEI>;
+ close DATEI;
+ foreach(@was) {
+ if ($_ eq $alias2prove || $_ eq "$alias2prove\n") {
+ $hirachie = "wa";
+ }
+ }
+ &read_file("data/ow");
+ @ows = <DATEI>;
+ close DATEI;
+ if ($hirachie ne "wa" || $_ eq "$alias2prove\n") {
+ foreach(@ows) {
+ if ($_ eq $alias2prove || $_ eq "$alias2prove\n") {
+ $hirachie = "ow";
+ }
+ }
+ }
+}
+
+$| = 1; # Cache von Perl ausschalten \ No newline at end of file
diff --git a/0.4.0a/help.sno b/0.4.0a/help.sno
new file mode 100644
index 0000000..9b3170b
--- /dev/null
+++ b/0.4.0a/help.sno
@@ -0,0 +1,56 @@
+<div>
+ Alle Chat-Befehle:
+</div>
+<hr>
+<table width=100% bgcolor=555555>
+<tr><th bgcolor=666666><div>SU</div></th><th bgcolor=666666><div>Befehl</div></th><th bgcolor=666666><div>Beschreibung</div></th></tr>
+<tr><td><div>NC</div></td><td><div>/about</div></td><td><div>Zeigt aktuelle Version und andere Infos der Community an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/away <font color=red>Nachricht</font></div></td><td><div>Abmelden mit einer<font color=red>Abmeldenachricht</font></div></td></tr>
+<tr><td><div>NC</div></td><td><div>/clear</div></td><td><div>Bildschirm wird gelöscht</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/col <font color=red>XXXXXX</font> <font color=ffa500>XXXXXX</font></div></td><td><div>Farbe/n (<font color=red>Namensfarbe</font> / <font color=ffa500>Textfarbe</font>) wechseln. Angabe in Hexadezimal.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/date</div></td><td><div>Zeigt aktuelles Datum und Urzeit an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/j <font color=red>Raumname</font></div></td><td><div>Raum wechseln/erstellen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ju <font color=red>Alias</font></div></td><td><div>In den Raum wechseln/folgen, wo sich <font color=red>Alias</font> befindet.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/m <font color=red>Aktion</font></div></td><td><div>Handeln mit 2 Farben</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/me <font color=red>Aktion</font></div></td><td><div>Handeln mit einer Farbe</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/msg <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine private <font color=ffa500>Nachricht</font> flüstern.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ <font color=ffa500>Nachricht</font></div></td><td><div>Eine private <font color=ffa500>Nachricht</font> demjenigen flüstern, dem zuletzt eine geflüstert wurde</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/online <font color=red>Alias</font></div></td><td><div>Zeigt Total-Chat-Zeit von <font color=red>Alias</font> in Minuten</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/q</div></td><td><div>Cumunnity verlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/rmgb</div></td><td><div>Das eigene Gästebuch komplett weglöschen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/s <font color=red>Nachricht</font></div></td><td><div><font color=red>Nachricht</font> schreien</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/seen <font color=red>Alias</font></div></td><td><div>Zeigt an, vor wieviel Stunden sich <font color=red>Nachricht</font> zum letzten Mal in das System eingelogt hat</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/w</div></td><td><div>Zeigt an, wer sich im aktuellen Raum befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc <font color=red>Raum</font></div></td><td><div>Zeigt an, wer sich im <font color=red>Raum</font> befindet. Wird kein Raum angegeben, dann wird jedeglich angezeigt, wer sich im System befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc/</div></td><td><div>Zeigt alle offenen Räume und deren Chatter an</div></td></tr>
+<tr><td><div>NC</div></td><td> <div>/wj <font color=red>Alias</font></div></td><td><div>Zeigt an, in welchen Raum sich <font color=red>Alias</font> befindet</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/l</div></td><td><div>Der aktuelle Raum wird ab- bzw. aufgesperrt</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/rsu <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> die Raumbesetzerrechte entnehmen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/su <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Raumbesetzer ernennen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/t <font color=red>Thema</font></div></td><td><div>Dem aktuellen Raum wird ein <font color=red>Thema</font> gegeben</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/k <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird aus dem Chat katapultiert!</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/ban</div></td><td><div>Zeigt alle verbannten Benutzer an</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/ban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> verbannen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/rban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> "entbannen"</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/ip <font color=red>Alias</font></div></td><td><div>Zeigt die IP-Nummer von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/kill <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird ganz und gar aus dem System entfernt</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/wa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Wächter ernennen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/rwa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom Wächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/sys <font color=red>Nachricht</font></div></td>
+<td><div>Systemnachricht schreiben. (Erscheint in allen existierenden Räumen)</div></td></tr>
+</table><hr>
+<div>
+ Zur Erklärung: NC steht für "Normale Chatter", RB für "Raumbesetzer", WÄ für "Wächter" und OW für "Oberwächter".
+ Obrige Befehle können nur von der/den jeweiligen Benutzergruppe/n werden.<br><br>
+ Allerdings gibt es folgendes zu beachten: Oberwächter verfügen über alle Chatbefehle. Normale Wächter über alle Chatbefehle, außer über die der Oberwächter.
+ Raumbesetzer können nur Raumbesetzerbefehle und die Befehle der normalen Chatter durchführen. Normale Chatter haben jedeglich die Standardbefehle zu verwenden.<br><br>
+ Weitere Besonderheiten der Wächter und Oberwächter:<br><br>
+ Wächter und Oberwächter können ....<br>
+ ... abgesperrte Chaträume problemlos betreten.<br>
+ ... nicht gekickt, verbannt oder gekillt werden.<br>
+ ... Logdateien der Cyberbar lesen.<br><br>
+
+ Des weiteren: Oberwächter ernennt nur der Systemadministrator!
+</div>
+</body>
+</html> \ No newline at end of file
diff --git a/0.4.0a/htdocs.pl b/0.4.0a/htdocs.pl
new file mode 100644
index 0000000..c92b496
--- /dev/null
+++ b/0.4.0a/htdocs.pl
@@ -0,0 +1,195 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+if ($var eq "help_html") {
+ &printfile("help.sno","Alle Chatbefehle");
+} elsif ($var eq "menu_html") {
+ &menu_html;
+} elsif ($var eq "werda_html") {
+ &werda_html;
+} elsif ($var eq "logs_html") {
+ &logs_html;
+} elsif ($var eq "view_logs_html") {
+ &secure_checkid($alias);
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ &printfile($tmp,$tmp,"log");
+ }
+} elsif ($var eq "superuser_html") {
+ &secure_checkid($alias);
+ &superuser_html;
+} else {
+ print
+ $q->start_html(-bgcolor=>"000000"),
+ $q->end_html;
+}
+
+sub menu_html {
+ if ($tmp eq "quit") {
+ print
+ $q->script( { -language=>"JavaScript" }, "window.open(\"index.pl?tmp=quit\",\"_top\")" );
+ sleep 1;
+ &remove_online($alias);
+ &secure_removeid($alias);
+ unlink("data/msgs/$alias");
+ }
+ &start_html("Menü","menu");
+print <<END;
+ <center>
+ <div>
+ [<a href="htdocs.pl?var=werda_html&alias=$alias&room=$room&col=$col&secol=$secol&&tmp=$tmp&tmpid=$tmpid" target="werda">Wer ist da?</a>]
+ [<a href="main2.pl?var=edit_profile_html&alias=$alias&tmpid=$tmpid" target="ProfilAendern">Profil ändern</a>]
+ [<a href="main2.pl?var=edit_options_html&alias=$alias&tmpid=$tmpid" target="main">Optionen</a>]
+ [<a href="main2.pl?var=list_alias_html&alias=$alias&tmpid=$tmpid" target="Benutzerliste">Benutzer</a>]
+ [<a href="htdocs.pl?var=help_html&tmpid=$tmpid" target="Befehle">Befehle</a>]
+ [<a href="main2.pl?var=gb_html&alias=$alias&tmpid=$tmpid" target="Board">Board</a>]
+ [<a href="htdocs.pl?var=superuser_html&alias=$alias&tmpid=$tmpid" target="Hirachie">Superuser</a>]
+ [<a href="htdocs.pl?var=logs_html&alias=$alias&tmpid=$tmpid" target="Logdateien">Logs</a>]
+ [<a href="push.pl?alias=$alias&room=$room&var=clear_screen&tmpid=$tmpid" target="main">Weiterchatten</a>]
+ [<a href="htdocs.pl?var=menu_html&tmp=quit&alias=$alias&tmpid=$tmpid">Verlassen</a>]
+ </div>
+ </center>
+</body>
+</html>
+END
+}
+
+
+sub werda_html { # Anzeige, wer eingelogt ist.
+ &start_html("Wer ist da?");
+ print <<END;
+<div>
+ $alias, schön daß Du hier bist :-)
+</div>
+<hr>
+<div>
+ Folgende Personen befinden sich im Chat:
+</div>
+<br>
+<div>
+END
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ my $room = $_;
+ &read_file("data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ &list_dir("data/online/rooms/$room",2);
+ local $nr = $#dir2-1;
+ print $q->b( $_ ),
+ " $door ($nr) Raumthema: $rstat[1]",
+ $q->br;
+ foreach(@dir2) {
+ if ($_ ne ".." && $_ ne ".") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid" }, "$_"), " ";
+ }
+ }
+ print $q->br, $q->br;
+ }
+ }
+ print
+ "</div>",
+ $q->end_html;
+}
+
+sub logs_html {
+ &start_html("Logdateien");
+ print <<END;
+<div>
+ Hier befinden sich alle Logdateien
+</div>
+<hr>
+END
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ print $q->div( "Folgende Logdateien des Raumes \"Cyberbar\" können nur von Wächtern und Oberwächtern gelesen werden (Sortiert nach A-Z, a-z):" ),
+ $q->br;
+ &list_dir("data/logs");
+ my @sortedir = sort(@dir);
+ foreach(@sortedir) {
+ if (-f "data/logs/$_") {
+ print $q->a( { -href=>"htdocs.pl?alias=$alias&var=view_logs_html&tmp=data/logs/$_&tmpid=$tmpid",
+ -target=>"_new" },
+ "$_" ),
+ " ";
+ }
+ }
+ } else {
+ print $q->div( "Logdateien können nur von Oberwächtern (OW) und von Wächtern (WÄ) gelesen werden. Du bist jedoch ein ",
+ "\"Normaler Chatter\". Wächter können alles nachlesen, was öffentlich gechattet wurde." ),
+ $q->hr;
+ &printfile("data/htdocs/logs_html");
+ }
+ print
+ $q->end_html;
+}
+
+sub superuser_html { # Zeigt an, wer Superuser ist
+ &start_html("Superuser");
+ print "<div>Hallo $alias. Du bist als ";
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ print
+ $q->b( "Oberwächter" ),
+ " (OW) eingetragen.</div>",
+ $q->hr;
+ } elsif ( $hirachie eq "wa") {
+ print
+ $q->b( "Wächter" ),
+ " (WÄ) eingetragen.</div>",
+ $q->hr;
+ } else {
+ print
+ $q->b( "normaler Chatter" ),
+ " (NC) eingetragen.</div>",
+ $q->hr;
+ }
+
+ my $nrow = $#ows+1;
+ print
+ "<div>",
+ $q->b( "OW" ),
+ "s ($nrow Stück)";
+ foreach(@ows) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+ my $nrwa = $#was+1;
+ print
+ "</div>",
+ $q->hr,
+ "<div>",
+ $q->b( "WÄ" ),
+ "s ($nrwa Stück)";
+ foreach(@was) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+print <<END;
+<hr>
+ Die jeweiligen Fähigkeiten der Oberwächter (OW) und der Wächter (WÄ) sind unter
+ "<a href="htdocs.pl?var=help_html&tmpid=$tmpid">Chat-Befehle</a>"
+ dokumentiert.
+</div>
+</body>
+</html>
+END
+} \ No newline at end of file
diff --git a/0.4.0a/index.pl b/0.4.0a/index.pl
new file mode 100644
index 0000000..7dc9af2
--- /dev/null
+++ b/0.4.0a/index.pl
@@ -0,0 +1,373 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header; # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUFGERUFEN WERDEN?##
+#####################################
+if ($var eq "create_alias_html") {
+ &create_alias_html;
+} elsif ($var eq "create_alias") {
+ &create_alias;
+} elsif ($var eq "login_html") {
+ &login_html;
+} elsif ($alias eq "") {
+ &login_html;
+} else {
+ &checklogin;
+}
+
+sub login_html { # Erste Startseite
+local $counter = undef;
+&read_file("data/count");
+ $counter = <DATEI>;
+close DATEI;
+$counter++;
+&write_file_new("data/count");
+ print DATEI $counter;
+close DATEI;
+&list_dir("data/online/users");
+my $logtin = $#dir-1;
+&start_html("Created by Paul C. Bütow 2k");
+print <<END;
+ <center>
+ <table width=400>
+ <tr>
+ <td>
+ <b>
+ <div>
+ $title - ( <a href="http://servers.yChat.de">yChat-Servers</a> )
+ <img src="$gfxpath/yChat.jpg">
+ </div>
+ </b>
+END
+ if ($tmp eq "true") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Wahrscheinlich existiert Dein Alias "$alias" nicht,
+ <br>
+ Du hast Dich verschrieben oder das Passwort ist falsch.
+ <br>
+ Versuch es erneuert !
+ </div>
+END
+ } elsif ($tmp eq "quit") {
+print <<END;
+ <div>
+ Du hast soeben den Chat verlassen.
+ <br>
+ Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ } elsif ($tmp eq "banned") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein Alias "$alias" wurde verbannt.
+ <br>
+ Z.z. kannst Du Dich leider nicht in den Chat einloggen.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($tmp eq "kick") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wurdest soeben aus dem Chat katapultiert!
+ <br>
+ Schlechtes Verhalten mag die Ursache hierfür sein.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($var eq "create_alias") {
+print "<div>Du hast sich soeben in die Datenbank eingetragen. Einfach auf \"Los Geht's\" klicken :-)</div>";
+ } else {
+print <<END;
+ <div>
+ Herzlich willkommen!
+ <br>
+ Einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <form action="index.pl" method="post">
+ <input type="hidden" name="tmp" value="true">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Alias:
+ <br>
+ <input name="alias" value="$alias">
+ </div>
+ </td>
+ <td>
+ <div>
+ Dein Passwort:
+ <br>
+ <input type="password" name="id" value="$id">
+ </div>
+ </td>
+ </tr>
+ </table>
+ <br>
+ <br>
+ <div>
+ Solltest Du noch keinen Nick besitzen, dann auf "Registrieren" klicken!
+ </div>
+ <br>
+ <table>
+ <tr>
+ <td>
+ <font color="ffffff">
+ <input type="submit" value="Los geht's!">
+ </font>
+ </form>
+ </td>
+ <td>
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias_html">
+ <font color="ffffff">
+ <input type="submit" value="Registrieren">
+ </font>
+ </form>
+ </td>
+ </tr>
+ </table>
+ <hr>
+ <div>
+ yChat befindet sich momentan noch in der Entwicklungsphase !
+ <br>
+ Fragen gehen an Paul Bütow (
+ <a href="mailto:paul\@buetow.oxg.de">
+ paul\@buetow.oxg.de
+ </a>
+ ) :-)
+ <br>
+ <br>
+ Diese Seite wurde schon $counter mal aufgerufen. Es sind z.Z. $logtin Benutzer online.
+ </td>
+ </tr>
+ </table>
+ </center>
+</body>
+</html>
+END
+ if ($logtin == 0) {
+ &list_dir("data/msgs");
+ &list_dir("data/online/rstat",2);
+ foreach(@dir) {
+ unlink("data/msgs/$_");
+ unlink("data/online/ident/$_");
+ }
+ foreach(@dir2) {
+ unlink("data/online/rstat/$_");
+ }
+ }
+ # Falls d. Skript das Raumverz. gelöscht hat, neu anlegen
+ if (-d "data/online/rooms") {
+ } else {
+ mkdir "data/online/rooms", 0777;
+ }
+}
+
+
+sub create_alias_html { # HTML-Form für Erstellung eines neuen Benutzers.
+my $reload = $_[0];
+&start_html("Registration");
+print <<END;
+ <center>
+ <table width=400>
+ <tr>
+ <td>
+END
+ if ($reload eq "alias_exists") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Der von Dir gewählte Benutzername "$alias" existiert in unserer Datenbank bereits. Bitte versuch es erneuert mit
+ einem anderen Benutzernamen !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "pw_wrong") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Deine beiden Passworteingaben stimmen nicht überein. Bitte geb das Passwort erneuert an um sicherzugehen, daß
+ kein falsches Passwort abgespeichert wird !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "alias_prohibited") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein gewählter Benutername "$alias" enthält illegale Zeichen. Bitte versuch einen anderen Benutzernamen!
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Hier kannst Du Dich registrieren. Bitte beachte, daß die Passworteingabefelder übereinstimmen!
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias">
+ <div>
+ Dein Alias:
+ <font color="ffa500">
+ (Muß angegeben werden)
+ </font>
+ <br>
+ <input name="alias" VALUE="$alias">
+ </div>
+ <br>
+ <div>
+ Dein gewünschtes Passwort:
+ <br>
+ <input type="password" name="id" value="$id">
+ </div>
+ <br>
+ <div>
+ Geb hier Dein Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp">
+ </div>
+ <br>
+ <font color=ffffff>
+ <input type="submit" value="Registrieren">
+ </font>
+ <br>
+ </form>
+ <hr>
+ <div>
+ Um den Chat zu betreten müssen die Daten nach der Registration auf der Startseite erneuert bestätigt werden !
+ </div>
+ </td>
+ </tr>
+ </table>
+</center>
+</body>
+</html>
+END
+}
+
+sub checklogin { # Überprüfen, ob die Login-Daten korrekt sind.
+ my $lognotexists = "true";
+ &list_dir("data/user/options");
+ for (my $i=0; $i<=$#dir; $i++) {
+ if ($dir[$i] eq $alias) {
+ &read_file("data/user/options/$alias");
+ @datei = <DATEI>;
+ close DATEI;
+ chomp($datei[0]);
+ if ($datei[0] eq $id) {
+ &read_file("data/ban"); # Überprüfen, ob Alias verbannt ist
+ @banned = <DATEI>;
+ close DATEI;
+ foreach(@banned) {
+ if ($_ eq "$alias\n") {
+ $tmp = "banned";
+ &login_html();
+ exit;
+ }
+ }
+ $col = $datei[1];
+ $secol = $datei[2];
+ $tmpid = time;
+ &write_file_new("data/online/ident/$alias");
+ print DATEI $ENV{'REMOTE_ADDR'}."\n".$tmpid;
+ close DATEI;
+ &read_file("data/user/lastlogin/$alias");
+ my @lastlogin = <DATEI>;
+ close DATEI;
+ &write_file_new("data/user/lastlogin/$alias");
+ print DATEI time;
+ close DATEI;
+ &frameset_html;
+ exit;
+ } else {
+ $lognotexists = "false";
+ }
+ }
+ }
+ if ($lognotexists eq "true") {
+ }
+ &login_html; # Falls Login-Daten inkorrekt sind, zurück zur Startseite.
+}
+
+sub create_alias { # Erstellung eines neuen Benutzers.
+ if ($alias =~ /[\W]/ || $alias eq "") {
+ &create_alias_html("alias_prohibited");;
+ exit;
+ } elsif ($id ne $tmp) {
+ &create_alias_html("pw_wrong");
+ exit;
+ }
+ &list_dir("data/user/options");
+ for (my $i=0; $i<=$#dir; $i++) {
+ if ($dir[$i] eq $alias) {
+ &create_alias_html("alias_exists");
+ exit;
+ }
+ }
+ &write_file_new("data/user/options/$alias");
+ print DATEI $id."\n";
+ close DATEI;
+ &zeit;
+ &list_dir("data/user/options");
+ my $number = $#dir-1;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias [$number] hat sich soeben als neuer Benutzer registriert :-) ...</font></i>");
+ &login_html;
+}
+
+sub frameset_html {
+print <<END;
+<html>
+ <head>
+ <title>
+ $title - Created & Copyright by Paul C. Bütow
+ </title>
+ </head>
+<frameset border=0 frameborder=0 framespacing=0 rows="50,*,55,0">
+ <frame name="menu" src="htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol&tmpid=$tmpid" scrolling="no">
+ <frameset border=0 frameborder=0 framespacing=0 cols="150,*">
+ <frame name="online" src="online.pl?room=$room&alias=$alias&tmpid=$tmpid">
+ <frame name="main" src="push.pl?room=$room&alias=$alias&var=clear_screen&tmpid=$tmpid">
+ </frameset>
+ <frame name="input" src="main.pl?alias=$alias&var=input_html&room=$room&col=$col&secol=$secol&tmp=login&tmpid=$tmpid" scrolling="no">
+ <frame name="reload" src="htdocs.pl" scrolling="no">
+</frameset>
+</html>
+END
+}
diff --git a/0.4.0a/main.pl b/0.4.0a/main.pl
new file mode 100644
index 0000000..de20d7c
--- /dev/null
+++ b/0.4.0a/main.pl
@@ -0,0 +1,739 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI; # CGI-Modul laden
+
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+if ($var eq "input_html") {
+ &secure_checkid($alias);
+ &input_html;
+#} elsif ($var eq "reload_html") {
+# &reload_html;
+} elsif ($var eq "post_msg") {
+ &post_msg;
+#} elsif ($var eq "change_room") {
+# &change_room;
+} else {
+ &error("Parameter fehlt");
+}
+
+sub input_html { # Eingabemaske für den Chat.
+ if ($tmp eq "login") {
+ &remove_rooms;
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat den Chat betreten ...</font></i>");
+ }
+ my $whisper = @_;
+ $whisper = $q->param('whisper') if ($whisper == 0);
+print <<END;
+<html>
+ <head>
+ <script language="JavaScript">
+ function delout()
+ {
+ document.inf.submit();
+ document.inf.msg.focus();
+ document.inf.msg.select();
+ return false;
+ }
+ </script>
+ </head>
+<body bgcolor=000000>
+ <form name="inf" target="reload" action="main.pl" method="GET" onsubmit="return delout()">
+END
+ print <<END;
+ <input type="hidden" name="var" value="post_msg">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="room" value="$room">
+ <input type="hidden" name="col" value="$col">
+ <input type="hidden" name="secol" value="$secol">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="id" value="$whisper">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input size="80" name="msg">
+ <input type="submit" value="Texten">
+ </form>
+</body>
+</html>
+END
+}
+
+sub reload_html { # Wird neugeladen, wenn eine Nachricht getextet wird!
+ my ($whisper,$action) = @_;
+ print "<html><head><script language=\"JavaScript\">";
+ if ($action eq "change_room") {
+ print "open(\"online.pl?alias=$alias&room=$room&tmpid=$tmpid\",\"online\");";
+ print "open(\"main.pl?var=input_html&alias=$alias&room=$room&col=$col&secol=$secol&whisper=$whisper&tmpid=$tmpid\",\"input\");";
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol&tmpid=$tmpid\",\"menu\");";
+ } elsif ($action eq "change_colors") {
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol&tmpid=$tmpid\",\"menu\");";
+ print "open(\"main.pl?var=input_html&alias=$alias&room=$room&col=$col&secol=$secol&whisper=$whisper&tmpid=$tmpid\",\"input\");";
+ } elsif ($action eq "away") {
+ print "open(\"main.pl?var=input_html&alias=$alias&col=$col&secol=$secol&room=$room&tmp=noaway&whisper=$whisper&tmpid=$tmpid\",\"input\");";
+ } elsif ($action eq "whisper") {
+ print "open(\"main.pl?var=input_html&alias=$alias&col=$col&secol=$secol&room=$room&whisper=$whisper&tmpid=$tmpid\",\"input\");";
+ } elsif ($action eq "quit") {
+ print "open(\"index.pl?tmp=quit\",\"_top\");";
+ }
+ print "</script></head><body bgcolor=000000>";
+ print
+ $q->end_html;
+}
+
+sub post_msg { # Wird aufgerufen, wenn aus input_html eine Eingabe gepostet wurde.
+ &secure_checkid($alias);
+ if ($tmp eq "noaway") {
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias meldet sich zurück ... </font></i>");
+ &post_prv($alias,"<script language=\"JavaScript\">open(\"main.pl?var=input_html&alias=$alias&col=$col&secol=$secol&room=$room&whisper=$whisper&tmpid=$tmpid\",\"input\");</script>");
+ }
+ $msg =~ s#<#&lt\;#g; # HTML-Tags deaktivieren
+ if (substr($msg,0,1) ne "/") { # Überprüfen, ob Befehl oder Nachricht
+ $msg = "<b><font color=$col>$alias: <font color=$secol>".$msg."</font></font></b>";
+ &reload_html($id,$tmp); # -> Action=none, Whisper=$id, $tmp =? noaway
+ &post($msg);
+ } else {
+ &cmd($msg);
+ }
+}
+
+sub cmd { # Alle Chatbefehle, die über input_html eingegeben werden können.
+ $_[0] = $_[0]." ";
+ $_[0] = substr($_[0], 1, length($_[0])-1);
+ my @cmd = split(/ /, $_[0]);
+ my $cmd = substr($_[0],0 , index($_[0], " "));
+ my ($whisper,$action) = ($id);
+#############>- NORMALE CHATBEFEHLE ( Alphabetisch sortiert ) -<
+#############>- INFORMATIONEN ÜBER DAS SYSTEM AUSGEBEN -<
+ if ($cmd eq "about") {
+ &post_prv("$alias","<font size=2 color=ffffff>Aktuelle Version ist $title und wurde am $datum aktuallisiert. Created by Paul C. Bütow 2k.</font>");
+#############>- ABMELDEN MIT 'AWAY-NACHRICHT' -<
+ } elsif ($cmd eq "away") {
+ if ($tmp eq "away") { # Falls 2 mal hintereinander /away eingegeben wurde
+ my $away_msg = "";
+ }
+ for ($i=1; $i <= $#cmd; $i++) {
+ $away_msg = $away_msg." ".$cmd[$i];
+ }
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias meldet sich ab (<font color=red>$away_msg</font> ) ...</i></font>");
+ &reload_html($whisper,"away");
+ exit;
+#############>- EIGENEN CHATBILDSCHIRM LÖSCHEN -<
+ } elsif ($cmd eq "clear") {
+ &post_prv("$alias","<script language=\"JavaScript\">window.open(\"push.pl?alias=$alias&room=$room&var=clear_screen&tmpid=$tmpid\",\"main\");</script>");
+ &reload_html($whisper);
+ exit;
+#############>- FARBEN WECHSELN -<
+ } elsif ($cmd eq "col") {
+ $col = $cmd[1];
+ my $tmpsecol = $cmd[2];
+ if ($tmpsecol eq "") {
+ $secol = $col
+ } else {
+ $secol = $tmpsecol;
+ }
+ &read_file("data/user/options/$alias");
+ my @pro = <DATEI>;
+ close DATEI;
+ &write_file_new("data/user/options/$alias");
+ print DATEI $pro[0]."".$col."\n".$secol;
+ close DATEI;
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat die Farbe gewechselt ...</font></i>");
+ &reload_html($whisper,"change_colors");
+ exit;
+#############>- AKTUELLES DATUM UND URZEIT AUSGEBEN -<
+ } elsif ($cmd eq "date") {
+ &zeit;
+ &post_prv("$alias","<font size=2 color=ffffff>Heute ist der $day.$month. Jahr $year. Es ist genau $hours:$min Uhr und $sec Sekunden.</font>");
+ &reload_html($whisper);
+ exit;
+#############>- EINEN NEUEN RAUM ERSTELLEN BZW. IN EINEN BESTEHENDEN RAUM WECHSELN -<
+ } elsif ($cmd eq "j") {
+ &change_room("j",$cmd[1],$room);
+ &reload_html($whisper,"change_room");
+ exit;
+#############>- HANDELN -<
+ } elsif ($cmd eq "me" || $cmd eq "m") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $me_msg = $me_msg." ".$cmd[$i];
+ }
+ if ($cmd eq "m") {
+ &post("<i><font color=$col>$alias <font color=$secol>$me_msg</font></font></i>");
+ } else {
+ &post("<i><font color=$col>$alias $me_msg</font></i>");
+ }
+ &reload_html($whisper);
+ exit;
+#############>- MEMO SCHREIBEN -<
+ } elsif ($cmd eq "memo") {
+ my $alias2memo = $cmd[1];
+ &list_dir("data/user/options");
+ foreach(@dir) {
+ if(-f "data/user/options/$alias2memo") {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $memo_msg = $memo_msg." ".$cmd[$i];
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2memo <font color=ffffff>wurde folgende memo erfolgreich hinterlassen: $memo_msg</font></font>");
+ &zeit;
+ &write_file("data/user/memos/$alias2memo");
+ print DATEI "<font size=2 color=ffffff>(<font color=red>$day.$month. - $hours:$min:$sec</font>) $alias hat Dir eine Memo hinterlassen: <font color=ffa500>$memo_msg</font></font><br>";
+ close DATEI;
+ &reload_html($whisper);
+ exit;
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2memo <font color=ffffff>existiert in der Datenbank nicht !</font></font>");
+ &reload_html($whisper);
+ exit;
+#############>- FLÜSTERN ( Auch mit '/' ) -<
+ } elsif ($cmd eq "msg" || $cmd eq "") {
+ my ($alias2post,$msg2post) = ($cmd[1],"");
+ if ($cmd eq "msg") {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ $action = "whisper";
+ } else {
+ $alias2post = $id;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ }
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ if ($_ eq $alias2post) {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "<i><font color=$col>$alias flüstert <font color=ffffff>=></font><font color=$secol>$msg2post</font></font></i><br>\n";
+ close DATEI;
+ &write_file("data/msgs/$alias");
+ print DATEI "<i><font color=$col>Zu $alias2post geflüstert <font color=ffffff>=></font><font color=$secol>$msg2post</font></font></i><br>\n";
+ close DATEI;
+ &reload_html($alias2post,$action);
+ exit;
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2post <font color=ffffff>ist momentan nicht anwesend !</font></font>");
+#############>- TOTALONLINEZEIT VON ALIAS ANZEIGEN -<
+ } elsif ($cmd eq "online") {
+ my $alias2prove= $cmd[1];
+ if (-f "data/user/counts/$alias2prove.online") {
+ &read_file("data/user/counts/$alias2prove.online");
+ my $online = <DATEI>;
+ close DATEI;
+ my $totaltime = sprintf("%.2f",($online / 60));
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff> war insgesamt schon $totaltime Minuten online !</font></font>");
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff>hat z.Z. keine Statistiken !</font></font>");
+ }
+ &reload_html($whisper);
+ exit;
+#############>- DAS SYSTEM VERLASSEN -<
+ } elsif ($cmd eq "q") {
+ &reload_html($whisper,"quit");
+ sleep 2;
+ &remove_online($alias,$room);
+ &secure_removeid($alias);
+ exit;
+#############>- DAS EIGENE GÄSTEBUCH LÖSCHEN -<
+ } elsif ($cmd eq "rmgb") {
+ unlink("data/user/gbooks/$alias");
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias löscht sein gesamtes Gästebuch ...</font></i>",$_);
+ &reload_html($whisper);
+ exit;
+#############>- SCHREIEN -<
+ } elsif ($cmd eq "s") {
+ my ($msg2scream,$msg2post);
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2scream = $msg2scream." ".$cmd[$i];
+ }
+ $msg2post = "\U$msg2scream";
+ &post("<font color=$col><i>$alias schreit:</i> <b><font color=$secol>".$msg2post."</font></font></b>");
+ &reload_html($whisper);
+ exit;
+#############>- SEHEN, WANN SICH ALIAS ZUM LETZTEN MAL EINGELOGT HAT -<
+ } elsif ($cmd eq "seen") {
+ my $alias2prove = $cmd[1];
+ &list_dir("data/user/options");
+ foreach(@dir) {
+ if (-f "data/user/lastlogin/$alias2prove") {
+ &read_file("data/user/lastlogin/$alias2prove");
+ my $lastlogin = <DATEI>;
+ close DATEI;
+ my $timestamp = sprintf("%.2f",((time() - $lastlogin) / 3600));;
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff> hat sich vor $timestamp Stunden zuletzt in das System eingelogt !</font></font>");
+ &reload_html($whisper);
+ exit;
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff> existiert nicht in der Benutzerdatenbank !</font></font>");
+ &reload_html($whisper);
+ exit;
+#############>- ANZEIGEN WER SICH IM AKTUELLEN RAUM BEFINDET -<
+} elsif ($cmd eq "w") {
+ &list_dir("data/online/rooms/$room");
+ &read_file("data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ my ($is,$nr) = ("t",0);
+ foreach(@dir) {
+ if (-f "data/online/rooms/$room/$_") {
+ $personen = $personen." ".$_;
+ $nr++;
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>$room $door ($nr) [".$rstat[1]."] : <font color=ffa500>$personen</font></font>");
+ &reload_html($whisper);
+ exit;
+ #############>- ANZEIGEN WER SICH IM SYSTEM BEFINDET -<
+ } elsif ($cmd eq "wc" || $cmd eq "wc/") {
+ $raum = $cmd[1];
+ if ($raum eq "" && $cmd eq "wc") {
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/users/$_");
+ }
+ my $nr = ($#dir-1);
+ my ($nrs,$is) = ("","ist");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "sind";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>$nr Person$nrs $is insgesamt eingelogt: <font color=ffa500>$personen</font></font>");
+ } elsif ($raum eq "" && $cmd eq "wc/") {
+ my $msg2post;
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ &list_dir("data/online/rooms/$_",2);
+ &read_file("data/online/rstat/$_");
+ my @rstat = <DATEI>;
+ close DATEI;
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ my $nr = $#dir2-1;
+ $msg2post = $msg2post."<tr><td><b><font size=2 color=ffffff>$_ $door ($nr) [".$rstat[1]."] </font></b></td><td><font size=2 color=ffffff>";
+ foreach $chatter (@dir2) {
+ if (-f "data/online/rooms/$_/$chatter") {
+ $msg2post = $msg2post."$chatter ";
+ }
+ }
+ print "</font></td>";
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>Folgende Räume sind offen:</font><table>$msg2post</table>");
+ } elsif ($raum ne "") {
+ my $personen;
+ &list_dir("data/online/rooms/$raum");
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/rooms/$raum/$_");
+ }
+ my ($nr,$is) = (($#dir-1),"t");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "n";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff> $nr Person$nrs befinde$is sich im Raum \"$raum\": <font color=ffa500>$personen</font></font>");
+ }
+ &reload_html($whisper);
+ exit;
+#############>- ANZEIGEN IN WELCHEN RAUM SICH JMD. BEFINDET BZW. JMD IN EINEN RAUM FOLGEN -<
+ } elsif ($cmd eq "wj" || $cmd eq "ju") {
+ my $alias2search = $cmd[1];
+ &list_dir("data/online/rooms");
+ foreach $raum (@dir) {
+ &list_dir("data/online/rooms/$raum",2) if (-d "data/online/rooms/$raum");
+ foreach $user (@dir2) {
+ if (-f "data/online/rooms/$raum/$user") {
+ if ($user eq $alias2search) {
+ if ($cmd eq "wj") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2search <font color=ffffff>befindet sich im Raum \"$raum\" !</font></font>");
+ } else {
+ &change_room("ju",$raum,$room,$alias2search);
+ }
+ &reload_html($whisper,"change_room");
+ exit;
+ }
+ }
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2search <font color=ffffff> ist nicht eingelogt !</font></font>");
+ &reload_html($whisper);
+ exit;
+#############>- RAUMNESETZER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- RAUM ABSCHLIESSEN/AUFSCHLIESSEN -<
+ } elsif ($cmd eq "l") {
+ &prove_besetzer($alias,$room);
+ &hirachie($alias);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ my $lock = "0\n";
+ &zeit;
+ if ($room eq "Cyberbar") {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum ohne Erfolg ab ...</font></i>");
+ } else {
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum ab ...</font></i>");
+ } else {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum auf ...</font></i>");
+ }
+ for ($i=1;$i<=$#r_stat;$i++) {
+ $lock = $lock.$r_stat[$i];
+ }
+ write_file_new("data/online/rstat/$room");
+ print DATEI $lock;
+ close DATEI;
+ }
+ }
+ &reload_html($whisper);
+ exit;
+#############>- RAUMBESETZER ERNENNEN -<
+ } elsif ($cmd eq "su") {
+ &prove_besetzer($alias,$room);
+ &hirachie($alias);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ my $alias2su = $cmd[1];
+ &list_dir("data/online/rooms/$room");
+ foreach(@dir) {
+ if ($_ eq $alias2su) {
+ &read_file("data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ &hirachie($alias2su);
+ &prove_besetzer($alias2su,$room);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ &reload_html($whisper);
+ &post_prv($alias,"<font color=ffa500>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist bereits RB, WÄ oder OW)</font>");
+ exit;
+ }
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias ernennt \"$alias2su\" zum Raumbesetzer ...</font></i>");
+ &write_file("data/online/rstat/$room");
+ print DATEI $alias2su."\n";
+ close DATEI;
+ &reload_html($whisper);
+ exit;
+ }
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist nicht anwesend)</font>");
+ }
+ &reload_html($whisper);
+ exit;
+#############>- RAUMBESETZER ENTNENNEN -<
+ } elsif ($cmd eq "rsu") {
+ &prove_besetzer($alias,$room);
+ &hirachie($alias);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ my $alias2rsu = $cmd[1];
+ &read_file("data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ &prove_besetzer($alias2rsu,$room);
+ if ($r_besetzer eq "true") {
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias entzieht \"$alias2rsu\" die Raumbesetzerrechte ...</font></i>");
+ my $newrstat = $rstat[0].$rstat[1];
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $newrstat = $newrstat.$r_stat[$i] if ($r_stat[$i] ne $alias2rsu."\n");
+ }
+ &write_file_new("data/online/rstat/$room");
+ print DATEI $newrstat;
+ close DATEI;
+ } else {
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2rsu <font color=ffffff>ist kein Raumbesetzer und kann dieser Status auch nicht aberkannt werden !</font></font>");
+ }
+ }
+ &reload_html($whisper);
+ exit;
+#############>- RAUM EIN THEMA GEBEN -<
+ } elsif ($cmd eq "t") {
+ &prove_besetzer($alias,$room);
+ &hirachie($alias);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ my $theme;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $theme = $theme." ".$cmd[$i];
+ }
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias gibt dem Raum das Thema <font color=red>( $theme )</font> ...</font></i>");
+ $theme = $r_stat[0].$theme."\n";
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $theme = $theme.$r_stat[$i];
+ }
+ write_file_new("data/online/rstat/$room");
+ print DATEI $theme;
+ close DATEI;
+ }
+ &reload_html($whisper);
+ exit;
+#############>- SUPERUSER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- ALIAS VERBANNEN BZW. ENTBANNEN -<
+ } elsif ($cmd eq "ban" || $cmd eq "rban") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ my ($alias2handle,$registriert) = $cmd[1];
+ &list_dir("data/user/options");
+ foreach(@dir) {
+ $registriert = "true" if ($_ eq $alias2handle);
+ }
+ if ($registriert ne "true") {
+ if ($cmd eq "ban") {
+ if ($alias2handle ne "") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> existiert nicht in der Benutzerdatenbank und kann so nich verbannt werden !</font></font>");
+ } else {
+ &read_file("data/ban");
+ my @banned = <DATEI>;
+ my ($benutzer);
+ my $nr = $#banned+1;
+ close DATEI;
+ foreach(@banned) {
+ $benutzer = $benutzer." ".$_;
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>Folgende Benutzer sind verbannt [$nr]: <font color=ffa500>$benutzer</font></font>");
+ }
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> existiert nicht in der Benutzerdatenbank und kann so nicht \"entbannt\" werden !</font></font>");
+ }
+ &reload_html($whisper);
+ exit;
+ }
+ &read_file("data/ban");
+ my @banlist = <DATEI>;
+ close DATEI;
+ foreach(@banlist) {
+ if ($_ eq "$alias2handle\n") {
+ if ($cmd eq "ban") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> ist bereits verbannt worden !</font></font>");
+ } else {
+ my $banned = "false";
+ foreach(@banlist) {
+ $banned = "true" if ($_ eq "$alias2handle\n");
+ }
+ if ($banned eq "true") {
+ my @newbanlist;
+ foreach(@banlist) {
+ push @newbanlist,$_ if ($_ ne "$alias2handle\n");
+ }
+ &write_file_new("data/ban");
+ print DATEI @newbanlist;
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> wurde soeben \"entbannt\" !</font></font>");
+ }
+ }
+ &reload_html($whisper);
+ exit;
+ }
+ }
+ if ($cmd eq "ban") {
+ &hirachie($alias2handle);
+ if ($hirachie ne "ow") {
+ &write_file("data/ban");
+ print DATEI "$alias2handle\n";
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> wurde soeben verbannt und kann sich nun nichtmehr in den Chat einloggen !</font>");
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> ist ein Oberwächter und kann deshalb nicht verbannt werden !</font></font>");
+ }
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> konnte nicht \"entbannt\" werden, da <font color=ffa500>$alias2handle</font> garnicht verbannt war !</font></font>");
+ }
+ }
+ &reload_html($whisper);
+ exit;
+#############>- IP # VON ALIAS ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "ip") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ my $alias2prove = $cmd[1];
+ &list_dir("data/online/ident");
+ foreach(@dir) {
+ if ($_ eq $alias2prove) {
+ &read_file("data/online/ident/$_");
+ local $ipnr = <DATEI>;
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$_ <font color=ffffff>hat die IP-Nummer $ipnr !</font></font>");
+ }
+ }
+ }
+ &reload_html($whisper);
+ exit;
+#############>- ALIAS AUS DEM CHAT KATAPULTIEREN -<
+ } elsif ($cmd eq "k") {
+ &hirachie($alias);
+ if ($hirachie eq "wa" || $hirachie eq "ow") {
+ my $alias2kick = $cmd[1];
+ &list_dir("data/online/rooms");
+ foreach $raum (@dir) {
+ &list_dir("data/online/rooms/$raum",2);
+ foreach $chatter (@dir2) {
+ if ($chatter eq $alias2kick) {
+ &hirachie($alias2kick);
+ if ($hirachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist Oberwächter und kann nicht \"gekickt\" werden !</font></font>");
+ } elsif ($hirachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist Wächter und kann nicht \"gekickt\" werden !</font></font>");
+ } else {
+ &post_prv("$alias2kick","<script language=\"JavaScript\">window.open(\"index.pl?tmp=kick\",\"_top\");</script>");
+ &zeit;
+ $_ = undef if ($room eq $_);
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias katapultiert \"$alias2kick\" aus dem Chat ...</font></i>",$_);
+ &remove_online($alias2kick,$_,"kick");
+ &secure_removeid($alias2kick);
+ }
+ &reload_html($whisper);
+ exit;
+ }
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist nicht anwesend und kann nicht \"gekickt\" werden !</font></font>");
+ }
+ &reload_html($whisper);
+ exit;
+#############>- EINEN BENUTZER AUS DEM SYSTEM LÖSCHEN -<
+ } elsif ($cmd eq "kill") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ my $alias2kill = $cmd[1];
+ &hirachie($alias2kill);
+ if ($hirachie eq "ow") {
+ &post_prv($alias,"<font size color=ffa500>$alias2kill</font> <font color=ffffff>ist Oberwächter und kann nicht aus dem System entfernt werden !</font>");
+ } elsif ($hirachie eq "wa") {
+ &post_prv($alias,"<font size color=ffa500>$alias2kill</font> <font color=ffffff>ist Wächter und kann nicht aus dem System entfernt werden !</font>");
+ } else {
+ unlink("data/user/options/$alias2kill");
+ unlink("data/user/profiles/$alias2kill");
+ unlink("data/user/gbooks/$alias2kill");
+ unlink("data/user/counts/$alias2kill");
+ unlink("data/user/lastlogin/$alias2kill");
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias killt \"$alias2kill\" ganz und gar aus dem System ...</font></i>");
+ }
+ }
+ &reload_html($whisper);
+ exit;
+ #############>- SYSTEMNACHRICHT IN ALLE BESTEHENDEN RÄUME POSTEN -<
+ } elsif ($cmd eq "sys") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $sys_msg = $sys_msg." ".$cmd[$i];
+ }
+ &zeit;
+ &post_all("<i><font color=ffffff>($hours:$min:$sec)</font></i> <b><font size=2 color=red>SYSTEMNACHRICHT</font></b><i><font color=ffffff>: $sys_msg ...</font></i>");
+ }
+ &reload_html($whisper);
+ exit;
+#############>- ALIAS ZUM WÄCHTER ERNNENNEN BZW. ZUM NORMALEN CHATTER DEGRADIEREN -<
+ } elsif ($cmd eq "wa" || $cmd eq "rwa") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ &zeit;
+ my $alias2handle = $cmd[1];
+ if ($cmd eq "wa") {
+ my $anerkennen = "false";
+ &list_dir("data/user/options");
+ foreach(@dir) {
+ if ($_ eq $alias2handle) {
+ $anerkennen = "true";
+ }
+ }
+ if ($anerkennen eq "true") {
+ &hirachie($alias2handle);
+ if ($hirachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff>ist bereits als Wächter eingetragen. Eine erneuerte Eintragung ist nicht möglich!</font></font>");
+ } elsif ($hirachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff>ist schon als Oberwächter eingetragen. Oberwächter können nicht gleichzeitig Wächter sein!</font></font>");
+ } else {
+ &write_file("data/wa");
+ print DATEI $alias2handle."\n";
+ close DATEI;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font><font color=ffa500> $alias ernennt \"$alias2handle\" zum Wächter ...</font></i>");
+ }
+ } else {
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2handle <font color=ffffff>kann nicht zum Wächter ernannt werden da Benutzername nicht existiert!</font></font>");
+ }
+ } elsif ($cmd eq "rwa") {
+ &read_file("data/wa");
+ my @wafile = <DATEI>;
+ close DATEI;
+ my $aberkennen = "false";
+ foreach(@wafile) {
+ if ($_ ne "$alias2handle\n") {
+ push @newafile,$_;
+ } else {
+ $aberkennen = "true";
+ }
+ }
+ &write_file_new("data/wa");
+ print DATEI @newafile;
+ close DATEI;
+ if ($aberkennen eq "true") {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat \"$alias2handle\" vom Wächter zum normalen Chatter degradiert ...</font></i>");
+ } else {
+ &post("<font size=2 color=ffa500>$alias2handle <font color=ffffff>konnte der Wächterstatus nicht aberkannt werden da Benutzer kein Wächter ist!</font></font>");
+ }
+ }
+ }
+#############>- ENDE DER CHATBEFEHLE -<
+}
+&reload_html($whisper,$action);
+}
+
+sub change_room { # Den Chat-Raum wechseln
+ my ($method,$newroom,$oldroom,$alias2follow) = @_;
+ # Überprüfen, ob Alias Raum betreten darf
+ &read_file("data/online/rstat/$newroom");
+ my @rstat = <DATEI>;
+ close DATEI;
+ if ($rstat[0] eq "1\n") {
+ &hirachie($alias);
+ if ($hirachie eq "wa" || $hirachie eq "ow") {
+ } else {
+ &post_prv("$alias","<font size=2 color=ffffff>Der Raum \"<font color=ffa500>$newroom</font>\" ist leider abgesperrt!</font>");
+ &reload_html($id,$action);
+ exit;
+ }
+ }
+ $room = $oldroom;
+ &zeit; # Zeit 'erneuern'
+ if ($method eq "j") {
+ unlink("data/online/rooms/$oldroom/$alias");
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias wechselt in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias kommt aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ &post_prv("$alias","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>Du wechselst aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ } elsif ($method eq "ju") {
+ unlink("data/online/rooms/$oldroom/$alias");
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias folgt \"$alias2follow\" in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias kommt aus dem Raum \"$oldroom\" und folgt \"$alias2follow\" herein nach \"$newroom\" ...</font></i>");
+ &post_prv("$alias","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>Du folgst \"$alias2follow\" aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ }
+ # Sicherheitshalber Alias erneuert entf.
+ unlink("data/online/rooms/$oldroom/$alias");
+ &rm_rstat($oldroom,$alias);
+ &rm_rooms;
+}
+
+sub prove_besetzer { # Prüfen, ob Benutzer Raumbesetzerrechte hat
+ my ($r_alias,$r_room) = @_;
+ $r_besetzer = "false";
+ &read_file("data/online/rstat/$r_room");
+ @r_stat = <DATEI>;
+ close DATEI;
+ for($i=2;$i<=$#r_stat;$i++) {
+ $r_besetzer = "true" if ($r_stat[$i] eq $r_alias || $r_stat[$i] eq $r_alias."\n");
+ }
+} \ No newline at end of file
diff --git a/0.4.0a/main2.pl b/0.4.0a/main2.pl
new file mode 100644
index 0000000..881c776
--- /dev/null
+++ b/0.4.0a/main2.pl
@@ -0,0 +1,576 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+
+if ($var eq "list_alias_html") {
+ &list_alias_html;
+} elsif ($var eq "alias_html") {
+ &alias_html;
+} elsif ($var eq "edit_profile_html") {
+ &edit_html("edit_profile_html");
+} elsif ($var eq "edit_options_html") {
+ &edit_html("edit_options_html");
+} elsif ($var eq "gb_html") {
+ &secure_checkid($alias);
+ &gb_html;
+} elsif ($var eq "post_gb") {
+ &secure_checkid($alias);
+ &post_gb;
+} elsif ($var eq "edit_profile") {
+ &secure_checkid($alias);
+ &edit("edit_profile");
+} elsif ($var eq "edit_options") {
+ &secure_checkid($alias);
+ &edit("edit_options");
+} elsif ($var eq "rm_gb_alias") {
+ &secure_checkid($alias);
+ &rm_gb;
+} else {
+ &error("Parameter fehlt");
+}
+
+###########################
+##HAUPTTEIL DIESER DATEI:##
+###########################
+
+sub gb_html { # Das Benutzerboard/Gästebuch.
+ my $message = $_[0];
+ &start_html("Benutzerboard");
+if ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </i>
+ einen Text und poste
+ <u>dann</u>
+ !
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Vielen Dank für Deinen Beitrag. Wenn Du willst, kannst Du jetzt gleich noch einen Eintrag posten ...
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Falls Du Anregungen oder Verbesserungsvorschläge für die Community hast, dann poste doch einen kleinen Eintrag :-)
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="guestbook">
+ <input type="hidden" name="id" value="y">
+ <input size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+ if (-e "data/guestbook") {
+ open (DATEI,"<data/guestbook") || &error("Konnte dat/guestbook nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ print
+ $q->div(@datei);
+ }
+ print
+ $q->end_html;
+}
+
+
+sub post_gb { # Wenn etwas in ein Gästebuch eingetragen wird
+ &zeit;
+ if ($msg eq "") {
+ if ($id eq "y") { # Überprüfen, ob Benutzerboard- oder Privatgästebuch
+ &gb_html("post_empty");
+ } else {
+ &alias_html("post_empty");
+ }
+ exit;
+ }
+ $msg =~ s#<#&lt\;#g;
+ my $tmpath = "";
+ if ($id eq "y") {
+ $tmpath = "data/guestbook";
+ } else {
+ $tmpath = "data/user/gbooks/$tmp";
+ }
+ if (-e "$tmpath") {
+ &read_file("$tmpath");
+ my @datei = <DATEI>;
+ close DATEI;
+ pop(@datei) if ($#datei > 99);
+ my @newdatei = "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ @newdatei = ("@newdatei", "@datei");
+ &write_file_new("$tmpath");
+ print DATEI @newdatei;
+ close DATEI;
+ } else {
+ &write_file_new("$tmpath");
+ print DATEI "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ close DATEI;
+ }
+ if ($id eq "y") {
+ &gb_html("post_ok");
+ exit;
+ } else {
+ post_prv("$tmp","<font size=2 color=ffffff><a href=\"main2.pl?alias=$alias&var=alias_html&tmp=$tmp&tmpid=$tmpid\" target=\"_new\">$alias</a> hat soeben einen Pin in <a href=\"main2.pl?alias=$alias&var=alias_html&tmp=$tmp&tmpid=$tmpid\" target=\"_new\">Dein Profil</a> gehängt ... </font>");
+ &alias_html;
+ exit;
+ }
+}
+
+sub rm_gb { # Gästebucheintrag entfernen
+ $tmp = $alias;
+ &read_file("data/user/gbooks/$alias");
+ my @gbfile = <DATEI>;
+ close DATEI;
+ my @newgbfile = ();
+ for($i=0; $i <= $#gbfile; $i++) {
+ push(@newgbfile,$gbfile[$i]) if ($i != $id);
+ }
+ &write_file_new("data/user/gbooks/$alias");
+ print DATEI @newgbfile;
+ close DATEI;
+ &alias_html("rm_ok");
+}
+
+sub list_alias_html { # Liste aller Benutzer
+ &start_html("Alle Benutzer");
+ &list_dir("data/user/options");
+ my @liste = sort(@dir);
+ my $nr = $#dir-1;
+print <<END;
+ <div>
+ Es sind z.Z. genau $nr Benutzernamen in der Datenbank vorhanden! (Sortiert nach #, A-Z, a-z)
+ </div>
+ <hr>
+ <div>
+END
+ foreach(@liste) {
+ if (-f "data/user/options/$_") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid" },
+ "$_"),
+ " ";
+ }
+ }
+print <<END;
+ </div>
+</body>
+</html>
+END
+}
+
+sub alias_html { # Anzeigen eines Benutzerprofils
+ my $message = $_[0];
+ local $counter = undef;
+ &read_file("data/user/counts/$tmp");
+ $counter = <DATEI>;
+ close DATEI;
+ $counter++;
+ &write_file_new("data/user/counts/$tmp");
+ print DATEI $counter."\n".$counter[1];
+ close DATEI;
+ &start_html($tmp);
+print <<END;
+<div>
+ <a href="htdocs.pl?var=werda_html&alias=$alias&tmpid=$tmpid">Hier</a>
+ gehts zur Gesamtübersicht !
+</div>
+<hr>
+END
+if ($message eq "rm_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Der von Dir gewählte Eintrag wurde erfolgreich gelöscht.
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </u>
+ einen Text und poste
+ <u>dann</u>
+ !
+ <hr>
+END
+}
+ &read_file("data/user/profiles/$tmp");
+ @data = <DATEI>;
+ close DATEI;
+print <<END;
+ <div>
+ Dieses Profil wurde insgesamt schon $counter mal aufgerufen !
+ <br>
+ <br>
+ Alias: $tmp
+ <br>
+ <br>
+ Nachname: $data[0]
+ <br>
+ <br>
+ Vorname: $data[1]
+ <br>
+ <br>
+ Alter: $data[2]
+ <br>
+ <br>
+ Wohnort: $data[3]
+ <br>
+ <br>
+ E-Mail:
+ <a href="mailto:$data[4]">$data[4]</a>
+ <br>
+ <br>
+ ICQ-Nummer: $data[5]
+ <br>
+ <br>
+ Homepage:
+ <a href="$data[6]" target="_new">$data[6]</a>
+ <br>
+ <br>
+ Weiteres:
+ <br>
+ $data[7]
+ <hr>
+ Hier kannst Du $tmp eine Nachricht hinterlassen!
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input type="text" size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+if (-e "data/user/gbooks/$tmp") {
+ open (DATEI,"<data/user/gbooks/$tmp") || &error("Konnte data/user/gbooks/$tmp nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ if ($alias ne $tmp) {
+ print @datei;
+ } else {
+print <<END;
+ <table>
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="rm_gb_alias">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+END
+for($i=0; $i <= $#datei; $i++) {
+print <<END;
+ <tr>
+ <td>
+ <input type="radio" name="id" value="$i">
+ </td>
+ <td>
+ <div class=q>
+ $datei[$i]
+ </div>
+ </td>
+ </tr>
+END
+}
+print <<END;
+ </table>
+ <table>
+ <tr>
+ <td>
+ <font color=ffffff>
+ <input type="submit" value="Makierten Eintrag löschen">
+ </font>
+ </td>
+ <td>
+ <font color=ffffff>
+ <input type="reset" value="Makierung rückgängig machen">
+ </font>
+ </td>
+ </tr>
+ </table>
+ </form>
+END
+}
+}
+ print
+ $q->end_html;
+}
+
+sub edit_html { # Chat-Optionen / Benutzerprofil editieren
+ my ($method,$message) = @_;
+ &start_html("Benutzerprofil ändern");
+ if ($method eq "edit_options_html") {
+ &read_file("data/user/options/$alias");
+ } elsif ($method eq "edit_profile_html") {
+ &read_file("data/user/profiles/$alias");
+ }
+ @data = <DATEI>;
+ close DATEI;
+ if ($method eq "edit_options_html") {
+ chomp($data[0]);
+ if ($message eq "edit_options_ok") {
+print <<END;
+<script language="JavaScript">
+ open("main.pl?var=input_html&alias=$alias&room=$room&col=$col&secol=$secol&tmpid=$tmpid","input");
+ open("htdocs.pl?var=menu_html&alias=$alias&room=$room&col=$col&secol=$secol&tmpid=$tmpid","menu");
+</script>
+<div class=b>
+ Hinweis:
+</div>
+<div>
+ Du hast soeben Deine Chat-Optionen erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren. Um
+ weiterzuchatten einfach auf <a href="push.pl?alias=$alias&room=$room&tmpid=$tmpid">Weiterchatten</a> klicken.
+</div>
+<hr>
+END
+ } elsif ($message eq "edit_pw_wrong") {
+print <<END;
+<div class=b>
+ ACHTUNG!
+</div>
+<div>
+ Du hast soeben versucht, dein Passwort zu ändern. Jedoch stimmte die Erste Eingabe nicht mit der Zweiten überein.
+ Bitte versuch es erneuert ...
+</div>
+<hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Deine Chat-Optionen editieren!" ),
+ $q->hr;
+ }
+print <<END;
+<form action="main2.pl">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="var" value="edit_options">
+ <div>
+ Dein Passwort
+ <font color=ffa500>
+ (Gut merken !!)
+ </font>
+ <br>
+ <input type="password" name="id" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ Geb hier das Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ "Deine Farbe (Farbe Deines Nicks):
+ <br>
+ <select NAME="col" size="1">
+ <option selected value="$col">($data[1])</option>
+ <option value="0000FF">Blau (1)</option>
+ <option value="008000">Grün</option>
+ <option value="000000">Schwarz</option>
+ <option value="808000">Oliv</option>
+ <option value="000080">Marineblau</option>
+ <option value="800080">Purpur</option>
+ <option value="808080">Braun</option>
+ <option value="FF00FF">Fuchsia</option>
+ <option value="008080">Stahlblau</option>
+ <option value="333333">Mittelschwarz</option>
+ <option value="003399">BärBlau</option>
+ <option value="0066CC">Blau (2)</option>
+ <option value="009933">Grün</option>
+ <option value="006666">Oliv</option>
+ <option value="FF0000">VollRot</option>
+ <option value="CC0000">RostRot</option>
+ <option value="990099">Lila</option>
+ <option value="FF00FF">Pink</option>
+ <option value="FF9900">Orange</option>
+ <option value="CC6600">Ocker</option>
+ <option value="996600">Braun</option>
+ <option value="666666">Grau</option>
+ <option value="0A6307">Dunkelgrün</option>
+ <option value="9C1B7C">Dunkellila</option>
+ <option value="3D0DB9">Dunkelblau</option>
+ <option value="8FA5ED">Hellblau</option>
+ <option value="FFFF00">Gelb</option>
+ <option value="3D4863">?????</option>
+ </select>
+ </div>
+ <br>
+ <div>
+ Deine zweite Farbe (Farbe Deiner Nachrichten):
+ <br>
+ <select NAME="secol" size="1">
+ <option selected value="$col">($data[2])</option>
+ <option value="0000FF">Blau (1)</option>
+ <option value="008000">Grün</option>
+ <option value="000000">Schwarz</option>
+ <option value="808000">Oliv</option>
+ <option value="000080">Marineblau</option>
+ <option value="800080">Purpur</option>
+ <option value="808080">Braun</option>
+ <option value="FF00FF">Fuchsia</option>
+ <option value="008080">Stahlblau</option>
+ <option value="333333">Mittelschwarz</option>
+ <option value="003399">BärBlau</option>
+ <option value="0066CC">Blau (2)</option>
+ <option value="009933">Grün</option>
+ <option value="006666">Oliv</option>
+ <option value="FF0000">VollRot</option>
+ <option value="CC0000">RostRot</option>
+ <option value="990099">Lila</option>
+ <option value="FF00FF">Pink</option>
+ <option value="FF9900">Orange</option>
+ <option value="CC6600">Ocker</option>
+ <option value="996600">Braun</option>
+ <option value="666666">Grau</option>
+ <option value="0A6307">Dunkelgrün</option>
+ <option value="9C1B7C">Dunkellila</option>
+ <option value="3D0DB9">Dunkelblau</option>
+ <option value="8FA5ED">Hellblau</option>
+ <option value="FFFF00">Gelb</option>
+ <option value="3D4863">?????</option>
+ </select>
+ </div>
+ <br>
+END
+ } elsif ($method eq "edit_profile_html") {
+ if ($message eq "edit_profile_ok") {
+print <<END;
+ <div class=b>
+ Hinweis:
+ </div>
+ <div>
+ Du hast soeben Dein Profil erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren:
+ <hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Dein Profil editieren!" ),
+ $q->hr;
+ }
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="var" value="edit_profile">
+ <div>
+ Dein Nachname:
+ <br>
+ <input name="nachname" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ Dein Vorname:
+ <br>
+ <input name="vorname" value="$data[1]">
+ </div>
+ <br>
+ <div>
+ Dein Alter:
+ <br>
+ <input name="alter" value="$data[2]">
+ </div>
+ <br>
+ <div>
+ Dein Wohnort:
+ <br>
+ <input name="wohnort" value="$data[3]">
+ </div>
+ <br>
+ <div>
+ Deine E-Mail Adresse:
+ <br>
+ <input name="email" value="$data[4]">
+ </div>
+ <br>
+ <div>
+ Deine ICQ-Nummer:
+ <br>
+ <input name="icq" value="$data[5]">
+ </div>
+ <br>
+ <div>
+ Deine Homepage:
+ <br>
+ <input name="homepage" value="$data[6]">
+ </div>
+ <br>
+ <div>
+ Weiteres:
+ <br>
+ <textarea rows="5" cols="40"name="weiteres" wrap="virtual">$data[7]</textarea>
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <font color=ffffff>
+ <input type="submit" value="Daten ändern ...">
+ </font>
+ </form>
+</body>
+</html>
+END
+}
+
+
+sub edit { # Benutzerprofil od. Chat-Optionen abspeichern
+ my $method = $_[0];
+ if ($method eq "edit_profile") {
+ &write_file_new("data/user/profiles/$alias");
+ print DATEI $q->param('nachname')."\n".$q->param('vorname')."\n".$q->param('alter')."\n".$q->param('wohnort')."\n".$q->param('email')."\n".$q->param('icq')."\n".$q->param('homepage')."\n".$q->param('weiteres');
+ close DATEI;
+ &edit_html("edit_profile_html","edit_profile_ok");
+ } elsif ($method eq "edit_options") {
+ if ($id ne $tmp) {
+ &edit_html("edit_options_html","edit_pw_wrong");
+ exit;
+ }
+ &write_file_new("data/user/options/$alias");
+ print DATEI $id."\n".$col."\n".$secol;
+ close DATEI;
+ &edit_html("edit_options_html","edit_options_ok");
+ }
+}
diff --git a/0.4.0a/online.pl b/0.4.0a/online.pl
new file mode 100644
index 0000000..e8e9f40
--- /dev/null
+++ b/0.4.0a/online.pl
@@ -0,0 +1,72 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+&secure_checkid($alias);
+
+# Onlinezeit zählen !
+&read_file("data/online/users/$alias");
+ my $oldstamp = <DATEI>;
+close DATEI;
+ if ($oldstamp > (time - 60)) {
+ &read_file("data/user/counts/$alias.online");
+ my $online = <DATEI>;
+ close DATEI;
+ my $total = (time-$oldstamp+$online);
+ &write_file_new("data/user/counts/$alias.online");
+ print DATEI $total;
+ close DATEI;
+ }
+##### ENDE
+
+&start_html("Online","online");
+&online($alias,$room);
+&list_dir("data/online/rooms/".$room);
+print
+ $q->div( "$room:" ),
+ "<font size=1 color=ffffef face=arial>";
+ foreach $online (@dir) {
+ if (-f "data/online/rooms/$room/$online") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$online&tmpid=$tmpid",
+ -target=>"$online" }, "$online"), $q->br;
+ }
+ }
+print
+ "</font>",
+ $q->end_html;
+
+sub online { # Benutzer in die Onlineliste hinzufügen bzw. erneuern
+ my ($alias,$room) = @_;
+ &write_file_new("data/online/users/$alias");
+ print DATEI time;
+ close DATEI;
+ if (-e "data/online/rooms/$room") { # Falls Raum nicht existiert anlegen
+ } else {
+ &write_file_new("data/online/rstat/$room"); # Raumbesetzerstatus setzen
+ print DATEI "0\n\n$alias\n";
+ close DATEI;
+ mkdir "data/online/rooms/$room", 0777;
+ }
+ &write_file_new("data/online/rooms/$room/$alias");
+ print DATEI time;
+ close DATEI;
+ &read_file("data/online/prove"); # Räume und Chatter auf Existenz überprüfen
+ my $provetime = <DATEI>;
+ close DATEI;
+ if ($provetime < (time - 30)) {
+ &write_file_new("data/online/prove");
+ print DATEI time;
+ close DATEI;
+ &rm_alias("data/online/users");
+ &rm_rooms;
+ }
+} \ No newline at end of file
diff --git a/0.4.0a/push.pl b/0.4.0a/push.pl
new file mode 100644
index 0000000..5ae82c5
--- /dev/null
+++ b/0.4.0a/push.pl
@@ -0,0 +1,97 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+CGI->compile(':all');
+$q = new CGI;
+
+$| = 1; # Cache von Perl ausschalten
+
+print
+ $q->header; # HTML-Header erzeugen
+
+require config;
+
+&secure_checkid($alias);
+
+########################################
+##ANFANG DER ZU STREAMENDEN HTML-DATEI##
+########################################
+
+print <<END;
+<html>
+ <head>
+<script language="JavaScript">
+<!--
+// Scroll-Routine von Anklepper (http://www.anklepper.de)
+// speziell für yChat (http://www.yChat.de), Copyright 2000
+scrolling = true;
+moves_steps = 4; // Schrittgröße
+moves_interval = 4; // Schrittgeschwindigkeit
+
+function moves()
+{
+ if( scrolling != false )
+ window.scrollBy( 0, moves_steps );
+ window.setTimeout( "moves()", moves_interval );
+}
+
+moves();
+//-->
+</script>
+ </head>
+<body bgcolor=000000 link=FFFFFF alink=FFFFEF vlink=FFFFEF>
+END
+
+#############################
+##BEGRÜSSUNGSTEXT SCHREIBEN##
+#############################
+
+my $msgfile;
+
+ print
+ $q->font( { -size=>1,
+ -color=>"ffffff",
+ -face=>"arial"},
+ "$title - Created & Copyright by Paul C. Bütow $tmp\n");
+
+ if (-f "data/user/memos/$alias") { # Nach Memonachrichten checken!
+ print "\n<br>";
+ &read_file("data/user/memos/$alias");
+ my $memos = <DATEI>;
+ close DATEI;
+ print $memos;
+ unlink("data/user/memos/$alias");
+ }
+ my $msgfile = "data/msgs/$alias";
+ &write_file_new($msgfile);
+ print DATEI $q->br;
+ close DATEI;
+ print $q->br;
+ open (MSGFILE, $msgfile);
+
+###############################
+##ENDLOSSCHLEIFE FÜR DEN PUSH##
+###############################
+
+my ($times,$online) = (0,"false");
+for (;;) {
+ for ($curpos = tell(MSGFILE); <MSGFILE>; $curpos = tell(MSGFILE)) {
+ print $_ ;
+ }
+ $times++;
+ if ($times > 14) { # Nach 15 Sekunden
+ print "\n<!--PING//-->"; # Ping zum Browser senden
+ $times = 0; # Sekundenzahl auf 0 zurücksetzen
+ $online = "true" if (-e "data/online/users/$alias");
+ if ($online eq "false") {
+ print "<font size=2 color=red>Aus technischen Gründen bitte auf <a href=\"push.pl?alias=$alias&room=$room&var=clear_screen&tmpid=$tmpid\">Weiterchatten</a> klicken.</font>";
+ exit;
+ }
+ $online = "false"
+ }
+ sleep 1;
+ seek(MSGFILE, $curpos, 0); # Position wiederherstellen
+}
+
diff --git a/0.4.0a/setup.sh b/0.4.0a/setup.sh
new file mode 100644
index 0000000..d076ded
--- /dev/null
+++ b/0.4.0a/setup.sh
@@ -0,0 +1,42 @@
+#!/bin/sh
+mkdir data
+mkdir data/logs
+chmod 777 data/logs
+mkdir data/msgs
+chmod 777 data/msgs
+mkdir data/user
+chmod 777 data/user
+mkdir data/user/counts
+chmod 777 data/user/counts
+mkdir data/user/memos
+chmod 777 data/user/memos
+mkdir data/user/options
+chmod 777 data/user/options
+mkdir data/user/profiles
+chmod 777 data/user/profiles
+mkdir data/user/gbooks
+chmod 777 data/user/gbooks
+mkdir data/user/lastlogin
+chmod 777 data/user/lastlogin
+mkdir data/online
+chmod 777 data/online
+mkdir data/online/rooms
+chmod 777 data/online/rooms
+mkdir data/online/rstat
+chmod 777 data/online/rstat
+mkdir data/online/users
+chmod 777 data/online/users
+mkdir data/online/ident
+chmod 777 data/online/ident
+chmod 777 data/htdocs/*
+chmod 777 *
+mkdir dokus/
+mv *.txt dokus/
+mkdir ../../htdocs/yChat/
+mv *.gif ../../htdocs/yChat/
+mv *.jpg ../../htdocs/yChat/
+echo
+echo yChat Setup beendet ...
+echo Created and copyrighted by Paul C. Bütow aka Snooper
+echo
+
diff --git a/0.4.0a/yBanner.gif b/0.4.0a/yBanner.gif
new file mode 100644
index 0000000..e4b691e
--- /dev/null
+++ b/0.4.0a/yBanner.gif
Binary files differ
diff --git a/0.4.0a/yBanner2.gif b/0.4.0a/yBanner2.gif
new file mode 100644
index 0000000..0e9684e
--- /dev/null
+++ b/0.4.0a/yBanner2.gif
Binary files differ
diff --git a/0.4.0a/yChat.jpg b/0.4.0a/yChat.jpg
new file mode 100644
index 0000000..61eabfb
--- /dev/null
+++ b/0.4.0a/yChat.jpg
Binary files differ
diff --git a/0.4.1/INSTALL.txt b/0.4.1/INSTALL.txt
new file mode 100644
index 0000000..31a302a
--- /dev/null
+++ b/0.4.1/INSTALL.txt
@@ -0,0 +1,107 @@
+#############################################################################
+## yChat.de Version 0.4.0 by CXG.de: The chatters of the next generation ##
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+yChat findest Du im Internet unter der Adresse www.yChat.de. Bei Kritik,
+Anregungen oder Fragen bitte in das dort vorhandene Board posten oder eine
+E-Mail an die oben stehende Adresse senden. Ich bemühe mich, yChat so gut wie
+möglich zu machen und bin über Ratschläge immer sehr erfreut :-) ...
+
+Die Installation kann auf Unix-Systemen voll automatisch duchgeführt werden.
+Allerdings ist dafür ein Telnet-Zugang notwendig. Kopiere alle vorhandenen
+Dateien in das Verzeichnis cgi-bin/yChat und führe dann das Shellskript
+setup.sh mit dem Befehl ./setup.sh aus. Alle Verzeichnisse werden
+automatisch erstellt. Dies wurde allerdings nur auf SuSE Linux Systemen
+mit root-Zugriff getestet. Solltest Du ein anderes System verwenden oder
+den Chat auf einen virtuellen Webserver installieren wollen, dann mußt Du
+unter umständen das Verzeichnis "../../htdocs/yChat" nach "../../yChat"
+in der setup.sh umbenennen. Ansonsten werden die dazugehörigen Grafikdateien
+falsch oder garnicht kopiert.
+
+Wenn Du keinen Telnet-Zugang hast, kannst Du hier die Verzeichnisse manuell
+erstellen:
+
+Folgende Basis-Dateien sind im Chat enthalten und müssen in das cgi-bin
+Verzeichnis kopiert werden. Z.B. nach ./cgi-bin/yChat/:
+
+config.pm => Configurationsdatei ("Shared subs")
+htdocs.pl => HTML-Dokumentdateien (Nicht unbedingt erforderlich)
+index.pl => Startskript (Registrierung, Frameset, Login, Daten edit.)
+main.pl => Hauptskript (Alle Hauptfunktionen des Chats)
+main2.pl => Skript für editieren der Benutzerdaten etc.
+online.pl => Anzeige und Überprüfung der eingelogten Benutzer
+push.pl => Server-Push-Routine
+setup.sh => Dient zur automatischen Einrichtung des Chats.
+LIESMICH.txt => Beinhaltet wichtige Informationen
+UPDATES.txt => Updateliste der verschiedenen Versionen
+INSTALL.txt => Dieses Dokument
+colors.txt => Datei beinhaltet alle Farben in hex. für die Chatoptionen
+help.sno => Datei beinhaltet alle Chatbefehle
+
+Folgende Verzeichnisse müssen erstellt werden (chmod 777 sollte
+funktionieren):
+
+- Hier befinden sich alle für den Chat notwenidgen Daten:
+ ./cgi-bin/yChat/data/*
+
+- Hier befinden sich alle Logdateien, die vom Chat erstellt werden:
+ ./cgi-bin/yChat/data/logs/*
+
+- Hier befinden sich die Message-Dateien der eingelogten Benutzer:
+ ./cgi-bin/yChat/data/msgs/*
+
+- Hier befinden sich alle Daten der registrierten Benutzer:
+ ./cgi-bin/yChat/data/user/*
+
+- Hier wird abgespeichert, wie oft ein Benutzerprofil insgesant schon
+ aufgerufen wurde und wie lange die Chatter schon online waren:
+ ./cgi-bin/yChat/data/user/counts/*
+
+- Hier werden alle Memos abgespeichert.
+ ./cgi-bin/yChat/data/user/memos/*
+
+- Hier befinden sich alle Chat-Optionen und Passwörter der registrierten
+ Benutzer:
+ ./cgi-bin/yChat/data/user/options/*
+
+- Hier befinden sich alle Benutzerprofile der Benutzer:
+ ./cgi-bin/yChat/data/user/profiles/*
+
+- Hier befinden sich alle Gästebucheinträge der Benutzer:
+ ./cgi-bin/yChat/data/user/gbooks/*
+
+- Hier wird abgespeichert, wann der der jew. benutzer zum letzten mal das System
+ betreten hat.
+ ./cgi-bin/yChat/data/user/lastlogin/*
+
+- Hier befinden sich alle Daten zu den aktuellen Chaträumen und User die online sind
+ ./cgi-bin/yChat/data/online/*
+
+- Hier befinden sich alle offnenen Räume
+ ./cgi-bin/yChat/data/online/rooms/*
+
+- Hier befinden sich die Chatter, die sich in den jew. Räumen befinden. Die
+ Verzeichnisse der Räume werden automatisch erstellt.
+ ./cgi-bin/yChat/data/online/rooms/RAUMNAME/*
+
+- Hier befinden sich alle Chatter, die sich z.Z. im System befinden
+ ./cgi-bin/yChat/data/online/users/*
+
+- Hier befinden sich alle IP-Nummern und TempIDs der eingelogten Chatter
+ ./cgi-bin/yChat/data/online/ident/*
+
+Folgende GRafikdateien sollten in ein nicht-CGI-BIN-Verzeichnis kopiert werden. Z.B.
+nach ./yChat/
+
+ bar.gif => Der gelb gestreifte Rand auf den meisten Seiten
+ yChat.gif => Das yChat-Logo auf der Startseite
+ yBanner.gif => 400x40 yChat-Banner
+ yBanner2.gif => 88x31 yChat-Banner
+
+Zum schluß sollte die config.pm-Datei nach wünschen editiert werden. Allerdings sollten
+die Copyright Hinweise und die Versionsnummern nicht manipuliert werden.
+
+Folgende Dateien werden von yChat automatisch erstellt:
+
+Viel Spaß beim Chatten ...
+ Snooper \ No newline at end of file
diff --git a/0.4.1/LIESMICH.txt b/0.4.1/LIESMICH.txt
new file mode 100644
index 0000000..97c7f1b
--- /dev/null
+++ b/0.4.1/LIESMICH.txt
@@ -0,0 +1,45 @@
+#############################################################################
+## yChat.de Version 0.4.0 by CXG.de: The chatters of the next generation ##
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+Allgemeine Bedingungen bezgl. yChat:
+
+ - Das yChat-System darf ohne Erleubnis des Autors nicht auf irgendeiner Art
+ und Weise weitergegeben- oder eingesetzt werden.
+
+ - Wird das yChat-System eingesetzt, so darf es manipuliert werden, soweit
+ die Copyright-Hinweise des Autors, die Versionsbezeichnung und der Link
+ auf der Startseite nach servers.yChat.de unverändert bleibt.
+ Ansonsten darf der gesamte Code manipuliert werden.
+
+ - Wird das yChat-System erlaubter Weise manipuliert, so muß das veränderte
+ Skript auf Anforderung an den Autor weitergegeben werden. Dieser darf
+ die Veränderungen in das Standard-yChat-System integrieren.
+
+ - Wird das yChat-System eingesetzt, su muß dem Autor die Location bzw. die
+ URL bekanntgegeben werden. Diese wird in servers.yChat.de eingetragen.
+ und mit einer URL wwX.yChat.de verlinkt. Wobei X für die Nummer des jew.
+ Servers steht.
+
+ - Es ist verboten, Sourcecode aus dem yChat-System zu kopieren und
+ für andere, nicht von yChat abhängige Perl-Programme einzusetzen.
+
+Im Flogenden einige yChat-bezügl. Verknüpfungen:
+
+ www.servers.yChat.de => Liste aller laufenden yChat-Systeme
+ www.install.yChat.de => Installationsdokumentation
+ www.liesmich.yChat.de => Allgemeine Bedingungen usw.
+ www.todo.yChat.de => Funktionen, die später integriert werden
+ www.updates.yChat.de => Update-Liste
+ www.yChat.de => Das Skript zum testen
+
+Vielen Dank an:
+
+ - Andreas Buchwald für die Programmierung des "Nach-UntenScroll-JavaScripts"
+ (www.anklepper.de).
+
+ - Michi aka Snoopy für die Erstellung und Anregung der Farbtabelle
+ (www.berlin-singeltreff.de).
+
+ - Peacemaker für die Erstellung des yChat-Logos
+ (www.peaceplace.de).
diff --git a/0.4.1/TODO.txt b/0.4.1/TODO.txt
new file mode 100644
index 0000000..59d9e3e
--- /dev/null
+++ b/0.4.1/TODO.txt
@@ -0,0 +1,24 @@
+Folgende Funktionen werden demnächst in yChat integriert:
+
+ - Die Schlucht (Ein Raum wo Chatter hineingeworfen werden,
+ die sich nicht benehmen und noch nicht aus dem Chat
+ katapultiert werden sollen).
+
+ - Löschung aller Chatter, die sich seit 60 Tagen nicht mehr
+ eingelogt haben.
+
+ - IP-Adressen ver-/entbannen.
+
+ - E-Mail zusendung bei verlorenem Passwort.
+
+ - Eine Top 20 (Onlinezeit) der Chatter
+
+ - Unter "Benutzer" sollen Chatter über eine Eingabemaske nach
+ dem Anfangsbuchstaben gesucht werden können (vergl. Kilahu).
+
+ - Der Cybarkeeper (künstlich intilligenter Chatroboter, der
+ sich im Hauptraum Cyberbar aufhält, virtuelle Drinks verteilt
+ und von Real-Chattern übernommen werden kann. (Zukunftsmusik)
+
+Für weitere Vorschläge bitte in das yChat-Board unter www.yChat.de
+texten oder eine E-Mail an paul@buetow.oxg.de :-) \ No newline at end of file
diff --git a/0.4.1/UPDATES.txt b/0.4.1/UPDATES.txt
new file mode 100644
index 0000000..84336fc
--- /dev/null
+++ b/0.4.1/UPDATES.txt
@@ -0,0 +1,111 @@
+########################### yChat.de UPDATE LIST ###########################
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+Hier sind alle Erneuerungen der Versionen dokumentiert:
+
+Update von 0.4.0 auf 0.4.1 (22.12.2k)
+ - Design wurde geändert.
+ - Unter "Optionen" ist nun eine komplette Farbtabelle eingebaut.
+ Es wurde dafür die Seperate Datei "colors.txt" angelegt. Diese
+ enthält alle in den Chatoptionen zur verfügungstehenden Farben.
+ Vielen Dank an Dave aka Truhe :-)
+ - Folgende Oberwächterbefehle wurden nun auch für normale Wächter
+ freigegeben: /ip /ban /rban
+
+Update von 0.2.6 auf 0.4.0 (19.12.2k)
+ - Der berüchtigte "IP-Bug" wurde beseitigt! Und zwar wurden TempIDs
+ eingeführt => Eine dauerhafte Überprüfung der Benutzer-IP-Nummer
+ ist also nicht mehr notwendig.
+ - Die totale Chat-Online-Zeit wird protokolliert und kann jew. mit
+ "/online Alias" aufgerufen werden. Die Onlinezeit wird alle 20 Sek.
+ aktualisiert.
+ - Neue Befehle: "/seen Alias" zeigt an, vor wieviel St. sich Alias
+ zuletzt in das System eingelogt hat. Der Befehle "/rmgb" entfernt
+ alle Einträge des eigenen Benutzergästebuchs im Profil.
+
+Update von 0.2.5 auf 0.2.6 (17.12.2k)
+ - Das Eingabeframe reloaded sich nicht mehr nach jedem Posting.
+ Vielen Dank an Truhe aka Dave und Klepper aka Andreas Buchwald!
+ Bei den Chatbefehlen /col /away /j und /ju muß sich das
+ Eingabeframe weiterhin reloaden.
+ - Der Befehl // wurde entfernt. Dieser war nicht mehr erforderlich.
+ weil Nachrichten werden nur noch sehr selten verschluckt. Dieser
+ Chatbefehl postete die letzte Nachricht nocheinmal.
+ - Neuer Befehl: mit "/memo Alias hier der Text" hinterläßt man
+ Alias eine Memo. Logt sich Alias in den Chat ein, dann erhält
+ er diese sofort. Dafür wurde das Verzeichnis ".data/user/memos/"
+ angelegt.
+ - Programmcode wurde ein wenig optimiert.
+ - Das Design wurde ein wenig geändert.
+ - Beseitigung diverser Bugs.
+
+Update von 0.2.4 auf 0.2.5 (15.12.2k)
+ - Derjenige, der einen Raum zuerst betritt, hat Raumbesetzerrechte.
+ - Raumbesetzer, Wächter und Oberwächte können weitere Raumbesetzer
+ bestimmen. Diese können Raumbeseter auch wieder degradieren.
+ - Raumbesetzer, Wächter und Oberwächter können dem aktuellen Raum
+ auf/absperren und Themen geben. Wächter und Oberwächter können
+ abgesperrte Räume betreten.
+ - Das Verzeichnis ".data/htdocs" wurde entfernt. Die Datei help_html
+ heist nun help.sno und befindet sich im yChat-Hauptverzeichnis.
+ - Das Verzeichnis ".data/user/lastlogin" wurde hinzugefügt. Hier
+ wird beim erfolgreichen Einloggen ein "Timestamp" gesetzt. Später
+ sollen Oberwächter "veraltete" Benutzer entfernen können.
+ - Neuer Oberwächterbefehl: "/kill Alias" entfernt Alias ganz und gar
+ vom System. Oberwächter und Wächter können nicht entfernt werden.
+ - Perl-Cache wurde im gesamten System komplett deaktiviert ( Weniger
+ Ladezeiten der HTML-Dokumente ).
+ - Nur Nachrichten aus dem Raum "Cyberbar" werden gelogt.
+ Selbsterstellte Räume werden nichtmehr gelogt. Viele Logfunktionen
+ wurden entfernt (weniger Serverbalast).
+ - Beseitigung einiger kleinen Bugs.
+ - Unter "Optionen" im Chat wir die Farbe nun mit einem Drop-Down-Menü
+ ausgewählt ( Vielen dank an Michi aka Snoopy ).
+ - Auf der Startseite wird nun angezeigt wieviele Benutzer eingelogt
+ sind. Ist keiner eingelogt, dann wird das System "aufgeräumt". D.h.
+ Dateien die nicht mehr gebraucht werden und noch nicht gelöscht
+ wurden werden entfernt ( z.B. Nachrichtendateien der einzelnen
+ Chatter und die Dateien die die IP-Nummern der eingelogten Benutzer
+ beinhalteten usw.).
+ - Hunzufügung einer TODO-Liste. Hier sind mehrere Funktionen
+ vermerkt, die in späteren yChat-Versionen eingebaut werden sollen.
+ (www.todo.yChat.de oder TODO.txt).
+
+Update von 0.2.3 auf 0.2.4 (30.11.2k)
+ - Optimierung bzw. Verbesserung der Push-Routine push.pl.
+ - Server-Ping wurde von 2-Pings-per-Minute auf 4 erhöht.
+ - yChat-Banner wurde erstellt und ist unter
+ documents.yChat.de/yBanner.jpg vorzufinden.
+ - Unter der URL servers.yChat.de wurde eine Serverliste angelegt,
+ welche anzeigt wo yChat-Systeme laufen.
+ - Des weiteren wurden die URLs updates.yChat.de, install.yChat.de
+ und liesmich.yChat.de eingerichtet.
+ - Die Menüpunkte wurden zusammengefaßt, damit sie unter einer
+ Auflösung von 800x600 nur eine Zeile belegen.
+ - Einige Bugs wurden entfernt.
+
+Update von 0.2.2 auf 0.2.3 (25.11.2k)
+ - Smooth scrolling JavaScript ( Vielen Dank an Andreas Buchwald ).
+ - "IP#-Fehler" wurde so gut wie beseitigt.
+ - Aufrufe der einzelnen Benutzerprofile wird gezählt und angezeigt.
+ Diese werden in data/user/counts/* gespeichert.
+ - Automatische Einrichtung des Chats mit setup.sh und Telnet.
+ - Menüpunkt "Dein Profil" wurde entfernt da eigenes Profil auch
+ stets über die Onlineliste aufgerufen werden kann.
+
+Update von 0.2.1 auf 0.2.2 (23.11.2k)
+ - Einige Bugs wurden entfernt.
+ - Geschwindigkeit des Chats wurde optimiert.
+ - Eine Liste aller eingelogten Benutzer erscheint am Rand. Hierfür
+ wurde die Datei online.pl eingeführt. Sie aktuallisiert sich alle
+ 20 Sekunden.
+ - Die UPDATES.txt wurde eingeführt.
+
+Update von 0.2.0 auf 0.2.1
+ - Einige Bugs wurden entfernt.
+ - Die IP# der eingelogten Benutzer werden nun anders verwaltet.
+
+Update von Alpha XVIII auf 0.2.0
+ - Die Handhabung der eingelogten Benutzer im System wurde komplett neu
+ überarbeitet.
+ - Neue Versionsnumern wurden eingeführt. \ No newline at end of file
diff --git a/0.4.1/bar.gif b/0.4.1/bar.gif
new file mode 100644
index 0000000..61d02b7
--- /dev/null
+++ b/0.4.1/bar.gif
Binary files differ
diff --git a/0.4.1/colors.sno b/0.4.1/colors.sno
new file mode 100644
index 0000000..3640b9e
--- /dev/null
+++ b/0.4.1/colors.sno
@@ -0,0 +1,290 @@
+ <table cellspacing=0 cellpadding=5 border=0>
+ <tr>
+ <td bgcolor="000000"><span style="color:#FFFFFF; text-decoration:line-through;">000000</span></td>
+ <td bgcolor="000033"><span style="color:#FFFFFF; text-decoration:line-through;">000033</span></td>
+ <td bgcolor="000066"><span style="color:#FFFFFF; text-decoration:line-through;">000066</span></td>
+ <td bgcolor="000099"><span style="color:#FFFFFF; text-decoration:line-through;">000099</span></td>
+ <td bgcolor="0000CC"><span style="color:#FFFFFF; text-decoration:line-through;">0000CC</span></td>
+ <td bgcolor="0000FF"><a href="javascript:insertcode('0000FF');" style="color:#FFFFFF;">0000FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="003300"><span style="color:#FFFFFF; text-decoration:line-through;">003300</span></td>
+ <td bgcolor="003333"><span style="color:#FFFFFF; text-decoration:line-through;">003333</span></td>
+ <td bgcolor="003366"><span style="color:#FFFFFF; text-decoration:line-through;">003366</span></td>
+ <td bgcolor="003399"><a href="javascript:insertcode('003399');" style="color:#FFFFFF;">003399</a></td>
+ <td bgcolor="0033CC"><a href="javascript:insertcode('0033CC');" style="color:#FFFFFF;">0033CC</a></td>
+ <td bgcolor="0033FF"><a href="javascript:insertcode('0033FF');" style="color:#FFFFFF;">0033FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="006600"><span style="color:#FFFFFF; text-decoration:line-through;">006600</span></td>
+ <td bgcolor="006633"><span style="color:#FFFFFF; text-decoration:line-through;">006633</span></td>
+ <td bgcolor="006666"><a href="javascript:insertcode('006666');" style="color:#FFFFFF;">006666</a></td>
+ <td bgcolor="006699"><a href="javascript:insertcode('006699');" style="color:#FFFFFF;">006699</a></td>
+ <td bgcolor="0066CC"><a href="javascript:insertcode('0066CC');" style="color:#FFFFFF;">0066CC</a></td>
+ <td bgcolor="0066FF"><a href="javascript:insertcode('0066FF');" style="color:#FFFFFF;">0066FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="009900"><a href="javascript:insertcode('009900');" style="color:#FFFFFF;">009900</a></td>
+ <td bgcolor="009933"><a href="javascript:insertcode('009933');" style="color:#FFFFFF;">009933</a></td>
+ <td bgcolor="009966"><a href="javascript:insertcode('009966');" style="color:#FFFFFF;">009966</a></td>
+ <td bgcolor="009999"><a href="javascript:insertcode('009999');" style="color:#FFFFFF;">009999</a></td>
+ <td bgcolor="0099CC"><a href="javascript:insertcode('0099CC');" style="color:#FFFFFF;">0099CC</a></td>
+ <td bgcolor="0099FF"><a href="javascript:insertcode('0099FF');" style="color:#FFFFFF;">0099FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00CC00"><a href="javascript:insertcode('00CC00');" style="color:#000000;">00CC00</a></td>
+ <td bgcolor="00CC33"><a href="javascript:insertcode('00CC33');" style="color:#000000;">00CC33</a></td>
+ <td bgcolor="00CC66"><a href="javascript:insertcode('00CC66');" style="color:#000000;">00CC66</a></td>
+ <td bgcolor="00CC99"><a href="javascript:insertcode('00CC99');" style="color:#000000;">00CC99</a></td>
+ <td bgcolor="00CCCC"><a href="javascript:insertcode('00CCCC');" style="color:#000000;">00CCCC</a></td>
+ <td bgcolor="00CCFF"><a href="javascript:insertcode('00CCFF');" style="color:#000000;">00CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00FF00"><a href="javascript:insertcode('00FF00');" style="color:#000000;">00FF00</a></td>
+ <td bgcolor="00FF33"><a href="javascript:insertcode('00FF33');" style="color:#000000;">00FF33</a></td>
+ <td bgcolor="00FF66"><a href="javascript:insertcode('00FF66');" style="color:#000000;">00FF66</a></td>
+ <td bgcolor="00FF99"><a href="javascript:insertcode('00FF99');" style="color:#000000;">00FF99</a></td>
+ <td bgcolor="00FFCC"><a href="javascript:insertcode('00FFCC');" style="color:#000000;">00FFCC</a></td>
+ <td bgcolor="00FFFF"><a href="javascript:insertcode('00FFFF');" style="color:#000000;">00FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="330000"><span style="color:#FFFFFF; text-decoration:line-through;">330000</span></td>
+ <td bgcolor="330033"><span style="color:#FFFFFF; text-decoration:line-through;">330033</span></td>
+ <td bgcolor="330066"><span style="color:#FFFFFF; text-decoration:line-through;">330066</span></td>
+ <td bgcolor="330099"><a href="javascript:insertcode('330099');" style="color:#FFFFFF;">330099</a></td>
+ <td bgcolor="3300CC"><a href="javascript:insertcode('3300CC');" style="color:#FFFFFF;">3300CC</a></td>
+ <td bgcolor="3300FF"><a href="javascript:insertcode('3300FF');" style="color:#FFFFFF;">3300FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="333300"><span style="color:#FFFFFF; text-decoration:line-through;">333300</span></td>
+ <td bgcolor="333333"><span style="color:#FFFFFF; text-decoration:line-through;">333333</span></td>
+ <td bgcolor="333366"><a href="javascript:insertcode('333366');" style="color:#FFFFFF;">333366</a></td>
+ <td bgcolor="333399"><a href="javascript:insertcode('333399');" style="color:#FFFFFF;">333399</a></td>
+ <td bgcolor="3333CC"><a href="javascript:insertcode('3333CC');" style="color:#FFFFFF;">3333CC</a></td>
+ <td bgcolor="3333FF"><a href="javascript:insertcode('3333FF');" style="color:#FFFFFF;">3333FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="336600"><a href="javascript:insertcode('336600');" style="color:#FFFFFF;">336600</a></td>
+ <td bgcolor="336633"><a href="javascript:insertcode('336633');" style="color:#FFFFFF;">336633</a></td>
+ <td bgcolor="336666"><a href="javascript:insertcode('336666');" style="color:#FFFFFF;">336666</a></td>
+ <td bgcolor="336699"><a href="javascript:insertcode('336699');" style="color:#FFFFFF;">336699</a></td>
+ <td bgcolor="3366CC"><a href="javascript:insertcode('3366CC');" style="color:#FFFFFF;">3366CC</a></td>
+ <td bgcolor="3366FF"><a href="javascript:insertcode('3366FF');" style="color:#FFFFFF;">3366FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="339900"><a href="javascript:insertcode('339900');" style="color:#FFFFFF;">339900</a></td>
+ <td bgcolor="339933"><a href="javascript:insertcode('339933');" style="color:#FFFFFF;">339933</a></td>
+ <td bgcolor="339966"><a href="javascript:insertcode('339966');" style="color:#FFFFFF;">339966</a></td>
+ <td bgcolor="339999"><a href="javascript:insertcode('339999');" style="color:#FFFFFF;">339999</a></td>
+ <td bgcolor="3399CC"><a href="javascript:insertcode('3399CC');" style="color:#FFFFFF;">3399CC</a></td>
+ <td bgcolor="3399FF"><a href="javascript:insertcode('3399FF');" style="color:#FFFFFF;">3399FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33CC00"><a href="javascript:insertcode('33CC00');" style="color:#000000;">33CC00</a></td>
+ <td bgcolor="33CC33"><a href="javascript:insertcode('33CC33');" style="color:#000000;">33CC33</a></td>
+ <td bgcolor="33CC66"><a href="javascript:insertcode('33CC66');" style="color:#000000;">33CC66</a></td>
+ <td bgcolor="33CC99"><a href="javascript:insertcode('33CC99');" style="color:#000000;">33CC99</a></td>
+ <td bgcolor="33CCCC"><a href="javascript:insertcode('33CCCC');" style="color:#000000;">33CCCC</a></td>
+ <td bgcolor="33CCFF"><a href="javascript:insertcode('33CCFF');" style="color:#000000;">33CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33FF00"><a href="javascript:insertcode('33FF00');" style="color:#000000;">33FF00</a></td>
+ <td bgcolor="33FF33"><a href="javascript:insertcode('33FF33');" style="color:#000000;">33FF33</a></td>
+ <td bgcolor="33FF66"><a href="javascript:insertcode('33FF66');" style="color:#000000;">33FF66</a></td>
+ <td bgcolor="33FF99"><a href="javascript:insertcode('33FF99');" style="color:#000000;">33FF99</a></td>
+ <td bgcolor="33FFCC"><a href="javascript:insertcode('33FFCC');" style="color:#000000;">33FFCC</a></td>
+ <td bgcolor="33FFFF"><a href="javascript:insertcode('33FFFF');" style="color:#000000;">33FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="660000"><span style="color:#FFFFFF; text-decoration:line-through;">660000</span></td>
+ <td bgcolor="660033"><span style="color:#FFFFFF; text-decoration:line-through;">660033</span></td>
+ <td bgcolor="660066"><a href="javascript:insertcode('660066');" style="color:#FFFFFF;">660066</a></td>
+ <td bgcolor="660099"><a href="javascript:insertcode('660099');" style="color:#FFFFFF;">660099</a></td>
+ <td bgcolor="6600CC"><a href="javascript:insertcode('6600CC');" style="color:#FFFFFF;">6600CC</a></td>
+ <td bgcolor="6600FF"><a href="javascript:insertcode('6600FF');" style="color:#FFFFFF;">6600FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="663300"><a href="javascript:insertcode('663300');" style="color:#FFFFFF;">663300</a></td>
+ <td bgcolor="663333"><a href="javascript:insertcode('663333');" style="color:#FFFFFF;">663333</a></td>
+ <td bgcolor="663366"><a href="javascript:insertcode('663366');" style="color:#FFFFFF;">663366</a></td>
+ <td bgcolor="663399"><a href="javascript:insertcode('663399');" style="color:#FFFFFF;">663399</a></td>
+ <td bgcolor="6633CC"><a href="javascript:insertcode('6633CC');" style="color:#FFFFFF;">6633CC</a></td>
+ <td bgcolor="6633FF"><a href="javascript:insertcode('6633FF');" style="color:#FFFFFF;">6633FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="666600"><a href="javascript:insertcode('666600');" style="color:#FFFFFF;">666600</a></td>
+ <td bgcolor="666633"><a href="javascript:insertcode('666633');" style="color:#FFFFFF;">666633</a></td>
+ <td bgcolor="666666"><a href="javascript:insertcode('666666');" style="color:#FFFFFF;">666666</a></td>
+ <td bgcolor="666699"><a href="javascript:insertcode('666699');" style="color:#FFFFFF;">666699</a></td>
+ <td bgcolor="6666CC"><a href="javascript:insertcode('6666CC');" style="color:#FFFFFF;">6666CC</a></td>
+ <td bgcolor="6666FF"><a href="javascript:insertcode('6666FF');" style="color:#FFFFFF;">6666FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="669900"><a href="javascript:insertcode('669900');" style="color:#000000;">669900</a></td>
+ <td bgcolor="669933"><a href="javascript:insertcode('669933');" style="color:#000000;">669933</a></td>
+ <td bgcolor="669966"><a href="javascript:insertcode('669966');" style="color:#000000;">669966</a></td>
+ <td bgcolor="669999"><a href="javascript:insertcode('669999');" style="color:#000000;">669999</a></td>
+ <td bgcolor="6699CC"><a href="javascript:insertcode('6699CC');" style="color:#000000;">6699CC</a></td>
+ <td bgcolor="6699FF"><a href="javascript:insertcode('6699FF');" style="color:#000000;">6699FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66CC00"><a href="javascript:insertcode('66CC00');" style="color:#000000;">66CC00</a></td>
+ <td bgcolor="66CC33"><a href="javascript:insertcode('66CC33');" style="color:#000000;">66CC33</a></td>
+ <td bgcolor="66CC66"><a href="javascript:insertcode('66CC66');" style="color:#000000;">66CC66</a></td>
+ <td bgcolor="66CC99"><a href="javascript:insertcode('66CC99');" style="color:#000000;">66CC99</a></td>
+ <td bgcolor="66CCCC"><a href="javascript:insertcode('66CCCC');" style="color:#000000;">66CCCC</a></td>
+ <td bgcolor="66CCFF"><a href="javascript:insertcode('66CCFF');" style="color:#000000;">66CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66FF00"><a href="javascript:insertcode('66FF00');" style="color:#000000;">66FF00</a></td>
+ <td bgcolor="66FF33"><a href="javascript:insertcode('66FF33');" style="color:#000000;">66FF33</a></td>
+ <td bgcolor="66FF66"><a href="javascript:insertcode('66FF66');" style="color:#000000;">66FF66</a></td>
+ <td bgcolor="66FF99"><a href="javascript:insertcode('66FF99');" style="color:#000000;">66FF99</a></td>
+ <td bgcolor="66FFCC"><a href="javascript:insertcode('66FFCC');" style="color:#000000;">66FFCC</a></td>
+ <td bgcolor="66FFFF"><a href="javascript:insertcode('66FFFF');" style="color:#000000;">66FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="990000"><a href="javascript:insertcode('990000');" style="color:#FFFFFF;">990000</a></td>
+ <td bgcolor="990033"><a href="javascript:insertcode('990033');" style="color:#FFFFFF;">990033</a></td>
+ <td bgcolor="990066"><a href="javascript:insertcode('990066');" style="color:#FFFFFF;">990066</a></td>
+ <td bgcolor="990099"><a href="javascript:insertcode('990099');" style="color:#FFFFFF;">990099</a></td>
+ <td bgcolor="9900CC"><a href="javascript:insertcode('9900CC');" style="color:#FFFFFF;">9900CC</a></td>
+ <td bgcolor="9900FF"><a href="javascript:insertcode('9900FF');" style="color:#FFFFFF;">9900FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="993300"><a href="javascript:insertcode('993300');" style="color:#FFFFFF;">993300</a></td>
+ <td bgcolor="993333"><a href="javascript:insertcode('993333');" style="color:#FFFFFF;">993333</a></td>
+ <td bgcolor="993366"><a href="javascript:insertcode('993366');" style="color:#FFFFFF;">993366</a></td>
+ <td bgcolor="993399"><a href="javascript:insertcode('993399');" style="color:#FFFFFF;">993399</a></td>
+ <td bgcolor="9933CC"><a href="javascript:insertcode('9933CC');" style="color:#FFFFFF;">9933CC</a></td>
+ <td bgcolor="9933FF"><a href="javascript:insertcode('9933FF');" style="color:#FFFFFF;">9933FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="996600"><a href="javascript:insertcode('996600');" style="color:#FFFFFF;">996600</a></td>
+ <td bgcolor="996633"><a href="javascript:insertcode('996633');" style="color:#FFFFFF;">996633</a></td>
+ <td bgcolor="996666"><a href="javascript:insertcode('996666');" style="color:#FFFFFF;">996666</a></td>
+ <td bgcolor="996699"><a href="javascript:insertcode('996699');" style="color:#FFFFFF;">996699</a></td>
+ <td bgcolor="9966CC"><a href="javascript:insertcode('9966CC');" style="color:#FFFFFF;">9966CC</a></td>
+ <td bgcolor="9966FF"><a href="javascript:insertcode('9966FF');" style="color:#FFFFFF;">9966FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="999900"><a href="javascript:insertcode('999900');" style="color:#000000;">999900</a></td>
+ <td bgcolor="999933"><a href="javascript:insertcode('999933');" style="color:#000000;">999933</a></td>
+ <td bgcolor="999966"><a href="javascript:insertcode('999966');" style="color:#000000;">999966</a></td>
+ <td bgcolor="999999"><a href="javascript:insertcode('999999');" style="color:#000000;">999999</a></td>
+ <td bgcolor="9999CC"><a href="javascript:insertcode('9999CC');" style="color:#000000;">9999CC</a></td>
+ <td bgcolor="9999FF"><a href="javascript:insertcode('9999FF');" style="color:#000000;">9999FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99CC00"><a href="javascript:insertcode('99CC00');" style="color:#000000;">99CC00</a></td>
+ <td bgcolor="99CC33"><a href="javascript:insertcode('99CC33');" style="color:#000000;">99CC33</a></td>
+ <td bgcolor="99CC66"><a href="javascript:insertcode('99CC66');" style="color:#000000;">99CC66</a></td>
+ <td bgcolor="99CC99"><a href="javascript:insertcode('99CC99');" style="color:#000000;">99CC99</a></td>
+ <td bgcolor="99CCCC"><a href="javascript:insertcode('99CCCC');" style="color:#000000;">99CCCC</a></td>
+ <td bgcolor="99CCFF"><a href="javascript:insertcode('99CCFF');" style="color:#000000;">99CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99FF00"><a href="javascript:insertcode('99FF00');" style="color:#000000;">99FF00</a></td>
+ <td bgcolor="99FF33"><a href="javascript:insertcode('99FF33');" style="color:#000000;">99FF33</a></td>
+ <td bgcolor="99FF66"><a href="javascript:insertcode('99FF66');" style="color:#000000;">99FF66</a></td>
+ <td bgcolor="99FF99"><a href="javascript:insertcode('99FF99');" style="color:#000000;">99FF99</a></td>
+ <td bgcolor="99FFCC"><a href="javascript:insertcode('99FFCC');" style="color:#000000;">99FFCC</a></td>
+ <td bgcolor="99FFFF"><a href="javascript:insertcode('99FFFF');" style="color:#000000;">99FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC0000"><a href="javascript:insertcode('CC0000');" style="color:#FFFFFF;">CC0000</a></td>
+ <td bgcolor="CC0033"><a href="javascript:insertcode('CC0033');" style="color:#FFFFFF;">CC0033</a></td>
+ <td bgcolor="CC0066"><a href="javascript:insertcode('CC0066');" style="color:#FFFFFF;">CC0066</a></td>
+ <td bgcolor="CC0099"><a href="javascript:insertcode('CC0099');" style="color:#FFFFFF;">CC0099</a></td>
+ <td bgcolor="CC00CC"><a href="javascript:insertcode('CC00CC');" style="color:#FFFFFF;">CC00CC</a></td>
+ <td bgcolor="CC00FF"><a href="javascript:insertcode('CC00FF');" style="color:#FFFFFF;">CC00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC3300"><a href="javascript:insertcode('CC3300');" style="color:#FFFFFF;">CC3300</a></td>
+ <td bgcolor="CC3333"><a href="javascript:insertcode('CC3333');" style="color:#FFFFFF;">CC3333</a></td>
+ <td bgcolor="CC3366"><a href="javascript:insertcode('CC3366');" style="color:#FFFFFF;">CC3366</a></td>
+ <td bgcolor="CC3399"><a href="javascript:insertcode('CC3399');" style="color:#FFFFFF;">CC3399</a></td>
+ <td bgcolor="CC33CC"><a href="javascript:insertcode('CC33CC');" style="color:#FFFFFF;">CC33CC</a></td>
+ <td bgcolor="CC33FF"><a href="javascript:insertcode('CC33FF');" style="color:#FFFFFF;">CC33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC6600"><a href="javascript:insertcode('CC6600');" style="color:#000000;">CC6600</a></td>
+ <td bgcolor="CC6633"><a href="javascript:insertcode('CC6633');" style="color:#000000;">CC6633</a></td>
+ <td bgcolor="CC6666"><a href="javascript:insertcode('CC6666');" style="color:#000000;">CC6666</a></td>
+ <td bgcolor="CC6699"><a href="javascript:insertcode('CC6699');" style="color:#000000;">CC6699</a></td>
+ <td bgcolor="CC66CC"><a href="javascript:insertcode('CC66CC');" style="color:#000000;">CC66CC</a></td>
+ <td bgcolor="CC66FF"><a href="javascript:insertcode('CC66FF');" style="color:#000000;">CC66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC9900"><a href="javascript:insertcode('CC9900');" style="color:#000000;">CC9900</a></td>
+ <td bgcolor="CC9933"><a href="javascript:insertcode('CC9933');" style="color:#000000;">CC9933</a></td>
+ <td bgcolor="CC9966"><a href="javascript:insertcode('CC9966');" style="color:#000000;">CC9966</a></td>
+ <td bgcolor="CC9999"><a href="javascript:insertcode('CC9999');" style="color:#000000;">CC9999</a></td>
+ <td bgcolor="CC99CC"><a href="javascript:insertcode('CC99CC');" style="color:#000000;">CC99CC</a></td>
+ <td bgcolor="CC99FF"><a href="javascript:insertcode('CC99FF');" style="color:#000000;">CC99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCCC00"><a href="javascript:insertcode('CCCC00');" style="color:#000000;">CCCC00</a></td>
+ <td bgcolor="CCCC33"><a href="javascript:insertcode('CCCC33');" style="color:#000000;">CCCC33</a></td>
+ <td bgcolor="CCCC66"><a href="javascript:insertcode('CCCC66');" style="color:#000000;">CCCC66</a></td>
+ <td bgcolor="CCCC99"><a href="javascript:insertcode('CCCC99');" style="color:#000000;">CCCC99</a></td>
+ <td bgcolor="CCCCCC"><a href="javascript:insertcode('CCCCCC');" style="color:#000000;">CCCCCC</a></td>
+ <td bgcolor="CCCCFF"><a href="javascript:insertcode('CCCCFF');" style="color:#000000;">CCCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCFF00"><a href="javascript:insertcode('CCFF00');" style="color:#000000;">CCFF00</a></td>
+ <td bgcolor="CCFF33"><a href="javascript:insertcode('CCFF33');" style="color:#000000;">CCFF33</a></td>
+ <td bgcolor="CCFF66"><a href="javascript:insertcode('CCFF66');" style="color:#000000;">CCFF66</a></td>
+ <td bgcolor="CCFF99"><a href="javascript:insertcode('CCFF99');" style="color:#000000;">CCFF99</a></td>
+ <td bgcolor="CCFFCC"><a href="javascript:insertcode('CCFFCC');" style="color:#000000;">CCFFCC</a></td>
+ <td bgcolor="CCFFFF"><a href="javascript:insertcode('CCFFFF');" style="color:#000000;">CCFFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF0000"><a href="javascript:insertcode('FF0000');" style="color:#FFFFFF;">FF0000</a></td>
+ <td bgcolor="FF0033"><a href="javascript:insertcode('FF0033');" style="color:#FFFFFF;">FF0033</a></td>
+ <td bgcolor="FF0066"><a href="javascript:insertcode('FF0066');" style="color:#FFFFFF;">FF0066</a></td>
+ <td bgcolor="FF0099"><a href="javascript:insertcode('FF0099');" style="color:#FFFFFF;">FF0099</a></td>
+ <td bgcolor="FF00CC"><a href="javascript:insertcode('FF00CC');" style="color:#FFFFFF;">FF00CC</a></td>
+ <td bgcolor="FF00FF"><a href="javascript:insertcode('FF00FF');" style="color:#FFFFFF;">FF00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF3300"><a href="javascript:insertcode('FF3300');" style="color:#FFFFFF;">FF3300</a></td>
+ <td bgcolor="FF3333"><a href="javascript:insertcode('FF3333');" style="color:#FFFFFF;">FF3333</a></td>
+ <td bgcolor="FF3366"><a href="javascript:insertcode('FF3366');" style="color:#FFFFFF;">FF3366</a></td>
+ <td bgcolor="FF3399"><a href="javascript:insertcode('FF3399');" style="color:#FFFFFF;">FF3399</a></td>
+ <td bgcolor="FF33CC"><a href="javascript:insertcode('FF33CC');" style="color:#FFFFFF;">FF33CC</a></td>
+ <td bgcolor="FF33FF"><a href="javascript:insertcode('FF33FF');" style="color:#FFFFFF;">FF33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF6600"><a href="javascript:insertcode('FF6600');" style="color:#000000;">FF6600</a></td>
+ <td bgcolor="FF6633"><a href="javascript:insertcode('FF6633');" style="color:#000000;">FF6633</a></td>
+ <td bgcolor="FF6666"><a href="javascript:insertcode('FF6666');" style="color:#000000;">FF6666</a></td>
+ <td bgcolor="FF6699"><a href="javascript:insertcode('FF6699');" style="color:#000000;">FF6699</a></td>
+ <td bgcolor="FF66CC"><a href="javascript:insertcode('FF66CC');" style="color:#000000;">FF66CC</a></td>
+ <td bgcolor="FF66FF"><a href="javascript:insertcode('FF66FF');" style="color:#000000;">FF66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF9900"><a href="javascript:insertcode('FF9900');" style="color:#000000;">FF9900</a></td>
+ <td bgcolor="FF9933"><a href="javascript:insertcode('FF9933');" style="color:#000000;">FF9933</a></td>
+ <td bgcolor="FF9966"><a href="javascript:insertcode('FF9966');" style="color:#000000;">FF9966</a></td>
+ <td bgcolor="FF9999"><a href="javascript:insertcode('FF9999');" style="color:#000000;">FF9999</a></td>
+ <td bgcolor="FF99CC"><a href="javascript:insertcode('FF99CC');" style="color:#000000;">FF99CC</a></td>
+ <td bgcolor="FF99FF"><a href="javascript:insertcode('FF99FF');" style="color:#000000;">FF99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFCC00"><a href="javascript:insertcode('FFCC00');" style="color:#000000;">FFCC00</a></td>
+ <td bgcolor="FFCC33"><a href="javascript:insertcode('FFCC33');" style="color:#000000;">FFCC33</a></td>
+ <td bgcolor="FFCC66"><a href="javascript:insertcode('FFCC66');" style="color:#000000;">FFCC66</a></td>
+ <td bgcolor="FFCC99"><a href="javascript:insertcode('FFCC99');" style="color:#000000;">FFCC99</a></td>
+ <td bgcolor="FFCCCC"><a href="javascript:insertcode('FFCCCC');" style="color:#000000;">FFCCCC</a></td>
+ <td bgcolor="FFCCFF"><a href="javascript:insertcode('FFCCFF');" style="color:#000000;">FFCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFFF00"><a href="javascript:insertcode('FFFF00');" style="color:#000000;">FFFF00</a></td>
+ <td bgcolor="FFFF33"><a href="javascript:insertcode('FFFF33');" style="color:#000000;">FFFF33</a></td>
+ <td bgcolor="FFFF66"><a href="javascript:insertcode('FFFF66');" style="color:#000000;">FFFF66</a></td>
+ <td bgcolor="FFFF99"><a href="javascript:insertcode('FFFF99');" style="color:#000000;">FFFF99</a></td>
+ <td bgcolor="FFFFCC"><a href="javascript:insertcode('FFFFCC');" style="color:#000000;">FFFFCC</a></td>
+ <td bgcolor="FFFFFF"><a href="javascript:insertcode('FFFFFF');" style="color:#000000;">FFFFFF</a></td>
+ </tr>
+</table> \ No newline at end of file
diff --git a/0.4.1/config.pm b/0.4.1/config.pm
new file mode 100644
index 0000000..a2d3df6
--- /dev/null
+++ b/0.4.1/config.pm
@@ -0,0 +1,306 @@
+# yChat - Copyright by Paul C. Bütow
+
+########################### Dieser Teil bestimmt die Standart-Variabeln.
+##STANDART-CONFIGURATION:## (CSS, Farben, Version etc.)
+###########################
+$alias = $q->param("alias");
+$var = $q->param("var");
+$room = $q->param("room");
+$col = $q->param("col");
+$secol = $q->param("secol");
+$msg = $q->param("msg");
+$tmpid = $q->param("tmpid");
+$tmp = $q->param("tmp");
+$id = $q->param("id");
+$room = "Cyberbar" if ($room eq "");
+$col = "ffffef" if ($col eq "");
+$secol = "ffffef" if ($secol eq "");
+$datum = "22.12.2k";
+$version = "0.4.1";
+$title = "yChat.de ($version)";
+$gfxpath = "../../yChat/";
+$style = <<ENDCSS;
+<style rel="stylesheet" type="text/css">
+ body { background-image: url("$gfxpath/bar.gif"); background-color: 000000 }
+ body.menu { background-image: none }
+ body.online { background-image: none }
+ div { font-family: arial, verdana, helvetiva; font-size: 10pt; color: ffffff }
+ div.b { font-weight: bold; color: ffa500 }
+ a { color: ffffef }
+ a:hover { color: ffffff; text-decoration: none }
+ input {background-color:000000;color:ffa500;font-weight:bold; font-family:arial}
+</style>
+ENDCSS
+
+############### Dieser Teil enthält Programmcode, der an verschiedenen
+##SHARED-SUBS## Stellen ausgeführt werden muß und jedem Skript zur
+############### Verfügung steht.
+
+sub printfile { # Liest eine externe Datei ein und gibt sie mit print aus
+ my ($file2print,$pagetitle,$bodyclass) = @_;
+ if ($pagetitle ne "") {
+ &start_html($pagetitle,$bodyclass);
+ }
+ &read_file($file2print);
+ @file2print = <DATEI>;
+ close DATEI;
+ print @file2print;
+}
+
+
+sub start_html { # Der HEADER einer HTML-Datei
+print "<html><head>";
+print "<meta http-equiv=\"refresh\" content=\"20\" URL=\"online.pl?room=$room\">" if ($_[1] eq "online");
+print <<END;
+ <title>
+ $title - $_[0]
+ </title>
+ $style
+ </head>
+END
+ if ($_[1] ne "") {
+ print "<body class=$_[1]>";
+ } else {
+ print "<body>";
+ }
+}
+
+sub post { # Öffentliche Nachricht im aktuellen Raum $room posten.
+ my ($msg2post,$secroom) = @_;
+ my @rooms = ($room,$secroom);
+ foreach(@rooms) {
+ my $room2post = $_;
+ &list_dir("data/online/rooms/$room2post");
+ foreach(@dir) {
+ my $alias2post = $_;
+ if (-f "data/online/rooms/$room2post/$alias2post") {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+ }
+ }
+ }
+ &log("$msg2post") if ($room eq "Cyberbar");
+}
+
+
+sub post_all { # Öffentliche Nachricht in ALLEN Räumen gleichzeitig posten.
+ my $msg2post = $_[0];
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ my $alias2post = $_;
+ if (-f "data/online/users/$alias2post") {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+ }
+ }
+ &log("$msg2post");
+}
+
+sub post_prv { # Private Nachricht posten (flüstern).
+ my $alias2post = $_[0];
+ my $msg2post = $_[1];
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+}
+
+sub log { # Protokollieren der Nachrichten etc.
+ my ($msg2log) = @_;
+ &zeit;
+ &write_file("data/logs/$day.$month.$year");
+ print DATEI "<br><font color=ffffef><i>($hours:$min:$sec)</i></font> $msg2log\n";
+ close DATEI;
+}
+
+
+sub zeit { # Aktuelles Datum und Uhrzeit bestimmen.
+ ($sec, $min, $hours, $day, $month, $year) = (localtime)[0..5];
+ $month += 1;
+ $hours = "0".$hours if ($hours < 10);
+ $min = "0".$min if ($min < 10);
+ $sec = "0".$sec if ($sec < 10);
+ $day = "0".$day if ($day < 10);
+ $month = "0".$month if ($month < 10);
+ $year = $year - 100;
+ if ($year < 10) {
+ $year = "200".$year;
+ } else {
+ $year = "20".$year;
+ }
+}
+
+sub count { # Zeilen in einer Datei Zählen.
+ my $file2count = $_[0];
+ &read_file($file2count);
+ my @datei = <DATEI>;
+ close DATEI;
+ $number = $#datei+1;
+}
+
+sub read_file { # Datei öffnen.
+ my $file2read = $_[0];
+ if (-e "$file2read") {
+ open (DATEI,"<$file2read") || &error("Konnte $file2read nicht öffnen");
+ }
+}
+
+sub write_file { # Text an eine Datei anhängen.
+ my $file2write = $_[0];
+ if (-e "$file2write") {
+ open (DATEI,">>$file2write") || &error("Konnte $file2write nicht öffnen");
+ } else {
+ &create_file("$file2write");
+ open (DATEI,">>$file2write") || &error("Konnte $file2write nicht öffnen");
+ }
+}
+
+sub write_file_new { # Datei neu schreiben.
+ my $file2write = $_[0];
+ if (-e "$file2write") {
+ open (DATEI,">$file2write") || &error("Konnte $file2write nicht öffnen");
+ } else {
+ &create_file("$file2write");
+ open (DATEI,">$file2write") || &error("Konnte $file2write nicht öffnen");
+ }
+}
+
+sub create_file { # Datei erstellen.
+ my $file2create = $_[0];
+ open (CREATE, ">$file2create") || &error("Konnte $file2create nicht erstellen!");
+ print CREATE "";
+ close CREATE;
+}
+
+sub error { # Error-Ausgabe.
+ my $error_msg = $_[0];
+ &start_html( "Error: ($error_msg)" );
+ print $q->div( "Error: ($error_msg)" ),
+ $q->end_html;
+ exit;
+}
+
+sub remove_online { # Chatter entfernen
+ my ($alias,$room,$method) = @_;
+ unlink("data/online/users/$alias");
+ unlink("data/online/rooms/$room/$alias") if ($room ne undef);
+ unlink("data/online/ident/$alias");
+ unlink("data/msgs/$alias");
+ &rm_rooms;
+ &zeit;
+ if ($method eq undef) {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias verläßt den Chat ...</font></i>");
+ } elsif ($method ne "kick") {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500> $_ hat den Chat verlassen ... </font></i>");
+ }
+ &rm_rstat($room,$alias) if ($room ne undef);
+}
+
+sub rm_alias { # Chatter aus dem System entfernen, dessen Timestamps älter als 60 Sekunden sind
+ my ($dir2rm,$rstatroom) = @_;
+ &list_dir($dir2rm,2);
+ foreach(@dir2) {
+ if (-f "$dir2rm/$_" && $_ ne undef) {
+ &read_file("$dir2rm/$_");
+ my $timestamp = <DATEI>;
+ close DATEI;
+ if ($timestamp < (time - 60)) {
+ if ($dir2rm eq "data/online/users") {
+ &remove_online($_,undef,1);
+ } else {
+ unlink("$dir2rm/$_");
+ &rm_rstat($rstatroom,$_) if ($rstatroom ne undef);
+ }
+ }
+ }
+ }
+}
+
+sub rm_rooms { # Leere Räume aus dem System entfernen
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-d "data/online/rooms/$_") {
+ &rm_alias("data/online/rooms/$_",$_);
+ &list_dir("data/online/rooms/$_",2);
+ if ($#dir2 = 1) {
+ rmdir("data/online/rooms/$_");
+ }
+ }
+ }
+}
+
+sub rm_rstat { # Benutzer als Raumbesetzer austragen
+ my ($rstatroom,$r_alias) = @_;
+ &read_file("data/online/rstat/$rstatroom");
+ my @rstat = <DATEI>;
+ close DATEI;
+ my $newfile = $rstat[0].$rstat[1];
+ for ($i=2;$i<=$#rstat;$i++) {
+ $newfile = $newfile."\n".$rstat[$i] if ($rstat[$i] ne $r_alias."\n");
+ }
+ write_file_new("data/online/rstat/$rstatroom");
+ print DATEI $newfile;
+ close DATEI;
+}
+
+sub secure_removeid { # Beim ausloggen die IP-Nummer aus dat/ip austragen.
+ my $alias2rm = $_[0];
+ unlink("data/online/ident/$alias2rm");
+}
+
+sub secure_checkid { # TmpID überprüfen
+ my ($alias2check) = @_;
+ &read_file("data/online/ident/$alias2check");
+ my @idfile = <DATEI>;
+ close DATEI;
+ if ($idfile[1] ne $tmpid) {
+ &error("Falsche TempID ! Du bist nicht befugt zu handeln !");
+ }
+}
+
+sub remove_rooms { # Leere Räume entfernen.
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-d "data/online/rooms/$_") {
+ &list_dir("data/online/rooms/$_");
+ rmdir("data/online/rooms/$_") if ($#dir = 1);
+ }
+ }
+}
+
+sub list_dir { # Beliebigen Verzeichnisbaum einlesen.
+ my ($dir,$method) = @_;
+ opendir(DIR, $dir);
+ if ($method eq undef) {
+ @dir = readdir(DIR);
+ } elsif ($method = 2) {
+ @dir2 = readdir(DIR);
+ }
+ closedir(DIR);
+}
+
+sub hirachie { # Chatter nach Sonderrechte überprüfen.
+ my $alias2prove = $_[0];
+ $hirachie = undef;
+ &read_file("data/wa");
+ @was = <DATEI>;
+ close DATEI;
+ foreach(@was) {
+ if ($_ eq $alias2prove || $_ eq "$alias2prove\n") {
+ $hirachie = "wa";
+ }
+ }
+ &read_file("data/ow");
+ @ows = <DATEI>;
+ close DATEI;
+ if ($hirachie ne "wa" || $_ eq "$alias2prove\n") {
+ foreach(@ows) {
+ if ($_ eq $alias2prove || $_ eq "$alias2prove\n") {
+ $hirachie = "ow";
+ }
+ }
+ }
+}
+
+$| = 1; # Cache von Perl ausschalten \ No newline at end of file
diff --git a/0.4.1/help.sno b/0.4.1/help.sno
new file mode 100644
index 0000000..5779354
--- /dev/null
+++ b/0.4.1/help.sno
@@ -0,0 +1,55 @@
+<div>
+ Alle Chat-Befehle:
+</div>
+<hr>
+<table width=100% bgcolor=555555>
+<tr><th bgcolor=666666><div>SU</div></th><th bgcolor=666666><div>Befehl</div></th><th bgcolor=666666><div>Beschreibung</div></th></tr>
+<tr><td><div>NC</div></td><td><div>/about</div></td><td><div>Zeigt aktuelle Version und andere Infos der Community an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/away <font color=red>Nachricht</font></div></td><td><div>Abmelden mit einer<font color=red>Abmeldenachricht</font></div></td></tr>
+<tr><td><div>NC</div></td><td><div>/clear</div></td><td><div>Bildschirm wird gelöscht</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/col <font color=red>XXXXXX</font> <font color=ffa500>XXXXXX</font></div></td><td><div>Farbe/n (<font color=red>Namensfarbe</font> / <font color=ffa500>Textfarbe</font>) wechseln. Angabe in Hexadezimal.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/date</div></td><td><div>Zeigt aktuelles Datum und Urzeit an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/j <font color=red>Raumname</font></div></td><td><div>Raum wechseln/erstellen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ju <font color=red>Alias</font></div></td><td><div>In den Raum wechseln/folgen, wo sich <font color=red>Alias</font> befindet.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/m <font color=red>Aktion</font></div></td><td><div>Handeln mit 2 Farben</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/me <font color=red>Aktion</font></div></td><td><div>Handeln mit einer Farbe</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/msg <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine private <font color=ffa500>Nachricht</font> flüstern.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ <font color=ffa500>Nachricht</font></div></td><td><div>Eine private <font color=ffa500>Nachricht</font> demjenigen flüstern, dem zuletzt eine geflüstert wurde</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/q</div></td><td><div>Cumunnity verlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/rmgb</div></td><td><div>Das eigene Gästebuch komplett weglöschen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/s <font color=red>Nachricht</font></div></td><td><div><font color=red>Nachricht</font> schreien</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/seen <font color=red>Alias</font></div></td><td><div>Zeigt an, vor wieviel Stunden sich <font color=red>Nachricht</font> zum letzten Mal in das System eingelogt hat</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/w</div></td><td><div>Zeigt an, wer sich im aktuellen Raum befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc <font color=red>Raum</font></div></td><td><div>Zeigt an, wer sich im <font color=red>Raum</font> befindet. Wird kein Raum angegeben, dann wird jedeglich angezeigt, wer sich im System befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc/</div></td><td><div>Zeigt alle offenen Räume und deren Chatter an</div></td></tr>
+<tr><td><div>NC</div></td><td> <div>/wj <font color=red>Alias</font></div></td><td><div>Zeigt an, in welchen Raum sich <font color=red>Alias</font> befindet</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/l</div></td><td><div>Der aktuelle Raum wird ab- bzw. aufgesperrt</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/rsu <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> die Raumbesetzerrechte entnehmen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/su <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Raumbesetzer ernennen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/t <font color=red>Thema</font></div></td><td><div>Dem aktuellen Raum wird ein <font color=red>Thema</font> gegeben</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban</div></td><td><div>Zeigt alle verbannten Benutzer an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> verbannen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/rban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> "entbannen"</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ip <font color=red>Alias</font></div></td><td><div>Zeigt die IP-Nummer von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/k <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird aus dem Chat katapultiert!</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/kill <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird ganz und gar aus dem System entfernt</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/wa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Wächter ernennen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/rwa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom Wächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/sys <font color=red>Nachricht</font></div></td>
+<td><div>Systemnachricht schreiben. (Erscheint in allen existierenden Räumen)</div></td></tr>
+</table><hr>
+<div>
+ Zur Erklärung: NC steht für "Normale Chatter", RB für "Raumbesetzer", WÄ für "Wächter" und OW für "Oberwächter".
+ Obrige Befehle können nur von der/den jeweiligen Benutzergruppe/n werden.<br><br>
+ Allerdings gibt es folgendes zu beachten: Oberwächter verfügen über alle Chatbefehle. Normale Wächter über alle Chatbefehle, außer über die der Oberwächter.
+ Raumbesetzer können nur Raumbesetzerbefehle und die Befehle der normalen Chatter durchführen. Normale Chatter haben jedeglich die Standardbefehle zu verwenden.<br><br>
+ Weitere Besonderheiten der Wächter und Oberwächter:<br><br>
+ Wächter und Oberwächter können ....<br>
+ ... abgesperrte Chaträume problemlos betreten.<br>
+ ... nicht gekickt, verbannt oder gekillt werden.<br>
+ ... Logdateien der Cyberbar lesen.<br><br>
+
+ Des weiteren: Oberwächter ernennt nur der Systemadministrator!
+</div>
+</body>
+</html> \ No newline at end of file
diff --git a/0.4.1/htdocs.pl b/0.4.1/htdocs.pl
new file mode 100644
index 0000000..8ceafa6
--- /dev/null
+++ b/0.4.1/htdocs.pl
@@ -0,0 +1,195 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+if ($var eq "help_html") {
+ &printfile("help.sno","Alle Chatbefehle");
+} elsif ($var eq "menu_html") {
+ &menu_html;
+} elsif ($var eq "werda_html") {
+ &werda_html;
+} elsif ($var eq "logs_html") {
+ &secure_checkid($alias);
+ &logs_html;
+} elsif ($var eq "view_logs_html") {
+ &secure_checkid($alias);
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ &printfile($tmp,$tmp,"log");
+ }
+} elsif ($var eq "superuser_html") {
+ &secure_checkid($alias);
+ &superuser_html;
+} else {
+ print
+ $q->start_html(-bgcolor=>"000000"),
+ $q->end_html;
+}
+
+sub menu_html {
+ if ($tmp eq "quit") {
+ print
+ $q->script( { -language=>"JavaScript" }, "window.open(\"index.pl?tmp=quit\",\"_top\")" );
+ sleep 1;
+ &remove_online($alias);
+ &secure_removeid($alias);
+ unlink("data/msgs/$alias");
+ }
+ &start_html("Menü","menu");
+print <<END;
+ <div>
+ [<a href="htdocs.pl?var=werda_html&alias=$alias&room=$room&col=$col&secol=$secol&&tmp=$tmp&tmpid=$tmpid" target="werda">Wer ist da?</a>]<br>
+ [<a href="main2.pl?var=edit_profile_html&alias=$alias&tmpid=$tmpid" target="ProfilAendern">Profil ändern</a>]<br>
+ [<a href="main2.pl?var=edit_options_html&alias=$alias&tmpid=$tmpid" target="Optionen">Chatoptionen</a>]<br>
+ [<a href="main2.pl?var=list_alias_html&alias=$alias&tmpid=$tmpid" target="Benutzerliste">Benutzerliste</a>]<br>
+ [<a href="htdocs.pl?var=help_html&tmpid=$tmpid" target="Befehle">Chatbefehle</a>]<br>
+ [<a href="main2.pl?var=gb_html&alias=$alias&tmpid=$tmpid" target="Board">Benutzerboard</a>]<br>
+ [<a href="htdocs.pl?var=superuser_html&alias=$alias&tmpid=$tmpid" target="Hirachie">Superuser</a>]<br>
+ [<a href="htdocs.pl?var=logs_html&alias=$alias&tmpid=$tmpid" target="Logdateien">Logdateien</a>]<br>
+ [<a href="http://www.updates.yChat.de" target="Updates">yChat-Updates</a>]<br><br>
+ [<a href="push.pl?alias=$alias&room=$room&var=clear_screen&tmpid=$tmpid" target="main">Weiterchatten</a>]<br>
+ [<a href="htdocs.pl?var=menu_html&tmp=quit&alias=$alias&tmpid=$tmpid">Verlassen</a>]<br>
+ </div>
+</body>
+</html>
+END
+}
+
+
+sub werda_html { # Anzeige, wer eingelogt ist.
+ &start_html("Wer ist da?");
+ print <<END;
+<div>
+ $alias, schön daß Du hier bist :-)
+</div>
+<hr>
+<div>
+ Folgende Personen befinden sich im Chat:
+</div>
+<br>
+<div>
+END
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ my $room = $_;
+ &read_file("data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ &list_dir("data/online/rooms/$room",2);
+ local $nr = $#dir2-1;
+ print $q->b( $_ ),
+ " $door ($nr) Raumthema: $rstat[1]",
+ $q->br;
+ foreach(@dir2) {
+ if ($_ ne ".." && $_ ne ".") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid" }, "$_"), " ";
+ }
+ }
+ print $q->br, $q->br;
+ }
+ }
+ print
+ "</div>",
+ $q->end_html;
+}
+
+sub logs_html {
+ &start_html("Logdateien");
+ print <<END;
+<div>
+ Hier befinden sich alle Logdateien
+</div>
+<hr>
+END
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ print $q->div( "Folgende Logdateien des Raumes \"Cyberbar\" können nur von Wächtern und Oberwächtern gelesen werden (Sortiert nach A-Z, a-z):" ),
+ $q->br;
+ &list_dir("data/logs");
+ my @sortedir = sort(@dir);
+ foreach(@sortedir) {
+ if (-f "data/logs/$_") {
+ print $q->a( { -href=>"htdocs.pl?alias=$alias&var=view_logs_html&tmp=data/logs/$_&tmpid=$tmpid",
+ -target=>"_new" },
+ "$_" ),
+ " ";
+ }
+ }
+ } else {
+ print $q->div( "Logdateien können nur von Oberwächtern (OW) und von Wächtern (WÄ) gelesen werden. Du bist jedoch ein ",
+ "\"Normaler Chatter\". Wächter können alles nachlesen, was öffentlich gechattet wurde." ),
+ $q->hr;
+ &printfile("data/htdocs/logs_html");
+ }
+ print
+ $q->end_html;
+}
+
+sub superuser_html { # Zeigt an, wer Superuser ist
+ &start_html("Superuser");
+ print "<div>Hallo $alias. Du bist als ";
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ print
+ $q->b( "Oberwächter" ),
+ " (OW) eingetragen.</div>",
+ $q->hr;
+ } elsif ( $hirachie eq "wa") {
+ print
+ $q->b( "Wächter" ),
+ " (WÄ) eingetragen.</div>",
+ $q->hr;
+ } else {
+ print
+ $q->b( "normaler Chatter" ),
+ " (NC) eingetragen.</div>",
+ $q->hr;
+ }
+
+ my $nrow = $#ows+1;
+ print
+ "<div>",
+ $q->b( "OW" ),
+ "s ($nrow Stück)";
+ foreach(@ows) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+ my $nrwa = $#was+1;
+ print
+ "</div>",
+ $q->hr,
+ "<div>",
+ $q->b( "WÄ" ),
+ "s ($nrwa Stück)";
+ foreach(@was) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+print <<END;
+<hr>
+ Die jeweiligen Fähigkeiten der Oberwächter (OW) und der Wächter (WÄ) sind unter
+ "<a href="htdocs.pl?var=help_html&tmpid=$tmpid">Chat-Befehle</a>"
+ dokumentiert.
+</div>
+</body>
+</html>
+END
+} \ No newline at end of file
diff --git a/0.4.1/index.pl b/0.4.1/index.pl
new file mode 100644
index 0000000..5d674fd
--- /dev/null
+++ b/0.4.1/index.pl
@@ -0,0 +1,376 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header; # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUFGERUFEN WERDEN?##
+#####################################
+if ($var eq "create_alias_html") {
+ &create_alias_html;
+} elsif ($var eq "create_alias") {
+ &create_alias;
+} elsif ($var eq "login_html") {
+ &login_html;
+} elsif ($alias eq "") {
+ &login_html;
+} else {
+ &checklogin;
+}
+
+sub login_html { # Erste Startseite
+local $counter = undef;
+&read_file("data/count");
+ $counter = <DATEI>;
+close DATEI;
+$counter++;
+&write_file_new("data/count");
+ print DATEI $counter;
+close DATEI;
+&list_dir("data/online/users");
+my $logtin = $#dir-1;
+&start_html("Created by Paul C. Bütow 2k");
+print <<END;
+ <center>
+ <table width=400>
+ <tr>
+ <td>
+ <b>
+ <div>
+ $title - ( <a href="http://servers.yChat.de">yChat-Servers</a> )
+ <img src="$gfxpath/yChat.jpg">
+ </div>
+ </b>
+END
+ if ($tmp eq "true") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Wahrscheinlich existiert Dein Alias "$alias" nicht,
+ <br>
+ Du hast Dich verschrieben oder das Passwort ist falsch.
+ <br>
+ Versuch es erneuert !
+ </div>
+END
+ } elsif ($tmp eq "quit") {
+print <<END;
+ <div>
+ Du hast soeben den Chat verlassen.
+ <br>
+ Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ } elsif ($tmp eq "banned") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein Alias "$alias" wurde verbannt.
+ <br>
+ Z.z. kannst Du Dich leider nicht in den Chat einloggen.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($tmp eq "kick") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wurdest soeben aus dem Chat katapultiert!
+ <br>
+ Schlechtes Verhalten mag die Ursache hierfür sein.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($var eq "create_alias") {
+print "<div>Du hast sich soeben in die Datenbank eingetragen. Einfach auf \"Los Geht's\" klicken :-)</div>";
+ } else {
+print <<END;
+ <div>
+ Herzlich willkommen!
+ <br>
+ Einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <form action="index.pl" method="post">
+ <input type="hidden" name="tmp" value="true">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Alias:
+ <br>
+ <input name="alias" value="$alias">
+ </div>
+ </td>
+ <td>
+ <div>
+ Dein Passwort:
+ <br>
+ <input type="password" name="id" value="$id">
+ </div>
+ </td>
+ </tr>
+ </table>
+ <br>
+ <br>
+ <div>
+ Solltest Du noch keinen Nick besitzen, dann auf "Registrieren" klicken!
+ </div>
+ <br>
+ <table>
+ <tr>
+ <td>
+ <font color="ffffff">
+ <input type="submit" value="Los geht's!">
+ </font>
+ </form>
+ </td>
+ <td>
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias_html">
+ <font color="ffffff">
+ <input type="submit" value="Registrieren">
+ </font>
+ </form>
+ </td>
+ </tr>
+ </table>
+ <hr>
+ <div>
+ yChat befindet sich momentan noch in der Entwicklungsphase !
+ <br>
+ Fragen gehen an Paul Bütow (
+ <a href="mailto:paul\@buetow.oxg.de">
+ paul\@buetow.oxg.de
+ </a>
+ ) :-)
+ <br>
+ <br>
+ Diese Seite wurde schon $counter mal aufgerufen. Es sind z.Z. $logtin Benutzer online.
+ </td>
+ </tr>
+ </table>
+ </center>
+</body>
+</html>
+END
+ if ($logtin == 0) {
+ &list_dir("data/msgs");
+ &list_dir("data/online/rstat",2);
+ foreach(@dir) {
+ unlink("data/msgs/$_");
+ unlink("data/online/ident/$_");
+ }
+ foreach(@dir2) {
+ unlink("data/online/rstat/$_");
+ }
+ }
+ # Falls d. Skript das Raumverz. gelöscht hat, neu anlegen
+ if (-d "data/online/rooms") {
+ } else {
+ mkdir "data/online/rooms", 0777;
+ }
+}
+
+
+sub create_alias_html { # HTML-Form für Erstellung eines neuen Benutzers.
+my $reload = $_[0];
+&start_html("Registration");
+print <<END;
+ <center>
+ <table width=400>
+ <tr>
+ <td>
+END
+ if ($reload eq "alias_exists") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Der von Dir gewählte Benutzername "$alias" existiert in unserer Datenbank bereits. Bitte versuch es erneuert mit
+ einem anderen Benutzernamen !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "pw_wrong") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Deine beiden Passworteingaben stimmen nicht überein. Bitte geb das Passwort erneuert an um sicherzugehen, daß
+ kein falsches Passwort abgespeichert wird !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "alias_prohibited") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein gewählter Benutername "$alias" enthält illegale Zeichen. Bitte versuch einen anderen Benutzernamen!
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Hier kannst Du Dich registrieren. Bitte beachte, daß die Passworteingabefelder übereinstimmen!
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias">
+ <div>
+ Dein Alias:
+ <font color="ffa500">
+ (Muß angegeben werden)
+ </font>
+ <br>
+ <input name="alias" VALUE="$alias">
+ </div>
+ <br>
+ <div>
+ Dein gewünschtes Passwort:
+ <br>
+ <input type="password" name="id" value="$id">
+ </div>
+ <br>
+ <div>
+ Geb hier Dein Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp">
+ </div>
+ <br>
+ <font color=ffffff>
+ <input type="submit" value="Registrieren">
+ </font>
+ <br>
+ </form>
+ <hr>
+ <div>
+ Um den Chat zu betreten müssen die Daten nach der Registration auf der Startseite erneuert bestätigt werden !
+ </div>
+ </td>
+ </tr>
+ </table>
+</center>
+</body>
+</html>
+END
+}
+
+sub checklogin { # Überprüfen, ob die Login-Daten korrekt sind.
+ my $lognotexists = "true";
+ &list_dir("data/user/options");
+ for (my $i=0; $i<=$#dir; $i++) {
+ if ($dir[$i] eq $alias) {
+ &read_file("data/user/options/$alias");
+ @datei = <DATEI>;
+ close DATEI;
+ chomp($datei[0]);
+ if ($datei[0] eq $id) {
+ &read_file("data/ban"); # Überprüfen, ob Alias verbannt ist
+ @banned = <DATEI>;
+ close DATEI;
+ foreach(@banned) {
+ if ($_ eq "$alias\n") {
+ $tmp = "banned";
+ &login_html();
+ exit;
+ }
+ }
+ $col = $datei[1];
+ $secol = $datei[2];
+ $tmpid = time;
+ &write_file_new("data/online/ident/$alias");
+ print DATEI $ENV{'REMOTE_ADDR'}."\n".$tmpid;
+ close DATEI;
+ &read_file("data/user/lastlogin/$alias");
+ my @lastlogin = <DATEI>;
+ close DATEI;
+ &write_file_new("data/user/lastlogin/$alias");
+ print DATEI time;
+ close DATEI;
+ &frameset_html;
+ exit;
+ } else {
+ $lognotexists = "false";
+ }
+ }
+ }
+ if ($lognotexists eq "true") {
+ }
+ &login_html; # Falls Login-Daten inkorrekt sind, zurück zur Startseite.
+}
+
+sub create_alias { # Erstellung eines neuen Benutzers.
+ if ($alias =~ /[\W]/ || $alias eq "") {
+ &create_alias_html("alias_prohibited");;
+ exit;
+ } elsif ($id ne $tmp) {
+ &create_alias_html("pw_wrong");
+ exit;
+ }
+ &list_dir("data/user/options");
+ for (my $i=0; $i<=$#dir; $i++) {
+ if ($dir[$i] eq $alias) {
+ &create_alias_html("alias_exists");
+ exit;
+ }
+ }
+ &write_file_new("data/user/options/$alias");
+ print DATEI $id."\n";
+ close DATEI;
+ &zeit;
+ &list_dir("data/user/options");
+ my $number = $#dir-1;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias [$number] hat sich soeben als neuer Benutzer registriert :-) ...</font></i>");
+ &login_html;
+}
+
+sub frameset_html {
+print <<END;
+<html>
+ <head>
+ <title>
+ $title - Created & Copyright by Paul C. Bütow
+ </title>
+ </head>
+
+<frameset border=0 frameborder=0 framespacing=0 cols="140,*">
+<frameset border=0 frameborder=0 framespacing=0 rows="210,*,55">
+ <frame name="menu" src="htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol&tmpid=$tmpid" scrolling="no">
+ <frame name="online" src="online.pl?room=$room&alias=$alias&tmpid=$tmpid">
+ <frame name="reload" src="htdocs.pl" scrolling="no">
+</frameset>
+<frameset border=0 frameborder=0 framespacing=0 rows="*,55">
+ <frame name="main" src="push.pl?room=$room&alias=$alias&tmpid=$tmpid">
+ <frame name="input" src="main.pl?alias=$alias&var=input_html&room=$room&col=$col&secol=$secol&tmp=login&tmpid=$tmpid" scrolling="no">
+</frameset>
+</frameset>
+</html>
+END
+}
diff --git a/0.4.1/main.pl b/0.4.1/main.pl
new file mode 100644
index 0000000..691177e
--- /dev/null
+++ b/0.4.1/main.pl
@@ -0,0 +1,737 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI; # CGI-Modul laden
+
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+if ($var eq "input_html") {
+ &secure_checkid($alias);
+ &input_html;
+} elsif ($var eq "post_msg") {
+ &post_msg;
+} else {
+ &error("Parameter fehlt");
+}
+
+sub input_html { # Eingabemaske für den Chat.
+ if ($tmp eq "login") {
+ &remove_rooms;
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat den Chat betreten ...</font></i>");
+ }
+ my $whisper = @_;
+ $whisper = $q->param('whisper') if ($whisper == 0);
+print <<END;
+<html>
+ <head>
+ <script language="JavaScript">
+ function delout()
+ {
+ document.inf.submit();
+ document.inf.msg.focus();
+ document.inf.msg.select();
+ return false;
+ }
+ </script>
+$style
+ </head>
+<body bgcolor=000000 class="online">
+ <form name="inf" target="reload" action="main.pl" method="GET" onsubmit="return delout()">
+END
+ print <<END;
+ <input type="hidden" name="var" value="post_msg">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="room" value="$room">
+ <input type="hidden" name="col" value="$col">
+ <input type="hidden" name="secol" value="$secol">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="id" value="$whisper">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input size="80" name="msg">
+ </form>
+</body>
+</html>
+END
+}
+
+sub reload_html { # Wird neugeladen, wenn eine Nachricht getextet wird!
+ my ($whisper,$action) = @_;
+ print "<html><head><script language=\"JavaScript\">";
+ if ($action eq "change_room") {
+ print "open(\"online.pl?alias=$alias&room=$room&tmpid=$tmpid\",\"online\");";
+ print "open(\"main.pl?var=input_html&alias=$alias&room=$room&col=$col&secol=$secol&whisper=$whisper&tmpid=$tmpid\",\"input\");";
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol&tmpid=$tmpid\",\"menu\");";
+ } elsif ($action eq "change_colors") {
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol&tmpid=$tmpid\",\"menu\");";
+ print "open(\"main.pl?var=input_html&alias=$alias&room=$room&col=$col&secol=$secol&whisper=$whisper&tmpid=$tmpid\",\"input\");";
+ } elsif ($action eq "away") {
+ print "open(\"main.pl?var=input_html&alias=$alias&col=$col&secol=$secol&room=$room&tmp=noaway&whisper=$whisper&tmpid=$tmpid\",\"input\");";
+ } elsif ($action eq "whisper") {
+ print "open(\"main.pl?var=input_html&alias=$alias&col=$col&secol=$secol&room=$room&whisper=$whisper&tmpid=$tmpid\",\"input\");";
+ } elsif ($action eq "quit") {
+ print "open(\"index.pl?tmp=quit\",\"_top\");";
+ }
+ print "</script></head><body bgcolor=000000>";
+ print
+ $q->end_html;
+}
+
+sub post_msg { # Wird aufgerufen, wenn aus input_html eine Eingabe gepostet wurde.
+ &secure_checkid($alias);
+ if ($tmp eq "noaway") {
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias meldet sich zurück ... </font></i>");
+ &post_prv($alias,"<script language=\"JavaScript\">open(\"main.pl?var=input_html&alias=$alias&col=$col&secol=$secol&room=$room&whisper=$whisper&tmpid=$tmpid\",\"input\");</script>");
+ }
+ $msg =~ s#<#&lt\;#g; # HTML-Tags deaktivieren
+ if (substr($msg,0,1) ne "/") { # Überprüfen, ob Befehl oder Nachricht
+ $msg = "<b><font color=$col>$alias: <font color=$secol>".$msg."</font></font></b>";
+ &reload_html($id,$tmp); # -> Action=none, Whisper=$id, $tmp =? noaway
+ &post($msg);
+ } else {
+ &cmd($msg);
+ }
+}
+
+sub cmd { # Alle Chatbefehle, die über input_html eingegeben werden können.
+ $_[0] = $_[0]." ";
+ $_[0] = substr($_[0], 1, length($_[0])-1);
+ my @cmd = split(/ /, $_[0]);
+ my $cmd = substr($_[0],0 , index($_[0], " "));
+ my ($whisper,$action) = ($id);
+#############>- NORMALE CHATBEFEHLE ( Alphabetisch sortiert ) -<
+#############>- INFORMATIONEN ÜBER DAS SYSTEM AUSGEBEN -<
+ if ($cmd eq "about") {
+ &post_prv("$alias","<font size=2 color=ffffff>Aktuelle Version ist $title und wurde am $datum aktuallisiert. Created by Paul C. Bütow 2k.</font>");
+#############>- ABMELDEN MIT 'AWAY-NACHRICHT' -<
+ } elsif ($cmd eq "away") {
+ if ($tmp eq "away") { # Falls 2 mal hintereinander /away eingegeben wurde
+ my $away_msg = "";
+ }
+ for ($i=1; $i <= $#cmd; $i++) {
+ $away_msg = $away_msg." ".$cmd[$i];
+ }
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias meldet sich ab (<font color=red>$away_msg</font> ) ...</i></font>");
+ &reload_html($whisper,"away");
+ exit;
+#############>- EIGENEN CHATBILDSCHIRM LÖSCHEN -<
+ } elsif ($cmd eq "clear") {
+ &post_prv("$alias","<script language=\"JavaScript\">window.open(\"push.pl?alias=$alias&room=$room&var=clear_screen&tmpid=$tmpid\",\"main\");</script>");
+ &reload_html($whisper);
+ exit;
+#############>- FARBEN WECHSELN -<
+ } elsif ($cmd eq "col") {
+ $col = $cmd[1];
+ my $tmpsecol = $cmd[2];
+ if ($tmpsecol eq "") {
+ $secol = $col
+ } else {
+ $secol = $tmpsecol;
+ }
+ &read_file("data/user/options/$alias");
+ my @pro = <DATEI>;
+ close DATEI;
+ &write_file_new("data/user/options/$alias");
+ print DATEI $pro[0]."".$col."\n".$secol;
+ close DATEI;
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat die Farbe gewechselt ...</font></i>");
+ &reload_html($whisper,"change_colors");
+ exit;
+#############>- AKTUELLES DATUM UND URZEIT AUSGEBEN -<
+ } elsif ($cmd eq "date") {
+ &zeit;
+ &post_prv("$alias","<font size=2 color=ffffff>Heute ist der $day.$month. Jahr $year. Es ist genau $hours:$min Uhr und $sec Sekunden.</font>");
+ &reload_html($whisper);
+ exit;
+#############>- EINEN NEUEN RAUM ERSTELLEN BZW. IN EINEN BESTEHENDEN RAUM WECHSELN -<
+ } elsif ($cmd eq "j") {
+ &change_room("j",$cmd[1],$room);
+ &reload_html($whisper,"change_room");
+ exit;
+#############>- HANDELN -<
+ } elsif ($cmd eq "me" || $cmd eq "m") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $me_msg = $me_msg." ".$cmd[$i];
+ }
+ if ($cmd eq "m") {
+ &post("<i><font color=$col>$alias <font color=$secol>$me_msg</font></font></i>");
+ } else {
+ &post("<i><font color=$col>$alias $me_msg</font></i>");
+ }
+ &reload_html($whisper);
+ exit;
+#############>- MEMO SCHREIBEN -<
+ } elsif ($cmd eq "memo") {
+ my $alias2memo = $cmd[1];
+ &list_dir("data/user/options");
+ foreach(@dir) {
+ if(-f "data/user/options/$alias2memo") {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $memo_msg = $memo_msg." ".$cmd[$i];
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2memo <font color=ffffff>wurde folgende memo erfolgreich hinterlassen: $memo_msg</font></font>");
+ &zeit;
+ &write_file("data/user/memos/$alias2memo");
+ print DATEI "<font size=2 color=ffffff>(<font color=red>$day.$month. - $hours:$min:$sec</font>) $alias hat Dir eine Memo hinterlassen: <font color=ffa500>$memo_msg</font></font><br>";
+ close DATEI;
+ &reload_html($whisper);
+ exit;
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2memo <font color=ffffff>existiert in der Datenbank nicht !</font></font>");
+ &reload_html($whisper);
+ exit;
+#############>- FLÜSTERN ( Auch mit '/' ) -<
+ } elsif ($cmd eq "msg" || $cmd eq "") {
+ my ($alias2post,$msg2post) = ($cmd[1],"");
+ if ($cmd eq "msg") {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ $action = "whisper";
+ } else {
+ $alias2post = $id;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ }
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ if ($_ eq $alias2post) {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "<i><font color=$col>$alias flüstert <font color=ffffff>=></font><font color=$secol>$msg2post</font></font></i><br>\n";
+ close DATEI;
+ &write_file("data/msgs/$alias");
+ print DATEI "<i><font color=$col>Zu $alias2post geflüstert <font color=ffffff>=></font><font color=$secol>$msg2post</font></font></i><br>\n";
+ close DATEI;
+ &reload_html($alias2post,$action);
+ exit;
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2post <font color=ffffff>ist momentan nicht anwesend !</font></font>");
+#############>- TOTALONLINEZEIT VON ALIAS ANZEIGEN -<
+ } elsif ($cmd eq "online") {
+ my $alias2prove= $cmd[1];
+ if (-f "data/user/counts/$alias2prove.online") {
+ &read_file("data/user/counts/$alias2prove.online");
+ my $online = <DATEI>;
+ close DATEI;
+ my $totaltime = sprintf("%.2f",($online / 60));
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff> war insgesamt schon $totaltime Minuten online !</font></font>");
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff>hat z.Z. keine Statistiken !</font></font>");
+ }
+ &reload_html($whisper);
+ exit;
+#############>- DAS SYSTEM VERLASSEN -<
+ } elsif ($cmd eq "q") {
+ &reload_html($whisper,"quit");
+ sleep 2;
+ &remove_online($alias,$room);
+ &secure_removeid($alias);
+ exit;
+#############>- DAS EIGENE GÄSTEBUCH LÖSCHEN -<
+ } elsif ($cmd eq "rmgb") {
+ unlink("data/user/gbooks/$alias");
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias löscht sein gesamtes Gästebuch ...</font></i>",$_);
+ &reload_html($whisper);
+ exit;
+#############>- SCHREIEN -<
+ } elsif ($cmd eq "s") {
+ my ($msg2scream,$msg2post);
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2scream = $msg2scream." ".$cmd[$i];
+ }
+ $msg2post = "\U$msg2scream";
+ &post("<font color=$col><i>$alias schreit:</i> <b><font color=$secol>".$msg2post."</font></font></b>");
+ &reload_html($whisper);
+ exit;
+#############>- SEHEN, WANN SICH ALIAS ZUM LETZTEN MAL EINGELOGT HAT -<
+ } elsif ($cmd eq "seen") {
+ my $alias2prove = $cmd[1];
+ &list_dir("data/user/options");
+ foreach(@dir) {
+ if (-f "data/user/lastlogin/$alias2prove") {
+ &read_file("data/user/lastlogin/$alias2prove");
+ my $lastlogin = <DATEI>;
+ close DATEI;
+ my $timestamp = sprintf("%.2f",((time() - $lastlogin) / 3600));;
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff> hat sich vor $timestamp Stunden zuletzt in das System eingelogt !</font></font>");
+ &reload_html($whisper);
+ exit;
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff> hat z.Z. keine Statistiken !</font></font>");
+ &reload_html($whisper);
+ exit;
+#############>- ANZEIGEN WER SICH IM AKTUELLEN RAUM BEFINDET -<
+} elsif ($cmd eq "w") {
+ &list_dir("data/online/rooms/$room");
+ &read_file("data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ my ($is,$nr) = ("t",0);
+ foreach(@dir) {
+ if (-f "data/online/rooms/$room/$_") {
+ $personen = $personen." ".$_;
+ $nr++;
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>$room $door ($nr) [".$rstat[1]."] : <font color=ffa500>$personen</font></font>");
+ &reload_html($whisper);
+ exit;
+ #############>- ANZEIGEN WER SICH IM SYSTEM BEFINDET -<
+ } elsif ($cmd eq "wc" || $cmd eq "wc/") {
+ $raum = $cmd[1];
+ if ($raum eq "" && $cmd eq "wc") {
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/users/$_");
+ }
+ my $nr = ($#dir-1);
+ my ($nrs,$is) = ("","ist");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "sind";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>$nr Person$nrs $is insgesamt eingelogt: <font color=ffa500>$personen</font></font>");
+ } elsif ($raum eq "" && $cmd eq "wc/") {
+ my $msg2post;
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ &list_dir("data/online/rooms/$_",2);
+ &read_file("data/online/rstat/$_");
+ my @rstat = <DATEI>;
+ close DATEI;
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ my $nr = $#dir2-1;
+ $msg2post = $msg2post."<tr><td><b><font size=2 color=ffffff>$_ $door ($nr) [".$rstat[1]."] </font></b></td><td><font size=2 color=ffffff>";
+ foreach $chatter (@dir2) {
+ if (-f "data/online/rooms/$_/$chatter") {
+ $msg2post = $msg2post."$chatter ";
+ }
+ }
+ print "</font></td>";
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>Folgende Räume sind offen:</font><table>$msg2post</table>");
+ } elsif ($raum ne "") {
+ my $personen;
+ &list_dir("data/online/rooms/$raum");
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/rooms/$raum/$_");
+ }
+ my ($nr,$is) = (($#dir-1),"t");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "n";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff> $nr Person$nrs befinde$is sich im Raum \"$raum\": <font color=ffa500>$personen</font></font>");
+ }
+ &reload_html($whisper);
+ exit;
+#############>- ANZEIGEN IN WELCHEN RAUM SICH JMD. BEFINDET BZW. JMD IN EINEN RAUM FOLGEN -<
+ } elsif ($cmd eq "wj" || $cmd eq "ju") {
+ my $alias2search = $cmd[1];
+ &list_dir("data/online/rooms");
+ foreach $raum (@dir) {
+ &list_dir("data/online/rooms/$raum",2) if (-d "data/online/rooms/$raum");
+ foreach $user (@dir2) {
+ if (-f "data/online/rooms/$raum/$user") {
+ if ($user eq $alias2search) {
+ if ($cmd eq "wj") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2search <font color=ffffff>befindet sich im Raum \"$raum\" !</font></font>");
+ } else {
+ &change_room("ju",$raum,$room,$alias2search);
+ }
+ &reload_html($whisper,"change_room");
+ exit;
+ }
+ }
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2search <font color=ffffff> ist nicht eingelogt !</font></font>");
+ &reload_html($whisper);
+ exit;
+#############>- RAUMNESETZER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- RAUM ABSCHLIESSEN/AUFSCHLIESSEN -<
+ } elsif ($cmd eq "l") {
+ &prove_besetzer($alias,$room);
+ &hirachie($alias);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ my $lock = "0\n";
+ &zeit;
+ if ($room eq "Cyberbar") {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum ohne Erfolg ab ...</font></i>");
+ } else {
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum ab ...</font></i>");
+ } else {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum auf ...</font></i>");
+ }
+ for ($i=1;$i<=$#r_stat;$i++) {
+ $lock = $lock.$r_stat[$i];
+ }
+ write_file_new("data/online/rstat/$room");
+ print DATEI $lock;
+ close DATEI;
+ }
+ }
+ &reload_html($whisper);
+ exit;
+#############>- RAUMBESETZER ERNENNEN -<
+ } elsif ($cmd eq "su") {
+ &prove_besetzer($alias,$room);
+ &hirachie($alias);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ my $alias2su = $cmd[1];
+ &list_dir("data/online/rooms/$room");
+ foreach(@dir) {
+ if ($_ eq $alias2su) {
+ &read_file("data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ &hirachie($alias2su);
+ &prove_besetzer($alias2su,$room);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ &reload_html($whisper);
+ &post_prv($alias,"<font color=ffa500>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist bereits RB, WÄ oder OW)</font>");
+ exit;
+ }
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias ernennt \"$alias2su\" zum Raumbesetzer ...</font></i>");
+ &write_file("data/online/rstat/$room");
+ print DATEI $alias2su."\n";
+ close DATEI;
+ &reload_html($whisper);
+ exit;
+ }
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist nicht anwesend)</font>");
+ }
+ &reload_html($whisper);
+ exit;
+#############>- RAUMBESETZER ENTNENNEN -<
+ } elsif ($cmd eq "rsu") {
+ &prove_besetzer($alias,$room);
+ &hirachie($alias);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ my $alias2rsu = $cmd[1];
+ &read_file("data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ &prove_besetzer($alias2rsu,$room);
+ if ($r_besetzer eq "true") {
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias entzieht \"$alias2rsu\" die Raumbesetzerrechte ...</font></i>");
+ my $newrstat = $rstat[0].$rstat[1];
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $newrstat = $newrstat.$r_stat[$i] if ($r_stat[$i] ne $alias2rsu."\n");
+ }
+ &write_file_new("data/online/rstat/$room");
+ print DATEI $newrstat;
+ close DATEI;
+ } else {
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2rsu <font color=ffffff>ist kein Raumbesetzer und kann dieser Status auch nicht aberkannt werden !</font></font>");
+ }
+ }
+ &reload_html($whisper);
+ exit;
+#############>- RAUM EIN THEMA GEBEN -<
+ } elsif ($cmd eq "t") {
+ &prove_besetzer($alias,$room);
+ &hirachie($alias);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ my $theme;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $theme = $theme." ".$cmd[$i];
+ }
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias gibt dem Raum das Thema <font color=red>( $theme )</font> ...</font></i>");
+ $theme = $r_stat[0].$theme."\n";
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $theme = $theme.$r_stat[$i];
+ }
+ write_file_new("data/online/rstat/$room");
+ print DATEI $theme;
+ close DATEI;
+ }
+ &reload_html($whisper);
+ exit;
+#############>- SUPERUSER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- ALIAS VERBANNEN BZW. ENTBANNEN -<
+ } elsif ($cmd eq "ban" || $cmd eq "rban") {
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ my ($alias2handle,$registriert) = $cmd[1];
+ &list_dir("data/user/options");
+ foreach(@dir) {
+ $registriert = "true" if ($_ eq $alias2handle);
+ }
+ if ($registriert ne "true") {
+ if ($cmd eq "ban") {
+ if ($alias2handle ne "") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> existiert nicht in der Benutzerdatenbank und kann so nich verbannt werden !</font></font>");
+ } else {
+ &read_file("data/ban");
+ my @banned = <DATEI>;
+ my ($benutzer);
+ my $nr = $#banned+1;
+ close DATEI;
+ foreach(@banned) {
+ $benutzer = $benutzer." ".$_;
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>Folgende Benutzer sind verbannt [$nr]: <font color=ffa500>$benutzer</font></font>");
+ }
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> existiert nicht in der Benutzerdatenbank und kann so nicht \"entbannt\" werden !</font></font>");
+ }
+ &reload_html($whisper);
+ exit;
+ }
+ &read_file("data/ban");
+ my @banlist = <DATEI>;
+ close DATEI;
+ foreach(@banlist) {
+ if ($_ eq "$alias2handle\n") {
+ if ($cmd eq "ban") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> ist bereits verbannt worden !</font></font>");
+ } else {
+ my $banned = "false";
+ foreach(@banlist) {
+ $banned = "true" if ($_ eq "$alias2handle\n");
+ }
+ if ($banned eq "true") {
+ my @newbanlist;
+ foreach(@banlist) {
+ push @newbanlist,$_ if ($_ ne "$alias2handle\n");
+ }
+ &write_file_new("data/ban");
+ print DATEI @newbanlist;
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> wurde soeben \"entbannt\" !</font></font>");
+ }
+ }
+ &reload_html($whisper);
+ exit;
+ }
+ }
+ if ($cmd eq "ban") {
+ &hirachie($alias2handle);
+ if ($hirachie ne "ow" || $hirachie eq "wa") {
+ &write_file("data/ban");
+ print DATEI "$alias2handle\n";
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> wurde soeben verbannt und kann sich nun nichtmehr in den Chat einloggen !</font>");
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> ist ein Oberwächter und kann deshalb nicht verbannt werden !</font></font>");
+ }
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> konnte nicht \"entbannt\" werden, da <font color=ffa500>$alias2handle</font> garnicht verbannt war !</font></font>");
+ }
+ }
+ &reload_html($whisper);
+ exit;
+#############>- IP # VON ALIAS ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "ip") {
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ my $alias2prove = $cmd[1];
+ &list_dir("data/online/ident");
+ foreach(@dir) {
+ if ($_ eq $alias2prove) {
+ &read_file("data/online/ident/$_");
+ local $ipnr = <DATEI>;
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$_ <font color=ffffff>hat die IP-Nummer $ipnr !</font></font>");
+ }
+ }
+ }
+ &reload_html($whisper);
+ exit;
+#############>- ALIAS AUS DEM CHAT KATAPULTIEREN -<
+ } elsif ($cmd eq "k") {
+ &hirachie($alias);
+ if ($hirachie eq "wa" || $hirachie eq "ow") {
+ my $alias2kick = $cmd[1];
+ &list_dir("data/online/rooms");
+ foreach $raum (@dir) {
+ &list_dir("data/online/rooms/$raum",2);
+ foreach $chatter (@dir2) {
+ if ($chatter eq $alias2kick) {
+ &hirachie($alias2kick);
+ if ($hirachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist Oberwächter und kann nicht \"gekickt\" werden !</font></font>");
+ } elsif ($hirachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist Wächter und kann nicht \"gekickt\" werden !</font></font>");
+ } else {
+ &post_prv("$alias2kick","<script language=\"JavaScript\">window.open(\"index.pl?tmp=kick\",\"_top\");</script>");
+ &zeit;
+ $_ = undef if ($room eq $_);
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias katapultiert \"$alias2kick\" aus dem Chat ...</font></i>",$_);
+ &remove_online($alias2kick,$_,"kick");
+ &secure_removeid($alias2kick);
+ }
+ &reload_html($whisper);
+ exit;
+ }
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist nicht anwesend und kann nicht \"gekickt\" werden !</font></font>");
+ }
+ &reload_html($whisper);
+ exit;
+#############>- EINEN BENUTZER AUS DEM SYSTEM LÖSCHEN -<
+ } elsif ($cmd eq "kill") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ my $alias2kill = $cmd[1];
+ &hirachie($alias2kill);
+ if ($hirachie eq "ow") {
+ &post_prv($alias,"<font size color=ffa500>$alias2kill</font> <font color=ffffff>ist Oberwächter und kann nicht aus dem System entfernt werden !</font>");
+ } elsif ($hirachie eq "wa") {
+ &post_prv($alias,"<font size color=ffa500>$alias2kill</font> <font color=ffffff>ist Wächter und kann nicht aus dem System entfernt werden !</font>");
+ } else {
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias killt \"$alias2kill\" ganz und gar aus dem System ...</font></i>");
+ unlink("data/user/options/$alias2kill");
+ unlink("data/user/profiles/$alias2kill");
+ unlink("data/user/gbooks/$alias2kill");
+ unlink("data/user/counts/$alias2kill");
+ unlink("data/user/counts/$alias2kill.online");
+ unlink("data/user/lastlogin/$alias2kill");
+ unlink("data/user/memos/$alias2kill");
+ }
+ }
+ &reload_html($whisper);
+ exit;
+ #############>- SYSTEMNACHRICHT IN ALLE BESTEHENDEN RÄUME POSTEN -<
+ } elsif ($cmd eq "sys") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $sys_msg = $sys_msg." ".$cmd[$i];
+ }
+ &zeit;
+ &post_all("<i><font color=ffffff>($hours:$min:$sec)</font></i> <b><font size=2 color=red>SYSTEMNACHRICHT</font></b><i><font color=ffffff>: $sys_msg ...</font></i>");
+ }
+ &reload_html($whisper);
+ exit;
+#############>- ALIAS ZUM WÄCHTER ERNNENNEN BZW. ZUM NORMALEN CHATTER DEGRADIEREN -<
+ } elsif ($cmd eq "wa" || $cmd eq "rwa") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ &zeit;
+ my $alias2handle = $cmd[1];
+ if ($cmd eq "wa") {
+ my $anerkennen = "false";
+ &list_dir("data/user/options");
+ foreach(@dir) {
+ if ($_ eq $alias2handle) {
+ $anerkennen = "true";
+ }
+ }
+ if ($anerkennen eq "true") {
+ &hirachie($alias2handle);
+ if ($hirachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff>ist bereits als Wächter eingetragen. Eine erneuerte Eintragung ist nicht möglich!</font></font>");
+ } elsif ($hirachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff>ist schon als Oberwächter eingetragen. Oberwächter können nicht gleichzeitig Wächter sein!</font></font>");
+ } else {
+ &write_file("data/wa");
+ print DATEI $alias2handle."\n";
+ close DATEI;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font><font color=ffa500> $alias ernennt \"$alias2handle\" zum Wächter ...</font></i>");
+ }
+ } else {
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2handle <font color=ffffff>kann nicht zum Wächter ernannt werden da Benutzername nicht existiert!</font></font>");
+ }
+ } elsif ($cmd eq "rwa") {
+ &read_file("data/wa");
+ my @wafile = <DATEI>;
+ close DATEI;
+ my $aberkennen = "false";
+ foreach(@wafile) {
+ if ($_ ne "$alias2handle\n") {
+ push @newafile,$_;
+ } else {
+ $aberkennen = "true";
+ }
+ }
+ &write_file_new("data/wa");
+ print DATEI @newafile;
+ close DATEI;
+ if ($aberkennen eq "true") {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat \"$alias2handle\" vom Wächter zum normalen Chatter degradiert ...</font></i>");
+ } else {
+ &post("<font size=2 color=ffa500>$alias2handle <font color=ffffff>konnte der Wächterstatus nicht aberkannt werden da Benutzer kein Wächter ist!</font></font>");
+ }
+ }
+ }
+#############>- ENDE DER CHATBEFEHLE -<
+}
+&reload_html($whisper,$action);
+}
+
+sub change_room { # Den Chat-Raum wechseln
+ my ($method,$newroom,$oldroom,$alias2follow) = @_;
+ # Überprüfen, ob Alias Raum betreten darf
+ &read_file("data/online/rstat/$newroom");
+ my @rstat = <DATEI>;
+ close DATEI;
+ if ($rstat[0] eq "1\n") {
+ &hirachie($alias);
+ if ($hirachie eq "wa" || $hirachie eq "ow") {
+ } else {
+ &post_prv("$alias","<font size=2 color=ffffff>Der Raum \"<font color=ffa500>$newroom</font>\" ist leider abgesperrt!</font>");
+ &reload_html($id,$action);
+ exit;
+ }
+ }
+ $room = $oldroom;
+ &zeit; # Zeit 'erneuern'
+ if ($method eq "j") {
+ unlink("data/online/rooms/$oldroom/$alias");
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias wechselt in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias kommt aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ &post_prv("$alias","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>Du wechselst aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ } elsif ($method eq "ju") {
+ unlink("data/online/rooms/$oldroom/$alias");
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias folgt \"$alias2follow\" in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias kommt aus dem Raum \"$oldroom\" und folgt \"$alias2follow\" herein nach \"$newroom\" ...</font></i>");
+ &post_prv("$alias","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>Du folgst \"$alias2follow\" aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ }
+ # Sicherheitshalber Alias erneuert entf.
+ unlink("data/online/rooms/$oldroom/$alias");
+ &rm_rstat($oldroom,$alias);
+ &rm_rooms;
+}
+
+sub prove_besetzer { # Prüfen, ob Benutzer Raumbesetzerrechte hat
+ my ($r_alias,$r_room) = @_;
+ $r_besetzer = "false";
+ &read_file("data/online/rstat/$r_room");
+ @r_stat = <DATEI>;
+ close DATEI;
+ for($i=2;$i<=$#r_stat;$i++) {
+ $r_besetzer = "true" if ($r_stat[$i] eq $r_alias || $r_stat[$i] eq $r_alias."\n");
+ }
+} \ No newline at end of file
diff --git a/0.4.1/main2.pl b/0.4.1/main2.pl
new file mode 100644
index 0000000..dbc736a
--- /dev/null
+++ b/0.4.1/main2.pl
@@ -0,0 +1,568 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+
+if ($var eq "list_alias_html") {
+ &list_alias_html;
+} elsif ($var eq "alias_html") {
+ &alias_html;
+} elsif ($var eq "edit_profile_html") {
+ &edit_html("edit_profile_html");
+} elsif ($var eq "edit_options_html") {
+ &edit_html("edit_options_html");
+} elsif ($var eq "gb_html") {
+ &secure_checkid($alias);
+ &gb_html;
+} elsif ($var eq "post_gb") {
+ &secure_checkid($alias);
+ &post_gb;
+} elsif ($var eq "edit_profile") {
+ &secure_checkid($alias);
+ &edit("edit_profile");
+} elsif ($var eq "edit_options") {
+ &secure_checkid($alias);
+ &edit("edit_options");
+} elsif ($var eq "rm_gb_alias") {
+ &secure_checkid($alias);
+ &rm_gb;
+} else {
+ &error("Parameter fehlt");
+}
+
+###########################
+##HAUPTTEIL DIESER DATEI:##
+###########################
+
+sub gb_html { # Das Benutzerboard/Gästebuch.
+ my $message = $_[0];
+ &start_html("Benutzerboard");
+if ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </i>
+ einen Text und poste
+ <u>dann</u>
+ !
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Vielen Dank für Deinen Beitrag. Wenn Du willst, kannst Du jetzt gleich noch einen Eintrag posten ...
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Falls Du Anregungen oder Verbesserungsvorschläge für die Community hast, dann poste doch einen kleinen Eintrag :-)
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="guestbook">
+ <input type="hidden" name="id" value="y">
+ <input size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+ if (-e "data/guestbook") {
+ open (DATEI,"<data/guestbook") || &error("Konnte dat/guestbook nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ print
+ $q->div(@datei);
+ }
+ print
+ $q->end_html;
+}
+
+
+sub post_gb { # Wenn etwas in ein Gästebuch eingetragen wird
+ &zeit;
+ if ($msg eq "") {
+ if ($id eq "y") { # Überprüfen, ob Benutzerboard- oder Privatgästebuch
+ &gb_html("post_empty");
+ } else {
+ &alias_html("post_empty");
+ }
+ exit;
+ }
+ $msg =~ s#<#&lt\;#g;
+ my $tmpath = "";
+ if ($id eq "y") {
+ $tmpath = "data/guestbook";
+ } else {
+ $tmpath = "data/user/gbooks/$tmp";
+ }
+ if (-e "$tmpath") {
+ &read_file("$tmpath");
+ my @datei = <DATEI>;
+ close DATEI;
+ pop(@datei) if ($#datei > 99);
+ my @newdatei = "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ @newdatei = ("@newdatei", "@datei");
+ &write_file_new("$tmpath");
+ print DATEI @newdatei;
+ close DATEI;
+ } else {
+ &write_file_new("$tmpath");
+ print DATEI "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ close DATEI;
+ }
+ if ($id eq "y") {
+ &gb_html("post_ok");
+ exit;
+ } else {
+ post_prv("$tmp","<font size=2 color=ffffff><a href=\"main2.pl?alias=$alias&var=alias_html&tmp=$tmp&tmpid=$tmpid\" target=\"_new\">$alias</a> hat soeben einen Pin in <a href=\"main2.pl?alias=$alias&var=alias_html&tmp=$tmp&tmpid=$tmpid\" target=\"_new\">Dein Profil</a> gehängt ... </font>");
+ &alias_html;
+ exit;
+ }
+}
+
+sub rm_gb { # Gästebucheintrag entfernen
+ $tmp = $alias;
+ &read_file("data/user/gbooks/$alias");
+ my @gbfile = <DATEI>;
+ close DATEI;
+ my @newgbfile = ();
+ for($i=0; $i <= $#gbfile; $i++) {
+ push(@newgbfile,$gbfile[$i]) if ($i != $id);
+ }
+ &write_file_new("data/user/gbooks/$alias");
+ print DATEI @newgbfile;
+ close DATEI;
+ &alias_html("rm_ok");
+}
+
+sub list_alias_html { # Liste aller Benutzer
+ &start_html("Alle Benutzer");
+ &list_dir("data/user/options");
+ my @liste = sort(@dir);
+ my $nr = $#dir-1;
+print <<END;
+ <div>
+ Es sind z.Z. genau $nr Benutzernamen in der Datenbank vorhanden! (Sortiert nach #, A-Z, a-z)
+ </div>
+ <hr>
+ <div>
+END
+ foreach(@liste) {
+ if (-f "data/user/options/$_") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid" },
+ "$_"),
+ " ";
+ }
+ }
+print <<END;
+ </div>
+</body>
+</html>
+END
+}
+
+sub alias_html { # Anzeigen eines Benutzerprofils
+ my $message = $_[0];
+ local $counter = undef;
+ &read_file("data/user/counts/$tmp");
+ $counter = <DATEI>;
+ close DATEI;
+ $counter++;
+ &write_file_new("data/user/counts/$tmp");
+ print DATEI $counter."\n".$counter[1];
+ close DATEI;
+ &start_html($tmp);
+print <<END;
+<div>
+ <a href="htdocs.pl?var=werda_html&alias=$alias&tmpid=$tmpid">Hier</a>
+ gehts zur Gesamtübersicht !
+</div>
+<hr>
+END
+if ($message eq "rm_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Der von Dir gewählte Eintrag wurde erfolgreich gelöscht.
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </u>
+ einen Text und poste
+ <u>dann</u>
+ !
+ <hr>
+END
+}
+ &read_file("data/user/profiles/$tmp");
+ @data = <DATEI>;
+ close DATEI;
+print <<END;
+ <div>
+ Dieses Profil wurde insgesamt schon $counter mal aufgerufen !
+ <br>
+ <br>
+ Alias: $tmp
+ <br>
+ <br>
+ Nachname: $data[0]
+ <br>
+ <br>
+ Vorname: $data[1]
+ <br>
+ <br>
+ Alter: $data[2]
+ <br>
+ <br>
+ Wohnort: $data[3]
+ <br>
+ <br>
+ E-Mail:
+ <a href="mailto:$data[4]">$data[4]</a>
+ <br>
+ <br>
+ ICQ-Nummer: $data[5]
+ <br>
+ <br>
+ Homepage:
+ <a href="$data[6]" target="_new">$data[6]</a>
+ <br>
+ <br>
+ Weiteres:
+ <br>
+ $data[7]
+ <hr>
+ Hier kannst Du $tmp eine Nachricht hinterlassen!
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input type="text" size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+if (-e "data/user/gbooks/$tmp") {
+ open (DATEI,"<data/user/gbooks/$tmp") || &error("Konnte data/user/gbooks/$tmp nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ if ($alias ne $tmp) {
+ print @datei;
+ } else {
+print <<END;
+ <table>
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="rm_gb_alias">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+END
+for($i=0; $i <= $#datei; $i++) {
+print <<END;
+ <tr>
+ <td>
+ <input type="radio" name="id" value="$i">
+ </td>
+ <td>
+ <div class=q>
+ $datei[$i]
+ </div>
+ </td>
+ </tr>
+END
+}
+print <<END;
+ </table>
+ <table>
+ <tr>
+ <td>
+ <font color=ffffff>
+ <input type="submit" value="Makierten Eintrag löschen">
+ </font>
+ </td>
+ <td>
+ <font color=ffffff>
+ <input type="reset" value="Makierung rückgängig machen">
+ </font>
+ </td>
+ </tr>
+ </table>
+ </form>
+END
+}
+}
+ print
+ $q->end_html;
+}
+
+sub edit_html { # Chat-Optionen / Benutzerprofil editieren
+ my ($method,$message) = @_;
+ &start_html("Benutzerprofil ändern");
+ if ($method eq "edit_options_html") {
+ &read_file("data/user/options/$alias");
+ } elsif ($method eq "edit_profile_html") {
+ &read_file("data/user/profiles/$alias");
+ }
+ @data = <DATEI>;
+ close DATEI;
+ if ($method eq "edit_options_html") {
+ chomp($data[0]);
+ if ($message eq "edit_options_ok") {
+print <<END;
+<script language="JavaScript">
+ open("main.pl?var=input_html&alias=$alias&room=$room&col=$col&secol=$secol&tmpid=$tmpid","input");
+ open("htdocs.pl?var=menu_html&alias=$alias&room=$room&col=$col&secol=$secol&tmpid=$tmpid","menu");
+</script>
+<div class=b>
+ Hinweis:
+</div>
+<div>
+ Du hast soeben Deine Chat-Optionen erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren. Um
+ weiterzuchatten einfach Fenster schliessen!
+</div>
+<hr>
+END
+ } elsif ($message eq "edit_pw_wrong") {
+print <<END;
+<div class=b>
+ ACHTUNG!
+</div>
+<div>
+ Du hast soeben versucht, dein Passwort zu ändern. Jedoch stimmte die Erste Eingabe nicht mit der Zweiten überein.
+ Bitte versuch es erneuert ...
+</div>
+<hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Deine Chat-Optionen editieren!" ),
+ $q->hr;
+ }
+print <<END;
+<script lang="javascript" type="text/javascript">
+<!--
+
+function radioWert(rObj) {
+ for (var i=0; i<rObj.length; i++) if (rObj[i].checked) return rObj[i].value;
+ return false;
+}
+
+function insertcode( code ) {
+ document.optionen.elements[radioWert(document.optionen.eingabe)].value = code;
+}
+
+//-->
+</script>
+
+<form name="optionen" action="main2.pl">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="var" value="edit_options">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Passwort
+ <font color=ffa500>
+ (Gut merken !!)
+ </font>
+ <br>
+ <input type="password" name="id" value="$data[0]">
+ </div>
+ </td>
+ <td width=20>
+ </td>
+ <td>
+ <div>
+ Geb hier das Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp" value="$data[0]">
+ </div>
+ </td>
+ </tr>
+ </table>
+<br>
+<br>
+ <table>
+ <tr>
+ <td>
+ <div>
+ <input type="radio" name="eingabe" value="col" checked>
+ Auswahl von Farbe 1
+ <br>
+ (Farbe Deines Nicks):
+ <br>
+ <input name="col" size="6" maxlength="6" value="$data[1]">
+ </div>
+ </td>
+ <td width=20>
+ </td>
+ <td>
+ <div>
+ <input type="radio" name="eingabe" value="secol">
+ Auswahl von Farbe 2
+ <br>
+ (Farbe Deiner Nachrichten):
+ <br>
+ <input name="secol" size="6" maxlength="6" value="$data[2]">
+ </div>
+ </td>
+ </tr>
+ </table>
+<br>
+ <div>
+ Beliebige Auswahl makieren und Farbe wählen. Um Deine Optionen abzuspeichern,
+ auf "Daten ändern" klicken!
+ </div>
+ <br>
+END
+ &read_file("colors.sno");
+ @colors = <DATEI>;
+ close DATEI;
+ print @colors;
+ } elsif ($method eq "edit_profile_html") {
+ if ($message eq "edit_profile_ok") {
+print <<END;
+ <div class=b>
+ Hinweis:
+ </div>
+ <div>
+ Du hast soeben Dein Profil erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren:
+ <hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Dein Profil editieren!" ),
+ $q->hr;
+ }
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="var" value="edit_profile">
+ <div>
+ Dein Nachname:
+ <br>
+ <input name="nachname" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ Dein Vorname:
+ <br>
+ <input name="vorname" value="$data[1]">
+ </div>
+ <br>
+ <div>
+ Dein Alter:
+ <br>
+ <input name="alter" value="$data[2]">
+ </div>
+ <br>
+ <div>
+ Dein Wohnort:
+ <br>
+ <input name="wohnort" value="$data[3]">
+ </div>
+ <br>
+ <div>
+ Deine E-Mail Adresse:
+ <br>
+ <input name="email" value="$data[4]">
+ </div>
+ <br>
+ <div>
+ Deine ICQ-Nummer:
+ <br>
+ <input name="icq" value="$data[5]">
+ </div>
+ <br>
+ <div>
+ Deine Homepage:
+ <br>
+ <input name="homepage" value="$data[6]">
+ </div>
+ <br>
+ <div>
+ Weiteres:
+ <br>
+ <textarea rows="5" cols="40"name="weiteres" wrap="virtual">$data[7]</textarea>
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <font color=ffffff>
+ <input type="submit" value="Daten ändern ...">
+ </font>
+ </form>
+</body>
+</html>
+END
+}
+
+
+sub edit { # Benutzerprofil od. Chat-Optionen abspeichern
+ my $method = $_[0];
+ if ($method eq "edit_profile") {
+ &write_file_new("data/user/profiles/$alias");
+ print DATEI $q->param('nachname')."\n".$q->param('vorname')."\n".$q->param('alter')."\n".$q->param('wohnort')."\n".$q->param('email')."\n".$q->param('icq')."\n".$q->param('homepage')."\n".$q->param('weiteres');
+ close DATEI;
+ &edit_html("edit_profile_html","edit_profile_ok");
+ } elsif ($method eq "edit_options") {
+ if ($id ne $tmp) {
+ &edit_html("edit_options_html","edit_pw_wrong");
+ exit;
+ }
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat seine Chateinstellungen geändert ...</font></i>");
+
+ &write_file_new("data/user/options/$alias");
+ print DATEI $id."\n".$col."\n".$secol;
+ close DATEI;
+ &edit_html("edit_options_html","edit_options_ok");
+ }
+}
diff --git a/0.4.1/online.pl b/0.4.1/online.pl
new file mode 100644
index 0000000..e8e9f40
--- /dev/null
+++ b/0.4.1/online.pl
@@ -0,0 +1,72 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+&secure_checkid($alias);
+
+# Onlinezeit zählen !
+&read_file("data/online/users/$alias");
+ my $oldstamp = <DATEI>;
+close DATEI;
+ if ($oldstamp > (time - 60)) {
+ &read_file("data/user/counts/$alias.online");
+ my $online = <DATEI>;
+ close DATEI;
+ my $total = (time-$oldstamp+$online);
+ &write_file_new("data/user/counts/$alias.online");
+ print DATEI $total;
+ close DATEI;
+ }
+##### ENDE
+
+&start_html("Online","online");
+&online($alias,$room);
+&list_dir("data/online/rooms/".$room);
+print
+ $q->div( "$room:" ),
+ "<font size=1 color=ffffef face=arial>";
+ foreach $online (@dir) {
+ if (-f "data/online/rooms/$room/$online") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$online&tmpid=$tmpid",
+ -target=>"$online" }, "$online"), $q->br;
+ }
+ }
+print
+ "</font>",
+ $q->end_html;
+
+sub online { # Benutzer in die Onlineliste hinzufügen bzw. erneuern
+ my ($alias,$room) = @_;
+ &write_file_new("data/online/users/$alias");
+ print DATEI time;
+ close DATEI;
+ if (-e "data/online/rooms/$room") { # Falls Raum nicht existiert anlegen
+ } else {
+ &write_file_new("data/online/rstat/$room"); # Raumbesetzerstatus setzen
+ print DATEI "0\n\n$alias\n";
+ close DATEI;
+ mkdir "data/online/rooms/$room", 0777;
+ }
+ &write_file_new("data/online/rooms/$room/$alias");
+ print DATEI time;
+ close DATEI;
+ &read_file("data/online/prove"); # Räume und Chatter auf Existenz überprüfen
+ my $provetime = <DATEI>;
+ close DATEI;
+ if ($provetime < (time - 30)) {
+ &write_file_new("data/online/prove");
+ print DATEI time;
+ close DATEI;
+ &rm_alias("data/online/users");
+ &rm_rooms;
+ }
+} \ No newline at end of file
diff --git a/0.4.1/push.pl b/0.4.1/push.pl
new file mode 100644
index 0000000..5ae82c5
--- /dev/null
+++ b/0.4.1/push.pl
@@ -0,0 +1,97 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+CGI->compile(':all');
+$q = new CGI;
+
+$| = 1; # Cache von Perl ausschalten
+
+print
+ $q->header; # HTML-Header erzeugen
+
+require config;
+
+&secure_checkid($alias);
+
+########################################
+##ANFANG DER ZU STREAMENDEN HTML-DATEI##
+########################################
+
+print <<END;
+<html>
+ <head>
+<script language="JavaScript">
+<!--
+// Scroll-Routine von Anklepper (http://www.anklepper.de)
+// speziell für yChat (http://www.yChat.de), Copyright 2000
+scrolling = true;
+moves_steps = 4; // Schrittgröße
+moves_interval = 4; // Schrittgeschwindigkeit
+
+function moves()
+{
+ if( scrolling != false )
+ window.scrollBy( 0, moves_steps );
+ window.setTimeout( "moves()", moves_interval );
+}
+
+moves();
+//-->
+</script>
+ </head>
+<body bgcolor=000000 link=FFFFFF alink=FFFFEF vlink=FFFFEF>
+END
+
+#############################
+##BEGRÜSSUNGSTEXT SCHREIBEN##
+#############################
+
+my $msgfile;
+
+ print
+ $q->font( { -size=>1,
+ -color=>"ffffff",
+ -face=>"arial"},
+ "$title - Created & Copyright by Paul C. Bütow $tmp\n");
+
+ if (-f "data/user/memos/$alias") { # Nach Memonachrichten checken!
+ print "\n<br>";
+ &read_file("data/user/memos/$alias");
+ my $memos = <DATEI>;
+ close DATEI;
+ print $memos;
+ unlink("data/user/memos/$alias");
+ }
+ my $msgfile = "data/msgs/$alias";
+ &write_file_new($msgfile);
+ print DATEI $q->br;
+ close DATEI;
+ print $q->br;
+ open (MSGFILE, $msgfile);
+
+###############################
+##ENDLOSSCHLEIFE FÜR DEN PUSH##
+###############################
+
+my ($times,$online) = (0,"false");
+for (;;) {
+ for ($curpos = tell(MSGFILE); <MSGFILE>; $curpos = tell(MSGFILE)) {
+ print $_ ;
+ }
+ $times++;
+ if ($times > 14) { # Nach 15 Sekunden
+ print "\n<!--PING//-->"; # Ping zum Browser senden
+ $times = 0; # Sekundenzahl auf 0 zurücksetzen
+ $online = "true" if (-e "data/online/users/$alias");
+ if ($online eq "false") {
+ print "<font size=2 color=red>Aus technischen Gründen bitte auf <a href=\"push.pl?alias=$alias&room=$room&var=clear_screen&tmpid=$tmpid\">Weiterchatten</a> klicken.</font>";
+ exit;
+ }
+ $online = "false"
+ }
+ sleep 1;
+ seek(MSGFILE, $curpos, 0); # Position wiederherstellen
+}
+
diff --git a/0.4.1/setup.sh b/0.4.1/setup.sh
new file mode 100644
index 0000000..d076ded
--- /dev/null
+++ b/0.4.1/setup.sh
@@ -0,0 +1,42 @@
+#!/bin/sh
+mkdir data
+mkdir data/logs
+chmod 777 data/logs
+mkdir data/msgs
+chmod 777 data/msgs
+mkdir data/user
+chmod 777 data/user
+mkdir data/user/counts
+chmod 777 data/user/counts
+mkdir data/user/memos
+chmod 777 data/user/memos
+mkdir data/user/options
+chmod 777 data/user/options
+mkdir data/user/profiles
+chmod 777 data/user/profiles
+mkdir data/user/gbooks
+chmod 777 data/user/gbooks
+mkdir data/user/lastlogin
+chmod 777 data/user/lastlogin
+mkdir data/online
+chmod 777 data/online
+mkdir data/online/rooms
+chmod 777 data/online/rooms
+mkdir data/online/rstat
+chmod 777 data/online/rstat
+mkdir data/online/users
+chmod 777 data/online/users
+mkdir data/online/ident
+chmod 777 data/online/ident
+chmod 777 data/htdocs/*
+chmod 777 *
+mkdir dokus/
+mv *.txt dokus/
+mkdir ../../htdocs/yChat/
+mv *.gif ../../htdocs/yChat/
+mv *.jpg ../../htdocs/yChat/
+echo
+echo yChat Setup beendet ...
+echo Created and copyrighted by Paul C. Bütow aka Snooper
+echo
+
diff --git a/0.4.1/yBanner.gif b/0.4.1/yBanner.gif
new file mode 100644
index 0000000..e4b691e
--- /dev/null
+++ b/0.4.1/yBanner.gif
Binary files differ
diff --git a/0.4.1/yBanner2.gif b/0.4.1/yBanner2.gif
new file mode 100644
index 0000000..0e9684e
--- /dev/null
+++ b/0.4.1/yBanner2.gif
Binary files differ
diff --git a/0.4.1/yChat.jpg b/0.4.1/yChat.jpg
new file mode 100644
index 0000000..61eabfb
--- /dev/null
+++ b/0.4.1/yChat.jpg
Binary files differ
diff --git a/0.4.2/CREDITS.txt b/0.4.2/CREDITS.txt
new file mode 100644
index 0000000..b1a6610
--- /dev/null
+++ b/0.4.2/CREDITS.txt
@@ -0,0 +1,26 @@
+############################## yChat.de SETUP ###############################
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+
+Vielen Dank an alle Personen, dir mit geholfen haben ( und immernoch helfen )
+yChat besser zu machen:
+
+ - Andreas Buchwald aka Anklepper, für die Programmierung des
+ "Nach-UntenScroll-JavaScripts", des "Ferlaufform-JavaScripts" im
+ Texteingabeframe und für die technische Umsetzung, daß sich das
+ Inputframe bei jedem Textposting nicht wieder reloadet.
+ ( www.anklepper.de ).
+
+ - Dave aka Truhe, für die Erstellung der Farbtabelle unter Chatoptionen inkl.
+ Auswähl-JavaScript!
+ ( maligree.yi.org )
+
+ - Michi aka Snoopy, für das Testen des Skripts auf seinem Server.
+ ( www.berlin-singeltreff.de ).
+
+ - Florian B. aka RocketKid für designtechnische Anregungen.
+ ( www.Rocket-Kid.de und www.proa.de )
+
+ - Larry Wall, für die Erfindung von Perl !
+
+ - Stefan Münz, für die Erstellung von SelfHTML !
diff --git a/0.4.2/README.txt b/0.4.2/README.txt
new file mode 100644
index 0000000..ce90571
--- /dev/null
+++ b/0.4.2/README.txt
@@ -0,0 +1,33 @@
+############################## yChat.de README ##############################
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+Allgemeine Bedingungen bezgl. yChat:
+
+ - Das yChat-System darf ohne Erleubnis des Autors nicht auf irgendeiner Art
+ und Weise weitergegeben- oder eingesetzt werden.
+
+ - Wird das yChat-System eingesetzt, so darf es manipuliert werden, soweit
+ die Copyright-Hinweise des Autors, die Versionsbezeichnung und der Link
+ auf der Startseite nach servers.yChat.de unverändert bleibt.
+ Ansonsten darf der gesamte Code manipuliert werden.
+
+ - Wird das yChat-System erlaubter Weise manipuliert, so muß das veränderte
+ Skript auf Anforderung an den Autor weitergegeben werden. Dieser darf
+ die Veränderungen in das Standard-yChat-System integrieren.
+
+ - Wird das yChat-System eingesetzt, su muß dem Autor die Location bzw. die
+ URL bekanntgegeben werden. Diese wird in servers.yChat.de eingetragen.
+ und mit einer URL wwX.yChat.de verlinkt. Wobei X für die Nummer des jew.
+ Servers steht.
+
+ - Es ist verboten, Sourcecode aus dem yChat-System zu kopieren und
+ für andere, nicht von yChat abhängige Perl-Programme einzusetzen.
+
+Im Flogenden einige yChat-bezügl. Verknüpfungen:
+
+ www.servers.yChat.de => Liste aller laufenden yChat-Systeme
+ www.setup.yChat.de => Installationsdokumentation
+ www.readme.yChat.de => Allgemeine Bedingungen usw.
+ www.todo.yChat.de => Funktionen, die später integriert werden
+ www.updates.yChat.de => Update-Liste
+ www.yChat.de => Das Skript im Einsatz
diff --git a/0.4.2/SETUP.txt b/0.4.2/SETUP.txt
new file mode 100644
index 0000000..e6767e5
--- /dev/null
+++ b/0.4.2/SETUP.txt
@@ -0,0 +1,102 @@
+############################## yChat.de SETUP ###############################
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+
+yChat findest Du im Internet unter der Adresse www.yChat.de. Bei Kritik,
+Anregungen oder Fragen bitte in das dort vorhandene Board posten oder eine
+E-Mail an die oben stehende Adresse senden. Ich bemühe mich, yChat so gut wie
+möglich zu machen und bin über Ratschläge immer sehr erfreut :-) ...
+
+Die Installation kann auf Unix-Systemen voll automatisch duchgeführt werden.
+Allerdings ist dafür ein Telnet-Zugang notwendig. Kopiere alle vorhandenen
+Dateien in das Verzeichnis cgi-bin/yChat und führe dann das Shellskript
+setup.sh mit dem Befehl ./setup.sh aus. Alle Verzeichnisse werden
+automatisch erstellt. Dies wurde allerdings nur auf SuSE Linux Systemen
+mit root-Zugriff getestet. Solltest Du ein anderes System verwenden oder
+den Chat auf einen virtuellen Webserver installieren wollen, dann mußt Du
+unter umständen das Verzeichnis "../../htdocs/yChat" nach "../../yChat"
+in der setup.sh umbenennen. Ansonsten werden die dazugehörigen Grafikdateien
+falsch oder garnicht kopiert.
+
+Wenn Du keinen Telnet-Zugang hast, kannst Du hier die Verzeichnisse manuell
+erstellen:
+
+Folgende Basis-Dateien sind im Chat enthalten und müssen in das cgi-bin
+Verzeichnis kopiert werden. Z.B. nach ./cgi-bin/yChat/:
+
+config.pm => Configurationsdatei ("Shared subs")
+htdocs.pl => HTML-Dokumentdateien (Nicht unbedingt erforderlich)
+index.pl => Startskript (Registrierung, Frameset, Login, Daten edit.)
+main.pl => Hauptskript (Alle Hauptfunktionen des Chats)
+main2.pl => Skript für editieren der Benutzerdaten etc.
+online.pl => Anzeige und Überprüfung der eingelogten Benutzer
+push.pl => Server-Push-Routine
+setup.sh => Dient zur automatischen Einrichtung des Chats.
+README.txt => Beinhaltet wichtige Informationen
+UPDATES.txt => Updateliste der verschiedenen Versionen
+CREDITS.txt => Personen, die geolfen haben yChat zu proggen.
+SETUP.txt => Dieses Dokument
+colors.txt => Datei beinhaltet alle Farben in hex. für die Chatoptionen
+help.sno => Datei beinhaltet alle Chatbefehle
+
+Folgende Verzeichnisse müssen erstellt werden (chmod 777 sollte
+funktionieren):
+
+- Hier befinden sich alle für den Chat notwenidgen Daten:
+ ./cgi-bin/yChat/data/*
+
+- Hier befinden sich alle Logdateien, die vom Chat erstellt werden:
+ ./cgi-bin/yChat/data/logs/*
+
+- Hier befinden sich die Message-Dateien der eingelogten Benutzer:
+ ./cgi-bin/yChat/data/msgs/*
+
+- Hier befinden sich alle Daten der registrierten Benutzer:
+ ./cgi-bin/yChat/data/user/*
+
+- Hier wird abgespeichert, wie oft ein Benutzerprofil insgesant schon
+ aufgerufen wurde und wie lange die Chatter schon online waren:
+ ./cgi-bin/yChat/data/user/counts/*
+
+- Hier werden alle Memos abgespeichert.
+ ./cgi-bin/yChat/data/user/memos/*
+
+- Hier befinden sich alle Chat-Optionen und Passwörter der registrierten
+ Benutzer:
+ ./cgi-bin/yChat/data/user/options/*
+
+- Hier befinden sich alle Benutzerprofile der Benutzer:
+ ./cgi-bin/yChat/data/user/profiles/*
+
+- Hier befinden sich alle Gästebucheinträge der Benutzer:
+ ./cgi-bin/yChat/data/user/gbooks/*
+
+- Hier wird abgespeichert, wann der der jew. benutzer zum letzten mal das System
+ betreten hat.
+ ./cgi-bin/yChat/data/user/lastlogin/*
+
+- Hier befinden sich alle Daten zu den aktuellen Chaträumen und User die online sind
+ ./cgi-bin/yChat/data/online/*
+
+- Hier befinden sich alle offnenen Räume
+ ./cgi-bin/yChat/data/online/rooms/*
+
+- Hier befinden sich die Chatter, die sich in den jew. Räumen befinden. Die
+ Verzeichnisse der Räume werden automatisch erstellt.
+ ./cgi-bin/yChat/data/online/rooms/RAUMNAME/*
+
+- Hier befinden sich alle Chatter, die sich z.Z. im System befinden
+ ./cgi-bin/yChat/data/online/users/*
+
+- Hier befinden sich alle IP-Nummern und TempIDs der eingelogten Chatter
+ ./cgi-bin/yChat/data/online/ident/*
+
+Alle Grafikdateien (+.gif und *.jpg) sollten in ein nicht-CGI-BIN-Verzeichnis kopiert
+werden. Z.B. nach ./yChat/.
+
+Zum schluß sollte die config.pm-Datei nach wünschen editiert werden. Allerdings sollten
+die Copyright Hinweise und die Versionsnummern nicht manipuliert werden.
+
+Folgende Dateien werden von yChat automatisch erstellt:
+
+Viel Spaß beim Chatten ... \ No newline at end of file
diff --git a/0.4.2/TODO.txt b/0.4.2/TODO.txt
new file mode 100644
index 0000000..59d9e3e
--- /dev/null
+++ b/0.4.2/TODO.txt
@@ -0,0 +1,24 @@
+Folgende Funktionen werden demnächst in yChat integriert:
+
+ - Die Schlucht (Ein Raum wo Chatter hineingeworfen werden,
+ die sich nicht benehmen und noch nicht aus dem Chat
+ katapultiert werden sollen).
+
+ - Löschung aller Chatter, die sich seit 60 Tagen nicht mehr
+ eingelogt haben.
+
+ - IP-Adressen ver-/entbannen.
+
+ - E-Mail zusendung bei verlorenem Passwort.
+
+ - Eine Top 20 (Onlinezeit) der Chatter
+
+ - Unter "Benutzer" sollen Chatter über eine Eingabemaske nach
+ dem Anfangsbuchstaben gesucht werden können (vergl. Kilahu).
+
+ - Der Cybarkeeper (künstlich intilligenter Chatroboter, der
+ sich im Hauptraum Cyberbar aufhält, virtuelle Drinks verteilt
+ und von Real-Chattern übernommen werden kann. (Zukunftsmusik)
+
+Für weitere Vorschläge bitte in das yChat-Board unter www.yChat.de
+texten oder eine E-Mail an paul@buetow.oxg.de :-) \ No newline at end of file
diff --git a/0.4.2/UPDATES.txt b/0.4.2/UPDATES.txt
new file mode 100644
index 0000000..9de123d
--- /dev/null
+++ b/0.4.2/UPDATES.txt
@@ -0,0 +1,119 @@
+########################### yChat.de U PDATE LIST ###########################
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+Hier sind alle Erneuerungen der Versionen dokumentiert:
+
+Update von 0.4.1 auf 0.4.2 (25.12.2k)
+ - Im Texteingabeformular werden nun per JavaScript die letzten 10
+ Postings zwischengespeichert und können per Drop-Down-Menü
+ wieder in das Submittextfeld geladen werden um erneuert getextet
+ zu werden.
+ - Neues Design.
+ - Diverse Dateien wurden umbenannt:
+ INSTALL.txt -> SETUP.txt
+ LIESMICH.txt -> README.txt
+ - Die Datei CREDITS.txt wurde angelegt.
+
+Update von 0.4.0 auf 0.4.1 (22.12.2k)
+ - Design wurde geändert.
+ - Unter "Optionen" ist nun eine komplette Farbtabelle eingebaut.
+ - Folgende Oberwächterbefehle wurden nun auch für normale Wächter
+ freigegeben: /ip /ban /rban.
+
+Update von 0.2.6 auf 0.4.0 (19.12.2k)
+ - Der berüchtigte "IP-Bug" wurde beseitigt! Und zwar wurden TempIDs
+ eingeführt => Eine dauerhafte Überprüfung der Benutzer-IP-Nummer
+ ist also nicht mehr notwendig.
+ - Die totale Chat-Online-Zeit wird protokolliert und kann jew. mit
+ "/online Alias" aufgerufen werden. Die Onlinezeit wird alle 20 Sek.
+ aktualisiert.
+ - Neue Befehle: "/seen Alias" zeigt an, vor wieviel St. sich Alias
+ zuletzt in das System eingelogt hat. Der Befehle "/rmgb" entfernt
+ alle Einträge des eigenen Benutzergästebuchs im Profil.
+
+Update von 0.2.5 auf 0.2.6 (17.12.2k)
+ - Das Eingabeframe reloaded sich nicht mehr nach jedem Posting.
+ Vielen Dank an Truhe aka Dave und Klepper aka Andreas Buchwald!
+ Bei den Chatbefehlen /col /away /j und /ju muß sich das
+ Eingabeframe weiterhin reloaden.
+ - Der Befehl // wurde entfernt. Dieser war nicht mehr erforderlich.
+ weil Nachrichten werden nur noch sehr selten verschluckt. Dieser
+ Chatbefehl postete die letzte Nachricht nocheinmal.
+ - Neuer Befehl: mit "/memo Alias hier der Text" hinterläßt man
+ Alias eine Memo. Logt sich Alias in den Chat ein, dann erhält
+ er diese sofort. Dafür wurde das Verzeichnis ".data/user/memos/"
+ angelegt.
+ - Programmcode wurde ein wenig optimiert.
+ - Das Design wurde ein wenig geändert.
+ - Beseitigung diverser Bugs.
+
+Update von 0.2.4 auf 0.2.5 (15.12.2k)
+ - Derjenige, der einen Raum zuerst betritt, hat Raumbesetzerrechte.
+ - Raumbesetzer, Wächter und Oberwächte können weitere Raumbesetzer
+ bestimmen. Diese können Raumbeseter auch wieder degradieren.
+ - Raumbesetzer, Wächter und Oberwächter können dem aktuellen Raum
+ auf/absperren und Themen geben. Wächter und Oberwächter können
+ abgesperrte Räume betreten.
+ - Das Verzeichnis ".data/htdocs" wurde entfernt. Die Datei help_html
+ heist nun help.sno und befindet sich im yChat-Hauptverzeichnis.
+ - Das Verzeichnis ".data/user/lastlogin" wurde hinzugefügt. Hier
+ wird beim erfolgreichen Einloggen ein "Timestamp" gesetzt. Später
+ sollen Oberwächter "veraltete" Benutzer entfernen können.
+ - Neuer Oberwächterbefehl: "/kill Alias" entfernt Alias ganz und gar
+ vom System. Oberwächter und Wächter können nicht entfernt werden.
+ - Perl-Cache wurde im gesamten System komplett deaktiviert ( Weniger
+ Ladezeiten der HTML-Dokumente ).
+ - Nur Nachrichten aus dem Raum "Cyberbar" werden gelogt.
+ Selbsterstellte Räume werden nichtmehr gelogt. Viele Logfunktionen
+ wurden entfernt (weniger Serverbalast).
+ - Beseitigung einiger kleinen Bugs.
+ - Unter "Optionen" im Chat wir die Farbe nun mit einem Drop-Down-Menü
+ ausgewählt ( Vielen dank an Michi aka Snoopy ).
+ - Auf der Startseite wird nun angezeigt wieviele Benutzer eingelogt
+ sind. Ist keiner eingelogt, dann wird das System "aufgeräumt". D.h.
+ Dateien die nicht mehr gebraucht werden und noch nicht gelöscht
+ wurden werden entfernt ( z.B. Nachrichtendateien der einzelnen
+ Chatter und die Dateien die die IP-Nummern der eingelogten Benutzer
+ beinhalteten usw.).
+ - Hunzufügung einer TODO-Liste. Hier sind mehrere Funktionen
+ vermerkt, die in späteren yChat-Versionen eingebaut werden sollen.
+ (www.todo.yChat.de oder TODO.txt).
+
+Update von 0.2.3 auf 0.2.4 (30.11.2k)
+ - Optimierung bzw. Verbesserung der Push-Routine push.pl.
+ - Server-Ping wurde von 2-Pings-per-Minute auf 4 erhöht.
+ - yChat-Banner wurde erstellt und ist unter
+ documents.yChat.de/yBanner.jpg vorzufinden.
+ - Unter der URL servers.yChat.de wurde eine Serverliste angelegt,
+ welche anzeigt wo yChat-Systeme laufen.
+ - Des weiteren wurden die URLs updates.yChat.de, install.yChat.de
+ und liesmich.yChat.de eingerichtet.
+ - Die Menüpunkte wurden zusammengefaßt, damit sie unter einer
+ Auflösung von 800x600 nur eine Zeile belegen.
+ - Einige Bugs wurden entfernt.
+
+Update von 0.2.2 auf 0.2.3 (25.11.2k)
+ - Smooth scrolling JavaScript ( Vielen Dank an Andreas Buchwald ).
+ - "IP#-Fehler" wurde so gut wie beseitigt.
+ - Aufrufe der einzelnen Benutzerprofile wird gezählt und angezeigt.
+ Diese werden in data/user/counts/* gespeichert.
+ - Automatische Einrichtung des Chats mit setup.sh und Telnet.
+ - Menüpunkt "Dein Profil" wurde entfernt da eigenes Profil auch
+ stets über die Onlineliste aufgerufen werden kann.
+
+Update von 0.2.1 auf 0.2.2 (23.11.2k)
+ - Einige Bugs wurden entfernt.
+ - Geschwindigkeit des Chats wurde optimiert.
+ - Eine Liste aller eingelogten Benutzer erscheint am Rand. Hierfür
+ wurde die Datei online.pl eingeführt. Sie aktuallisiert sich alle
+ 20 Sekunden.
+ - Die UPDATES.txt wurde eingeführt.
+
+Update von 0.2.0 auf 0.2.1
+ - Einige Bugs wurden entfernt.
+ - Die IP# der eingelogten Benutzer werden nun anders verwaltet.
+
+Update von Alpha XVIII auf 0.2.0
+ - Die Handhabung der eingelogten Benutzer im System wurde komplett neu
+ überarbeitet.
+ - Neue Versionsnumern wurden eingeführt. \ No newline at end of file
diff --git a/0.4.2/colors.sno b/0.4.2/colors.sno
new file mode 100644
index 0000000..3640b9e
--- /dev/null
+++ b/0.4.2/colors.sno
@@ -0,0 +1,290 @@
+ <table cellspacing=0 cellpadding=5 border=0>
+ <tr>
+ <td bgcolor="000000"><span style="color:#FFFFFF; text-decoration:line-through;">000000</span></td>
+ <td bgcolor="000033"><span style="color:#FFFFFF; text-decoration:line-through;">000033</span></td>
+ <td bgcolor="000066"><span style="color:#FFFFFF; text-decoration:line-through;">000066</span></td>
+ <td bgcolor="000099"><span style="color:#FFFFFF; text-decoration:line-through;">000099</span></td>
+ <td bgcolor="0000CC"><span style="color:#FFFFFF; text-decoration:line-through;">0000CC</span></td>
+ <td bgcolor="0000FF"><a href="javascript:insertcode('0000FF');" style="color:#FFFFFF;">0000FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="003300"><span style="color:#FFFFFF; text-decoration:line-through;">003300</span></td>
+ <td bgcolor="003333"><span style="color:#FFFFFF; text-decoration:line-through;">003333</span></td>
+ <td bgcolor="003366"><span style="color:#FFFFFF; text-decoration:line-through;">003366</span></td>
+ <td bgcolor="003399"><a href="javascript:insertcode('003399');" style="color:#FFFFFF;">003399</a></td>
+ <td bgcolor="0033CC"><a href="javascript:insertcode('0033CC');" style="color:#FFFFFF;">0033CC</a></td>
+ <td bgcolor="0033FF"><a href="javascript:insertcode('0033FF');" style="color:#FFFFFF;">0033FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="006600"><span style="color:#FFFFFF; text-decoration:line-through;">006600</span></td>
+ <td bgcolor="006633"><span style="color:#FFFFFF; text-decoration:line-through;">006633</span></td>
+ <td bgcolor="006666"><a href="javascript:insertcode('006666');" style="color:#FFFFFF;">006666</a></td>
+ <td bgcolor="006699"><a href="javascript:insertcode('006699');" style="color:#FFFFFF;">006699</a></td>
+ <td bgcolor="0066CC"><a href="javascript:insertcode('0066CC');" style="color:#FFFFFF;">0066CC</a></td>
+ <td bgcolor="0066FF"><a href="javascript:insertcode('0066FF');" style="color:#FFFFFF;">0066FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="009900"><a href="javascript:insertcode('009900');" style="color:#FFFFFF;">009900</a></td>
+ <td bgcolor="009933"><a href="javascript:insertcode('009933');" style="color:#FFFFFF;">009933</a></td>
+ <td bgcolor="009966"><a href="javascript:insertcode('009966');" style="color:#FFFFFF;">009966</a></td>
+ <td bgcolor="009999"><a href="javascript:insertcode('009999');" style="color:#FFFFFF;">009999</a></td>
+ <td bgcolor="0099CC"><a href="javascript:insertcode('0099CC');" style="color:#FFFFFF;">0099CC</a></td>
+ <td bgcolor="0099FF"><a href="javascript:insertcode('0099FF');" style="color:#FFFFFF;">0099FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00CC00"><a href="javascript:insertcode('00CC00');" style="color:#000000;">00CC00</a></td>
+ <td bgcolor="00CC33"><a href="javascript:insertcode('00CC33');" style="color:#000000;">00CC33</a></td>
+ <td bgcolor="00CC66"><a href="javascript:insertcode('00CC66');" style="color:#000000;">00CC66</a></td>
+ <td bgcolor="00CC99"><a href="javascript:insertcode('00CC99');" style="color:#000000;">00CC99</a></td>
+ <td bgcolor="00CCCC"><a href="javascript:insertcode('00CCCC');" style="color:#000000;">00CCCC</a></td>
+ <td bgcolor="00CCFF"><a href="javascript:insertcode('00CCFF');" style="color:#000000;">00CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00FF00"><a href="javascript:insertcode('00FF00');" style="color:#000000;">00FF00</a></td>
+ <td bgcolor="00FF33"><a href="javascript:insertcode('00FF33');" style="color:#000000;">00FF33</a></td>
+ <td bgcolor="00FF66"><a href="javascript:insertcode('00FF66');" style="color:#000000;">00FF66</a></td>
+ <td bgcolor="00FF99"><a href="javascript:insertcode('00FF99');" style="color:#000000;">00FF99</a></td>
+ <td bgcolor="00FFCC"><a href="javascript:insertcode('00FFCC');" style="color:#000000;">00FFCC</a></td>
+ <td bgcolor="00FFFF"><a href="javascript:insertcode('00FFFF');" style="color:#000000;">00FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="330000"><span style="color:#FFFFFF; text-decoration:line-through;">330000</span></td>
+ <td bgcolor="330033"><span style="color:#FFFFFF; text-decoration:line-through;">330033</span></td>
+ <td bgcolor="330066"><span style="color:#FFFFFF; text-decoration:line-through;">330066</span></td>
+ <td bgcolor="330099"><a href="javascript:insertcode('330099');" style="color:#FFFFFF;">330099</a></td>
+ <td bgcolor="3300CC"><a href="javascript:insertcode('3300CC');" style="color:#FFFFFF;">3300CC</a></td>
+ <td bgcolor="3300FF"><a href="javascript:insertcode('3300FF');" style="color:#FFFFFF;">3300FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="333300"><span style="color:#FFFFFF; text-decoration:line-through;">333300</span></td>
+ <td bgcolor="333333"><span style="color:#FFFFFF; text-decoration:line-through;">333333</span></td>
+ <td bgcolor="333366"><a href="javascript:insertcode('333366');" style="color:#FFFFFF;">333366</a></td>
+ <td bgcolor="333399"><a href="javascript:insertcode('333399');" style="color:#FFFFFF;">333399</a></td>
+ <td bgcolor="3333CC"><a href="javascript:insertcode('3333CC');" style="color:#FFFFFF;">3333CC</a></td>
+ <td bgcolor="3333FF"><a href="javascript:insertcode('3333FF');" style="color:#FFFFFF;">3333FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="336600"><a href="javascript:insertcode('336600');" style="color:#FFFFFF;">336600</a></td>
+ <td bgcolor="336633"><a href="javascript:insertcode('336633');" style="color:#FFFFFF;">336633</a></td>
+ <td bgcolor="336666"><a href="javascript:insertcode('336666');" style="color:#FFFFFF;">336666</a></td>
+ <td bgcolor="336699"><a href="javascript:insertcode('336699');" style="color:#FFFFFF;">336699</a></td>
+ <td bgcolor="3366CC"><a href="javascript:insertcode('3366CC');" style="color:#FFFFFF;">3366CC</a></td>
+ <td bgcolor="3366FF"><a href="javascript:insertcode('3366FF');" style="color:#FFFFFF;">3366FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="339900"><a href="javascript:insertcode('339900');" style="color:#FFFFFF;">339900</a></td>
+ <td bgcolor="339933"><a href="javascript:insertcode('339933');" style="color:#FFFFFF;">339933</a></td>
+ <td bgcolor="339966"><a href="javascript:insertcode('339966');" style="color:#FFFFFF;">339966</a></td>
+ <td bgcolor="339999"><a href="javascript:insertcode('339999');" style="color:#FFFFFF;">339999</a></td>
+ <td bgcolor="3399CC"><a href="javascript:insertcode('3399CC');" style="color:#FFFFFF;">3399CC</a></td>
+ <td bgcolor="3399FF"><a href="javascript:insertcode('3399FF');" style="color:#FFFFFF;">3399FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33CC00"><a href="javascript:insertcode('33CC00');" style="color:#000000;">33CC00</a></td>
+ <td bgcolor="33CC33"><a href="javascript:insertcode('33CC33');" style="color:#000000;">33CC33</a></td>
+ <td bgcolor="33CC66"><a href="javascript:insertcode('33CC66');" style="color:#000000;">33CC66</a></td>
+ <td bgcolor="33CC99"><a href="javascript:insertcode('33CC99');" style="color:#000000;">33CC99</a></td>
+ <td bgcolor="33CCCC"><a href="javascript:insertcode('33CCCC');" style="color:#000000;">33CCCC</a></td>
+ <td bgcolor="33CCFF"><a href="javascript:insertcode('33CCFF');" style="color:#000000;">33CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33FF00"><a href="javascript:insertcode('33FF00');" style="color:#000000;">33FF00</a></td>
+ <td bgcolor="33FF33"><a href="javascript:insertcode('33FF33');" style="color:#000000;">33FF33</a></td>
+ <td bgcolor="33FF66"><a href="javascript:insertcode('33FF66');" style="color:#000000;">33FF66</a></td>
+ <td bgcolor="33FF99"><a href="javascript:insertcode('33FF99');" style="color:#000000;">33FF99</a></td>
+ <td bgcolor="33FFCC"><a href="javascript:insertcode('33FFCC');" style="color:#000000;">33FFCC</a></td>
+ <td bgcolor="33FFFF"><a href="javascript:insertcode('33FFFF');" style="color:#000000;">33FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="660000"><span style="color:#FFFFFF; text-decoration:line-through;">660000</span></td>
+ <td bgcolor="660033"><span style="color:#FFFFFF; text-decoration:line-through;">660033</span></td>
+ <td bgcolor="660066"><a href="javascript:insertcode('660066');" style="color:#FFFFFF;">660066</a></td>
+ <td bgcolor="660099"><a href="javascript:insertcode('660099');" style="color:#FFFFFF;">660099</a></td>
+ <td bgcolor="6600CC"><a href="javascript:insertcode('6600CC');" style="color:#FFFFFF;">6600CC</a></td>
+ <td bgcolor="6600FF"><a href="javascript:insertcode('6600FF');" style="color:#FFFFFF;">6600FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="663300"><a href="javascript:insertcode('663300');" style="color:#FFFFFF;">663300</a></td>
+ <td bgcolor="663333"><a href="javascript:insertcode('663333');" style="color:#FFFFFF;">663333</a></td>
+ <td bgcolor="663366"><a href="javascript:insertcode('663366');" style="color:#FFFFFF;">663366</a></td>
+ <td bgcolor="663399"><a href="javascript:insertcode('663399');" style="color:#FFFFFF;">663399</a></td>
+ <td bgcolor="6633CC"><a href="javascript:insertcode('6633CC');" style="color:#FFFFFF;">6633CC</a></td>
+ <td bgcolor="6633FF"><a href="javascript:insertcode('6633FF');" style="color:#FFFFFF;">6633FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="666600"><a href="javascript:insertcode('666600');" style="color:#FFFFFF;">666600</a></td>
+ <td bgcolor="666633"><a href="javascript:insertcode('666633');" style="color:#FFFFFF;">666633</a></td>
+ <td bgcolor="666666"><a href="javascript:insertcode('666666');" style="color:#FFFFFF;">666666</a></td>
+ <td bgcolor="666699"><a href="javascript:insertcode('666699');" style="color:#FFFFFF;">666699</a></td>
+ <td bgcolor="6666CC"><a href="javascript:insertcode('6666CC');" style="color:#FFFFFF;">6666CC</a></td>
+ <td bgcolor="6666FF"><a href="javascript:insertcode('6666FF');" style="color:#FFFFFF;">6666FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="669900"><a href="javascript:insertcode('669900');" style="color:#000000;">669900</a></td>
+ <td bgcolor="669933"><a href="javascript:insertcode('669933');" style="color:#000000;">669933</a></td>
+ <td bgcolor="669966"><a href="javascript:insertcode('669966');" style="color:#000000;">669966</a></td>
+ <td bgcolor="669999"><a href="javascript:insertcode('669999');" style="color:#000000;">669999</a></td>
+ <td bgcolor="6699CC"><a href="javascript:insertcode('6699CC');" style="color:#000000;">6699CC</a></td>
+ <td bgcolor="6699FF"><a href="javascript:insertcode('6699FF');" style="color:#000000;">6699FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66CC00"><a href="javascript:insertcode('66CC00');" style="color:#000000;">66CC00</a></td>
+ <td bgcolor="66CC33"><a href="javascript:insertcode('66CC33');" style="color:#000000;">66CC33</a></td>
+ <td bgcolor="66CC66"><a href="javascript:insertcode('66CC66');" style="color:#000000;">66CC66</a></td>
+ <td bgcolor="66CC99"><a href="javascript:insertcode('66CC99');" style="color:#000000;">66CC99</a></td>
+ <td bgcolor="66CCCC"><a href="javascript:insertcode('66CCCC');" style="color:#000000;">66CCCC</a></td>
+ <td bgcolor="66CCFF"><a href="javascript:insertcode('66CCFF');" style="color:#000000;">66CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66FF00"><a href="javascript:insertcode('66FF00');" style="color:#000000;">66FF00</a></td>
+ <td bgcolor="66FF33"><a href="javascript:insertcode('66FF33');" style="color:#000000;">66FF33</a></td>
+ <td bgcolor="66FF66"><a href="javascript:insertcode('66FF66');" style="color:#000000;">66FF66</a></td>
+ <td bgcolor="66FF99"><a href="javascript:insertcode('66FF99');" style="color:#000000;">66FF99</a></td>
+ <td bgcolor="66FFCC"><a href="javascript:insertcode('66FFCC');" style="color:#000000;">66FFCC</a></td>
+ <td bgcolor="66FFFF"><a href="javascript:insertcode('66FFFF');" style="color:#000000;">66FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="990000"><a href="javascript:insertcode('990000');" style="color:#FFFFFF;">990000</a></td>
+ <td bgcolor="990033"><a href="javascript:insertcode('990033');" style="color:#FFFFFF;">990033</a></td>
+ <td bgcolor="990066"><a href="javascript:insertcode('990066');" style="color:#FFFFFF;">990066</a></td>
+ <td bgcolor="990099"><a href="javascript:insertcode('990099');" style="color:#FFFFFF;">990099</a></td>
+ <td bgcolor="9900CC"><a href="javascript:insertcode('9900CC');" style="color:#FFFFFF;">9900CC</a></td>
+ <td bgcolor="9900FF"><a href="javascript:insertcode('9900FF');" style="color:#FFFFFF;">9900FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="993300"><a href="javascript:insertcode('993300');" style="color:#FFFFFF;">993300</a></td>
+ <td bgcolor="993333"><a href="javascript:insertcode('993333');" style="color:#FFFFFF;">993333</a></td>
+ <td bgcolor="993366"><a href="javascript:insertcode('993366');" style="color:#FFFFFF;">993366</a></td>
+ <td bgcolor="993399"><a href="javascript:insertcode('993399');" style="color:#FFFFFF;">993399</a></td>
+ <td bgcolor="9933CC"><a href="javascript:insertcode('9933CC');" style="color:#FFFFFF;">9933CC</a></td>
+ <td bgcolor="9933FF"><a href="javascript:insertcode('9933FF');" style="color:#FFFFFF;">9933FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="996600"><a href="javascript:insertcode('996600');" style="color:#FFFFFF;">996600</a></td>
+ <td bgcolor="996633"><a href="javascript:insertcode('996633');" style="color:#FFFFFF;">996633</a></td>
+ <td bgcolor="996666"><a href="javascript:insertcode('996666');" style="color:#FFFFFF;">996666</a></td>
+ <td bgcolor="996699"><a href="javascript:insertcode('996699');" style="color:#FFFFFF;">996699</a></td>
+ <td bgcolor="9966CC"><a href="javascript:insertcode('9966CC');" style="color:#FFFFFF;">9966CC</a></td>
+ <td bgcolor="9966FF"><a href="javascript:insertcode('9966FF');" style="color:#FFFFFF;">9966FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="999900"><a href="javascript:insertcode('999900');" style="color:#000000;">999900</a></td>
+ <td bgcolor="999933"><a href="javascript:insertcode('999933');" style="color:#000000;">999933</a></td>
+ <td bgcolor="999966"><a href="javascript:insertcode('999966');" style="color:#000000;">999966</a></td>
+ <td bgcolor="999999"><a href="javascript:insertcode('999999');" style="color:#000000;">999999</a></td>
+ <td bgcolor="9999CC"><a href="javascript:insertcode('9999CC');" style="color:#000000;">9999CC</a></td>
+ <td bgcolor="9999FF"><a href="javascript:insertcode('9999FF');" style="color:#000000;">9999FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99CC00"><a href="javascript:insertcode('99CC00');" style="color:#000000;">99CC00</a></td>
+ <td bgcolor="99CC33"><a href="javascript:insertcode('99CC33');" style="color:#000000;">99CC33</a></td>
+ <td bgcolor="99CC66"><a href="javascript:insertcode('99CC66');" style="color:#000000;">99CC66</a></td>
+ <td bgcolor="99CC99"><a href="javascript:insertcode('99CC99');" style="color:#000000;">99CC99</a></td>
+ <td bgcolor="99CCCC"><a href="javascript:insertcode('99CCCC');" style="color:#000000;">99CCCC</a></td>
+ <td bgcolor="99CCFF"><a href="javascript:insertcode('99CCFF');" style="color:#000000;">99CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99FF00"><a href="javascript:insertcode('99FF00');" style="color:#000000;">99FF00</a></td>
+ <td bgcolor="99FF33"><a href="javascript:insertcode('99FF33');" style="color:#000000;">99FF33</a></td>
+ <td bgcolor="99FF66"><a href="javascript:insertcode('99FF66');" style="color:#000000;">99FF66</a></td>
+ <td bgcolor="99FF99"><a href="javascript:insertcode('99FF99');" style="color:#000000;">99FF99</a></td>
+ <td bgcolor="99FFCC"><a href="javascript:insertcode('99FFCC');" style="color:#000000;">99FFCC</a></td>
+ <td bgcolor="99FFFF"><a href="javascript:insertcode('99FFFF');" style="color:#000000;">99FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC0000"><a href="javascript:insertcode('CC0000');" style="color:#FFFFFF;">CC0000</a></td>
+ <td bgcolor="CC0033"><a href="javascript:insertcode('CC0033');" style="color:#FFFFFF;">CC0033</a></td>
+ <td bgcolor="CC0066"><a href="javascript:insertcode('CC0066');" style="color:#FFFFFF;">CC0066</a></td>
+ <td bgcolor="CC0099"><a href="javascript:insertcode('CC0099');" style="color:#FFFFFF;">CC0099</a></td>
+ <td bgcolor="CC00CC"><a href="javascript:insertcode('CC00CC');" style="color:#FFFFFF;">CC00CC</a></td>
+ <td bgcolor="CC00FF"><a href="javascript:insertcode('CC00FF');" style="color:#FFFFFF;">CC00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC3300"><a href="javascript:insertcode('CC3300');" style="color:#FFFFFF;">CC3300</a></td>
+ <td bgcolor="CC3333"><a href="javascript:insertcode('CC3333');" style="color:#FFFFFF;">CC3333</a></td>
+ <td bgcolor="CC3366"><a href="javascript:insertcode('CC3366');" style="color:#FFFFFF;">CC3366</a></td>
+ <td bgcolor="CC3399"><a href="javascript:insertcode('CC3399');" style="color:#FFFFFF;">CC3399</a></td>
+ <td bgcolor="CC33CC"><a href="javascript:insertcode('CC33CC');" style="color:#FFFFFF;">CC33CC</a></td>
+ <td bgcolor="CC33FF"><a href="javascript:insertcode('CC33FF');" style="color:#FFFFFF;">CC33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC6600"><a href="javascript:insertcode('CC6600');" style="color:#000000;">CC6600</a></td>
+ <td bgcolor="CC6633"><a href="javascript:insertcode('CC6633');" style="color:#000000;">CC6633</a></td>
+ <td bgcolor="CC6666"><a href="javascript:insertcode('CC6666');" style="color:#000000;">CC6666</a></td>
+ <td bgcolor="CC6699"><a href="javascript:insertcode('CC6699');" style="color:#000000;">CC6699</a></td>
+ <td bgcolor="CC66CC"><a href="javascript:insertcode('CC66CC');" style="color:#000000;">CC66CC</a></td>
+ <td bgcolor="CC66FF"><a href="javascript:insertcode('CC66FF');" style="color:#000000;">CC66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC9900"><a href="javascript:insertcode('CC9900');" style="color:#000000;">CC9900</a></td>
+ <td bgcolor="CC9933"><a href="javascript:insertcode('CC9933');" style="color:#000000;">CC9933</a></td>
+ <td bgcolor="CC9966"><a href="javascript:insertcode('CC9966');" style="color:#000000;">CC9966</a></td>
+ <td bgcolor="CC9999"><a href="javascript:insertcode('CC9999');" style="color:#000000;">CC9999</a></td>
+ <td bgcolor="CC99CC"><a href="javascript:insertcode('CC99CC');" style="color:#000000;">CC99CC</a></td>
+ <td bgcolor="CC99FF"><a href="javascript:insertcode('CC99FF');" style="color:#000000;">CC99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCCC00"><a href="javascript:insertcode('CCCC00');" style="color:#000000;">CCCC00</a></td>
+ <td bgcolor="CCCC33"><a href="javascript:insertcode('CCCC33');" style="color:#000000;">CCCC33</a></td>
+ <td bgcolor="CCCC66"><a href="javascript:insertcode('CCCC66');" style="color:#000000;">CCCC66</a></td>
+ <td bgcolor="CCCC99"><a href="javascript:insertcode('CCCC99');" style="color:#000000;">CCCC99</a></td>
+ <td bgcolor="CCCCCC"><a href="javascript:insertcode('CCCCCC');" style="color:#000000;">CCCCCC</a></td>
+ <td bgcolor="CCCCFF"><a href="javascript:insertcode('CCCCFF');" style="color:#000000;">CCCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCFF00"><a href="javascript:insertcode('CCFF00');" style="color:#000000;">CCFF00</a></td>
+ <td bgcolor="CCFF33"><a href="javascript:insertcode('CCFF33');" style="color:#000000;">CCFF33</a></td>
+ <td bgcolor="CCFF66"><a href="javascript:insertcode('CCFF66');" style="color:#000000;">CCFF66</a></td>
+ <td bgcolor="CCFF99"><a href="javascript:insertcode('CCFF99');" style="color:#000000;">CCFF99</a></td>
+ <td bgcolor="CCFFCC"><a href="javascript:insertcode('CCFFCC');" style="color:#000000;">CCFFCC</a></td>
+ <td bgcolor="CCFFFF"><a href="javascript:insertcode('CCFFFF');" style="color:#000000;">CCFFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF0000"><a href="javascript:insertcode('FF0000');" style="color:#FFFFFF;">FF0000</a></td>
+ <td bgcolor="FF0033"><a href="javascript:insertcode('FF0033');" style="color:#FFFFFF;">FF0033</a></td>
+ <td bgcolor="FF0066"><a href="javascript:insertcode('FF0066');" style="color:#FFFFFF;">FF0066</a></td>
+ <td bgcolor="FF0099"><a href="javascript:insertcode('FF0099');" style="color:#FFFFFF;">FF0099</a></td>
+ <td bgcolor="FF00CC"><a href="javascript:insertcode('FF00CC');" style="color:#FFFFFF;">FF00CC</a></td>
+ <td bgcolor="FF00FF"><a href="javascript:insertcode('FF00FF');" style="color:#FFFFFF;">FF00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF3300"><a href="javascript:insertcode('FF3300');" style="color:#FFFFFF;">FF3300</a></td>
+ <td bgcolor="FF3333"><a href="javascript:insertcode('FF3333');" style="color:#FFFFFF;">FF3333</a></td>
+ <td bgcolor="FF3366"><a href="javascript:insertcode('FF3366');" style="color:#FFFFFF;">FF3366</a></td>
+ <td bgcolor="FF3399"><a href="javascript:insertcode('FF3399');" style="color:#FFFFFF;">FF3399</a></td>
+ <td bgcolor="FF33CC"><a href="javascript:insertcode('FF33CC');" style="color:#FFFFFF;">FF33CC</a></td>
+ <td bgcolor="FF33FF"><a href="javascript:insertcode('FF33FF');" style="color:#FFFFFF;">FF33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF6600"><a href="javascript:insertcode('FF6600');" style="color:#000000;">FF6600</a></td>
+ <td bgcolor="FF6633"><a href="javascript:insertcode('FF6633');" style="color:#000000;">FF6633</a></td>
+ <td bgcolor="FF6666"><a href="javascript:insertcode('FF6666');" style="color:#000000;">FF6666</a></td>
+ <td bgcolor="FF6699"><a href="javascript:insertcode('FF6699');" style="color:#000000;">FF6699</a></td>
+ <td bgcolor="FF66CC"><a href="javascript:insertcode('FF66CC');" style="color:#000000;">FF66CC</a></td>
+ <td bgcolor="FF66FF"><a href="javascript:insertcode('FF66FF');" style="color:#000000;">FF66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF9900"><a href="javascript:insertcode('FF9900');" style="color:#000000;">FF9900</a></td>
+ <td bgcolor="FF9933"><a href="javascript:insertcode('FF9933');" style="color:#000000;">FF9933</a></td>
+ <td bgcolor="FF9966"><a href="javascript:insertcode('FF9966');" style="color:#000000;">FF9966</a></td>
+ <td bgcolor="FF9999"><a href="javascript:insertcode('FF9999');" style="color:#000000;">FF9999</a></td>
+ <td bgcolor="FF99CC"><a href="javascript:insertcode('FF99CC');" style="color:#000000;">FF99CC</a></td>
+ <td bgcolor="FF99FF"><a href="javascript:insertcode('FF99FF');" style="color:#000000;">FF99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFCC00"><a href="javascript:insertcode('FFCC00');" style="color:#000000;">FFCC00</a></td>
+ <td bgcolor="FFCC33"><a href="javascript:insertcode('FFCC33');" style="color:#000000;">FFCC33</a></td>
+ <td bgcolor="FFCC66"><a href="javascript:insertcode('FFCC66');" style="color:#000000;">FFCC66</a></td>
+ <td bgcolor="FFCC99"><a href="javascript:insertcode('FFCC99');" style="color:#000000;">FFCC99</a></td>
+ <td bgcolor="FFCCCC"><a href="javascript:insertcode('FFCCCC');" style="color:#000000;">FFCCCC</a></td>
+ <td bgcolor="FFCCFF"><a href="javascript:insertcode('FFCCFF');" style="color:#000000;">FFCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFFF00"><a href="javascript:insertcode('FFFF00');" style="color:#000000;">FFFF00</a></td>
+ <td bgcolor="FFFF33"><a href="javascript:insertcode('FFFF33');" style="color:#000000;">FFFF33</a></td>
+ <td bgcolor="FFFF66"><a href="javascript:insertcode('FFFF66');" style="color:#000000;">FFFF66</a></td>
+ <td bgcolor="FFFF99"><a href="javascript:insertcode('FFFF99');" style="color:#000000;">FFFF99</a></td>
+ <td bgcolor="FFFFCC"><a href="javascript:insertcode('FFFFCC');" style="color:#000000;">FFFFCC</a></td>
+ <td bgcolor="FFFFFF"><a href="javascript:insertcode('FFFFFF');" style="color:#000000;">FFFFFF</a></td>
+ </tr>
+</table> \ No newline at end of file
diff --git a/0.4.2/config.pm b/0.4.2/config.pm
new file mode 100644
index 0000000..364ff59
--- /dev/null
+++ b/0.4.2/config.pm
@@ -0,0 +1,307 @@
+# yChat - Copyright by Paul C. Bütow
+
+########################### Dieser Teil bestimmt die Standart-Variabeln.
+##STANDART-CONFIGURATION:## (CSS, Farben, Version etc.)
+###########################
+$alias = $q->param("alias");
+$var = $q->param("var");
+$room = $q->param("room");
+$col = $q->param("col");
+$secol = $q->param("secol");
+$msg = $q->param("msg");
+$tmpid = $q->param("tmpid");
+$tmp = $q->param("tmp");
+$id = $q->param("id");
+$room = "Cyberbar" if ($room eq "");
+$col = "ffffef" if ($col eq "");
+$secol = "ffffef" if ($secol eq "");
+$datum = "25.12.2k";
+$version = "0.4.2";
+$title = "yChat.de ($version)";
+$gfxpath = "../../yChat/";
+$style = <<ENDCSS;
+<style rel="stylesheet" type="text/css">
+ body { background-color: 005146 }
+ body.blank { background-color: 000000 }
+ body.online { background-color: 000000 }
+ body.log { background-color: 000000 }
+ div { font-family: arial, verdana, helvetiva; font-size: 9pt; color: ffffff }
+ div.b { font-weight: bold; color: ffa500 }
+ a { color: ffffef }
+ a:hover { color: ffffff; text-decoration: none }
+</style>
+ENDCSS
+
+############### Dieser Teil enthält Programmcode, der an verschiedenen
+##SHARED-SUBS## Stellen ausgeführt werden muß und jedem Skript zur
+############### Verfügung steht.
+
+sub printfile { # Liest eine externe Datei ein und gibt sie mit print aus
+ my ($file2print,$pagetitle,$bodyclass) = @_;
+ if ($pagetitle ne "") {
+ &start_html($pagetitle,$bodyclass);
+ }
+ &read_file($file2print);
+ @file2print = <DATEI>;
+ close DATEI;
+ print @file2print;
+}
+
+
+sub start_html { # Der HEADER einer HTML-Datei
+print "<html><head>";
+print "<meta http-equiv=\"refresh\" content=\"20\" URL=\"online.pl?room=$room\">" if ($_[1] eq "online");
+print <<END;
+ <title>
+ $title - $_[0]
+ </title>
+ $_[2]
+ $style
+ </head>
+END
+ if ($_[1] ne "") {
+ print "<body class=$_[1]>";
+ } else {
+ print "<body>";
+ }
+}
+
+sub post { # Öffentliche Nachricht im aktuellen Raum $room posten.
+ my ($msg2post,$secroom) = @_;
+ my @rooms = ($room,$secroom);
+ foreach(@rooms) {
+ my $room2post = $_;
+ &list_dir("data/online/rooms/$room2post");
+ foreach(@dir) {
+ my $alias2post = $_;
+ if (-f "data/online/rooms/$room2post/$alias2post") {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+ }
+ }
+ }
+ &log("$msg2post") if ($room eq "Cyberbar");
+}
+
+
+sub post_all { # Öffentliche Nachricht in ALLEN Räumen gleichzeitig posten.
+ my $msg2post = $_[0];
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ my $alias2post = $_;
+ if (-f "data/online/users/$alias2post") {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+ }
+ }
+ &log("$msg2post");
+}
+
+sub post_prv { # Private Nachricht posten (flüstern).
+ my $alias2post = $_[0];
+ my $msg2post = $_[1];
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+}
+
+sub log { # Protokollieren der Nachrichten etc.
+ my ($msg2log) = @_;
+ &zeit;
+ &write_file("data/logs/$day.$month.$year");
+ print DATEI "<br><font color=ffffef><i>($hours:$min:$sec)</i></font> $msg2log\n";
+ close DATEI;
+}
+
+
+sub zeit { # Aktuelles Datum und Uhrzeit bestimmen.
+ ($sec, $min, $hours, $day, $month, $year) = (localtime)[0..5];
+ $month += 1;
+ $hours = "0".$hours if ($hours < 10);
+ $min = "0".$min if ($min < 10);
+ $sec = "0".$sec if ($sec < 10);
+ $day = "0".$day if ($day < 10);
+ $month = "0".$month if ($month < 10);
+ $year = $year - 100;
+ if ($year < 10) {
+ $year = "200".$year;
+ } else {
+ $year = "20".$year;
+ }
+}
+
+sub count { # Zeilen in einer Datei Zählen.
+ my $file2count = $_[0];
+ &read_file($file2count);
+ my @datei = <DATEI>;
+ close DATEI;
+ $number = $#datei+1;
+}
+
+sub read_file { # Datei öffnen.
+ my $file2read = $_[0];
+ if (-e "$file2read") {
+ open (DATEI,"<$file2read") || &error("Konnte $file2read nicht öffnen");
+ }
+}
+
+sub write_file { # Text an eine Datei anhängen.
+ my $file2write = $_[0];
+ if (-e "$file2write") {
+ open (DATEI,">>$file2write") || &error("Konnte $file2write nicht öffnen");
+ } else {
+ &create_file("$file2write");
+ open (DATEI,">>$file2write") || &error("Konnte $file2write nicht öffnen");
+ }
+}
+
+sub write_file_new { # Datei neu schreiben.
+ my $file2write = $_[0];
+ if (-e "$file2write") {
+ open (DATEI,">$file2write") || &error("Konnte $file2write nicht öffnen");
+ } else {
+ &create_file("$file2write");
+ open (DATEI,">$file2write") || &error("Konnte $file2write nicht öffnen");
+ }
+}
+
+sub create_file { # Datei erstellen.
+ my $file2create = $_[0];
+ open (CREATE, ">$file2create") || &error("Konnte $file2create nicht erstellen!");
+ print CREATE "";
+ close CREATE;
+}
+
+sub error { # Error-Ausgabe.
+ my $error_msg = $_[0];
+ &start_html( "Error: ($error_msg)" );
+ print $q->div( "Error: ($error_msg)" ),
+ $q->end_html;
+ exit;
+}
+
+sub remove_online { # Chatter entfernen
+ my ($alias,$room,$method) = @_;
+ unlink("data/online/users/$alias");
+ unlink("data/online/rooms/$room/$alias") if ($room ne undef);
+ unlink("data/online/ident/$alias");
+ unlink("data/msgs/$alias");
+ &rm_rooms;
+ &zeit;
+ if ($method eq undef) {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias verläßt den Chat ...</font></i>");
+ } elsif ($method ne "kick") {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500> $_ hat den Chat verlassen ... </font></i>");
+ }
+ &rm_rstat($room,$alias) if ($room ne undef);
+}
+
+sub rm_alias { # Chatter aus dem System entfernen, dessen Timestamps älter als 60 Sekunden sind
+ my ($dir2rm,$rstatroom) = @_;
+ &list_dir($dir2rm,2);
+ foreach(@dir2) {
+ if (-f "$dir2rm/$_" && $_ ne undef) {
+ &read_file("$dir2rm/$_");
+ my $timestamp = <DATEI>;
+ close DATEI;
+ if ($timestamp < (time - 60)) {
+ if ($dir2rm eq "data/online/users") {
+ &remove_online($_,undef,1);
+ } else {
+ unlink("$dir2rm/$_");
+ &rm_rstat($rstatroom,$_) if ($rstatroom ne undef);
+ }
+ }
+ }
+ }
+}
+
+sub rm_rooms { # Leere Räume aus dem System entfernen
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-d "data/online/rooms/$_") {
+ &rm_alias("data/online/rooms/$_",$_);
+ &list_dir("data/online/rooms/$_",2);
+ if ($#dir2 = 1) {
+ rmdir("data/online/rooms/$_");
+ }
+ }
+ }
+}
+
+sub rm_rstat { # Benutzer als Raumbesetzer austragen
+ my ($rstatroom,$r_alias) = @_;
+ &read_file("data/online/rstat/$rstatroom");
+ my @rstat = <DATEI>;
+ close DATEI;
+ my $newfile = $rstat[0].$rstat[1];
+ for ($i=2;$i<=$#rstat;$i++) {
+ $newfile = $newfile."\n".$rstat[$i] if ($rstat[$i] ne $r_alias."\n");
+ }
+ write_file_new("data/online/rstat/$rstatroom");
+ print DATEI $newfile;
+ close DATEI;
+}
+
+sub secure_removeid { # Beim ausloggen die IP-Nummer aus dat/ip austragen.
+ my $alias2rm = $_[0];
+ unlink("data/online/ident/$alias2rm");
+}
+
+sub secure_checkid { # TmpID überprüfen
+ my ($alias2check) = @_;
+ &read_file("data/online/ident/$alias2check");
+ my @idfile = <DATEI>;
+ close DATEI;
+ if ($idfile[1] ne $tmpid) {
+ &error("Falsche TempID ! Du bist nicht befugt zu handeln !");
+ }
+}
+
+sub remove_rooms { # Leere Räume entfernen.
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-d "data/online/rooms/$_") {
+ &list_dir("data/online/rooms/$_");
+ rmdir("data/online/rooms/$_") if ($#dir = 1);
+ }
+ }
+}
+
+sub list_dir { # Beliebigen Verzeichnisbaum einlesen.
+ my ($dir,$method) = @_;
+ opendir(DIR, $dir);
+ if ($method eq undef) {
+ @dir = readdir(DIR);
+ } elsif ($method = 2) {
+ @dir2 = readdir(DIR);
+ }
+ closedir(DIR);
+}
+
+sub hirachie { # Chatter nach Sonderrechte überprüfen.
+ my $alias2prove = $_[0];
+ $hirachie = undef;
+ &read_file("data/wa");
+ @was = <DATEI>;
+ close DATEI;
+ foreach(@was) {
+ if ($_ eq $alias2prove || $_ eq "$alias2prove\n") {
+ $hirachie = "wa";
+ }
+ }
+ &read_file("data/ow");
+ @ows = <DATEI>;
+ close DATEI;
+ if ($hirachie ne "wa" || $_ eq "$alias2prove\n") {
+ foreach(@ows) {
+ if ($_ eq $alias2prove || $_ eq "$alias2prove\n") {
+ $hirachie = "ow";
+ }
+ }
+ }
+}
+
+$| = 1; # Cache von Perl ausschalten \ No newline at end of file
diff --git a/0.4.2/help.sno b/0.4.2/help.sno
new file mode 100644
index 0000000..5779354
--- /dev/null
+++ b/0.4.2/help.sno
@@ -0,0 +1,55 @@
+<div>
+ Alle Chat-Befehle:
+</div>
+<hr>
+<table width=100% bgcolor=555555>
+<tr><th bgcolor=666666><div>SU</div></th><th bgcolor=666666><div>Befehl</div></th><th bgcolor=666666><div>Beschreibung</div></th></tr>
+<tr><td><div>NC</div></td><td><div>/about</div></td><td><div>Zeigt aktuelle Version und andere Infos der Community an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/away <font color=red>Nachricht</font></div></td><td><div>Abmelden mit einer<font color=red>Abmeldenachricht</font></div></td></tr>
+<tr><td><div>NC</div></td><td><div>/clear</div></td><td><div>Bildschirm wird gelöscht</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/col <font color=red>XXXXXX</font> <font color=ffa500>XXXXXX</font></div></td><td><div>Farbe/n (<font color=red>Namensfarbe</font> / <font color=ffa500>Textfarbe</font>) wechseln. Angabe in Hexadezimal.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/date</div></td><td><div>Zeigt aktuelles Datum und Urzeit an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/j <font color=red>Raumname</font></div></td><td><div>Raum wechseln/erstellen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ju <font color=red>Alias</font></div></td><td><div>In den Raum wechseln/folgen, wo sich <font color=red>Alias</font> befindet.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/m <font color=red>Aktion</font></div></td><td><div>Handeln mit 2 Farben</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/me <font color=red>Aktion</font></div></td><td><div>Handeln mit einer Farbe</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/msg <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine private <font color=ffa500>Nachricht</font> flüstern.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ <font color=ffa500>Nachricht</font></div></td><td><div>Eine private <font color=ffa500>Nachricht</font> demjenigen flüstern, dem zuletzt eine geflüstert wurde</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/q</div></td><td><div>Cumunnity verlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/rmgb</div></td><td><div>Das eigene Gästebuch komplett weglöschen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/s <font color=red>Nachricht</font></div></td><td><div><font color=red>Nachricht</font> schreien</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/seen <font color=red>Alias</font></div></td><td><div>Zeigt an, vor wieviel Stunden sich <font color=red>Nachricht</font> zum letzten Mal in das System eingelogt hat</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/w</div></td><td><div>Zeigt an, wer sich im aktuellen Raum befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc <font color=red>Raum</font></div></td><td><div>Zeigt an, wer sich im <font color=red>Raum</font> befindet. Wird kein Raum angegeben, dann wird jedeglich angezeigt, wer sich im System befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc/</div></td><td><div>Zeigt alle offenen Räume und deren Chatter an</div></td></tr>
+<tr><td><div>NC</div></td><td> <div>/wj <font color=red>Alias</font></div></td><td><div>Zeigt an, in welchen Raum sich <font color=red>Alias</font> befindet</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/l</div></td><td><div>Der aktuelle Raum wird ab- bzw. aufgesperrt</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/rsu <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> die Raumbesetzerrechte entnehmen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/su <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Raumbesetzer ernennen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/t <font color=red>Thema</font></div></td><td><div>Dem aktuellen Raum wird ein <font color=red>Thema</font> gegeben</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban</div></td><td><div>Zeigt alle verbannten Benutzer an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> verbannen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/rban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> "entbannen"</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ip <font color=red>Alias</font></div></td><td><div>Zeigt die IP-Nummer von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/k <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird aus dem Chat katapultiert!</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/kill <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird ganz und gar aus dem System entfernt</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/wa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Wächter ernennen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/rwa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom Wächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/sys <font color=red>Nachricht</font></div></td>
+<td><div>Systemnachricht schreiben. (Erscheint in allen existierenden Räumen)</div></td></tr>
+</table><hr>
+<div>
+ Zur Erklärung: NC steht für "Normale Chatter", RB für "Raumbesetzer", WÄ für "Wächter" und OW für "Oberwächter".
+ Obrige Befehle können nur von der/den jeweiligen Benutzergruppe/n werden.<br><br>
+ Allerdings gibt es folgendes zu beachten: Oberwächter verfügen über alle Chatbefehle. Normale Wächter über alle Chatbefehle, außer über die der Oberwächter.
+ Raumbesetzer können nur Raumbesetzerbefehle und die Befehle der normalen Chatter durchführen. Normale Chatter haben jedeglich die Standardbefehle zu verwenden.<br><br>
+ Weitere Besonderheiten der Wächter und Oberwächter:<br><br>
+ Wächter und Oberwächter können ....<br>
+ ... abgesperrte Chaträume problemlos betreten.<br>
+ ... nicht gekickt, verbannt oder gekillt werden.<br>
+ ... Logdateien der Cyberbar lesen.<br><br>
+
+ Des weiteren: Oberwächter ernennt nur der Systemadministrator!
+</div>
+</body>
+</html> \ No newline at end of file
diff --git a/0.4.2/htdocs.pl b/0.4.2/htdocs.pl
new file mode 100644
index 0000000..bb70682
--- /dev/null
+++ b/0.4.2/htdocs.pl
@@ -0,0 +1,244 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+if ($var eq "help_html") {
+ &printfile("help.sno","Alle Chatbefehle");
+} elsif ($var eq "logo_html") {
+ &start_html("Logo");
+ print "<layer top=-3 left=0><div style=\"position:absolute; top:5; left:10\">",
+ "<img src=\"$gfxpath/y_.gif\"></div></layer>";
+ $q->end_html;
+} elsif ($var eq "menu_html") {
+ &menu_html;
+} elsif ($var eq "menu2_html") {
+ &menu2_html;
+} elsif ($var eq "werda_html") {
+ &werda_html;
+} elsif ($var eq "logs_html") {
+ &secure_checkid($alias);
+ &logs_html;
+} elsif ($var eq "view_logs_html") {
+ &secure_checkid($alias);
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ &printfile($tmp,"blank" ,"log");
+ }
+} elsif ($var eq "superuser_html") {
+ &secure_checkid($alias);
+ &superuser_html;
+} else {
+ print
+ $q->start_html(-bgcolor=>"000000"),
+ $q->end_html;
+}
+
+sub menu_html {
+if ($tmp eq "quit") {
+ &start_html("Quit","blank","<script language=\"JavaScript\">open(\"index.pl?tmp=quit\",\"_top\");</script>");
+ print $q->end_html;
+ sleep 2;
+ &remove_online($alias,$room);
+ &secure_removeid($alias);
+ exit;
+}
+ENDJS
+ &start_html("Menü","blank");
+print <<END;
+<script language="JavaScript">
+function fenster(fenster,target) {
+ open(fenster,target,"width=500,height=500,screenX=100,screenY=100,scrollbars");
+}
+</script>
+<font size=2 face=verdana>
+ <a href='javascript:fenster("htdocs.pl?var=werda_html&alias=$alias&room=$room&col=$col&secol=$secol&&tmp=$tmp&tmpid=$tmpid","weristda")'>Wer ist da?</a>
+ <a href='javascript:fenster("main2.pl?var=edit_profile_html&alias=$alias&tmpid=$tmpid","ProfilAendern")'>Profil ändern</a>
+ <a href='javascript:fenster("main2.pl?var=edit_options_html&alias=$alias&tmpid=$tmpid","Optionen")'>Chatoptionen</a>
+ <a href='javascript:fenster("main2.pl?var=list_alias_html&alias=$alias&tmpid=$tmpid","Benutzerliste")'>Benutzerliste</a>
+ <a href='javascript:fenster("htdocs.pl?var=help_html&tmpid=$tmpid","Befehle")'>Chatbefehle</a><br>
+ <a href='javascript:fenster("main2.pl?var=gb_html&alias=$alias&tmpid=$tmpid","Board")'>Benutzerboard</a>
+ <a href='javascript:fenster("htdocs.pl?var=superuser_html&alias=$alias&tmpid=$tmpid","Superuser")'>Superuser</a>
+ <a href='javascript:fenster("htdocs.pl?var=logs_html&alias=$alias&tmpid=$tmpid","Logdateien")'>Logdateien</a>
+ <a href="http://www.updates.yChat.de" target="Updates">Updates</a>
+ <a href="http://www.credits.yChat.de" target="Credits">Credits</a>
+ <a href="htdocs.pl?alias=$alias&var=menu_html&room=$room&tmpid=$tmpid&tmp=quit">Verlassen</a>
+</font>
+</body>
+</html>
+END
+}
+
+sub menu2_html {
+$JavaScript = <<ENDJS;
+<script language="JavaScript">
+ Normal1 = new Image();
+ Normal1.src = "$gfxpath/_updates.gif";
+ Highlight1 = new Image();
+ Highlight1.src = "$gfxpath/_updates_.gif";
+ Normal2 = new Image();
+ Normal2.src = "$gfxpath/_credits.gif";
+ Highlight2 = new Image();
+ Highlight2.src = "$gfxpath/_credits_.gif";
+ Normal3 = new Image();
+ Normal3.src = "$gfxpath/_readme.gif";
+ Highlight3 = new Image();
+ Highlight3.src = "$gfxpath/_readme_.gif";
+ Normal4 = new Image();
+ Normal4.src = "$gfxpath/_todo.gif";
+ Highlight4 = new Image();
+ Highlight4.src = "$gfxpath/_todo_.gif";
+
+function Bildwechsel(Bildnr,Bildobjekt) {
+ window.document.images[Bildnr].src = Bildobjekt.src;
+}
+</script>
+ENDJS
+ &start_html("Menü2","blank");
+print <<END;
+ <a onMouseOver="Bildwechsel(0,Highlight1)" onMouseOut="Bildwechsel(0,Normal1)" href="http://www.updates.yChat.de" target="Updates"><img src="$gfxpath/_updates.gif" border=0></a>
+ <a onMouseOver="Bildwechsel(1,Highlight2)" onMouseOut="Bildwechsel(1,Normal2)" href="http://www.credits.yChat.de" target="Updates"><img src="$gfxpath/_credits.gif" border=0></a>
+ <a onMouseOver="Bildwechsel(2,Highlight3)" onMouseOut="Bildwechsel(2,Normal3)" href="http://www.credits.yChat.de" target="Updates"><img src="$gfxpath/_readme.gif" border=0></a>
+ <a onMouseOver="Bildwechsel(3,Highlight4)" onMouseOut="Bildwechsel(3,Normal4)" href="http://www.credits.yChat.de" target="Updates"><img src="$gfxpath/_todo.gif" border=0></a>
+</body>
+</html>
+END
+}
+
+
+sub werda_html { # Anzeige, wer eingelogt ist.
+ &start_html("Wer ist da?");
+ print <<END;
+<div>
+ $alias, schön daß Du hier bist :-)
+</div>
+<hr>
+<div>
+ Folgende Personen befinden sich im Chat:
+</div>
+<br>
+<div>
+END
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ my $room = $_;
+ &read_file("data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ &list_dir("data/online/rooms/$room",2);
+ local $nr = $#dir2-1;
+ print $q->b( $_ ),
+ " $door ($nr) Raumthema: $rstat[1]",
+ $q->br;
+ foreach(@dir2) {
+ if ($_ ne ".." && $_ ne ".") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid" }, "$_"), " ";
+ }
+ }
+ print $q->br, $q->br;
+ }
+ }
+ print
+ "</div>",
+ $q->end_html;
+}
+
+sub logs_html {
+ &start_html("Logdateien");
+ print <<END;
+<div>
+ Hier befinden sich alle Logdateien
+</div>
+<hr>
+END
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ print $q->div( "Folgende Logdateien des Raumes \"Cyberbar\" können nur von Wächtern und Oberwächtern gelesen werden (Sortiert nach A-Z, a-z):" ),
+ $q->br;
+ &list_dir("data/logs");
+ my @sortedir = sort(@dir);
+ foreach(@sortedir) {
+ if (-f "data/logs/$_") {
+ print $q->a( { -href=>"htdocs.pl?alias=$alias&var=view_logs_html&tmp=data/logs/$_&tmpid=$tmpid",
+ -target=>"_new" },
+ "$_" ),
+ " ";
+ }
+ }
+ } else {
+ print $q->div( "Logdateien können nur von Oberwächtern (OW) und von Wächtern (WÄ) gelesen werden. Du bist jedoch ein ",
+ "\"Normaler Chatter\". Wächter können alles nachlesen, was öffentlich gechattet wurde." ),
+ $q->hr;
+ &printfile("data/htdocs/logs_html");
+ }
+ print
+ $q->end_html;
+}
+
+sub superuser_html { # Zeigt an, wer Superuser ist
+ &start_html("Superuser");
+ print "<div>Hallo $alias. Du bist als ";
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ print
+ $q->b( "Oberwächter" ),
+ " (OW) eingetragen.</div>",
+ $q->hr;
+ } elsif ( $hirachie eq "wa") {
+ print
+ $q->b( "Wächter" ),
+ " (WÄ) eingetragen.</div>",
+ $q->hr;
+ } else {
+ print
+ $q->b( "normaler Chatter" ),
+ " (NC) eingetragen.</div>",
+ $q->hr;
+ }
+
+ my $nrow = $#ows+1;
+ print
+ "<div>",
+ $q->b( "OW" ),
+ "s ($nrow Stück)";
+ foreach(@ows) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+ my $nrwa = $#was+1;
+ print
+ "</div>",
+ $q->hr,
+ "<div>",
+ $q->b( "WÄ" ),
+ "s ($nrwa Stück)";
+ foreach(@was) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+print <<END;
+<hr>
+ Die jeweiligen Fähigkeiten der Oberwächter (OW) und der Wächter (WÄ) sind unter
+ "<a href="htdocs.pl?var=help_html&tmpid=$tmpid">Chat-Befehle</a>"
+ dokumentiert.
+</div>
+</body>
+</html>
+END
+} \ No newline at end of file
diff --git a/0.4.2/index.pl b/0.4.2/index.pl
new file mode 100644
index 0000000..423749c
--- /dev/null
+++ b/0.4.2/index.pl
@@ -0,0 +1,392 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header; # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUFGERUFEN WERDEN?##
+#####################################
+if ($var eq "create_alias_html") {
+ &create_alias_html;
+} elsif ($var eq "create_alias") {
+ &create_alias;
+} elsif ($var eq "login_html") {
+ &login_html;
+} elsif ($alias eq "") {
+ &login_html;
+} else {
+ &checklogin;
+}
+
+sub login_html { # Erste Startseite
+local $counter = undef;
+&read_file("data/count");
+ $counter = <DATEI>;
+close DATEI;
+$counter++;
+&write_file_new("data/count");
+ print DATEI $counter;
+close DATEI;
+&list_dir("data/online/users");
+my $logtin = $#dir-1;
+&list_dir("data/user/options",2);
+my $users = $#dir2-1;
+&start_html("Created & Copyright by Paul C. Bütow");
+print <<END;
+ <center>
+ <table width=500>
+ <tr>
+ <td>
+ <center>
+ <table>
+ <tr>
+ <td>
+ <img src="$gfxpath/y.gif">
+ </td>
+ <td>
+ <div>
+ yChat: Version $version
+ <br><br>
+ Letztes Update: $datum
+ <br><br>
+ Seitenaufrufe: $counter
+ <br><br>
+ Benutzer registriert: $users
+ <br><br>
+ Benutzer online: $logtin
+ <br><br>
+ Webmaster: <a href="mailto:paul\@buetow.oxg.de">Paul C. Bütow</a>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </center>
+ </div>
+ <br>
+ <br>
+END
+ if ($tmp eq "true") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Wahrscheinlich existiert Dein Alias "$alias" nicht,
+ <br>
+ Du hast Dich verschrieben oder das Passwort ist falsch.
+ <br>
+ Versuch es erneuert !
+ </div>
+END
+ } elsif ($tmp eq "quit") {
+print <<END;
+ <div>
+ Du hast soeben den Chat verlassen.
+ <br>
+ Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ } elsif ($tmp eq "banned") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein Alias "$alias" wurde verbannt.
+ <br>
+ Z.z. kannst Du Dich leider nicht in den Chat einloggen.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($tmp eq "kick") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wurdest soeben aus dem Chat katapultiert!
+ <br>
+ Schlechtes Verhalten mag die Ursache hierfür sein.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($var eq "create_alias") {
+print "<div>Du hast sich soeben in die Datenbank eingetragen. Einfach auf \"Los Geht's\" klicken :-)</div>";
+ } else {
+print <<END;
+ <div>
+ Herzlich willkommen!
+ <br>
+ Einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <form action="index.pl" method="post">
+ <input type="hidden" name="tmp" value="true">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Alias:
+ <br>
+ <input name="alias" value="$alias">
+ </div>
+ </td>
+ <td>
+ <div>
+ Dein Passwort:
+ <br>
+ <input type="password" name="id" value="$id">
+ </div>
+ </td>
+ </tr>
+ </table>
+ <br>
+ <br>
+ <div>
+ Solltest Du noch keinen Nick besitzen, dann auf "Registrieren" klicken!
+ </div>
+ <br>
+ <table>
+ <tr>
+ <td>
+ <font color="ffffff">
+ <input type="submit" value="Los geht's!">
+ </font>
+ </form>
+ </td>
+ <td>
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias_html">
+ <font color="ffffff">
+ <input type="submit" value="Registrieren">
+ </font>
+ </form>
+ </td>
+ </tr>
+ </table>
+ <hr>
+ </td>
+ </tr>
+ </table>
+ </center>
+</body>
+</html>
+END
+ if ($logtin == 0) {
+ &list_dir("data/msgs");
+ &list_dir("data/online/rstat",2);
+ foreach(@dir) {
+ unlink("data/msgs/$_");
+ unlink("data/online/ident/$_");
+ }
+ foreach(@dir2) {
+ unlink("data/online/rstat/$_");
+ }
+ }
+ # Falls d. Skript das Raumverz. gelöscht hat, neu anlegen
+ if (-d "data/online/rooms") {
+ } else {
+ mkdir "data/online/rooms", 0777;
+ }
+}
+
+
+sub create_alias_html { # HTML-Form für Erstellung eines neuen Benutzers.
+my $reload = $_[0];
+&start_html("Registration");
+print <<END;
+ <center>
+ <table width=500>
+ <tr>
+ <td>
+END
+ if ($reload eq "alias_exists") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Der von Dir gewählte Benutzername "$alias" existiert in unserer Datenbank bereits. Bitte versuch es erneuert mit
+ einem anderen Benutzernamen !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "pw_wrong") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Deine beiden Passworteingaben stimmen nicht überein. Bitte geb das Passwort erneuert an um sicherzugehen, daß
+ kein falsches Passwort abgespeichert wird !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "alias_prohibited") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein gewählter Benutername "$alias" enthält illegale Zeichen. Bitte versuch einen anderen Benutzernamen!
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Hier kannst Du Dich registrieren. Bitte beachte, daß die Passworteingabefelder übereinstimmen!
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias">
+ <div>
+ Dein Alias:
+ <font color="ffa500">
+ (Muß angegeben werden)
+ </font>
+ <br>
+ <input name="alias" VALUE="$alias">
+ </div>
+ <br>
+ <div>
+ Dein gewünschtes Passwort:
+ <br>
+ <input type="password" name="id" value="$id">
+ </div>
+ <br>
+ <div>
+ Geb hier Dein Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp">
+ </div>
+ <br>
+ <font color=ffffff>
+ <input type="submit" value="Registrieren">
+ </font>
+ <br>
+ </form>
+ <hr>
+ <div>
+ Um den Chat zu betreten müssen die Daten nach der Registration auf der Startseite erneuert bestätigt werden !
+ </div>
+ </td>
+ </tr>
+ </table>
+</center>
+</body>
+</html>
+END
+}
+
+sub checklogin { # Überprüfen, ob die Login-Daten korrekt sind.
+ my $lognotexists = "true";
+ &list_dir("data/user/options");
+ for (my $i=0; $i<=$#dir; $i++) {
+ if ($dir[$i] eq $alias) {
+ &read_file("data/user/options/$alias");
+ @datei = <DATEI>;
+ close DATEI;
+ chomp($datei[0]);
+ if ($datei[0] eq $id) {
+ &read_file("data/ban"); # Überprüfen, ob Alias verbannt ist
+ @banned = <DATEI>;
+ close DATEI;
+ foreach(@banned) {
+ if ($_ eq "$alias\n") {
+ $tmp = "banned";
+ &login_html();
+ exit;
+ }
+ }
+ $col = $datei[1];
+ $secol = $datei[2];
+ $tmpid = time;
+ &write_file_new("data/online/ident/$alias");
+ print DATEI $ENV{'REMOTE_ADDR'}."\n".$tmpid;
+ close DATEI;
+ &read_file("data/user/lastlogin/$alias");
+ my @lastlogin = <DATEI>;
+ close DATEI;
+ &write_file_new("data/user/lastlogin/$alias");
+ print DATEI time;
+ close DATEI;
+ &frameset_html;
+ exit;
+ } else {
+ $lognotexists = "false";
+ }
+ }
+ }
+ if ($lognotexists eq "true") {
+ }
+ &login_html; # Falls Login-Daten inkorrekt sind, zurück zur Startseite.
+}
+
+sub create_alias { # Erstellung eines neuen Benutzers.
+ if ($alias =~ /[\W]/ || $alias eq "") {
+ &create_alias_html("alias_prohibited");;
+ exit;
+ } elsif ($id ne $tmp) {
+ &create_alias_html("pw_wrong");
+ exit;
+ }
+ &list_dir("data/user/options");
+ for (my $i=0; $i<=$#dir; $i++) {
+ if ($dir[$i] eq $alias) {
+ &create_alias_html("alias_exists");
+ exit;
+ }
+ }
+ &write_file_new("data/user/options/$alias");
+ print DATEI $id."\n";
+ close DATEI;
+ &zeit;
+ &list_dir("data/user/options");
+ my $number = $#dir-1;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias [$number] hat sich soeben als neuer Benutzer registriert :-) ...</font></i>");
+ &login_html;
+}
+
+sub frameset_html {
+print <<END;
+<html>
+ <head>
+ <title>
+ $title - Created & Copyright by Paul C. Bütow
+ </title>
+ </head>
+
+<frameset border=0 frameborder=0 framespacing=0 cols="130,*">
+ <frameset border=0 frameborder=0 framespacing=0 rows="300,*,55">
+ <frame name="online" src="online.pl?room=$room&alias=$alias&tmpid=$tmpid">
+ <frame src="htdocs.pl">
+ <frameset border=0 frameborder=0 framespacing=0 cols="70,*">
+ <frame name="logo" src="htdocs.pl?var=logo_html" scrolling="no">
+ <frame name="reload" src="htdocs.pl" scrolling="no">
+ </frameset>
+ </frameset>
+ <frameset border=0 frameborder=0 framespacing=0 rows="60,*,55">
+ <frame name="menu" src="htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol&tmpid=$tmpid" scrolling="no">
+ <frame name="main" src="push.pl?room=$room&alias=$alias&tmpid=$tmpid">
+ <frame name="input" src="main.pl?alias=$alias&var=input_html&room=$room&col=$col&secol=$secol&tmp=login&tmpid=$tmpid" scrolling="no">
+ </frameset>
+</frameset>
+</html>
+END
+}
diff --git a/0.4.2/main.pl b/0.4.2/main.pl
new file mode 100644
index 0000000..f6efdd1
--- /dev/null
+++ b/0.4.2/main.pl
@@ -0,0 +1,798 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI; # CGI-Modul laden
+
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+if ($var eq "input_html") {
+ &secure_checkid($alias);
+ &input_html;
+} elsif ($var eq "post_msg") {
+ &post_msg;
+} else {
+ &error("Parameter fehlt");
+}
+
+sub input_html { # Eingabemaske für den Chat.
+ if ($tmp eq "login") {
+ &remove_rooms;
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat den Chat betreten ...</font></i>");
+ }
+ my $whisper = @_;
+ $whisper = $q->param('whisper') if ($whisper == 0);
+print <<END;
+<html>
+ <head>
+ <script language="JavaScript">
+
+maxVerlauf = 10; // Anzahl der Einträge des Verlaufs
+maxPreview = 20; // Zeichenlänge der Verlaufsvorschau
+fullVerlauf = new Array( maxVerlauf );
+
+function delout()
+{
+ addVerlauf( document.inf.msg.value );
+ document.verlaufform.verlauf.selectedIndex = maxVerlauf;
+ document.inf.submit(); // Formular absenden
+ document.inf.msg.focus();
+ document.inf.msg.select();
+ return false;
+}
+function CheckAuswahl()
+{
+ id = document.verlaufform.verlauf.selectedIndex;
+
+ if( fullVerlauf[ id-1 ] == null ) // Falls das Feld leer ist
+ return false; // Aufruf ignorieren
+
+ document.inf.msg.value = fullVerlauf[ id-1 ];
+
+ return true;
+}
+function addVerlauf( msg )
+{
+ if( msg == "" ) // Falls msg leer
+ return false; // Aufruf ignorieren
+
+ for( i=0; i<(maxVerlauf-1); i++ ) // Alle Einträge einen aufrutschen
+ {
+ document.verlaufform.verlauf.options[i+1].text = document.verlaufform.verlauf.options[i+2].text;
+ fullVerlauf[i] = fullVerlauf[i+1];
+ }
+ if( msg.length > maxPreview )
+ pre = msg.slice( 0, maxPreview-3 ) + "...";
+ else
+ pre = msg;
+
+ document.verlaufform.verlauf.options[ maxVerlauf ].text = pre; // Neue Vorschau anfügen
+ fullVerlauf[ maxVerlauf-1 ] = msg; // Neuen Eintrag anfügen
+}
+
+ </script>
+$style
+ </head>
+<body class="blank">
+ <div align="left">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td>
+ <form name="inf" target="reload" action="main.pl" method="GET" onsubmit="return delout()">
+ <input type="hidden" name="var" value="post_msg">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="room" value="$room">
+ <input type="hidden" name="col" value="$col">
+ <input type="hidden" name="secol" value="$secol">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="id" value="$whisper">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input size="40" name="msg">
+ <input type="submit" value="Texten">
+ </form>
+ </td>
+ <td>
+ <form name="verlaufform">
+ <select size="1" name="verlauf" size="40" onChange="CheckAuswahl()">
+ <option value>- Nachrichten-Verlauf -</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ </select>
+ </form>
+ </td>
+ </tr>
+ </table>
+ </div>
+</body>
+</html>
+END
+}
+
+sub reload_html { # Wird neugeladen, wenn eine Nachricht getextet wird!
+ my ($whisper,$action) = @_;
+ print "<html><head><script language=\"JavaScript\">";
+ if ($action eq "change_room") {
+ print "open(\"online.pl?alias=$alias&room=$room&tmpid=$tmpid\",\"online\");";
+ print "open(\"main.pl?var=input_html&alias=$alias&room=$room&col=$col&secol=$secol&whisper=$whisper&tmpid=$tmpid\",\"input\");";
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol&tmpid=$tmpid\",\"menu\");";
+ } elsif ($action eq "change_colors") {
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol&tmpid=$tmpid\",\"menu\");";
+ print "open(\"main.pl?var=input_html&alias=$alias&room=$room&col=$col&secol=$secol&whisper=$whisper&tmpid=$tmpid\",\"input\");";
+ } elsif ($action eq "away") {
+ print "open(\"main.pl?var=input_html&alias=$alias&col=$col&secol=$secol&room=$room&tmp=noaway&whisper=$whisper&tmpid=$tmpid\",\"input\");";
+ } elsif ($action eq "whisper") {
+ print "open(\"main.pl?var=input_html&alias=$alias&col=$col&secol=$secol&room=$room&whisper=$whisper&tmpid=$tmpid\",\"input\");";
+ } elsif ($action eq "quit") {
+ print "open(\"index.pl?tmp=quit\",\"_top\");";
+ }
+ print "</script></head><body bgcolor=$col>";
+ print
+ $q->end_html;
+}
+
+sub post_msg { # Wird aufgerufen, wenn aus input_html eine Eingabe gepostet wurde.
+ &secure_checkid($alias);
+ if ($tmp eq "noaway") {
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias meldet sich zurück ... </font></i>");
+ &post_prv($alias,"<script language=\"JavaScript\">open(\"main.pl?var=input_html&alias=$alias&col=$col&secol=$secol&room=$room&whisper=$whisper&tmpid=$tmpid\",\"input\");</script>");
+ }
+ $msg =~ s#<#&lt\;#g; # HTML-Tags deaktivieren
+ if (substr($msg,0,1) ne "/") { # Überprüfen, ob Befehl oder Nachricht
+ $msg = "<b><font color=$col>$alias: <font color=$secol>".$msg."</font></font></b>";
+ &reload_html($id,$tmp); # -> Action=none, Whisper=$id, $tmp =? noaway
+ &post($msg);
+ } else {
+ &cmd($msg);
+ }
+}
+
+sub cmd { # Alle Chatbefehle, die über input_html eingegeben werden können.
+ $_[0] = $_[0]." ";
+ $_[0] = substr($_[0], 1, length($_[0])-1);
+ my @cmd = split(/ /, $_[0]);
+ my $cmd = substr($_[0],0 , index($_[0], " "));
+ my ($whisper,$action) = ($id);
+#############>- NORMALE CHATBEFEHLE ( Alphabetisch sortiert ) -<
+#############>- INFORMATIONEN ÜBER DAS SYSTEM AUSGEBEN -<
+ if ($cmd eq "about") {
+ &post_prv("$alias","<font size=2 color=ffffff>Aktuelle Version ist $title und wurde am $datum aktuallisiert. Created by Paul C. Bütow 2k.</font>");
+#############>- ABMELDEN MIT 'AWAY-NACHRICHT' -<
+ } elsif ($cmd eq "away") {
+ if ($tmp eq "away") { # Falls 2 mal hintereinander /away eingegeben wurde
+ my $away_msg = "";
+ }
+ for ($i=1; $i <= $#cmd; $i++) {
+ $away_msg = $away_msg." ".$cmd[$i];
+ }
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias meldet sich ab (<font color=red>$away_msg</font> ) ...</i></font>");
+ &reload_html($whisper,"away");
+ exit;
+#############>- EIGENEN CHATBILDSCHIRM LÖSCHEN -<
+ } elsif ($cmd eq "clear") {
+ &post_prv("$alias","<script language=\"JavaScript\">window.open(\"push.pl?alias=$alias&room=$room&var=clear_screen&tmpid=$tmpid\",\"main\");</script>");
+ &reload_html($whisper);
+ exit;
+#############>- FARBEN WECHSELN -<
+ } elsif ($cmd eq "col") {
+ $col = $cmd[1];
+ my $tmpsecol = $cmd[2];
+ if ($tmpsecol eq "") {
+ $secol = $col
+ } else {
+ $secol = $tmpsecol;
+ }
+ &read_file("data/user/options/$alias");
+ my @pro = <DATEI>;
+ close DATEI;
+ &write_file_new("data/user/options/$alias");
+ print DATEI $pro[0]."".$col."\n".$secol;
+ close DATEI;
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat die Farbe gewechselt ...</font></i>");
+ &reload_html($whisper,"change_colors");
+ exit;
+#############>- AKTUELLES DATUM UND URZEIT AUSGEBEN -<
+ } elsif ($cmd eq "date") {
+ &zeit;
+ &post_prv("$alias","<font size=2 color=ffffff>Heute ist der $day.$month. Jahr $year. Es ist genau $hours:$min Uhr und $sec Sekunden.</font>");
+ &reload_html($whisper);
+ exit;
+#############>- EINEN NEUEN RAUM ERSTELLEN BZW. IN EINEN BESTEHENDEN RAUM WECHSELN -<
+ } elsif ($cmd eq "j") {
+ &change_room("j",$cmd[1],$room);
+ &reload_html($whisper,"change_room");
+ exit;
+#############>- HANDELN -<
+ } elsif ($cmd eq "me" || $cmd eq "m") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $me_msg = $me_msg." ".$cmd[$i];
+ }
+ if ($cmd eq "m") {
+ &post("<i><font color=$col>$alias <font color=$secol>$me_msg</font></font></i>");
+ } else {
+ &post("<i><font color=$col>$alias $me_msg</font></i>");
+ }
+ &reload_html($whisper);
+ exit;
+#############>- MEMO SCHREIBEN -<
+ } elsif ($cmd eq "memo") {
+ my $alias2memo = $cmd[1];
+ &list_dir("data/user/options");
+ foreach(@dir) {
+ if(-f "data/user/options/$alias2memo") {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $memo_msg = $memo_msg." ".$cmd[$i];
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2memo <font color=ffffff>wurde folgende memo erfolgreich hinterlassen: $memo_msg</font></font>");
+ &zeit;
+ &write_file("data/user/memos/$alias2memo");
+ print DATEI "<font size=2 color=ffffff>(<font color=red>$day.$month. - $hours:$min:$sec</font>) $alias hat Dir eine Memo hinterlassen: <font color=ffa500>$memo_msg</font></font><br>";
+ close DATEI;
+ &reload_html($whisper);
+ exit;
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2memo <font color=ffffff>existiert in der Datenbank nicht !</font></font>");
+ &reload_html($whisper);
+ exit;
+#############>- FLÜSTERN ( Auch mit '/' ) -<
+ } elsif ($cmd eq "msg" || $cmd eq "") {
+ my ($alias2post,$msg2post) = ($cmd[1],"");
+ if ($cmd eq "msg") {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ $action = "whisper";
+ } else {
+ $alias2post = $id;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ }
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ if ($_ eq $alias2post) {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "<i><font color=$col>$alias flüstert <font color=ffffff>=></font><font color=$secol>$msg2post</font></font></i><br>\n";
+ close DATEI;
+ &write_file("data/msgs/$alias");
+ print DATEI "<i><font color=$col>Zu $alias2post geflüstert <font color=ffffff>=></font><font color=$secol>$msg2post</font></font></i><br>\n";
+ close DATEI;
+ &reload_html($alias2post,$action);
+ exit;
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2post <font color=ffffff>ist momentan nicht anwesend !</font></font>");
+#############>- TOTALONLINEZEIT VON ALIAS ANZEIGEN -<
+ } elsif ($cmd eq "online") {
+ my $alias2prove= $cmd[1];
+ if (-f "data/user/counts/$alias2prove.online") {
+ &read_file("data/user/counts/$alias2prove.online");
+ my $online = <DATEI>;
+ close DATEI;
+ my $totaltime = sprintf("%.2f",($online / 60));
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff> war insgesamt schon $totaltime Minuten online !</font></font>");
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff>hat z.Z. keine Statistiken !</font></font>");
+ }
+ &reload_html($whisper);
+ exit;
+#############>- DAS SYSTEM VERLASSEN -<
+ } elsif ($cmd eq "q") {
+ &reload_html($whisper,"quit");
+ sleep 2;
+ &remove_online($alias,$room);
+ &secure_removeid($alias);
+ exit;
+#############>- DAS EIGENE GÄSTEBUCH LÖSCHEN -<
+ } elsif ($cmd eq "rmgb") {
+ unlink("data/user/gbooks/$alias");
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias löscht sein gesamtes Gästebuch ...</font></i>",$_);
+ &reload_html($whisper);
+ exit;
+#############>- SCHREIEN -<
+ } elsif ($cmd eq "s") {
+ my ($msg2scream,$msg2post);
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2scream = $msg2scream." ".$cmd[$i];
+ }
+ $msg2post = "\U$msg2scream";
+ &post("<font color=$col><i>$alias schreit:</i> <b><font color=$secol>".$msg2post."</font></font></b>");
+ &reload_html($whisper);
+ exit;
+#############>- SEHEN, WANN SICH ALIAS ZUM LETZTEN MAL EINGELOGT HAT -<
+ } elsif ($cmd eq "seen") {
+ my $alias2prove = $cmd[1];
+ &list_dir("data/user/options");
+ foreach(@dir) {
+ if (-f "data/user/lastlogin/$alias2prove") {
+ &read_file("data/user/lastlogin/$alias2prove");
+ my $lastlogin = <DATEI>;
+ close DATEI;
+ my $timestamp = sprintf("%.2f",((time() - $lastlogin) / 3600));;
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff> hat sich vor $timestamp Stunden zuletzt in das System eingelogt !</font></font>");
+ &reload_html($whisper);
+ exit;
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff> hat z.Z. keine Statistiken !</font></font>");
+ &reload_html($whisper);
+ exit;
+#############>- ANZEIGEN WER SICH IM AKTUELLEN RAUM BEFINDET -<
+} elsif ($cmd eq "w") {
+ &list_dir("data/online/rooms/$room");
+ &read_file("data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ my ($is,$nr) = ("t",0);
+ foreach(@dir) {
+ if (-f "data/online/rooms/$room/$_") {
+ $personen = $personen." ".$_;
+ $nr++;
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>$room $door ($nr) [".$rstat[1]."] : <font color=ffa500>$personen</font></font>");
+ &reload_html($whisper);
+ exit;
+ #############>- ANZEIGEN WER SICH IM SYSTEM BEFINDET -<
+ } elsif ($cmd eq "wc" || $cmd eq "wc/") {
+ $raum = $cmd[1];
+ if ($raum eq "" && $cmd eq "wc") {
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/users/$_");
+ }
+ my $nr = ($#dir-1);
+ my ($nrs,$is) = ("","ist");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "sind";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>$nr Person$nrs $is insgesamt eingelogt: <font color=ffa500>$personen</font></font>");
+ } elsif ($raum eq "" && $cmd eq "wc/") {
+ my $msg2post;
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ &list_dir("data/online/rooms/$_",2);
+ &read_file("data/online/rstat/$_");
+ my @rstat = <DATEI>;
+ close DATEI;
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ my $nr = $#dir2-1;
+ $msg2post = $msg2post."<tr><td><b><font size=2 color=ffffff>$_ $door ($nr) [".$rstat[1]."] </font></b></td><td><font size=2 color=ffffff>";
+ foreach $chatter (@dir2) {
+ if (-f "data/online/rooms/$_/$chatter") {
+ $msg2post = $msg2post."$chatter ";
+ }
+ }
+ print "</font></td>";
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>Folgende Räume sind offen:</font><table>$msg2post</table>");
+ } elsif ($raum ne "") {
+ my $personen;
+ &list_dir("data/online/rooms/$raum");
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/rooms/$raum/$_");
+ }
+ my ($nr,$is) = (($#dir-1),"t");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "n";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff> $nr Person$nrs befinde$is sich im Raum \"$raum\": <font color=ffa500>$personen</font></font>");
+ }
+ &reload_html($whisper);
+ exit;
+#############>- ANZEIGEN IN WELCHEN RAUM SICH JMD. BEFINDET BZW. JMD IN EINEN RAUM FOLGEN -<
+ } elsif ($cmd eq "wj" || $cmd eq "ju") {
+ my $alias2search = $cmd[1];
+ &list_dir("data/online/rooms");
+ foreach $raum (@dir) {
+ &list_dir("data/online/rooms/$raum",2) if (-d "data/online/rooms/$raum");
+ foreach $user (@dir2) {
+ if (-f "data/online/rooms/$raum/$user") {
+ if ($user eq $alias2search) {
+ if ($cmd eq "wj") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2search <font color=ffffff>befindet sich im Raum \"$raum\" !</font></font>");
+ } else {
+ &change_room("ju",$raum,$room,$alias2search);
+ }
+ &reload_html($whisper,"change_room");
+ exit;
+ }
+ }
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2search <font color=ffffff> ist nicht eingelogt !</font></font>");
+ &reload_html($whisper);
+ exit;
+#############>- RAUMNESETZER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- RAUM ABSCHLIESSEN/AUFSCHLIESSEN -<
+ } elsif ($cmd eq "l") {
+ &prove_besetzer($alias,$room);
+ &hirachie($alias);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ my $lock = "0\n";
+ &zeit;
+ if ($room eq "Cyberbar") {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum ohne Erfolg ab ...</font></i>");
+ } else {
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum ab ...</font></i>");
+ } else {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum auf ...</font></i>");
+ }
+ for ($i=1;$i<=$#r_stat;$i++) {
+ $lock = $lock.$r_stat[$i];
+ }
+ write_file_new("data/online/rstat/$room");
+ print DATEI $lock;
+ close DATEI;
+ }
+ }
+ &reload_html($whisper);
+ exit;
+#############>- RAUMBESETZER ERNENNEN -<
+ } elsif ($cmd eq "su") {
+ &prove_besetzer($alias,$room);
+ &hirachie($alias);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ my $alias2su = $cmd[1];
+ &list_dir("data/online/rooms/$room");
+ foreach(@dir) {
+ if ($_ eq $alias2su) {
+ &read_file("data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ &hirachie($alias2su);
+ &prove_besetzer($alias2su,$room);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ &reload_html($whisper);
+ &post_prv($alias,"<font color=ffa500>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist bereits RB, WÄ oder OW)</font>");
+ exit;
+ }
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias ernennt \"$alias2su\" zum Raumbesetzer ...</font></i>");
+ &write_file("data/online/rstat/$room");
+ print DATEI $alias2su."\n";
+ close DATEI;
+ &reload_html($whisper);
+ exit;
+ }
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist nicht anwesend)</font>");
+ }
+ &reload_html($whisper);
+ exit;
+#############>- RAUMBESETZER ENTNENNEN -<
+ } elsif ($cmd eq "rsu") {
+ &prove_besetzer($alias,$room);
+ &hirachie($alias);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ my $alias2rsu = $cmd[1];
+ &read_file("data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ &prove_besetzer($alias2rsu,$room);
+ if ($r_besetzer eq "true") {
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias entzieht \"$alias2rsu\" die Raumbesetzerrechte ...</font></i>");
+ my $newrstat = $rstat[0].$rstat[1];
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $newrstat = $newrstat.$r_stat[$i] if ($r_stat[$i] ne $alias2rsu."\n");
+ }
+ &write_file_new("data/online/rstat/$room");
+ print DATEI $newrstat;
+ close DATEI;
+ } else {
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2rsu <font color=ffffff>ist kein Raumbesetzer und kann dieser Status auch nicht aberkannt werden !</font></font>");
+ }
+ }
+ &reload_html($whisper);
+ exit;
+#############>- RAUM EIN THEMA GEBEN -<
+ } elsif ($cmd eq "t") {
+ &prove_besetzer($alias,$room);
+ &hirachie($alias);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ my $theme;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $theme = $theme." ".$cmd[$i];
+ }
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias gibt dem Raum das Thema <font color=red>( $theme )</font> ...</font></i>");
+ $theme = $r_stat[0].$theme."\n";
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $theme = $theme.$r_stat[$i];
+ }
+ write_file_new("data/online/rstat/$room");
+ print DATEI $theme;
+ close DATEI;
+ }
+ &reload_html($whisper);
+ exit;
+#############>- SUPERUSER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- ALIAS VERBANNEN BZW. ENTBANNEN -<
+ } elsif ($cmd eq "ban" || $cmd eq "rban") {
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ my ($alias2handle,$registriert) = $cmd[1];
+ &list_dir("data/user/options");
+ foreach(@dir) {
+ $registriert = "true" if ($_ eq $alias2handle);
+ }
+ if ($registriert ne "true") {
+ if ($cmd eq "ban") {
+ if ($alias2handle ne "") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> existiert nicht in der Benutzerdatenbank und kann so nich verbannt werden !</font></font>");
+ } else {
+ &read_file("data/ban");
+ my @banned = <DATEI>;
+ my ($benutzer);
+ my $nr = $#banned+1;
+ close DATEI;
+ foreach(@banned) {
+ $benutzer = $benutzer." ".$_;
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>Folgende Benutzer sind verbannt [$nr]: <font color=ffa500>$benutzer</font></font>");
+ }
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> existiert nicht in der Benutzerdatenbank und kann so nicht \"entbannt\" werden !</font></font>");
+ }
+ &reload_html($whisper);
+ exit;
+ }
+ &read_file("data/ban");
+ my @banlist = <DATEI>;
+ close DATEI;
+ foreach(@banlist) {
+ if ($_ eq "$alias2handle\n") {
+ if ($cmd eq "ban") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> ist bereits verbannt worden !</font></font>");
+ } else {
+ my $banned = "false";
+ foreach(@banlist) {
+ $banned = "true" if ($_ eq "$alias2handle\n");
+ }
+ if ($banned eq "true") {
+ my @newbanlist;
+ foreach(@banlist) {
+ push @newbanlist,$_ if ($_ ne "$alias2handle\n");
+ }
+ &write_file_new("data/ban");
+ print DATEI @newbanlist;
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> wurde soeben \"entbannt\" !</font></font>");
+ }
+ }
+ &reload_html($whisper);
+ exit;
+ }
+ }
+ if ($cmd eq "ban") {
+ &hirachie($alias2handle);
+ if ($hirachie ne "ow" || $hirachie eq "wa") {
+ &write_file("data/ban");
+ print DATEI "$alias2handle\n";
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> wurde soeben verbannt und kann sich nun nichtmehr in den Chat einloggen !</font></font>");
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> ist ein Oberwächter und kann deshalb nicht verbannt werden !</font></font>");
+ }
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> konnte nicht \"entbannt\" werden, da <font color=ffa500>$alias2handle</font> garnicht verbannt war !</font></font>");
+ }
+ }
+ &reload_html($whisper);
+ exit;
+#############>- IP # VON ALIAS ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "ip") {
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ my $alias2prove = $cmd[1];
+ &list_dir("data/online/ident");
+ foreach(@dir) {
+ if ($_ eq $alias2prove) {
+ &read_file("data/online/ident/$_");
+ local $ipnr = <DATEI>;
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$_ <font color=ffffff>hat die IP-Nummer $ipnr !</font></font>");
+ }
+ }
+ }
+ &reload_html($whisper);
+ exit;
+#############>- ALIAS AUS DEM CHAT KATAPULTIEREN -<
+ } elsif ($cmd eq "k") {
+ &hirachie($alias);
+ if ($hirachie eq "wa" || $hirachie eq "ow") {
+ my $alias2kick = $cmd[1];
+ &list_dir("data/online/rooms");
+ foreach $raum (@dir) {
+ &list_dir("data/online/rooms/$raum",2);
+ foreach $chatter (@dir2) {
+ if ($chatter eq $alias2kick) {
+ &hirachie($alias2kick);
+ if ($hirachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist Oberwächter und kann nicht \"gekickt\" werden !</font></font>");
+ } elsif ($hirachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist Wächter und kann nicht \"gekickt\" werden !</font></font>");
+ } else {
+ &post_prv("$alias2kick","<script language=\"JavaScript\">window.open(\"index.pl?tmp=kick\",\"_top\");</script>");
+ &zeit;
+ $_ = undef if ($room eq $_);
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias katapultiert \"$alias2kick\" aus dem Chat ...</font></i>",$_);
+ &remove_online($alias2kick,$_,"kick");
+ &secure_removeid($alias2kick);
+ }
+ &reload_html($whisper);
+ exit;
+ }
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist nicht anwesend und kann nicht \"gekickt\" werden !</font></font>");
+ }
+ &reload_html($whisper);
+ exit;
+#############>- EINEN BENUTZER AUS DEM SYSTEM LÖSCHEN -<
+ } elsif ($cmd eq "kill") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ my $alias2kill = $cmd[1];
+ &hirachie($alias2kill);
+ if ($hirachie eq "ow") {
+ &post_prv($alias,"<font size color=ffa500>$alias2kill</font> <font color=ffffff>ist Oberwächter und kann nicht aus dem System entfernt werden !</font>");
+ } elsif ($hirachie eq "wa") {
+ &post_prv($alias,"<font size color=ffa500>$alias2kill</font> <font color=ffffff>ist Wächter und kann nicht aus dem System entfernt werden !</font>");
+ } else {
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias killt \"$alias2kill\" ganz und gar aus dem System ...</font></i>");
+ unlink("data/user/options/$alias2kill");
+ unlink("data/user/profiles/$alias2kill");
+ unlink("data/user/gbooks/$alias2kill");
+ unlink("data/user/counts/$alias2kill");
+ unlink("data/user/counts/$alias2kill.online");
+ unlink("data/user/lastlogin/$alias2kill");
+ unlink("data/user/memos/$alias2kill");
+ }
+ }
+ &reload_html($whisper);
+ exit;
+ #############>- SYSTEMNACHRICHT IN ALLE BESTEHENDEN RÄUME POSTEN -<
+ } elsif ($cmd eq "sys") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $sys_msg = $sys_msg." ".$cmd[$i];
+ }
+ &zeit;
+ &post_all("<i><font color=ffffff>($hours:$min:$sec)</font></i> <b><font size=2 color=red>SYSTEMNACHRICHT</font></b><i><font color=ffffff>: $sys_msg ...</font></i>");
+ }
+ &reload_html($whisper);
+ exit;
+#############>- ALIAS ZUM WÄCHTER ERNNENNEN BZW. ZUM NORMALEN CHATTER DEGRADIEREN -<
+ } elsif ($cmd eq "wa" || $cmd eq "rwa") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ &zeit;
+ my $alias2handle = $cmd[1];
+ if ($cmd eq "wa") {
+ my $anerkennen = "false";
+ &list_dir("data/user/options");
+ foreach(@dir) {
+ if ($_ eq $alias2handle) {
+ $anerkennen = "true";
+ }
+ }
+ if ($anerkennen eq "true") {
+ &hirachie($alias2handle);
+ if ($hirachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff>ist bereits als Wächter eingetragen. Eine erneuerte Eintragung ist nicht möglich!</font></font>");
+ } elsif ($hirachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff>ist schon als Oberwächter eingetragen. Oberwächter können nicht gleichzeitig Wächter sein!</font></font>");
+ } else {
+ &write_file("data/wa");
+ print DATEI $alias2handle."\n";
+ close DATEI;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font><font color=ffa500> $alias ernennt \"$alias2handle\" zum Wächter ...</font></i>");
+ }
+ } else {
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2handle <font color=ffffff>kann nicht zum Wächter ernannt werden da Benutzername nicht existiert!</font></font>");
+ }
+ } elsif ($cmd eq "rwa") {
+ &read_file("data/wa");
+ my @wafile = <DATEI>;
+ close DATEI;
+ my $aberkennen = "false";
+ foreach(@wafile) {
+ if ($_ ne "$alias2handle\n") {
+ push @newafile,$_;
+ } else {
+ $aberkennen = "true";
+ }
+ }
+ &write_file_new("data/wa");
+ print DATEI @newafile;
+ close DATEI;
+ if ($aberkennen eq "true") {
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat \"$alias2handle\" vom Wächter zum normalen Chatter degradiert ...</font></i>");
+ } else {
+ &post("<font size=2 color=ffa500>$alias2handle <font color=ffffff>konnte der Wächterstatus nicht aberkannt werden da Benutzer kein Wächter ist!</font></font>");
+ }
+ }
+ }
+#############>- ENDE DER CHATBEFEHLE -<
+}
+&reload_html($whisper,$action);
+}
+
+sub change_room { # Den Chat-Raum wechseln
+ my ($method,$newroom,$oldroom,$alias2follow) = @_;
+ # Überprüfen, ob Alias Raum betreten darf
+ &read_file("data/online/rstat/$newroom");
+ my @rstat = <DATEI>;
+ close DATEI;
+ if ($rstat[0] eq "1\n") {
+ &hirachie($alias);
+ if ($hirachie eq "wa" || $hirachie eq "ow") {
+ } else {
+ &post_prv("$alias","<font size=2 color=ffffff>Der Raum \"<font color=ffa500>$newroom</font>\" ist leider abgesperrt!</font>");
+ &reload_html($id,$action);
+ exit;
+ }
+ }
+ $room = $oldroom;
+ &zeit; # Zeit 'erneuern'
+ if ($method eq "j") {
+ unlink("data/online/rooms/$oldroom/$alias");
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias wechselt in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias kommt aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ &post_prv("$alias","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>Du wechselst aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ } elsif ($method eq "ju") {
+ unlink("data/online/rooms/$oldroom/$alias");
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias folgt \"$alias2follow\" in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias kommt aus dem Raum \"$oldroom\" und folgt \"$alias2follow\" herein nach \"$newroom\" ...</font></i>");
+ &post_prv("$alias","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>Du folgst \"$alias2follow\" aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ }
+ # Sicherheitshalber Alias erneuert entf.
+ unlink("data/online/rooms/$oldroom/$alias");
+ &rm_rstat($oldroom,$alias);
+ &rm_rooms;
+}
+
+sub prove_besetzer { # Prüfen, ob Benutzer Raumbesetzerrechte hat
+ my ($r_alias,$r_room) = @_;
+ $r_besetzer = "false";
+ &read_file("data/online/rstat/$r_room");
+ @r_stat = <DATEI>;
+ close DATEI;
+ for($i=2;$i<=$#r_stat;$i++) {
+ $r_besetzer = "true" if ($r_stat[$i] eq $r_alias || $r_stat[$i] eq $r_alias."\n");
+ }
+} \ No newline at end of file
diff --git a/0.4.2/main2.pl b/0.4.2/main2.pl
new file mode 100644
index 0000000..dbc736a
--- /dev/null
+++ b/0.4.2/main2.pl
@@ -0,0 +1,568 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+
+if ($var eq "list_alias_html") {
+ &list_alias_html;
+} elsif ($var eq "alias_html") {
+ &alias_html;
+} elsif ($var eq "edit_profile_html") {
+ &edit_html("edit_profile_html");
+} elsif ($var eq "edit_options_html") {
+ &edit_html("edit_options_html");
+} elsif ($var eq "gb_html") {
+ &secure_checkid($alias);
+ &gb_html;
+} elsif ($var eq "post_gb") {
+ &secure_checkid($alias);
+ &post_gb;
+} elsif ($var eq "edit_profile") {
+ &secure_checkid($alias);
+ &edit("edit_profile");
+} elsif ($var eq "edit_options") {
+ &secure_checkid($alias);
+ &edit("edit_options");
+} elsif ($var eq "rm_gb_alias") {
+ &secure_checkid($alias);
+ &rm_gb;
+} else {
+ &error("Parameter fehlt");
+}
+
+###########################
+##HAUPTTEIL DIESER DATEI:##
+###########################
+
+sub gb_html { # Das Benutzerboard/Gästebuch.
+ my $message = $_[0];
+ &start_html("Benutzerboard");
+if ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </i>
+ einen Text und poste
+ <u>dann</u>
+ !
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Vielen Dank für Deinen Beitrag. Wenn Du willst, kannst Du jetzt gleich noch einen Eintrag posten ...
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Falls Du Anregungen oder Verbesserungsvorschläge für die Community hast, dann poste doch einen kleinen Eintrag :-)
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="guestbook">
+ <input type="hidden" name="id" value="y">
+ <input size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+ if (-e "data/guestbook") {
+ open (DATEI,"<data/guestbook") || &error("Konnte dat/guestbook nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ print
+ $q->div(@datei);
+ }
+ print
+ $q->end_html;
+}
+
+
+sub post_gb { # Wenn etwas in ein Gästebuch eingetragen wird
+ &zeit;
+ if ($msg eq "") {
+ if ($id eq "y") { # Überprüfen, ob Benutzerboard- oder Privatgästebuch
+ &gb_html("post_empty");
+ } else {
+ &alias_html("post_empty");
+ }
+ exit;
+ }
+ $msg =~ s#<#&lt\;#g;
+ my $tmpath = "";
+ if ($id eq "y") {
+ $tmpath = "data/guestbook";
+ } else {
+ $tmpath = "data/user/gbooks/$tmp";
+ }
+ if (-e "$tmpath") {
+ &read_file("$tmpath");
+ my @datei = <DATEI>;
+ close DATEI;
+ pop(@datei) if ($#datei > 99);
+ my @newdatei = "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ @newdatei = ("@newdatei", "@datei");
+ &write_file_new("$tmpath");
+ print DATEI @newdatei;
+ close DATEI;
+ } else {
+ &write_file_new("$tmpath");
+ print DATEI "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ close DATEI;
+ }
+ if ($id eq "y") {
+ &gb_html("post_ok");
+ exit;
+ } else {
+ post_prv("$tmp","<font size=2 color=ffffff><a href=\"main2.pl?alias=$alias&var=alias_html&tmp=$tmp&tmpid=$tmpid\" target=\"_new\">$alias</a> hat soeben einen Pin in <a href=\"main2.pl?alias=$alias&var=alias_html&tmp=$tmp&tmpid=$tmpid\" target=\"_new\">Dein Profil</a> gehängt ... </font>");
+ &alias_html;
+ exit;
+ }
+}
+
+sub rm_gb { # Gästebucheintrag entfernen
+ $tmp = $alias;
+ &read_file("data/user/gbooks/$alias");
+ my @gbfile = <DATEI>;
+ close DATEI;
+ my @newgbfile = ();
+ for($i=0; $i <= $#gbfile; $i++) {
+ push(@newgbfile,$gbfile[$i]) if ($i != $id);
+ }
+ &write_file_new("data/user/gbooks/$alias");
+ print DATEI @newgbfile;
+ close DATEI;
+ &alias_html("rm_ok");
+}
+
+sub list_alias_html { # Liste aller Benutzer
+ &start_html("Alle Benutzer");
+ &list_dir("data/user/options");
+ my @liste = sort(@dir);
+ my $nr = $#dir-1;
+print <<END;
+ <div>
+ Es sind z.Z. genau $nr Benutzernamen in der Datenbank vorhanden! (Sortiert nach #, A-Z, a-z)
+ </div>
+ <hr>
+ <div>
+END
+ foreach(@liste) {
+ if (-f "data/user/options/$_") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid" },
+ "$_"),
+ " ";
+ }
+ }
+print <<END;
+ </div>
+</body>
+</html>
+END
+}
+
+sub alias_html { # Anzeigen eines Benutzerprofils
+ my $message = $_[0];
+ local $counter = undef;
+ &read_file("data/user/counts/$tmp");
+ $counter = <DATEI>;
+ close DATEI;
+ $counter++;
+ &write_file_new("data/user/counts/$tmp");
+ print DATEI $counter."\n".$counter[1];
+ close DATEI;
+ &start_html($tmp);
+print <<END;
+<div>
+ <a href="htdocs.pl?var=werda_html&alias=$alias&tmpid=$tmpid">Hier</a>
+ gehts zur Gesamtübersicht !
+</div>
+<hr>
+END
+if ($message eq "rm_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Der von Dir gewählte Eintrag wurde erfolgreich gelöscht.
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </u>
+ einen Text und poste
+ <u>dann</u>
+ !
+ <hr>
+END
+}
+ &read_file("data/user/profiles/$tmp");
+ @data = <DATEI>;
+ close DATEI;
+print <<END;
+ <div>
+ Dieses Profil wurde insgesamt schon $counter mal aufgerufen !
+ <br>
+ <br>
+ Alias: $tmp
+ <br>
+ <br>
+ Nachname: $data[0]
+ <br>
+ <br>
+ Vorname: $data[1]
+ <br>
+ <br>
+ Alter: $data[2]
+ <br>
+ <br>
+ Wohnort: $data[3]
+ <br>
+ <br>
+ E-Mail:
+ <a href="mailto:$data[4]">$data[4]</a>
+ <br>
+ <br>
+ ICQ-Nummer: $data[5]
+ <br>
+ <br>
+ Homepage:
+ <a href="$data[6]" target="_new">$data[6]</a>
+ <br>
+ <br>
+ Weiteres:
+ <br>
+ $data[7]
+ <hr>
+ Hier kannst Du $tmp eine Nachricht hinterlassen!
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input type="text" size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+if (-e "data/user/gbooks/$tmp") {
+ open (DATEI,"<data/user/gbooks/$tmp") || &error("Konnte data/user/gbooks/$tmp nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ if ($alias ne $tmp) {
+ print @datei;
+ } else {
+print <<END;
+ <table>
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="rm_gb_alias">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+END
+for($i=0; $i <= $#datei; $i++) {
+print <<END;
+ <tr>
+ <td>
+ <input type="radio" name="id" value="$i">
+ </td>
+ <td>
+ <div class=q>
+ $datei[$i]
+ </div>
+ </td>
+ </tr>
+END
+}
+print <<END;
+ </table>
+ <table>
+ <tr>
+ <td>
+ <font color=ffffff>
+ <input type="submit" value="Makierten Eintrag löschen">
+ </font>
+ </td>
+ <td>
+ <font color=ffffff>
+ <input type="reset" value="Makierung rückgängig machen">
+ </font>
+ </td>
+ </tr>
+ </table>
+ </form>
+END
+}
+}
+ print
+ $q->end_html;
+}
+
+sub edit_html { # Chat-Optionen / Benutzerprofil editieren
+ my ($method,$message) = @_;
+ &start_html("Benutzerprofil ändern");
+ if ($method eq "edit_options_html") {
+ &read_file("data/user/options/$alias");
+ } elsif ($method eq "edit_profile_html") {
+ &read_file("data/user/profiles/$alias");
+ }
+ @data = <DATEI>;
+ close DATEI;
+ if ($method eq "edit_options_html") {
+ chomp($data[0]);
+ if ($message eq "edit_options_ok") {
+print <<END;
+<script language="JavaScript">
+ open("main.pl?var=input_html&alias=$alias&room=$room&col=$col&secol=$secol&tmpid=$tmpid","input");
+ open("htdocs.pl?var=menu_html&alias=$alias&room=$room&col=$col&secol=$secol&tmpid=$tmpid","menu");
+</script>
+<div class=b>
+ Hinweis:
+</div>
+<div>
+ Du hast soeben Deine Chat-Optionen erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren. Um
+ weiterzuchatten einfach Fenster schliessen!
+</div>
+<hr>
+END
+ } elsif ($message eq "edit_pw_wrong") {
+print <<END;
+<div class=b>
+ ACHTUNG!
+</div>
+<div>
+ Du hast soeben versucht, dein Passwort zu ändern. Jedoch stimmte die Erste Eingabe nicht mit der Zweiten überein.
+ Bitte versuch es erneuert ...
+</div>
+<hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Deine Chat-Optionen editieren!" ),
+ $q->hr;
+ }
+print <<END;
+<script lang="javascript" type="text/javascript">
+<!--
+
+function radioWert(rObj) {
+ for (var i=0; i<rObj.length; i++) if (rObj[i].checked) return rObj[i].value;
+ return false;
+}
+
+function insertcode( code ) {
+ document.optionen.elements[radioWert(document.optionen.eingabe)].value = code;
+}
+
+//-->
+</script>
+
+<form name="optionen" action="main2.pl">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="var" value="edit_options">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Passwort
+ <font color=ffa500>
+ (Gut merken !!)
+ </font>
+ <br>
+ <input type="password" name="id" value="$data[0]">
+ </div>
+ </td>
+ <td width=20>
+ </td>
+ <td>
+ <div>
+ Geb hier das Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp" value="$data[0]">
+ </div>
+ </td>
+ </tr>
+ </table>
+<br>
+<br>
+ <table>
+ <tr>
+ <td>
+ <div>
+ <input type="radio" name="eingabe" value="col" checked>
+ Auswahl von Farbe 1
+ <br>
+ (Farbe Deines Nicks):
+ <br>
+ <input name="col" size="6" maxlength="6" value="$data[1]">
+ </div>
+ </td>
+ <td width=20>
+ </td>
+ <td>
+ <div>
+ <input type="radio" name="eingabe" value="secol">
+ Auswahl von Farbe 2
+ <br>
+ (Farbe Deiner Nachrichten):
+ <br>
+ <input name="secol" size="6" maxlength="6" value="$data[2]">
+ </div>
+ </td>
+ </tr>
+ </table>
+<br>
+ <div>
+ Beliebige Auswahl makieren und Farbe wählen. Um Deine Optionen abzuspeichern,
+ auf "Daten ändern" klicken!
+ </div>
+ <br>
+END
+ &read_file("colors.sno");
+ @colors = <DATEI>;
+ close DATEI;
+ print @colors;
+ } elsif ($method eq "edit_profile_html") {
+ if ($message eq "edit_profile_ok") {
+print <<END;
+ <div class=b>
+ Hinweis:
+ </div>
+ <div>
+ Du hast soeben Dein Profil erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren:
+ <hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Dein Profil editieren!" ),
+ $q->hr;
+ }
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="var" value="edit_profile">
+ <div>
+ Dein Nachname:
+ <br>
+ <input name="nachname" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ Dein Vorname:
+ <br>
+ <input name="vorname" value="$data[1]">
+ </div>
+ <br>
+ <div>
+ Dein Alter:
+ <br>
+ <input name="alter" value="$data[2]">
+ </div>
+ <br>
+ <div>
+ Dein Wohnort:
+ <br>
+ <input name="wohnort" value="$data[3]">
+ </div>
+ <br>
+ <div>
+ Deine E-Mail Adresse:
+ <br>
+ <input name="email" value="$data[4]">
+ </div>
+ <br>
+ <div>
+ Deine ICQ-Nummer:
+ <br>
+ <input name="icq" value="$data[5]">
+ </div>
+ <br>
+ <div>
+ Deine Homepage:
+ <br>
+ <input name="homepage" value="$data[6]">
+ </div>
+ <br>
+ <div>
+ Weiteres:
+ <br>
+ <textarea rows="5" cols="40"name="weiteres" wrap="virtual">$data[7]</textarea>
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <font color=ffffff>
+ <input type="submit" value="Daten ändern ...">
+ </font>
+ </form>
+</body>
+</html>
+END
+}
+
+
+sub edit { # Benutzerprofil od. Chat-Optionen abspeichern
+ my $method = $_[0];
+ if ($method eq "edit_profile") {
+ &write_file_new("data/user/profiles/$alias");
+ print DATEI $q->param('nachname')."\n".$q->param('vorname')."\n".$q->param('alter')."\n".$q->param('wohnort')."\n".$q->param('email')."\n".$q->param('icq')."\n".$q->param('homepage')."\n".$q->param('weiteres');
+ close DATEI;
+ &edit_html("edit_profile_html","edit_profile_ok");
+ } elsif ($method eq "edit_options") {
+ if ($id ne $tmp) {
+ &edit_html("edit_options_html","edit_pw_wrong");
+ exit;
+ }
+ &zeit;
+ &post("<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat seine Chateinstellungen geändert ...</font></i>");
+
+ &write_file_new("data/user/options/$alias");
+ print DATEI $id."\n".$col."\n".$secol;
+ close DATEI;
+ &edit_html("edit_options_html","edit_options_ok");
+ }
+}
diff --git a/0.4.2/online.pl b/0.4.2/online.pl
new file mode 100644
index 0000000..57e1349
--- /dev/null
+++ b/0.4.2/online.pl
@@ -0,0 +1,72 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+&secure_checkid($alias);
+
+# Onlinezeit zählen !
+&read_file("data/online/users/$alias");
+ my $oldstamp = <DATEI>;
+close DATEI;
+ if ($oldstamp > (time - 60)) {
+ &read_file("data/user/counts/$alias.online");
+ my $online = <DATEI>;
+ close DATEI;
+ my $total = (time-$oldstamp+$online);
+ &write_file_new("data/user/counts/$alias.online");
+ print DATEI $total;
+ close DATEI;
+ }
+##### ENDE
+
+&start_html("Online","online");
+&online($alias,$room);
+&list_dir("data/online/rooms/".$room);
+print
+ $q->div( "$room:" ),
+ "<font size=1 color=ffffef face=arial>";
+ foreach $online (@dir) {
+ if (-f "data/online/rooms/$room/$online") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$online&tmpid=$tmpid",
+ -target=>"$online" }, "$online"), $q->br;
+ }
+ }
+print
+ "</font>",
+ $q->end_html;
+
+sub online { # Benutzer in die Onlineliste hinzufügen bzw. erneuern
+ my ($alias,$room) = @_;
+ &write_file_new("data/online/users/$alias");
+ print DATEI time;
+ close DATEI;
+ if (-e "data/online/rooms/$room") { # Falls Raum nicht existiert anlegen
+ } else {
+ &write_file_new("data/online/rstat/$room"); # Raumbesetzerstatus setzen
+ print DATEI "0\n\n$alias\n";
+ close DATEI;
+ mkdir "data/online/rooms/$room", 0777;
+ }
+ &write_file_new("data/online/rooms/$room/$alias");
+ print DATEI time;
+ close DATEI;
+ &read_file("data/online/prove"); # Räume und Chatter auf Existenz überprüfen
+ my $provetime = <DATEI>;
+ close DATEI;
+ if ($provetime < (time - 30)) {
+ &write_file_new("data/online/prove");
+ print DATEI time;
+ close DATEI;
+ &rm_alias("data/online/users");
+ &rm_rooms;
+ }
+} \ No newline at end of file
diff --git a/0.4.2/push.pl b/0.4.2/push.pl
new file mode 100644
index 0000000..5ae82c5
--- /dev/null
+++ b/0.4.2/push.pl
@@ -0,0 +1,97 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+CGI->compile(':all');
+$q = new CGI;
+
+$| = 1; # Cache von Perl ausschalten
+
+print
+ $q->header; # HTML-Header erzeugen
+
+require config;
+
+&secure_checkid($alias);
+
+########################################
+##ANFANG DER ZU STREAMENDEN HTML-DATEI##
+########################################
+
+print <<END;
+<html>
+ <head>
+<script language="JavaScript">
+<!--
+// Scroll-Routine von Anklepper (http://www.anklepper.de)
+// speziell für yChat (http://www.yChat.de), Copyright 2000
+scrolling = true;
+moves_steps = 4; // Schrittgröße
+moves_interval = 4; // Schrittgeschwindigkeit
+
+function moves()
+{
+ if( scrolling != false )
+ window.scrollBy( 0, moves_steps );
+ window.setTimeout( "moves()", moves_interval );
+}
+
+moves();
+//-->
+</script>
+ </head>
+<body bgcolor=000000 link=FFFFFF alink=FFFFEF vlink=FFFFEF>
+END
+
+#############################
+##BEGRÜSSUNGSTEXT SCHREIBEN##
+#############################
+
+my $msgfile;
+
+ print
+ $q->font( { -size=>1,
+ -color=>"ffffff",
+ -face=>"arial"},
+ "$title - Created & Copyright by Paul C. Bütow $tmp\n");
+
+ if (-f "data/user/memos/$alias") { # Nach Memonachrichten checken!
+ print "\n<br>";
+ &read_file("data/user/memos/$alias");
+ my $memos = <DATEI>;
+ close DATEI;
+ print $memos;
+ unlink("data/user/memos/$alias");
+ }
+ my $msgfile = "data/msgs/$alias";
+ &write_file_new($msgfile);
+ print DATEI $q->br;
+ close DATEI;
+ print $q->br;
+ open (MSGFILE, $msgfile);
+
+###############################
+##ENDLOSSCHLEIFE FÜR DEN PUSH##
+###############################
+
+my ($times,$online) = (0,"false");
+for (;;) {
+ for ($curpos = tell(MSGFILE); <MSGFILE>; $curpos = tell(MSGFILE)) {
+ print $_ ;
+ }
+ $times++;
+ if ($times > 14) { # Nach 15 Sekunden
+ print "\n<!--PING//-->"; # Ping zum Browser senden
+ $times = 0; # Sekundenzahl auf 0 zurücksetzen
+ $online = "true" if (-e "data/online/users/$alias");
+ if ($online eq "false") {
+ print "<font size=2 color=red>Aus technischen Gründen bitte auf <a href=\"push.pl?alias=$alias&room=$room&var=clear_screen&tmpid=$tmpid\">Weiterchatten</a> klicken.</font>";
+ exit;
+ }
+ $online = "false"
+ }
+ sleep 1;
+ seek(MSGFILE, $curpos, 0); # Position wiederherstellen
+}
+
diff --git a/0.4.2/setup.sh b/0.4.2/setup.sh
new file mode 100644
index 0000000..d076ded
--- /dev/null
+++ b/0.4.2/setup.sh
@@ -0,0 +1,42 @@
+#!/bin/sh
+mkdir data
+mkdir data/logs
+chmod 777 data/logs
+mkdir data/msgs
+chmod 777 data/msgs
+mkdir data/user
+chmod 777 data/user
+mkdir data/user/counts
+chmod 777 data/user/counts
+mkdir data/user/memos
+chmod 777 data/user/memos
+mkdir data/user/options
+chmod 777 data/user/options
+mkdir data/user/profiles
+chmod 777 data/user/profiles
+mkdir data/user/gbooks
+chmod 777 data/user/gbooks
+mkdir data/user/lastlogin
+chmod 777 data/user/lastlogin
+mkdir data/online
+chmod 777 data/online
+mkdir data/online/rooms
+chmod 777 data/online/rooms
+mkdir data/online/rstat
+chmod 777 data/online/rstat
+mkdir data/online/users
+chmod 777 data/online/users
+mkdir data/online/ident
+chmod 777 data/online/ident
+chmod 777 data/htdocs/*
+chmod 777 *
+mkdir dokus/
+mv *.txt dokus/
+mkdir ../../htdocs/yChat/
+mv *.gif ../../htdocs/yChat/
+mv *.jpg ../../htdocs/yChat/
+echo
+echo yChat Setup beendet ...
+echo Created and copyrighted by Paul C. Bütow aka Snooper
+echo
+
diff --git a/0.4.2/y.gif b/0.4.2/y.gif
new file mode 100644
index 0000000..356175d
--- /dev/null
+++ b/0.4.2/y.gif
Binary files differ
diff --git a/0.4.2/y_.gif b/0.4.2/y_.gif
new file mode 100644
index 0000000..f8b6ee5
--- /dev/null
+++ b/0.4.2/y_.gif
Binary files differ
diff --git a/0.4.3a/CREDITS.txt b/0.4.3a/CREDITS.txt
new file mode 100644
index 0000000..b1a6610
--- /dev/null
+++ b/0.4.3a/CREDITS.txt
@@ -0,0 +1,26 @@
+############################## yChat.de SETUP ###############################
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+
+Vielen Dank an alle Personen, dir mit geholfen haben ( und immernoch helfen )
+yChat besser zu machen:
+
+ - Andreas Buchwald aka Anklepper, für die Programmierung des
+ "Nach-UntenScroll-JavaScripts", des "Ferlaufform-JavaScripts" im
+ Texteingabeframe und für die technische Umsetzung, daß sich das
+ Inputframe bei jedem Textposting nicht wieder reloadet.
+ ( www.anklepper.de ).
+
+ - Dave aka Truhe, für die Erstellung der Farbtabelle unter Chatoptionen inkl.
+ Auswähl-JavaScript!
+ ( maligree.yi.org )
+
+ - Michi aka Snoopy, für das Testen des Skripts auf seinem Server.
+ ( www.berlin-singeltreff.de ).
+
+ - Florian B. aka RocketKid für designtechnische Anregungen.
+ ( www.Rocket-Kid.de und www.proa.de )
+
+ - Larry Wall, für die Erfindung von Perl !
+
+ - Stefan Münz, für die Erstellung von SelfHTML !
diff --git a/0.4.3a/README.txt b/0.4.3a/README.txt
new file mode 100644
index 0000000..a4dda3c
--- /dev/null
+++ b/0.4.3a/README.txt
@@ -0,0 +1,35 @@
+############################## yChat.de README ##############################
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+Allgemeine Bedingungen bezgl. yChat:
+
+ - Das yChat-System darf ohne Erleubnis des Autors nicht auf irgendeiner Art
+ und Weise weitergegeben- oder eingesetzt werden.
+
+ - Wird das yChat-System eingesetzt, so darf es manipuliert werden, soweit
+ die Copyright-Hinweise des Autors, die Versionsbezeichnung und der Link
+ auf der Startseite nach servers.yChat.de unverändert bleibt.
+ Ansonsten darf der gesamte Code manipuliert werden.
+
+ - Wird das yChat-System erlaubter Weise manipuliert, so muß das veränderte
+ Skript auf Anforderung an den Autor weitergegeben werden. Dieser darf
+ die Veränderungen in das Standard-yChat-System integrieren.
+
+ - Wird das yChat-System eingesetzt, su muß dem Autor die Location bzw. die
+ URL bekanntgegeben werden. Diese wird in servers.yChat.de eingetragen.
+ und mit einer URL wwX.yChat.de verlinkt. Wobei X für die Nummer des jew.
+ Servers steht.
+
+ - Es ist verboten, Sourcecode aus dem yChat-System zu kopieren und
+ für andere, nicht von yChat abhängige Perl-Programme einzusetzen.
+
+Im Flogenden einige yChat-bezügl. Verknüpfungen:
+
+ www.credits.yChat.de => Creditsliste
+ www.download.yChat.de => Das Skript zum downloaden
+ www.readme.yChat.de => Allgemeine Bedingungen usw.
+ www.servers.yChat.de => Liste aller laufenden yChat-Systeme
+ www.setup.yChat.de => Installationsdokumentation
+ www.todo.yChat.de => Funktionen, die später integriert werden
+ www.updates.yChat.de => Update-Liste
+ www.yChat.de => Das Skript im Einsatz
diff --git a/0.4.3a/SETUP.txt b/0.4.3a/SETUP.txt
new file mode 100644
index 0000000..b133af0
--- /dev/null
+++ b/0.4.3a/SETUP.txt
@@ -0,0 +1,102 @@
+############################## yChat.de SETUP ###############################
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+
+yChat findest Du im Internet unter der Adresse www.yChat.de. Bei Kritik,
+Anregungen oder Fragen bitte in das dort vorhandene Board posten oder eine
+E-Mail an die oben stehende Adresse senden. Ich bemühe mich, yChat so gut wie
+möglich zu machen und bin über Ratschläge immer sehr erfreut :-) ...
+
+Die Installation kann auf Unix-Systemen voll automatisch duchgeführt werden.
+Allerdings ist dafür ein Telnet-Zugang notwendig. Kopiere alle vorhandenen
+Dateien in das Verzeichnis cgi-bin/yChat und führe dann das Shellskript
+setup.sh mit dem Befehl ./setup.sh aus. Alle Verzeichnisse werden
+automatisch erstellt. Dies wurde allerdings nur auf SuSE Linux Systemen
+mit root-Zugriff getestet. Solltest Du ein anderes System verwenden oder
+den Chat auf einen virtuellen Webserver installieren wollen, dann mußt Du
+unter umständen das Verzeichnis "../../htdocs/yChat" nach "../../yChat"
+in der setup.sh umbenennen. Ansonsten werden die dazugehörigen Grafikdateien
+falsch oder garnicht kopiert.
+
+Wenn Du keinen Telnet-Zugang hast, kannst Du hier die Verzeichnisse manuell
+erstellen:
+
+Folgende Basis-Dateien sind im Chat enthalten und müssen in das cgi-bin
+Verzeichnis kopiert werden. Z.B. nach ./cgi-bin/yChat/:
+
+config.pm => Configurationsdatei ("Shared subs")
+htdocs.pl => HTML-Dokumentdateien (Nicht unbedingt erforderlich)
+index.pl => Startskript (Registrierung, Frameset, Login, Daten edit.)
+main.pl => Hauptskript (Alle Hauptfunktionen des Chats)
+main2.pl => Skript für editieren der Benutzerdaten etc.
+online.pl => Anzeige und Überprüfung der eingelogten Benutzer
+push.pl => Server-Push-Routine
+setup.sh => Dient zur automatischen Einrichtung des Chats.
+README.txt => Beinhaltet wichtige Informationen
+UPDATES.txt => Updateliste der verschiedenen Versionen
+CREDITS.txt => Personen, die geolfen haben yChat zu proggen.
+SETUP.txt => Dieses Dokument
+colors.sno => Datei beinhaltet alle Farben in hex. für die Chatoptionen
+help.sno => Datei beinhaltet alle Chatbefehle
+
+Folgende Verzeichnisse müssen erstellt werden (chmod 777 sollte
+funktionieren):
+
+- Hier befinden sich alle für den Chat notwenidgen Daten:
+ ./cgi-bin/yChat/data/*
+
+- Hier befinden sich alle Logdateien, die vom Chat erstellt werden:
+ ./cgi-bin/yChat/data/logs/*
+
+- Hier befinden sich die Message-Dateien der eingelogten Benutzer:
+ ./cgi-bin/yChat/data/msgs/*
+
+- Hier befinden sich alle Daten der registrierten Benutzer:
+ ./cgi-bin/yChat/data/user/*
+
+- Hier wird abgespeichert, wie oft ein Benutzerprofil insgesant schon
+ aufgerufen wurde und wie lange die Chatter schon online waren:
+ ./cgi-bin/yChat/data/user/counts/*
+
+- Hier werden alle Memos abgespeichert.
+ ./cgi-bin/yChat/data/user/memos/*
+
+- Hier befinden sich alle Chat-Optionen und Passwörter der registrierten
+ Benutzer:
+ ./cgi-bin/yChat/data/user/options/*
+
+- Hier befinden sich alle Benutzerprofile der Benutzer:
+ ./cgi-bin/yChat/data/user/profiles/*
+
+- Hier befinden sich alle Gästebucheinträge der Benutzer:
+ ./cgi-bin/yChat/data/user/gbooks/*
+
+- Hier wird abgespeichert, wann der der jew. benutzer zum letzten mal das System
+ betreten hat.
+ ./cgi-bin/yChat/data/user/lastlogin/*
+
+- Hier befinden sich alle Daten zu den aktuellen Chaträumen und User die online sind
+ ./cgi-bin/yChat/data/online/*
+
+- Hier befinden sich alle offnenen Räume
+ ./cgi-bin/yChat/data/online/rooms/*
+
+- Hier befinden sich die Chatter, die sich in den jew. Räumen befinden. Die
+ Verzeichnisse der Räume werden automatisch erstellt.
+ ./cgi-bin/yChat/data/online/rooms/RAUMNAME/*
+
+- Hier befinden sich alle Chatter, die sich z.Z. im System befinden
+ ./cgi-bin/yChat/data/online/users/*
+
+- Hier befinden sich alle IP-Nummern und TempIDs der eingelogten Chatter
+ ./cgi-bin/yChat/data/online/ident/*
+
+Alle Grafikdateien (+.gif und *.jpg) sollten in ein nicht-CGI-BIN-Verzeichnis kopiert
+werden. Z.B. nach ./yChat/.
+
+Zum schluß sollte die config.pm-Datei nach wünschen editiert werden. Allerdings sollten
+die Copyright Hinweise und die Versionsnummern nicht manipuliert werden.
+
+Folgende Dateien werden von yChat automatisch erstellt:
+
+Viel Spaß beim Chatten ... \ No newline at end of file
diff --git a/0.4.3a/TODO.txt b/0.4.3a/TODO.txt
new file mode 100644
index 0000000..59d9e3e
--- /dev/null
+++ b/0.4.3a/TODO.txt
@@ -0,0 +1,24 @@
+Folgende Funktionen werden demnächst in yChat integriert:
+
+ - Die Schlucht (Ein Raum wo Chatter hineingeworfen werden,
+ die sich nicht benehmen und noch nicht aus dem Chat
+ katapultiert werden sollen).
+
+ - Löschung aller Chatter, die sich seit 60 Tagen nicht mehr
+ eingelogt haben.
+
+ - IP-Adressen ver-/entbannen.
+
+ - E-Mail zusendung bei verlorenem Passwort.
+
+ - Eine Top 20 (Onlinezeit) der Chatter
+
+ - Unter "Benutzer" sollen Chatter über eine Eingabemaske nach
+ dem Anfangsbuchstaben gesucht werden können (vergl. Kilahu).
+
+ - Der Cybarkeeper (künstlich intilligenter Chatroboter, der
+ sich im Hauptraum Cyberbar aufhält, virtuelle Drinks verteilt
+ und von Real-Chattern übernommen werden kann. (Zukunftsmusik)
+
+Für weitere Vorschläge bitte in das yChat-Board unter www.yChat.de
+texten oder eine E-Mail an paul@buetow.oxg.de :-) \ No newline at end of file
diff --git a/0.4.3a/UPDATES.txt b/0.4.3a/UPDATES.txt
new file mode 100644
index 0000000..c7dcdcf
--- /dev/null
+++ b/0.4.3a/UPDATES.txt
@@ -0,0 +1,136 @@
+########################### yChat.de UPDATE LIST ###########################
+## Copyright by Paul C. Bütow aka Snooper 2000 (paul@buetow.oxg.de) ##
+#############################################################################
+Hier sind alle Erneuerungen der Versionen dokumentiert:
+
+Update von 0.4.2 auf 0.4.3 (30.12.2k)
+ - Optimierung der Zuweisung der Variabeln im Programmcode:
+ Variablen werden nun wirklich nur deffiniert, wenn diese auch
+ erforderlich sind.
+ - Komplette Neuprogrammierung diverser Subs (nun leistungsfähiger)
+ - Bei Aufrug der Login-Seite wird der gesamte Chat auf leerstehende
+ Räume und "alte" Chatter überprüft und ggf. entfernt.
+ - Verbesserung diverser JavaScript-Codes.
+ - Editiert ein Benutzer sein Profil, so wird dies mit der Meldung
+ "Alias hat sein Profil geändert ..." bekanntgegeben.
+ - Mit "/t" ohne weiteren Text erscheint die Nachricht "Alias hat das
+ Thema des Raums gelöscht ..."
+ - Hinzufügung diverser Administratorbefehle: "/pw Alias" zeigt
+ Zugangspassword von Alias an. "/ow Alias" ernennt Alias zum OW.
+ "/row Alias" entzieht Alias die OW-Rechte.
+
+Update von 0.4.1 auf 0.4.2 (25.12.2k)
+ - Im Texteingabeformular werden nun per JavaScript die letzten 10
+ Postings zwischengespeichert und können per Drop-Down-Menü
+ wieder in das Submittextfeld geladen werden um erneuert getextet
+ zu werden.
+ - Neues Design.
+ - Diverse Dateien wurden umbenannt:
+ INSTALL.txt -> SETUP.txt
+ LIESMICH.txt -> README.txt
+ - Die Datei CREDITS.txt wurde angelegt und somit auch die URL
+ www.credits.yChat.de.
+
+Update von 0.4.0 auf 0.4.1 (22.12.2k)
+ - Design wurde geändert.
+ - Unter "Optionen" ist nun eine komplette Farbtabelle eingebaut.
+ - Folgende Oberwächterbefehle wurden nun auch für normale Wächter
+ freigegeben: /ip /ban /rban.
+
+Update von 0.2.6 auf 0.4.0 (19.12.2k)
+ - Der berüchtigte "IP-Bug" wurde beseitigt! Und zwar wurden TempIDs
+ eingeführt => Eine dauerhafte Überprüfung der Benutzer-IP-Nummer
+ ist also nicht mehr notwendig.
+ - Die totale Chat-Online-Zeit wird protokolliert und kann jew. mit
+ "/online Alias" aufgerufen werden. Die Onlinezeit wird alle 20 Sek.
+ aktualisiert.
+ - Neue Befehle: "/seen Alias" zeigt an, vor wieviel St. sich Alias
+ zuletzt in das System eingelogt hat. Der Befehle "/rmgb" entfernt
+ alle Einträge des eigenen Benutzergästebuchs im Profil.
+
+Update von 0.2.5 auf 0.2.6 (17.12.2k)
+ - Das Eingabeframe reloaded sich nicht mehr nach jedem Posting.
+ Vielen Dank an Truhe aka Dave und Klepper aka Andreas Buchwald!
+ Bei den Chatbefehlen /col /away /j und /ju muß sich das
+ Eingabeframe weiterhin reloaden.
+ - Der Befehl // wurde entfernt. Dieser war nicht mehr erforderlich.
+ weil Nachrichten werden nur noch sehr selten verschluckt. Dieser
+ Chatbefehl postete die letzte Nachricht nocheinmal.
+ - Neuer Befehl: mit "/memo Alias hier der Text" hinterläßt man
+ Alias eine Memo. Logt sich Alias in den Chat ein, dann erhält
+ er diese sofort. Dafür wurde das Verzeichnis ".data/user/memos/"
+ angelegt.
+ - Programmcode wurde ein wenig optimiert.
+ - Das Design wurde ein wenig geändert.
+ - Beseitigung diverser Bugs.
+
+Update von 0.2.4 auf 0.2.5 (15.12.2k)
+ - Derjenige, der einen Raum zuerst betritt, hat Raumbesetzerrechte.
+ - Raumbesetzer, Wächter und Oberwächte können weitere Raumbesetzer
+ bestimmen. Diese können Raumbeseter auch wieder degradieren.
+ - Raumbesetzer, Wächter und Oberwächter können dem aktuellen Raum
+ auf/absperren und Themen geben. Wächter und Oberwächter können
+ abgesperrte Räume betreten.
+ - Das Verzeichnis ".data/htdocs" wurde entfernt. Die Datei help_html
+ heist nun help.sno und befindet sich im yChat-Hauptverzeichnis.
+ - Das Verzeichnis ".data/user/lastlogin" wurde hinzugefügt. Hier
+ wird beim erfolgreichen Einloggen ein "Timestamp" gesetzt. Später
+ sollen Oberwächter "veraltete" Benutzer entfernen können.
+ - Neuer Oberwächterbefehl: "/kill Alias" entfernt Alias ganz und gar
+ vom System. Oberwächter und Wächter können nicht entfernt werden.
+ - Perl-Cache wurde im gesamten System komplett deaktiviert ( Weniger
+ Ladezeiten der HTML-Dokumente ).
+ - Nur Nachrichten aus dem Raum "Cyberbar" werden gelogt.
+ Selbsterstellte Räume werden nichtmehr gelogt. Viele Logfunktionen
+ wurden entfernt (weniger Serverbalast).
+ - Beseitigung einiger kleinen Bugs.
+ - Unter "Optionen" im Chat wir die Farbe nun mit einem Drop-Down-Menü
+ ausgewählt ( Vielen dank an Michi aka Snoopy ).
+ - Auf der Startseite wird nun angezeigt wieviele Benutzer eingelogt
+ sind. Ist keiner eingelogt, dann wird das System "aufgeräumt". D.h.
+ Dateien die nicht mehr gebraucht werden und noch nicht gelöscht
+ wurden werden entfernt ( z.B. Nachrichtendateien der einzelnen
+ Chatter und die Dateien die die IP-Nummern der eingelogten Benutzer
+ beinhalteten usw.).
+ - Hunzufügung einer TODO-Liste. Hier sind mehrere Funktionen
+ vermerkt, die in späteren yChat-Versionen eingebaut werden sollen.
+ (www.todo.yChat.de oder TODO.txt).
+
+Update von 0.2.3 auf 0.2.4 (30.11.2k)
+ - Optimierung bzw. Verbesserung der Push-Routine push.pl.
+ - Server-Ping wurde von 2-Pings-per-Minute auf 4 erhöht.
+ - yChat-Banner wurde erstellt und ist unter
+ documents.yChat.de/yBanner.jpg vorzufinden.
+ - Unter der URL servers.yChat.de wurde eine Serverliste angelegt,
+ welche anzeigt wo yChat-Systeme laufen.
+ - Des weiteren wurden die URLs updates.yChat.de, install.yChat.de
+ und liesmich.yChat.de eingerichtet.
+ - Die Menüpunkte wurden zusammengefaßt, damit sie unter einer
+ Auflösung von 800x600 nur eine Zeile belegen.
+ - Einige Bugs wurden entfernt.
+
+Update von 0.2.2 auf 0.2.3 (25.11.2k)
+ - Smooth scrolling JavaScript ( Vielen Dank an Andreas Buchwald ).
+ - "IP#-Fehler" wurde so gut wie beseitigt.
+ - Aufrufe der einzelnen Benutzerprofile wird gezählt und angezeigt.
+ Diese werden in data/user/counts/* gespeichert.
+ - Automatische Einrichtung des Chats mit setup.sh und Telnet.
+ - Menüpunkt "Dein Profil" wurde entfernt da eigenes Profil auch
+ stets über die Onlineliste aufgerufen werden kann.
+
+Update von 0.2.1 auf 0.2.2 (23.11.2k)
+ - Einige Bugs wurden entfernt.
+ - Geschwindigkeit des Chats wurde optimiert.
+ - Eine Liste aller eingelogten Benutzer erscheint am Rand. Hierfür
+ wurde die Datei online.pl eingeführt. Sie aktuallisiert sich alle
+ 20 Sekunden.
+ - Die UPDATES.txt wurde eingeführt.
+
+Update von 0.2.0 auf 0.2.1
+ - Einige Bugs wurden entfernt.
+ - Die IP# der eingelogten Benutzer werden nun anders verwaltet.
+
+Update von Alpha XVIII auf 0.2.0
+ - Die Handhabung der eingelogten Benutzer im System wurde komplett neu
+ überarbeitet.
+ - Neue Versionsnumern wurden eingeführt. \ No newline at end of file
diff --git a/0.4.3a/colors.sno b/0.4.3a/colors.sno
new file mode 100644
index 0000000..3640b9e
--- /dev/null
+++ b/0.4.3a/colors.sno
@@ -0,0 +1,290 @@
+ <table cellspacing=0 cellpadding=5 border=0>
+ <tr>
+ <td bgcolor="000000"><span style="color:#FFFFFF; text-decoration:line-through;">000000</span></td>
+ <td bgcolor="000033"><span style="color:#FFFFFF; text-decoration:line-through;">000033</span></td>
+ <td bgcolor="000066"><span style="color:#FFFFFF; text-decoration:line-through;">000066</span></td>
+ <td bgcolor="000099"><span style="color:#FFFFFF; text-decoration:line-through;">000099</span></td>
+ <td bgcolor="0000CC"><span style="color:#FFFFFF; text-decoration:line-through;">0000CC</span></td>
+ <td bgcolor="0000FF"><a href="javascript:insertcode('0000FF');" style="color:#FFFFFF;">0000FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="003300"><span style="color:#FFFFFF; text-decoration:line-through;">003300</span></td>
+ <td bgcolor="003333"><span style="color:#FFFFFF; text-decoration:line-through;">003333</span></td>
+ <td bgcolor="003366"><span style="color:#FFFFFF; text-decoration:line-through;">003366</span></td>
+ <td bgcolor="003399"><a href="javascript:insertcode('003399');" style="color:#FFFFFF;">003399</a></td>
+ <td bgcolor="0033CC"><a href="javascript:insertcode('0033CC');" style="color:#FFFFFF;">0033CC</a></td>
+ <td bgcolor="0033FF"><a href="javascript:insertcode('0033FF');" style="color:#FFFFFF;">0033FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="006600"><span style="color:#FFFFFF; text-decoration:line-through;">006600</span></td>
+ <td bgcolor="006633"><span style="color:#FFFFFF; text-decoration:line-through;">006633</span></td>
+ <td bgcolor="006666"><a href="javascript:insertcode('006666');" style="color:#FFFFFF;">006666</a></td>
+ <td bgcolor="006699"><a href="javascript:insertcode('006699');" style="color:#FFFFFF;">006699</a></td>
+ <td bgcolor="0066CC"><a href="javascript:insertcode('0066CC');" style="color:#FFFFFF;">0066CC</a></td>
+ <td bgcolor="0066FF"><a href="javascript:insertcode('0066FF');" style="color:#FFFFFF;">0066FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="009900"><a href="javascript:insertcode('009900');" style="color:#FFFFFF;">009900</a></td>
+ <td bgcolor="009933"><a href="javascript:insertcode('009933');" style="color:#FFFFFF;">009933</a></td>
+ <td bgcolor="009966"><a href="javascript:insertcode('009966');" style="color:#FFFFFF;">009966</a></td>
+ <td bgcolor="009999"><a href="javascript:insertcode('009999');" style="color:#FFFFFF;">009999</a></td>
+ <td bgcolor="0099CC"><a href="javascript:insertcode('0099CC');" style="color:#FFFFFF;">0099CC</a></td>
+ <td bgcolor="0099FF"><a href="javascript:insertcode('0099FF');" style="color:#FFFFFF;">0099FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00CC00"><a href="javascript:insertcode('00CC00');" style="color:#000000;">00CC00</a></td>
+ <td bgcolor="00CC33"><a href="javascript:insertcode('00CC33');" style="color:#000000;">00CC33</a></td>
+ <td bgcolor="00CC66"><a href="javascript:insertcode('00CC66');" style="color:#000000;">00CC66</a></td>
+ <td bgcolor="00CC99"><a href="javascript:insertcode('00CC99');" style="color:#000000;">00CC99</a></td>
+ <td bgcolor="00CCCC"><a href="javascript:insertcode('00CCCC');" style="color:#000000;">00CCCC</a></td>
+ <td bgcolor="00CCFF"><a href="javascript:insertcode('00CCFF');" style="color:#000000;">00CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00FF00"><a href="javascript:insertcode('00FF00');" style="color:#000000;">00FF00</a></td>
+ <td bgcolor="00FF33"><a href="javascript:insertcode('00FF33');" style="color:#000000;">00FF33</a></td>
+ <td bgcolor="00FF66"><a href="javascript:insertcode('00FF66');" style="color:#000000;">00FF66</a></td>
+ <td bgcolor="00FF99"><a href="javascript:insertcode('00FF99');" style="color:#000000;">00FF99</a></td>
+ <td bgcolor="00FFCC"><a href="javascript:insertcode('00FFCC');" style="color:#000000;">00FFCC</a></td>
+ <td bgcolor="00FFFF"><a href="javascript:insertcode('00FFFF');" style="color:#000000;">00FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="330000"><span style="color:#FFFFFF; text-decoration:line-through;">330000</span></td>
+ <td bgcolor="330033"><span style="color:#FFFFFF; text-decoration:line-through;">330033</span></td>
+ <td bgcolor="330066"><span style="color:#FFFFFF; text-decoration:line-through;">330066</span></td>
+ <td bgcolor="330099"><a href="javascript:insertcode('330099');" style="color:#FFFFFF;">330099</a></td>
+ <td bgcolor="3300CC"><a href="javascript:insertcode('3300CC');" style="color:#FFFFFF;">3300CC</a></td>
+ <td bgcolor="3300FF"><a href="javascript:insertcode('3300FF');" style="color:#FFFFFF;">3300FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="333300"><span style="color:#FFFFFF; text-decoration:line-through;">333300</span></td>
+ <td bgcolor="333333"><span style="color:#FFFFFF; text-decoration:line-through;">333333</span></td>
+ <td bgcolor="333366"><a href="javascript:insertcode('333366');" style="color:#FFFFFF;">333366</a></td>
+ <td bgcolor="333399"><a href="javascript:insertcode('333399');" style="color:#FFFFFF;">333399</a></td>
+ <td bgcolor="3333CC"><a href="javascript:insertcode('3333CC');" style="color:#FFFFFF;">3333CC</a></td>
+ <td bgcolor="3333FF"><a href="javascript:insertcode('3333FF');" style="color:#FFFFFF;">3333FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="336600"><a href="javascript:insertcode('336600');" style="color:#FFFFFF;">336600</a></td>
+ <td bgcolor="336633"><a href="javascript:insertcode('336633');" style="color:#FFFFFF;">336633</a></td>
+ <td bgcolor="336666"><a href="javascript:insertcode('336666');" style="color:#FFFFFF;">336666</a></td>
+ <td bgcolor="336699"><a href="javascript:insertcode('336699');" style="color:#FFFFFF;">336699</a></td>
+ <td bgcolor="3366CC"><a href="javascript:insertcode('3366CC');" style="color:#FFFFFF;">3366CC</a></td>
+ <td bgcolor="3366FF"><a href="javascript:insertcode('3366FF');" style="color:#FFFFFF;">3366FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="339900"><a href="javascript:insertcode('339900');" style="color:#FFFFFF;">339900</a></td>
+ <td bgcolor="339933"><a href="javascript:insertcode('339933');" style="color:#FFFFFF;">339933</a></td>
+ <td bgcolor="339966"><a href="javascript:insertcode('339966');" style="color:#FFFFFF;">339966</a></td>
+ <td bgcolor="339999"><a href="javascript:insertcode('339999');" style="color:#FFFFFF;">339999</a></td>
+ <td bgcolor="3399CC"><a href="javascript:insertcode('3399CC');" style="color:#FFFFFF;">3399CC</a></td>
+ <td bgcolor="3399FF"><a href="javascript:insertcode('3399FF');" style="color:#FFFFFF;">3399FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33CC00"><a href="javascript:insertcode('33CC00');" style="color:#000000;">33CC00</a></td>
+ <td bgcolor="33CC33"><a href="javascript:insertcode('33CC33');" style="color:#000000;">33CC33</a></td>
+ <td bgcolor="33CC66"><a href="javascript:insertcode('33CC66');" style="color:#000000;">33CC66</a></td>
+ <td bgcolor="33CC99"><a href="javascript:insertcode('33CC99');" style="color:#000000;">33CC99</a></td>
+ <td bgcolor="33CCCC"><a href="javascript:insertcode('33CCCC');" style="color:#000000;">33CCCC</a></td>
+ <td bgcolor="33CCFF"><a href="javascript:insertcode('33CCFF');" style="color:#000000;">33CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33FF00"><a href="javascript:insertcode('33FF00');" style="color:#000000;">33FF00</a></td>
+ <td bgcolor="33FF33"><a href="javascript:insertcode('33FF33');" style="color:#000000;">33FF33</a></td>
+ <td bgcolor="33FF66"><a href="javascript:insertcode('33FF66');" style="color:#000000;">33FF66</a></td>
+ <td bgcolor="33FF99"><a href="javascript:insertcode('33FF99');" style="color:#000000;">33FF99</a></td>
+ <td bgcolor="33FFCC"><a href="javascript:insertcode('33FFCC');" style="color:#000000;">33FFCC</a></td>
+ <td bgcolor="33FFFF"><a href="javascript:insertcode('33FFFF');" style="color:#000000;">33FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="660000"><span style="color:#FFFFFF; text-decoration:line-through;">660000</span></td>
+ <td bgcolor="660033"><span style="color:#FFFFFF; text-decoration:line-through;">660033</span></td>
+ <td bgcolor="660066"><a href="javascript:insertcode('660066');" style="color:#FFFFFF;">660066</a></td>
+ <td bgcolor="660099"><a href="javascript:insertcode('660099');" style="color:#FFFFFF;">660099</a></td>
+ <td bgcolor="6600CC"><a href="javascript:insertcode('6600CC');" style="color:#FFFFFF;">6600CC</a></td>
+ <td bgcolor="6600FF"><a href="javascript:insertcode('6600FF');" style="color:#FFFFFF;">6600FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="663300"><a href="javascript:insertcode('663300');" style="color:#FFFFFF;">663300</a></td>
+ <td bgcolor="663333"><a href="javascript:insertcode('663333');" style="color:#FFFFFF;">663333</a></td>
+ <td bgcolor="663366"><a href="javascript:insertcode('663366');" style="color:#FFFFFF;">663366</a></td>
+ <td bgcolor="663399"><a href="javascript:insertcode('663399');" style="color:#FFFFFF;">663399</a></td>
+ <td bgcolor="6633CC"><a href="javascript:insertcode('6633CC');" style="color:#FFFFFF;">6633CC</a></td>
+ <td bgcolor="6633FF"><a href="javascript:insertcode('6633FF');" style="color:#FFFFFF;">6633FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="666600"><a href="javascript:insertcode('666600');" style="color:#FFFFFF;">666600</a></td>
+ <td bgcolor="666633"><a href="javascript:insertcode('666633');" style="color:#FFFFFF;">666633</a></td>
+ <td bgcolor="666666"><a href="javascript:insertcode('666666');" style="color:#FFFFFF;">666666</a></td>
+ <td bgcolor="666699"><a href="javascript:insertcode('666699');" style="color:#FFFFFF;">666699</a></td>
+ <td bgcolor="6666CC"><a href="javascript:insertcode('6666CC');" style="color:#FFFFFF;">6666CC</a></td>
+ <td bgcolor="6666FF"><a href="javascript:insertcode('6666FF');" style="color:#FFFFFF;">6666FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="669900"><a href="javascript:insertcode('669900');" style="color:#000000;">669900</a></td>
+ <td bgcolor="669933"><a href="javascript:insertcode('669933');" style="color:#000000;">669933</a></td>
+ <td bgcolor="669966"><a href="javascript:insertcode('669966');" style="color:#000000;">669966</a></td>
+ <td bgcolor="669999"><a href="javascript:insertcode('669999');" style="color:#000000;">669999</a></td>
+ <td bgcolor="6699CC"><a href="javascript:insertcode('6699CC');" style="color:#000000;">6699CC</a></td>
+ <td bgcolor="6699FF"><a href="javascript:insertcode('6699FF');" style="color:#000000;">6699FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66CC00"><a href="javascript:insertcode('66CC00');" style="color:#000000;">66CC00</a></td>
+ <td bgcolor="66CC33"><a href="javascript:insertcode('66CC33');" style="color:#000000;">66CC33</a></td>
+ <td bgcolor="66CC66"><a href="javascript:insertcode('66CC66');" style="color:#000000;">66CC66</a></td>
+ <td bgcolor="66CC99"><a href="javascript:insertcode('66CC99');" style="color:#000000;">66CC99</a></td>
+ <td bgcolor="66CCCC"><a href="javascript:insertcode('66CCCC');" style="color:#000000;">66CCCC</a></td>
+ <td bgcolor="66CCFF"><a href="javascript:insertcode('66CCFF');" style="color:#000000;">66CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66FF00"><a href="javascript:insertcode('66FF00');" style="color:#000000;">66FF00</a></td>
+ <td bgcolor="66FF33"><a href="javascript:insertcode('66FF33');" style="color:#000000;">66FF33</a></td>
+ <td bgcolor="66FF66"><a href="javascript:insertcode('66FF66');" style="color:#000000;">66FF66</a></td>
+ <td bgcolor="66FF99"><a href="javascript:insertcode('66FF99');" style="color:#000000;">66FF99</a></td>
+ <td bgcolor="66FFCC"><a href="javascript:insertcode('66FFCC');" style="color:#000000;">66FFCC</a></td>
+ <td bgcolor="66FFFF"><a href="javascript:insertcode('66FFFF');" style="color:#000000;">66FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="990000"><a href="javascript:insertcode('990000');" style="color:#FFFFFF;">990000</a></td>
+ <td bgcolor="990033"><a href="javascript:insertcode('990033');" style="color:#FFFFFF;">990033</a></td>
+ <td bgcolor="990066"><a href="javascript:insertcode('990066');" style="color:#FFFFFF;">990066</a></td>
+ <td bgcolor="990099"><a href="javascript:insertcode('990099');" style="color:#FFFFFF;">990099</a></td>
+ <td bgcolor="9900CC"><a href="javascript:insertcode('9900CC');" style="color:#FFFFFF;">9900CC</a></td>
+ <td bgcolor="9900FF"><a href="javascript:insertcode('9900FF');" style="color:#FFFFFF;">9900FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="993300"><a href="javascript:insertcode('993300');" style="color:#FFFFFF;">993300</a></td>
+ <td bgcolor="993333"><a href="javascript:insertcode('993333');" style="color:#FFFFFF;">993333</a></td>
+ <td bgcolor="993366"><a href="javascript:insertcode('993366');" style="color:#FFFFFF;">993366</a></td>
+ <td bgcolor="993399"><a href="javascript:insertcode('993399');" style="color:#FFFFFF;">993399</a></td>
+ <td bgcolor="9933CC"><a href="javascript:insertcode('9933CC');" style="color:#FFFFFF;">9933CC</a></td>
+ <td bgcolor="9933FF"><a href="javascript:insertcode('9933FF');" style="color:#FFFFFF;">9933FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="996600"><a href="javascript:insertcode('996600');" style="color:#FFFFFF;">996600</a></td>
+ <td bgcolor="996633"><a href="javascript:insertcode('996633');" style="color:#FFFFFF;">996633</a></td>
+ <td bgcolor="996666"><a href="javascript:insertcode('996666');" style="color:#FFFFFF;">996666</a></td>
+ <td bgcolor="996699"><a href="javascript:insertcode('996699');" style="color:#FFFFFF;">996699</a></td>
+ <td bgcolor="9966CC"><a href="javascript:insertcode('9966CC');" style="color:#FFFFFF;">9966CC</a></td>
+ <td bgcolor="9966FF"><a href="javascript:insertcode('9966FF');" style="color:#FFFFFF;">9966FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="999900"><a href="javascript:insertcode('999900');" style="color:#000000;">999900</a></td>
+ <td bgcolor="999933"><a href="javascript:insertcode('999933');" style="color:#000000;">999933</a></td>
+ <td bgcolor="999966"><a href="javascript:insertcode('999966');" style="color:#000000;">999966</a></td>
+ <td bgcolor="999999"><a href="javascript:insertcode('999999');" style="color:#000000;">999999</a></td>
+ <td bgcolor="9999CC"><a href="javascript:insertcode('9999CC');" style="color:#000000;">9999CC</a></td>
+ <td bgcolor="9999FF"><a href="javascript:insertcode('9999FF');" style="color:#000000;">9999FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99CC00"><a href="javascript:insertcode('99CC00');" style="color:#000000;">99CC00</a></td>
+ <td bgcolor="99CC33"><a href="javascript:insertcode('99CC33');" style="color:#000000;">99CC33</a></td>
+ <td bgcolor="99CC66"><a href="javascript:insertcode('99CC66');" style="color:#000000;">99CC66</a></td>
+ <td bgcolor="99CC99"><a href="javascript:insertcode('99CC99');" style="color:#000000;">99CC99</a></td>
+ <td bgcolor="99CCCC"><a href="javascript:insertcode('99CCCC');" style="color:#000000;">99CCCC</a></td>
+ <td bgcolor="99CCFF"><a href="javascript:insertcode('99CCFF');" style="color:#000000;">99CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99FF00"><a href="javascript:insertcode('99FF00');" style="color:#000000;">99FF00</a></td>
+ <td bgcolor="99FF33"><a href="javascript:insertcode('99FF33');" style="color:#000000;">99FF33</a></td>
+ <td bgcolor="99FF66"><a href="javascript:insertcode('99FF66');" style="color:#000000;">99FF66</a></td>
+ <td bgcolor="99FF99"><a href="javascript:insertcode('99FF99');" style="color:#000000;">99FF99</a></td>
+ <td bgcolor="99FFCC"><a href="javascript:insertcode('99FFCC');" style="color:#000000;">99FFCC</a></td>
+ <td bgcolor="99FFFF"><a href="javascript:insertcode('99FFFF');" style="color:#000000;">99FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC0000"><a href="javascript:insertcode('CC0000');" style="color:#FFFFFF;">CC0000</a></td>
+ <td bgcolor="CC0033"><a href="javascript:insertcode('CC0033');" style="color:#FFFFFF;">CC0033</a></td>
+ <td bgcolor="CC0066"><a href="javascript:insertcode('CC0066');" style="color:#FFFFFF;">CC0066</a></td>
+ <td bgcolor="CC0099"><a href="javascript:insertcode('CC0099');" style="color:#FFFFFF;">CC0099</a></td>
+ <td bgcolor="CC00CC"><a href="javascript:insertcode('CC00CC');" style="color:#FFFFFF;">CC00CC</a></td>
+ <td bgcolor="CC00FF"><a href="javascript:insertcode('CC00FF');" style="color:#FFFFFF;">CC00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC3300"><a href="javascript:insertcode('CC3300');" style="color:#FFFFFF;">CC3300</a></td>
+ <td bgcolor="CC3333"><a href="javascript:insertcode('CC3333');" style="color:#FFFFFF;">CC3333</a></td>
+ <td bgcolor="CC3366"><a href="javascript:insertcode('CC3366');" style="color:#FFFFFF;">CC3366</a></td>
+ <td bgcolor="CC3399"><a href="javascript:insertcode('CC3399');" style="color:#FFFFFF;">CC3399</a></td>
+ <td bgcolor="CC33CC"><a href="javascript:insertcode('CC33CC');" style="color:#FFFFFF;">CC33CC</a></td>
+ <td bgcolor="CC33FF"><a href="javascript:insertcode('CC33FF');" style="color:#FFFFFF;">CC33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC6600"><a href="javascript:insertcode('CC6600');" style="color:#000000;">CC6600</a></td>
+ <td bgcolor="CC6633"><a href="javascript:insertcode('CC6633');" style="color:#000000;">CC6633</a></td>
+ <td bgcolor="CC6666"><a href="javascript:insertcode('CC6666');" style="color:#000000;">CC6666</a></td>
+ <td bgcolor="CC6699"><a href="javascript:insertcode('CC6699');" style="color:#000000;">CC6699</a></td>
+ <td bgcolor="CC66CC"><a href="javascript:insertcode('CC66CC');" style="color:#000000;">CC66CC</a></td>
+ <td bgcolor="CC66FF"><a href="javascript:insertcode('CC66FF');" style="color:#000000;">CC66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC9900"><a href="javascript:insertcode('CC9900');" style="color:#000000;">CC9900</a></td>
+ <td bgcolor="CC9933"><a href="javascript:insertcode('CC9933');" style="color:#000000;">CC9933</a></td>
+ <td bgcolor="CC9966"><a href="javascript:insertcode('CC9966');" style="color:#000000;">CC9966</a></td>
+ <td bgcolor="CC9999"><a href="javascript:insertcode('CC9999');" style="color:#000000;">CC9999</a></td>
+ <td bgcolor="CC99CC"><a href="javascript:insertcode('CC99CC');" style="color:#000000;">CC99CC</a></td>
+ <td bgcolor="CC99FF"><a href="javascript:insertcode('CC99FF');" style="color:#000000;">CC99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCCC00"><a href="javascript:insertcode('CCCC00');" style="color:#000000;">CCCC00</a></td>
+ <td bgcolor="CCCC33"><a href="javascript:insertcode('CCCC33');" style="color:#000000;">CCCC33</a></td>
+ <td bgcolor="CCCC66"><a href="javascript:insertcode('CCCC66');" style="color:#000000;">CCCC66</a></td>
+ <td bgcolor="CCCC99"><a href="javascript:insertcode('CCCC99');" style="color:#000000;">CCCC99</a></td>
+ <td bgcolor="CCCCCC"><a href="javascript:insertcode('CCCCCC');" style="color:#000000;">CCCCCC</a></td>
+ <td bgcolor="CCCCFF"><a href="javascript:insertcode('CCCCFF');" style="color:#000000;">CCCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCFF00"><a href="javascript:insertcode('CCFF00');" style="color:#000000;">CCFF00</a></td>
+ <td bgcolor="CCFF33"><a href="javascript:insertcode('CCFF33');" style="color:#000000;">CCFF33</a></td>
+ <td bgcolor="CCFF66"><a href="javascript:insertcode('CCFF66');" style="color:#000000;">CCFF66</a></td>
+ <td bgcolor="CCFF99"><a href="javascript:insertcode('CCFF99');" style="color:#000000;">CCFF99</a></td>
+ <td bgcolor="CCFFCC"><a href="javascript:insertcode('CCFFCC');" style="color:#000000;">CCFFCC</a></td>
+ <td bgcolor="CCFFFF"><a href="javascript:insertcode('CCFFFF');" style="color:#000000;">CCFFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF0000"><a href="javascript:insertcode('FF0000');" style="color:#FFFFFF;">FF0000</a></td>
+ <td bgcolor="FF0033"><a href="javascript:insertcode('FF0033');" style="color:#FFFFFF;">FF0033</a></td>
+ <td bgcolor="FF0066"><a href="javascript:insertcode('FF0066');" style="color:#FFFFFF;">FF0066</a></td>
+ <td bgcolor="FF0099"><a href="javascript:insertcode('FF0099');" style="color:#FFFFFF;">FF0099</a></td>
+ <td bgcolor="FF00CC"><a href="javascript:insertcode('FF00CC');" style="color:#FFFFFF;">FF00CC</a></td>
+ <td bgcolor="FF00FF"><a href="javascript:insertcode('FF00FF');" style="color:#FFFFFF;">FF00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF3300"><a href="javascript:insertcode('FF3300');" style="color:#FFFFFF;">FF3300</a></td>
+ <td bgcolor="FF3333"><a href="javascript:insertcode('FF3333');" style="color:#FFFFFF;">FF3333</a></td>
+ <td bgcolor="FF3366"><a href="javascript:insertcode('FF3366');" style="color:#FFFFFF;">FF3366</a></td>
+ <td bgcolor="FF3399"><a href="javascript:insertcode('FF3399');" style="color:#FFFFFF;">FF3399</a></td>
+ <td bgcolor="FF33CC"><a href="javascript:insertcode('FF33CC');" style="color:#FFFFFF;">FF33CC</a></td>
+ <td bgcolor="FF33FF"><a href="javascript:insertcode('FF33FF');" style="color:#FFFFFF;">FF33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF6600"><a href="javascript:insertcode('FF6600');" style="color:#000000;">FF6600</a></td>
+ <td bgcolor="FF6633"><a href="javascript:insertcode('FF6633');" style="color:#000000;">FF6633</a></td>
+ <td bgcolor="FF6666"><a href="javascript:insertcode('FF6666');" style="color:#000000;">FF6666</a></td>
+ <td bgcolor="FF6699"><a href="javascript:insertcode('FF6699');" style="color:#000000;">FF6699</a></td>
+ <td bgcolor="FF66CC"><a href="javascript:insertcode('FF66CC');" style="color:#000000;">FF66CC</a></td>
+ <td bgcolor="FF66FF"><a href="javascript:insertcode('FF66FF');" style="color:#000000;">FF66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF9900"><a href="javascript:insertcode('FF9900');" style="color:#000000;">FF9900</a></td>
+ <td bgcolor="FF9933"><a href="javascript:insertcode('FF9933');" style="color:#000000;">FF9933</a></td>
+ <td bgcolor="FF9966"><a href="javascript:insertcode('FF9966');" style="color:#000000;">FF9966</a></td>
+ <td bgcolor="FF9999"><a href="javascript:insertcode('FF9999');" style="color:#000000;">FF9999</a></td>
+ <td bgcolor="FF99CC"><a href="javascript:insertcode('FF99CC');" style="color:#000000;">FF99CC</a></td>
+ <td bgcolor="FF99FF"><a href="javascript:insertcode('FF99FF');" style="color:#000000;">FF99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFCC00"><a href="javascript:insertcode('FFCC00');" style="color:#000000;">FFCC00</a></td>
+ <td bgcolor="FFCC33"><a href="javascript:insertcode('FFCC33');" style="color:#000000;">FFCC33</a></td>
+ <td bgcolor="FFCC66"><a href="javascript:insertcode('FFCC66');" style="color:#000000;">FFCC66</a></td>
+ <td bgcolor="FFCC99"><a href="javascript:insertcode('FFCC99');" style="color:#000000;">FFCC99</a></td>
+ <td bgcolor="FFCCCC"><a href="javascript:insertcode('FFCCCC');" style="color:#000000;">FFCCCC</a></td>
+ <td bgcolor="FFCCFF"><a href="javascript:insertcode('FFCCFF');" style="color:#000000;">FFCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFFF00"><a href="javascript:insertcode('FFFF00');" style="color:#000000;">FFFF00</a></td>
+ <td bgcolor="FFFF33"><a href="javascript:insertcode('FFFF33');" style="color:#000000;">FFFF33</a></td>
+ <td bgcolor="FFFF66"><a href="javascript:insertcode('FFFF66');" style="color:#000000;">FFFF66</a></td>
+ <td bgcolor="FFFF99"><a href="javascript:insertcode('FFFF99');" style="color:#000000;">FFFF99</a></td>
+ <td bgcolor="FFFFCC"><a href="javascript:insertcode('FFFFCC');" style="color:#000000;">FFFFCC</a></td>
+ <td bgcolor="FFFFFF"><a href="javascript:insertcode('FFFFFF');" style="color:#000000;">FFFFFF</a></td>
+ </tr>
+</table> \ No newline at end of file
diff --git a/0.4.3a/config.pm b/0.4.3a/config.pm
new file mode 100644
index 0000000..9a54fcf
--- /dev/null
+++ b/0.4.3a/config.pm
@@ -0,0 +1,303 @@
+# yChat - Copyright by Paul C. Bütow
+
+
+########################### Dieser Teil bestimmt die Standart-Variabeln.
+##STANDART-CONFIGURATION:## (CSS, Farben, Version etc.)
+###########################
+$datum = "30.12.2k";
+$version = "0.4.3";
+$title = "yChat.de ($version)";
+$gfxpath = "../../yChat";
+$style = <<ENDCSS;
+<style rel="stylesheet" type="text/css">
+ body { background-color: 005146 }
+ body.blank { background-color: 000000 }
+ body.online { background-color: 000000 }
+ body.log { background-color: 000000 }
+ div { font-family: arial, verdana, helvetiva; font-size: 9pt; color: ffffff }
+ div.b { font-weight: bold; color: ffa500 }
+ a { color: ffffef }
+ a:hover { color: ffffff; text-decoration: none }
+</style>
+ENDCSS
+
+############### Dieser Teil enthält Programmcode, der an verschiedenen
+##SHARED-SUBS## Stellen ausgeführt werden muß und jedem Skript zur
+############### Verfügung steht.
+
+sub printfile { # Liest eine externe Datei ein und gibt sie mit print aus
+ my ($file2print,$pagetitle,$bodyclass) = @_;
+ if ($pagetitle ne "") {
+ &start_html($pagetitle,$bodyclass);
+ }
+ &read_file($file2print);
+ @file2print = <DATEI>;
+ close DATEI;
+ print @file2print;
+}
+
+
+sub start_html { # Der HEADER einer HTML-Datei
+print "<html><head>";
+print "<meta http-equiv=\"refresh\" content=\"20\" URL=\"online.pl?room=$room\">" if ($_[1] eq "online");
+print <<END;
+ <title>
+ $title - $_[0]
+ </title>
+ $_[2]
+ $style
+ </head>
+END
+ if ($_[1] eq "start") {
+ print "<body onload=\"document.login.alias.focus();\">";
+ } elsif ($_[1] ne "") {
+ print "<body class=$_[1]>";
+ } else {
+ print "<body>";
+ }
+}
+
+sub post { # Öffentliche Nachricht im aktuellen Raum $room posten.
+ my ($room,$msg2post,$secroom) = @_;
+ my @rooms = $room;
+if ($room ne $secroom) {
+ my @rooms = ($room,$secroom);
+}
+ foreach(@rooms) {
+ my $room2post = $_;
+ &list_dir("data/online/rooms/$room2post");
+ foreach(@dir) {
+ my $alias2post = $_;
+ if (-f "data/online/rooms/$room2post/$alias2post") {
+ open (DATEI,">>data/msgs/$alias2post") || &error("Konnte $file2write nicht öffnen");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+ }
+ }
+ }
+ &log($msg2post) if ($room eq "Cyberbar");
+}
+
+
+sub post_all { # Öffentliche Nachricht in ALLEN Räumen gleichzeitig posten.
+ my $msg2post = $_[0];
+ &list_dir("data/online/users");
+ foreach $alias2post (@dir) {
+ if (-f "data/online/users/$alias2post") {
+ open (DATEI,">>data/msgs/$alias2post") || &error("Konnte $file2write nicht öffnen");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+ }
+ }
+ &log($msg2post);
+}
+
+sub post_prv { # Private Nachricht posten (flüstern).
+ my $alias2post = $_[0];
+ my $msg2post = $_[1];
+ &write_file("data/msgs/$alias2post");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+}
+
+sub log { # Protokollieren der Nachrichten etc.
+ my ($msg2log) = @_;
+ &zeit;
+ &write_file("data/logs/$day.$month.$year");
+ print DATEI "<br><font color=ffffef><i>($hours:$min:$sec)</i></font> $msg2log\n";
+ close DATEI;
+}
+
+
+sub zeit { # Aktuelles Datum und Uhrzeit bestimmen.
+ ($sec, $min, $hours, $day, $month, $year) = (localtime)[0..5];
+ $month += 1;
+ $hours = "0".$hours if ($hours < 10);
+ $min = "0".$min if ($min < 10);
+ $sec = "0".$sec if ($sec < 10);
+ $day = "0".$day if ($day < 10);
+ $month = "0".$month if ($month < 10);
+ $year = $year - 100;
+ if ($year < 10) {
+ $year = "200".$year;
+ } else {
+ $year = "20".$year;
+ }
+}
+
+sub count { # Zeilen in einer Datei Zählen.
+ my $file2count = $_[0];
+ &read_file($file2count);
+ my @datei = <DATEI>;
+ close DATEI;
+ $number = $#datei+1;
+}
+
+sub read_file { # Datei öffnen.
+ my $file2read = $_[0];
+ if (-e "$file2read") {
+ open (DATEI,"<$file2read") || &error("Konnte $file2read nicht öffnen");
+ }
+}
+
+sub write_file { # Text an eine Datei anhängen.
+ my $file2write = $_[0];
+ if (-e "$file2write") {
+ open (DATEI,">>$file2write") || &error("Konnte $file2write nicht öffnen");
+ } else {
+ &create_file("$file2write");
+ open (DATEI,">>$file2write") || &error("Konnte $file2write nicht öffnen");
+ }
+}
+
+sub write_file_new { # Datei neu schreiben.
+ my $file2write = $_[0];
+ if (-e "$file2write") {
+ open (DATEI,">$file2write") || &error("Konnte $file2write nicht öffnen");
+ } else {
+ &create_file("$file2write");
+ open (DATEI,">$file2write") || &error("Konnte $file2write nicht öffnen");
+ }
+}
+
+sub create_file { # Datei erstellen.
+ my $file2create = $_[0];
+ open (CREATE, ">$file2create") || &error("Konnte $file2create nicht erstellen!");
+ print CREATE "";
+ close CREATE;
+}
+
+sub error { # Error-Ausgabe.
+ my $error_msg = $_[0];
+ &start_html( "Error: ($error_msg)" );
+ print $q->div( "Error: ($error_msg)" ),
+ $q->end_html;
+ exit;
+}
+
+sub check_online {
+ open(PROVE,">data/online/prove");
+ print PROVE time;
+ close PROVE;
+ opendir(RAUMDIR, "data/online/rooms");
+ @raumdir = readdir(RAUMDIR);
+ closedir(RAUMDIR);
+ foreach $raum (@raumdir) {
+ opendir(BENUTZERDIR, "data/online/rooms/$raum");
+ @benutzerdir = readdir(BENUTZERDIR);
+ closedir(BENUTZERDIR);
+ my $raumleer= 1;
+ foreach $benutzer (@benutzerdir) {
+ if (-f "data/online/rooms/$raum/$benutzer") {
+ $raumleer = 0;
+ open (BENUTZER,"<data/online/rooms/$raum/$benutzer");
+ $benutzerstamp = <BENUTZER>;
+ close BENUTZER;
+ if ($benutzerstamp < (time - 40)) {
+ unlink("data/online/$raum/$benutzer");
+ open (BENUTZER2,"<data/online/users/$benutzer");
+ $benutzerstamp2 = <BENUTZER2>;
+ close BENUTZER2;
+ if ($benutzerstamp2 < (time - 40)) {
+ if ($benutzer ne $alias) {
+ &rm_alias($benutzer,$raum); # ohne $raum/benutzer entf.
+ } else {
+ unlink("data/online/rooms/$raum/$benutzer");
+ }
+ &zeit;
+ &post($raum,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$benutzer hat den Chat verlassen ... </font></i>");
+ }
+ }
+ }
+ }
+ if ($raumleer == 1) { # Falls Raum leer ist => entf.
+ rmdir("data/online/rooms/$raum");
+ unlink("data/online/rstat/$raum");
+ }
+ }
+}
+
+sub rm_alias { # Falls Benutzer offline gegangen ist
+ my($benutzer,$raum) = @_;
+ unlink("data/online/rooms/$raum/$benutzer");
+ unlink("data/online/users/$benutzer");
+ unlink("data/online/ident/$benutzer");
+ unlink("data/msgs/$benutzer");
+ &rm_rstat($benutzer,$raum);
+}
+
+
+sub rm_rstat { # Benutzer als Raumbesetzer austragen
+ my ($r_alias,$rstatroom) = @_;
+ open (RSTAT,"<data/online/rstat/$rstatroom");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ my @rstat2 = ($rstat[0],$rstat[1]);
+ for ($i=2;$i<=$#rstat;$i++) {
+ push(@rstat2,$rstat[$i]) if ($rstat[$i] ne $r_alias."\n");
+ }
+ open (RSTAT,">data/online/rstat/$rstatroom");
+ print RSTAT @rstat2;
+ close RSTAT;
+}
+
+sub secure_removeid { # Beim ausloggen die IP-Nummer aus dat/ip austragen.
+ my $alias2rm = $_[0];
+ unlink("data/online/ident/$alias2rm");
+}
+
+sub secure_checkid { # TmpID überprüfen
+ my ($alias2check) = @_;
+ &read_file("data/online/ident/$alias2check");
+ my @idfile = <DATEI>;
+ close DATEI;
+ if ($idfile[1] ne $tmpid) {
+ &error("Falsche TempID ! Du bist nicht befugt zu handeln !");
+ }
+}
+
+sub remove_rooms { # Leere Räume entfernen.
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-d "data/online/rooms/$_") {
+ &list_dir("data/online/rooms/$_");
+ rmdir("data/online/rooms/$_") if ($#dir = 1);
+ }
+ }
+}
+
+sub list_dir { # Beliebigen Verzeichnisbaum einlesen.
+ my ($dir,$method) = @_;
+ opendir(DIR, $dir);
+ if ($method eq undef) {
+ @dir = readdir(DIR);
+ } elsif ($method = 2) {
+ @dir2 = readdir(DIR);
+ }
+ closedir(DIR);
+}
+
+sub hirachie { # Chatter nach Sonderrechte überprüfen.
+ my $alias2prove = $_[0];
+ $hirachie = undef;
+ &read_file("data/wa");
+ @was = <DATEI>;
+ close DATEI;
+ foreach(@was) {
+ if ($_ eq $alias2prove || $_ eq "$alias2prove\n") {
+ $hirachie = "wa";
+ }
+ }
+ &read_file("data/ow");
+ @ows = <DATEI>;
+ close DATEI;
+ if ($hirachie ne "wa" || $_ eq "$alias2prove\n") {
+ foreach(@ows) {
+ if ($_ eq $alias2prove || $_ eq "$alias2prove\n") {
+ $hirachie = "ow";
+ }
+ }
+ }
+}
+
+$| = 1; # Cache von Perl ausschalten \ No newline at end of file
diff --git a/0.4.3a/help.sno b/0.4.3a/help.sno
new file mode 100644
index 0000000..b2ac529
--- /dev/null
+++ b/0.4.3a/help.sno
@@ -0,0 +1,58 @@
+<div>
+ Alle Chat-Befehle:
+</div>
+<hr>
+<table width=100% bgcolor=000000>
+<tr><th bgcolor=666666><div>SU</div></th><th bgcolor=666666><div>Befehl</div></th><th bgcolor=666666><div>Beschreibung</div></th></tr>
+<tr><td><div>NC</div></td><td><div>/about</div></td><td><div>Zeigt aktuelle Version und andere Infos der Community an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/away <font color=red>Nachricht</font></div></td><td><div>Abmelden mit einer<font color=red>Abmeldenachricht</font></div></td></tr>
+<tr><td><div>NC</div></td><td><div>/clear</div></td><td><div>Bildschirm wird gelöscht</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/col <font color=red>XXXXXX</font> <font color=ffa500>XXXXXX</font></div></td><td><div>Farbe/n (<font color=red>Namensfarbe</font> / <font color=ffa500>Textfarbe</font>) wechseln. Angabe in Hexadezimal.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/date</div></td><td><div>Zeigt aktuelles Datum und Urzeit an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/j <font color=red>Raumname</font></div></td><td><div>Raum wechseln/erstellen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ju <font color=red>Alias</font></div></td><td><div>In den Raum wechseln/folgen, wo sich <font color=red>Alias</font> befindet.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/m <font color=red>Aktion</font></div></td><td><div>Handeln mit 2 Farben</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/me <font color=red>Aktion</font></div></td><td><div>Handeln mit einer Farbe</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/msg <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine private <font color=ffa500>Nachricht</font> flüstern</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ <font color=ffa500>Nachricht</font></div></td><td><div>Eine private <font color=ffa500>Nachricht</font> demjenigen flüstern, dem zuletzt eine geflüstert wurde</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/online <font color=red>Alias</font></div></td><td><div>Zeigt Onlineminuten von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/q</div></td><td><div>Cumunnity verlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/rmgb</div></td><td><div>Das eigene Gästebuch komplett weglöschen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/s <font color=red>Nachricht</font></div></td><td><div><font color=red>Nachricht</font> schreien</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/seen <font color=red>Alias</font></div></td><td><div>Zeigt an, vor wieviel Stunden sich <font color=red>Nachricht</font> zum letzten Mal in das System eingelogt hat</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/w</div></td><td><div>Zeigt an, wer sich im aktuellen Raum befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc <font color=red>Raum</font></div></td><td><div>Zeigt an, wer sich im <font color=red>Raum</font> befindet. Wird kein Raum angegeben, dann wird jedeglich angezeigt, wer sich im System befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc/</div></td><td><div>Zeigt alle offenen Räume und deren Chatter an</div></td></tr>
+<tr><td><div>NC</div></td><td> <div>/wj <font color=red>Alias</font></div></td><td><div>Zeigt an, in welchen Raum sich <font color=red>Alias</font> befindet</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/l</div></td><td><div>Der aktuelle Raum wird ab- bzw. aufgesperrt</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/rsu <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> die Raumbesetzerrechte entnehmen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/su <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Raumbesetzer ernennen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/t <font color=red>Thema</font></div></td><td><div>Dem aktuellen Raum wird ein <font color=red>Thema</font> gegeben</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban</div></td><td><div>Zeigt alle verbannten Benutzer an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> verbannen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/rban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> "entbannen"</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ip <font color=red>Alias</font></div></td><td><div>Zeigt die IP-Nummer von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/k <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird aus dem Chat katapultiert!</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/kill <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird ganz und gar aus dem System entfernt</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/wa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Wächter ernennen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/rwa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom Wächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/sys <font color=red>Nachricht</font></div></td><td><div>Systemnachricht schreiben. (Erscheint in allen existierenden Räumen)</div></td></tr>
+<tr><td><div><font color=yellow>ADM</font></div></td><td><div>/ow <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Oberwächter ernennen</div></td></tr>
+<tr><td><div><font color=yellow>ADM</font></div></td><td><div>/row <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> die Oberwächterrechte entziehen</div></td></tr>
+<tr><td><div><font color=yellow>ADM</font></div></td><td><div>/pw <font color=red>Alias</font></div></td><td><div>Zeigt Zugangspasswort von <font color=red>Alias</font> an</div></td></tr>
+</table><hr>
+<div>
+ Zur Erklärung: NC steht für "Normale Chatter", RB für "Raumbesetzer", WÄ für "Wächter" und OW für "Oberwächter".
+ Obrige Befehle können nur von der/den jeweiligen Benutzergruppe/n werden.<br><br>
+ Allerdings gibt es folgendes zu beachten: Oberwächter verfügen über alle Chatbefehle. Normale Wächter über alle Chatbefehle, außer über die der Oberwächter.
+ Raumbesetzer können nur Raumbesetzerbefehle und die Befehle der normalen Chatter durchführen. Normale Chatter haben jedeglich die Standardbefehle zu verwenden.<br><br>
+ Weitere Besonderheiten der Wächter und Oberwächter:<br><br>
+ Wächter und Oberwächter können ....<br>
+ ... abgesperrte Chaträume problemlos betreten.<br>
+ ... nicht gekickt, verbannt oder gekillt werden.<br>
+ ... Logdateien der Cyberbar lesen.<br><br>
+
+ Des weiteren: Oberwächter ernennt nur der Systemadministrator!
+</div>
+</body>
+</html> \ No newline at end of file
diff --git a/0.4.3a/htdocs.pl b/0.4.3a/htdocs.pl
new file mode 100644
index 0000000..f3b5b10
--- /dev/null
+++ b/0.4.3a/htdocs.pl
@@ -0,0 +1,221 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+$var = $q->param("var");
+if ($var eq "help_html") {
+ &printfile("help.sno","Alle Chatbefehle");
+} elsif ($var eq "logo_html") {
+ &start_html("Logo");
+ print "<layer top=-3 left=0><div style=\"position:absolute; top:5; left:10\">",
+ "<img src=\"$gfxpath/y_.gif\"></div></layer>";
+ $q->end_html;
+} elsif ($var eq "menu_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ $tmp = $q->param("tmp");
+ &menu_html;
+} elsif ($var eq "werda_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &werda_html;
+} elsif ($var eq "logs_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ &logs_html;
+} elsif ($var eq "view_logs_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $tmp = $q->param("tmp");
+ &secure_checkid($alias);
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ &printfile($tmp,"blank","log");
+ }
+} elsif ($var eq "superuser_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ &superuser_html;
+} else {
+ print
+ $q->start_html(-bgcolor=>"000000"),
+ $q->end_html;
+}
+
+sub menu_html {
+if ($tmp eq "quit") {
+ &start_html("Quit","blank","<script language=\"JavaScript\">open(\"index.pl?tmp=quit\",\"_top\");</script>");
+ print $q->end_html;
+ sleep 2;
+ &remove_online($alias,$room);
+ &secure_removeid($alias);
+ exit;
+}
+ENDJS
+ &start_html("Menü","blank");
+print <<END;
+<script language="JavaScript">
+function fenster(fenster,target) {
+ open(fenster,target,"width=500,height=500,screenX=100,screenY=100,scrollbars");
+}
+</script>
+<font size=2 face=verdana>
+ <a href='javascript:fenster("htdocs.pl?var=werda_html&alias=$alias&room=$room&col=$col&secol=$secol&&tmp=$tmp&tmpid=$tmpid","weristda")'>Wer ist da?</a>
+ <a href='javascript:fenster("main2.pl?var=edit_profile_html&alias=$alias&tmpid=$tmpid&room=$room","ProfilAendern")'>Profil ändern</a>
+ <a href='javascript:fenster("main2.pl?var=edit_options_html&alias=$alias&tmpid=$tmpid&room=$room","Optionen")'>Chatoptionen</a>
+ <a href='javascript:fenster("main2.pl?var=list_alias_html&alias=$alias&tmpid=$tmpid","Benutzerliste")'>Benutzerliste</a>
+ <a href='javascript:fenster("htdocs.pl?var=help_html&tmpid=$tmpid","Befehle")'>Chatbefehle</a><br>
+ <a href='javascript:fenster("main2.pl?var=gb_html&alias=$alias&tmpid=$tmpid","Board")'>Benutzerboard</a>
+ <a href='javascript:fenster("htdocs.pl?var=superuser_html&alias=$alias&tmpid=$tmpid","Superuser")'>Superuser</a>
+ <a href='javascript:fenster("htdocs.pl?var=logs_html&alias=$alias&tmpid=$tmpid","Logdateien")'>Logdateien</a>
+ <a href="http://www.updates.yChat.de" target="Updates">Updates</a>
+ <a href="http://www.credits.yChat.de" target="Credits">Credits</a>
+ <a href="htdocs.pl?alias=$alias&var=menu_html&room=$room&tmpid=$tmpid&tmp=quit">Verlassen</a>
+</font>
+</body>
+</html>
+END
+}
+
+sub werda_html { # Anzeige, wer eingelogt ist.
+ &start_html("Wer ist da?");
+ print <<END;
+<div>
+ $alias, schön daß Du hier bist :-)
+</div>
+<hr>
+<div>
+ Folgende Personen befinden sich im Chat:
+</div>
+<br>
+<div>
+END
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ my $room = $_;
+ &read_file("data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ &list_dir("data/online/rooms/$room",2);
+ local $nr = $#dir2-1;
+ print $q->b( $_ ),
+ " $door ($nr) Raumthema: $rstat[1]",
+ $q->br;
+ foreach(@dir2) {
+ if ($_ ne ".." && $_ ne ".") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid" }, "$_"), " ";
+ }
+ }
+ print $q->br, $q->br;
+ }
+ }
+ print
+ "</div>",
+ $q->end_html;
+}
+
+sub logs_html {
+ &start_html("Logdateien");
+ print <<END;
+<div>
+ Hier befinden sich alle Logdateien
+</div>
+<hr>
+END
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ print $q->div( "Folgende Logdateien des Raumes \"Cyberbar\" können nur von Wächtern und Oberwächtern gelesen werden (Sortiert nach A-Z, a-z):" ),
+ $q->br;
+ &list_dir("data/logs");
+ my @sortedir = sort(@dir);
+ foreach(@sortedir) {
+ if (-f "data/logs/$_") {
+ print $q->a( { -href=>"htdocs.pl?alias=$alias&var=view_logs_html&tmp=data/logs/$_&tmpid=$tmpid",
+ -target=>"_new" },
+ "$_" ),
+ " ";
+ }
+ }
+ } else {
+ print $q->div( "Logdateien können nur von Oberwächtern (OW) und von Wächtern (WÄ) gelesen werden. Du bist jedoch ein ",
+ "\"Normaler Chatter\". Wächter können alles nachlesen, was öffentlich gechattet wurde." ),
+ $q->hr;
+ &printfile("data/htdocs/logs_html");
+ }
+ print
+ $q->end_html;
+}
+
+sub superuser_html { # Zeigt an, wer Superuser ist
+ &start_html("Superuser");
+ print "<div>Hallo $alias. Du bist als ";
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ print
+ $q->b( "Oberwächter" ),
+ " (OW) eingetragen.</div>",
+ $q->hr;
+ } elsif ( $hirachie eq "wa") {
+ print
+ $q->b( "Wächter" ),
+ " (WÄ) eingetragen.</div>",
+ $q->hr;
+ } else {
+ print
+ $q->b( "normaler Chatter" ),
+ " (NC) eingetragen.</div>",
+ $q->hr;
+ }
+
+ my $nrow = $#ows+1;
+ print
+ "<div>",
+ $q->b( "OW" ),
+ "s ($nrow Stück)";
+ foreach(@ows) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+ my $nrwa = $#was+1;
+ print
+ "</div>",
+ $q->hr,
+ "<div>",
+ $q->b( "WÄ" ),
+ "s ($nrwa Stück)";
+ foreach(@was) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+print <<END;
+<hr>
+ Die jeweiligen Fähigkeiten der Oberwächter (OW) und der Wächter (WÄ) sind unter
+ "<a href="htdocs.pl?var=help_html">Chat-Befehle</a>"
+ dokumentiert.
+</div>
+</body>
+</html>
+END
+} \ No newline at end of file
diff --git a/0.4.3a/index.pl b/0.4.3a/index.pl
new file mode 100644
index 0000000..7593428
--- /dev/null
+++ b/0.4.3a/index.pl
@@ -0,0 +1,408 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header; # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUFGERUFEN WERDEN?##
+#####################################
+
+$var = $q->param("var");
+$alias = $q->param("alias");
+$id = $q->param("id");
+$tmp = $q->param("tmp");
+
+
+if ($var eq "create_alias_html") {
+ &create_alias_html;
+} elsif ($var eq "create_alias") {
+ &create_alias;
+} elsif ($var eq "login_html") {
+ $tmp = $q->param("tmp");
+ &login_html;
+} elsif ($alias eq "") {
+ &login_html;
+} else {
+ &checklogin;
+}
+
+sub login_html { # Erste Startseite
+&check_online;
+local $counter = undef;
+&read_file("data/count");
+ $counter = <DATEI>;
+close DATEI;
+$counter++;
+&write_file_new("data/count");
+ print DATEI $counter;
+close DATEI;
+&list_dir("data/online/users");
+my $logtin = $#dir-1;
+&list_dir("data/user/options",2);
+my $users = $#dir2-1;
+&start_html("Created & Copyright by Paul C. Bütow","start");
+print <<END;
+ <center>
+ <table width=500>
+ <tr>
+ <td>
+ <center>
+ <table>
+ <tr>
+ <td>
+ <img src="$gfxpath/y.gif">
+ </td>
+ <td>
+ <div>
+ yChat: Version $version
+ <br><br>
+ Letztes Update: $datum
+ <br><br>
+ Seitenaufrufe: $counter
+ <br><br>
+ Benutzer registriert: $users
+ <br><br>
+ Benutzer online: $logtin
+ <br><br>
+ Webmaster: <a href="mailto:paul\@buetow.oxg.de">Paul C. Bütow</a>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </center>
+ </div>
+ <br>
+ <br>
+END
+ if ($tmp eq "true") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Wahrscheinlich existiert Dein Alias "$alias" nicht,
+ <br>
+ Du hast Dich verschrieben oder das Passwort ist falsch.
+ <br>
+ Versuch es erneuert !
+ </div>
+END
+ } elsif ($tmp eq "quit") {
+print <<END;
+ <div>
+ Du hast soeben den Chat verlassen.
+ <br>
+ Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ } elsif ($tmp eq "banned") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein Alias "$alias" wurde verbannt.
+ <br>
+ Z.z. kannst Du Dich leider nicht in den Chat einloggen.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($tmp eq "kick") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wurdest soeben aus dem Chat katapultiert!
+ <br>
+ Schlechtes Verhalten mag die Ursache hierfür sein.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($var eq "create_alias") {
+print "<div>Du hast sich soeben in die Datenbank eingetragen. Einfach auf \"Los Geht's\" klicken :-)</div>";
+ } else {
+print <<END;
+ <div>
+ Herzlich willkommen!
+ <br>
+ Einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <form name="login" action="index.pl" method="post">
+ <input type="hidden" name="tmp" value="true">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Alias:
+ <br>
+ <input name="alias" value="$alias">
+ </div>
+ </td>
+ <td>
+ <div>
+ Dein Passwort:
+ <br>
+ <input type="password" name="id" value="$id">
+ </div>
+ </td>
+ </tr>
+ </table>
+ <br>
+ <br>
+ <div>
+ Solltest Du noch keinen Nick besitzen, dann auf "Registrieren" klicken!
+ </div>
+ <br>
+ <table>
+ <tr>
+ <td>
+ <font color="ffffff">
+ <input type="submit" value="Los geht's!">
+ </font>
+ </form>
+ </td>
+ <td>
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias_html">
+ <font color="ffffff">
+ <input type="submit" value="Registrieren">
+ </font>
+ </form>
+ </td>
+ </tr>
+ </table>
+ <hr>
+ </td>
+ </tr>
+ </table>
+ </center>
+</body>
+</html>
+END
+ if ($logtin == 0) {
+ &list_dir("data/msgs");
+ &list_dir("data/online/rstat",2);
+ foreach(@dir) {
+ unlink("data/msgs/$_");
+ unlink("data/online/ident/$_");
+ }
+ foreach(@dir2) {
+ unlink("data/online/rstat/$_");
+ }
+ }
+ # Falls d. Skript das Raumverz. gelöscht hat, neu anlegen
+ if (-d "data/online/rooms") {
+ } else {
+ mkdir "data/online/rooms", 0777;
+ }
+}
+
+
+sub create_alias_html { # HTML-Form für Erstellung eines neuen Benutzers.
+my $reload = $_[0];
+&start_html("Registration");
+print <<END;
+ <center>
+ <table width=500>
+ <tr>
+ <td>
+END
+ if ($reload eq "alias_exists") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Der von Dir gewählte Benutzername "$alias" existiert in unserer Datenbank bereits. Bitte versuch es erneuert mit
+ einem anderen Benutzernamen !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "pw_wrong") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Deine beiden Passworteingaben stimmen nicht überein. Bitte geb das Passwort erneuert an um sicherzugehen, daß
+ kein falsches Passwort abgespeichert wird !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "alias_prohibited") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein gewählter Benutername "$alias" enthält illegale Zeichen. Bitte versuch einen anderen Benutzernamen!
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Hier kannst Du Dich registrieren. Bitte beachte, daß die Passworteingabefelder übereinstimmen!
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias">
+ <div>
+ Dein Alias:
+ <font color="ffa500">
+ (Muß angegeben werden)
+ </font>
+ <br>
+ <input name="alias" VALUE="$alias">
+ </div>
+ <br>
+ <div>
+ Dein gewünschtes Passwort:
+ <br>
+ <input type="password" name="id" value="$id">
+ </div>
+ <br>
+ <div>
+ Geb hier Dein Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp">
+ </div>
+ <br>
+ <font color=ffffff>
+ <input type="submit" value="Registrieren">
+ </font>
+ <br>
+ </form>
+ <hr>
+ <div>
+ Um den Chat zu betreten müssen die Daten nach der Registration auf der Startseite erneuert bestätigt werden !
+ </div>
+ </td>
+ </tr>
+ </table>
+</center>
+</body>
+</html>
+END
+}
+
+sub checklogin { # Überprüfen, ob die Login-Daten korrekt sind.
+ my $lognotexists = "true";
+ &list_dir("data/user/options");
+ for (my $i=0; $i<=$#dir; $i++) {
+ if ($dir[$i] eq $alias) {
+ &read_file("data/user/options/$alias");
+ @datei = <DATEI>;
+ close DATEI;
+ chomp($datei[0]);
+ if ($datei[0] eq $id) {
+ &read_file("data/ban"); # Überprüfen, ob Alias verbannt ist
+ @banned = <DATEI>;
+ close DATEI;
+ foreach(@banned) {
+ if ($_ eq "$alias\n") {
+ $tmp = "banned";
+ &login_html();
+ exit;
+ }
+ }
+ if ($datei[1] eq undef) {
+ $col = "ffffff";
+ }else {
+ $col = $datei[1];
+ }
+ if ($datei[2] eq undef) {
+ $secol = "ffffef";
+ }else {
+ $secol = $datei[2];
+ }
+ $tmpid = time;
+ &write_file_new("data/online/ident/$alias");
+ print DATEI $ENV{'REMOTE_ADDR'}."\n".$tmpid;
+ close DATEI;
+ &read_file("data/user/lastlogin/$alias");
+ my @lastlogin = <DATEI>;
+ close DATEI;
+ &write_file_new("data/user/lastlogin/$alias");
+ print DATEI time;
+ close DATEI;
+ &frameset_html;
+ exit;
+ } else {
+ $lognotexists = "false";
+ }
+ }
+ }
+ if ($lognotexists eq "true") {
+ }
+ &login_html; # Falls Login-Daten inkorrekt sind, zurück zur Startseite.
+}
+
+sub create_alias { # Erstellung eines neuen Benutzers.
+ if ($alias =~ /[\W]/ || $alias eq "") {
+ &create_alias_html("alias_prohibited");;
+ exit;
+ } elsif ($id ne $tmp) {
+ &create_alias_html("pw_wrong");
+ exit;
+ }
+ &list_dir("data/user/options");
+ for (my $i=0; $i<=$#dir; $i++) {
+ if ($dir[$i] eq $alias) {
+ &create_alias_html("alias_exists");
+ exit;
+ }
+ }
+ &write_file_new("data/user/options/$alias");
+ print DATEI $id."\n";
+ close DATEI;
+ &zeit;
+ &list_dir("data/user/options");
+ my $number = $#dir-1;
+ &post("Cyberbar","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias [$number] hat sich soeben als neuer Benutzer registriert :-) ...</font></i>");
+ &login_html;
+}
+
+sub frameset_html {
+print <<END;
+<html>
+ <head>
+ <title>
+ $title - Created & Copyright by Paul C. Bütow
+ </title>
+ </head>
+<frameset border=0 frameborder=0 framespacing=0 cols="130,*">
+ <frameset border=0 frameborder=0 framespacing=0 rows="300,*,55">
+ <frame name="online" src="online.pl?room=Cyberbar&alias=$alias&tmpid=$tmpid">
+ <frame src="htdocs.pl">
+ <frameset border=0 frameborder=0 framespacing=0 cols="70,*">
+ <frame name="logo" src="htdocs.pl?var=logo_html" scrolling="no">
+ <frame name="reload" src="htdocs.pl" scrolling="no">
+ </frameset>
+ </frameset>
+ <frameset border=0 frameborder=0 framespacing=0 rows="60,*,55">
+ <frame name="menu" src="htdocs.pl?alias=$alias&var=menu_html&room=Cyberbar&col=$col&secol=$secol&tmpid=$tmpid" scrolling="no">
+ <frame name="main" src="push.pl?room=Cyberbar&alias=$alias&tmpid=$tmpid">
+ <frame name="input" src="main.pl?alias=$alias&var=input_html&room=Cyberbar&col=$col&secol=$secol&tmp=login&tmpid=$tmpid" scrolling="no">
+ </frameset>
+</frameset>
+</html>
+END
+}
diff --git a/0.4.3a/main.pl b/0.4.3a/main.pl
new file mode 100644
index 0000000..010c58f
--- /dev/null
+++ b/0.4.3a/main.pl
@@ -0,0 +1,899 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI; # CGI-Modul laden
+
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+$var = $q->param("var");
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+&secure_checkid($alias);
+$room = $q->param("room");
+$col = $q->param("col");
+$secol = $q->param("secol");
+$tmp = $q->param("tmp");
+if ($var eq "input_html") {
+ &input_html;
+} elsif ($var eq "post_msg") {
+ $tmp = $q->param("tmp");
+ $msg = $q->param("msg");
+ $whisper = $q->param("whisper");
+ &post_msg;
+} else {
+ &error("Parameter fehlt");
+}
+
+sub input_html { # Eingabemaske für den Chat.
+ if ($tmp eq "login") {
+ &remove_rooms;
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat den Chat betreten ...</font></i>");
+ }
+ my $whisper = @_;
+ $whisper = $q->param('whisper') if ($whisper == 0);
+print <<END;
+<html>
+ <head>
+ <script language="JavaScript">
+
+maxVerlauf = 10; // Anzahl der Einträge des Verlaufs
+maxPreview = 20; // Zeichenlänge der Verlaufsvorschau
+fullVerlauf = new Array( maxVerlauf );
+
+function delout()
+{
+ addVerlauf( document.inf.msg.value );
+ document.inf.submit(); // Formular absenden
+ document.inf.msg.focus(); // Fukus in das Eingabeform
+ document.inf.msg.select(); // Text im Eigabeform markieren
+ return false;
+}
+function CheckAuswahl()
+{
+ id = document.verlaufform.verlauf.selectedIndex;
+
+ if( fullVerlauf[ id-1 ] == null ) // Falls das Feld leer ist
+ return false; // Aufruf ignorieren
+
+ document.inf.msg.value = fullVerlauf[ id-1 ];
+ document.inf.msg.focus();
+
+ return true;
+}
+function addVerlauf( msg )
+{
+ if( msg == "" ) // Falls msg leer
+ return false; // Aufruf ignorieren
+
+ for( i=0; i<(maxVerlauf-1); i++ ) // Alle Einträge einen aufrutschen
+ {
+ document.verlaufform.verlauf.options[i+1].text = document.verlaufform.verlauf.options[i+2].text;
+ fullVerlauf[i] = fullVerlauf[i+1];
+ }
+ if( msg.length > maxPreview )
+ pre = msg.slice( 0, maxPreview-3 ) + "...";
+ else
+ pre = msg;
+
+ document.verlaufform.verlauf.options[ maxVerlauf ].text = pre; // Neue Vorschau anfügen
+ fullVerlauf[ maxVerlauf-1 ] = msg; // Neuen Eintrag anfügen
+
+// document.verlaufform.verlauf.selectedIndex = maxVerlauf; // Fokus auf den letzten Eintrag
+ document.verlaufform.verlauf.selectedIndex = 0; // Fokus auf den ersten Eintrag (Überschrift)
+}
+
+ </script>
+$style
+ </head>
+<body class="blank" onload="document.inf.msg.focus();">
+ <div align="left">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td>
+ <form name="inf" target="reload" action="main.pl" method="GET" onsubmit="return delout()">
+ <input type="hidden" name="var" value="post_msg">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="room" value="$room">
+ <input type="hidden" name="col" value="$col">
+ <input type="hidden" name="secol" value="$secol">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="whisper" value="$whisper">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input size="50" name="msg">
+ </form>
+ </td>
+ <td>
+ <form name="verlaufform">
+ <select size="1" name="verlauf" size="40" onChange="CheckAuswahl()">
+ <option value>- Nachrichten-Verlauf -</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ </select>
+ </form>
+ </td>
+ </tr>
+ </table>
+ </div>
+</body>
+</html>
+END
+}
+
+sub reload_html { # Wird neugeladen, wenn eine Nachricht getextet wird!
+ my ($whisper,$action) = @_;
+ print "<html><head><script language=\"JavaScript\">";
+ if ($action eq "change_room") {
+ print "open(\"online.pl?alias=$alias&room=$room&tmpid=$tmpid\",\"online\");";
+ print "open(\"main.pl?var=input_html&alias=$alias&room=$room&col=$col&secol=$secol&whisper=$whisper&tmpid=$tmpid\",\"input\");";
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol&tmpid=$tmpid\",\"menu\");";
+ } elsif ($action eq "change_colors") {
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol&tmpid=$tmpid\",\"menu\");";
+ print "open(\"main.pl?var=input_html&alias=$alias&room=$room&col=$col&secol=$secol&whisper=$whisper&tmpid=$tmpid\",\"input\");";
+ } elsif ($action eq "whisper") {
+ print "open(\"main.pl?var=input_html&alias=$alias&col=$col&secol=$secol&room=$room&whisper=$whisper&tmpid=$tmpid\",\"input\");";
+ } elsif ($action eq "away") {
+ print "open(\"main.pl?var=input_html&alias=$alias&col=$col&secol=$secol&room=$room&tmp=noaway&whisper=$whisper&tmpid=$tmpid\",\"input\");";
+ } elsif ($action eq "noaway") {
+ &zeit;
+ &post("$room,<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias meldet sich zurück ... </font></i>");
+ print "open(\"main.pl?var=input_html&alias=$alias&col=$col&secol=$secol&room=$room&whisper=$whisper&tmpid=$tmpid\",\"input\");";
+ } elsif ($action eq "quit") {
+ print "open(\"index.pl?tmp=quit\",\"_top\");";
+ }
+ print "</script></head><body bgcolor=$col>";
+ print
+ $q->end_html;
+}
+
+sub post_msg { # Wird aufgerufen, wenn aus input_html eine Eingabe gepostet wurde.
+ if ($tmp eq "noaway") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat sich zurück gemeldet ... </font></i>");
+ &post_prv($alias,"<script language=\"JavaScript\">open(\"main.pl?var=input_html&alias=$alias&col=$col&secol=$secol&room=$room&whisper=$whisper&tmpid=$tmpid\",\"input\");</script>");
+ }
+ $msg =~ s#<#&lt\;#g; # HTML-Tags deaktivieren
+ if (substr($msg,0,1) ne "/") { # Überprüfen, ob Befehl oder Nachricht
+ &post($room,"<b><font color=$col>$alias: <font color=$secol>".$msg."</font></font></b>");
+ &reload_html($whisper,$tmp);
+ } else {
+ if ($tmp eq "noaway") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat sich zurück gemeldet ... </font></i>");
+ &post_prv($alias,"<script language=\"JavaScript\">open(\"main.pl?var=input_html&alias=$alias&col=$col&secol=$secol&room=$room&whisper=$whisper&tmpid=$tmpid\",\"input\");</script>");
+ }
+ &cmd($msg);
+ }
+}
+
+sub cmd { # Alle Chatbefehle, die über input_html eingegeben werden können.
+ $_[0] = $_[0]." ";
+ $_[0] = substr($_[0], 1, length($_[0])-1);
+ my @cmd = split(/ /, $_[0]);
+ my $cmd = substr($_[0],0 , index($_[0], " "));
+ my ($action);
+#############>- NORMALE CHATBEFEHLE ( Alphabetisch sortiert ) -<
+#############>- INFORMATIONEN ÜBER DAS SYSTEM AUSGEBEN -<
+ if ($cmd eq "about") {
+ &post_prv("$alias","<font size=2 color=ffffff>Aktuelle Version ist $title und wurde am $datum aktuallisiert. Created by Paul C. Bütow 2k.</font>");
+#############>- ABMELDEN MIT 'AWAY-NACHRICHT' -<
+ } elsif ($cmd eq "away") {
+ if ($tmp eq "away") { # Falls 2 mal hintereinander /away eingegeben wurde
+ my $away_msg = "";
+ }
+ for ($i=1; $i <= $#cmd; $i++) {
+ $away_msg = $away_msg." ".$cmd[$i];
+ }
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias meldet sich ab (<font color=red>$away_msg</font> ) ...</i></font>");
+ &reload_html($whisper,"away");
+ exit;
+#############>- EIGENEN CHATBILDSCHIRM LÖSCHEN -<
+ } elsif ($cmd eq "clear") {
+ &post_prv("$alias","<script language=\"JavaScript\">window.open(\"push.pl?alias=$alias&room=$room&var=clear_screen&tmpid=$tmpid\",\"main\");</script>");
+ &reload_html($whisper);
+ exit;
+#############>- FARBEN WECHSELN -<
+ } elsif ($cmd eq "col") {
+ $col = $cmd[1];
+ my $tmpsecol = $cmd[2];
+ if ($tmpsecol eq "") {
+ $secol = $col
+ } else {
+ $secol = $tmpsecol;
+ }
+ &read_file("data/user/options/$alias");
+ my @pro = <DATEI>;
+ close DATEI;
+ &write_file_new("data/user/options/$alias");
+ print DATEI $pro[0]."".$col."\n".$secol;
+ close DATEI;
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat die Farbe gewechselt ...</font></i>");
+ &reload_html($whisper,"change_colors");
+ exit;
+#############>- AKTUELLES DATUM UND URZEIT AUSGEBEN -<
+ } elsif ($cmd eq "date") {
+ &zeit;
+ &post_prv("$alias","<font size=2 color=ffffff>Heute ist der $day.$month. Jahr $year. Es ist genau $hours:$min Uhr und $sec Sekunden.</font>");
+ &reload_html($whisper);
+ exit;
+#############>- EINEN NEUEN RAUM ERSTELLEN BZW. IN EINEN BESTEHENDEN RAUM WECHSELN -<
+ } elsif ($cmd eq "j") {
+ &change_room("j",$cmd[1],$room);
+ &reload_html($whisper,"change_room");
+ exit;
+#############>- HANDELN -<
+ } elsif ($cmd eq "me" || $cmd eq "m") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $me_msg = $me_msg." ".$cmd[$i];
+ }
+ if ($cmd eq "m") {
+ &post($room,"<i><font color=$col>$alias <font color=$secol>$me_msg</font></font></i>");
+ } else {
+ &post($room,"<i><font color=$col>$alias $me_msg</font></i>");
+ }
+ &reload_html($whisper);
+ exit;
+#############>- MEMO SCHREIBEN -<
+ } elsif ($cmd eq "memo") {
+ my $alias2memo = $cmd[1];
+ &list_dir("data/user/options");
+ foreach(@dir) {
+ if(-f "data/user/options/$alias2memo") {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $memo_msg = $memo_msg." ".$cmd[$i];
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2memo <font color=ffffff>wurde folgende memo erfolgreich hinterlassen: $memo_msg</font></font>");
+ &zeit;
+ &write_file("data/user/memos/$alias2memo");
+ print DATEI "<font size=2 color=ffffff>(<font color=red>$day.$month. - $hours:$min:$sec</font>) $alias hat Dir eine Memo hinterlassen: <font color=ffa500>$memo_msg</font></font><br>";
+ close DATEI;
+ &reload_html($whisper);
+ exit;
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2memo <font color=ffffff>existiert in der Datenbank nicht !</font></font>");
+ &reload_html($whisper);
+ exit;
+#############>- FLÜSTERN ( Auch mit '/' ) -<
+ } elsif ($cmd eq "msg" || $cmd eq "") {
+ my ($alias2post,$msg2post) = ($cmd[1],"");
+ if ($cmd eq "msg") {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ $action = "whisper";
+ } else {
+ $alias2post = $whisper;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ }
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ if ($_ eq $alias2post) {
+ &write_file("data/msgs/$alias2post");
+ print DATEI "<i><font color=$col>$alias flüstert <font color=ffffff>=></font><font color=$secol>$msg2post</font></font></i><br>\n";
+ close DATEI;
+ &write_file("data/msgs/$alias");
+ print DATEI "<i><font color=$col>Zu $alias2post geflüstert <font color=ffffff>=></font><font color=$secol>$msg2post</font></font></i><br>\n";
+ close DATEI;
+ &reload_html($alias2post,$action);
+ exit;
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2post <font color=ffffff>ist momentan nicht anwesend !</font></font>");
+#############>- TOTALONLINEZEIT VON ALIAS ANZEIGEN -<
+ } elsif ($cmd eq "online") {
+ my $alias2prove= $cmd[1];
+ if (-f "data/user/counts/$alias2prove.online") {
+ &read_file("data/user/counts/$alias2prove.online");
+ my $online = <DATEI>;
+ close DATEI;
+ my $totaltime = sprintf("%.2f",($online / 60));
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff> war insgesamt schon $totaltime Minuten online !</font></font>");
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff>hat z.Z. keine Statistiken !</font></font>");
+ }
+ &reload_html($whisper);
+ exit;
+#############>- DAS SYSTEM VERLASSEN -<
+ } elsif ($cmd eq "q") {
+ &reload_html($whisper,"quit");
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias verläßt den Chat ... </font></i>");
+ sleep 2;
+ &rm_alias($alias,$room);
+ exit;
+#############>- DAS EIGENE GÄSTEBUCH LÖSCHEN -<
+ } elsif ($cmd eq "rmgb") {
+ unlink("data/user/gbooks/$alias");
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias löscht sein gesamtes Gästebuch ...</font></i>",$_);
+ &reload_html($whisper);
+ exit;
+#############>- SCHREIEN -<
+ } elsif ($cmd eq "s") {
+ my ($msg2scream,$msg2post);
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2scream = $msg2scream." ".$cmd[$i];
+ }
+ $msg2post = "\U$msg2scream";
+ &post($room,"<font color=$col><i>$alias schreit:</i> <b><font color=$secol>".$msg2post."</font></font></b>");
+ &reload_html($whisper);
+ exit;
+#############>- SEHEN, WANN SICH ALIAS ZUM LETZTEN MAL EINGELOGT HAT -<
+ } elsif ($cmd eq "seen") {
+ my $alias2prove = $cmd[1];
+ &list_dir("data/user/options");
+ foreach(@dir) {
+ if (-f "data/user/lastlogin/$alias2prove") {
+ &read_file("data/user/lastlogin/$alias2prove");
+ my $lastlogin = <DATEI>;
+ close DATEI;
+ my $timestamp = sprintf("%.2f",((time() - $lastlogin) / 3600));;
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff> hat sich vor $timestamp Stunden zuletzt in das System eingelogt !</font></font>");
+ &reload_html($whisper);
+ exit;
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff> hat z.Z. keine Statistiken !</font></font>");
+ &reload_html($whisper);
+ exit;
+#############>- ANZEIGEN WER SICH IM AKTUELLEN RAUM BEFINDET -<
+ } elsif ($cmd eq "w") {
+ &list_dir("data/online/rooms/$room");
+ &read_file("data/online/rstat/$room");
+ my @r_stat = <DATEI>;
+ close DATEI;
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($r_stat[0] eq "1\n");
+ my ($is,$nr) = ("t",0);
+ foreach(@dir) {
+ if (-f "data/online/rooms/$room/$_") {
+ $personen = $personen." ".$_;
+ $nr++;
+ }
+ }
+ &post_prv($alias,"<font size=2 color=ffffff>$room $door ($nr) [".$r_stat[1]."] : <font color=ffa500>$personen</font></font>");
+ &reload_html($whisper);
+ exit;
+ #############>- ANZEIGEN WER SICH IM SYSTEM BEFINDET -<
+ } elsif ($cmd eq "wc" || $cmd eq "wc/") {
+ $raum = $cmd[1];
+ if ($raum eq "" && $cmd eq "wc") {
+ &list_dir("data/online/users");
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/users/$_");
+ }
+ my $nr = ($#dir-1);
+ my ($nrs,$is) = ("","ist");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "sind";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>$nr Person$nrs $is insgesamt eingelogt: <font color=ffa500>$personen</font></font>");
+ } elsif ($raum eq "" && $cmd eq "wc/") {
+ my $msg2post;
+ &list_dir("data/online/rooms");
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ &list_dir("data/online/rooms/$_",2);
+ &read_file("data/online/rstat/$_");
+ my @rstat = <DATEI>;
+ close DATEI;
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ my $nr = $#dir2-1;
+ $msg2post = $msg2post."<tr><td><b><font size=2 color=ffffff>$_ $door ($nr) [".$rstat[1]."] </font></b></td><td><font size=2 color=ffffff>";
+ foreach $chatter (@dir2) {
+ if (-f "data/online/rooms/$_/$chatter") {
+ $msg2post = $msg2post."$chatter ";
+ }
+ }
+ print "</font></td>";
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>Folgende Räume sind offen:</font><table>$msg2post</table>");
+ } elsif ($raum ne "") {
+ my $personen;
+ &list_dir("data/online/rooms/$raum");
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/rooms/$raum/$_");
+ }
+ my ($nr,$is) = (($#dir-1),"t");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "n";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff> $nr Person$nrs befinde$is sich im Raum \"$raum\": <font color=ffa500>$personen</font></font>");
+ }
+ &reload_html($whisper);
+ exit;
+#############>- ANZEIGEN IN WELCHEN RAUM SICH JMD. BEFINDET BZW. JMD IN EINEN RAUM FOLGEN -<
+ } elsif ($cmd eq "wj" || $cmd eq "ju") {
+ my $alias2search = $cmd[1];
+ &list_dir("data/online/rooms");
+ foreach $raum (@dir) {
+ &list_dir("data/online/rooms/$raum",2) if (-d "data/online/rooms/$raum");
+ foreach $user (@dir2) {
+ if (-f "data/online/rooms/$raum/$user") {
+ if ($user eq $alias2search) {
+ if ($cmd eq "wj") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2search <font color=ffffff>befindet sich im Raum \"$raum\" !</font></font>");
+ } else {
+ &change_room("ju",$raum,$room,$alias2search);
+ }
+ &reload_html($whisper,"change_room");
+ exit;
+ }
+ }
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2search <font color=ffffff> ist nicht eingelogt !</font></font>");
+ &reload_html($whisper);
+ exit;
+#############>- RAUMNESETZER BEFEHLE ( Alphabetisch sortiert ) -<
+
+
+
+
+#############>- RAUM ABSCHLIESSEN/AUFSCHLIESSEN -<
+ } elsif ($cmd eq "l") {
+ &prove_besetzer($alias,$room);
+ &hirachie($alias);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ my $lock = "0\n";
+ &zeit;
+ if ($room eq "Cyberbar") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum ohne Erfolg ab ...</font></i>");
+ } else {
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum ab ...</font></i>");
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum auf ...</font></i>");
+ }
+ for ($i=1;$i<=$#r_stat;$i++) {
+ $lock = $lock.$r_stat[$i];
+ }
+ write_file_new("data/online/rstat/$room");
+ print DATEI $lock;
+ close DATEI;
+ }
+ }
+ &reload_html($whisper);
+ exit;
+#############>- RAUMBESETZER ERNENNEN -<
+ } elsif ($cmd eq "su") {
+ &prove_besetzer($alias,$room);
+ &hirachie($alias);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ my $alias2su = $cmd[1];
+ &list_dir("data/online/rooms/$room");
+ foreach(@dir) {
+ if ($_ eq $alias2su) {
+ &read_file("data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ &hirachie($alias2su);
+ &prove_besetzer($alias2su,$room);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ &reload_html($whisper);
+ &post_prv($alias,"<font color=ffa500>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist bereits RB, WÄ oder OW)</font>");
+ exit;
+ }
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias ernennt \"$alias2su\" zum Raumbesetzer ...</font></i>");
+ &write_file("data/online/rstat/$room");
+ print DATEI $alias2su."\n";
+ close DATEI;
+ &reload_html($whisper);
+ exit;
+ }
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist nicht anwesend)</font>");
+ }
+ &reload_html($whisper);
+ exit;
+#############>- RAUMBESETZER ENTNENNEN -<
+ } elsif ($cmd eq "rsu") {
+ &prove_besetzer($alias,$room);
+ &hirachie($alias);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ my $alias2rsu = $cmd[1];
+ &read_file("data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ &prove_besetzer($alias2rsu,$room);
+ if ($r_besetzer eq "true") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias entzieht \"$alias2rsu\" die Raumbesetzerrechte ...</font></i>");
+ my $newrstat = $rstat[0].$rstat[1];
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $newrstat = $newrstat.$r_stat[$i] if ($r_stat[$i] ne $alias2rsu."\n");
+ }
+ &write_file_new("data/online/rstat/$room");
+ print DATEI $newrstat;
+ close DATEI;
+ } else {
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2rsu <font color=ffffff>ist kein Raumbesetzer und kann dieser Status auch nicht aberkannt werden !</font></font>");
+ }
+ }
+ &reload_html($whisper);
+ exit;
+#############>- RAUM EIN THEMA GEBEN -<
+ } elsif ($cmd eq "t") {
+ &prove_besetzer($alias,$room);
+ &hirachie($alias);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ my $theme;
+ &zeit;
+ if ($cmd[1] ne undef) {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $theme = $theme." ".$cmd[$i];
+ }
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias gibt dem Raum das Thema <font color=red>( $theme )</font> ...</font></i>");
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias löscht das Thema des Raums ...</font></i>");
+ }
+ $theme = $r_stat[0].$theme."\n";
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $theme = $theme.$r_stat[$i];
+ }
+ write_file_new("data/online/rstat/$room");
+ print DATEI $theme;
+ close DATEI;
+ }
+ &reload_html($whisper);
+ exit;
+#############>- SUPERUSER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- ALIAS VERBANNEN BZW. ENTBANNEN -<
+ } elsif ($cmd eq "ban" || $cmd eq "rban") {
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ my ($alias2handle,$registriert) = $cmd[1];
+ &list_dir("data/user/options");
+ foreach(@dir) {
+ $registriert = "true" if ($_ eq $alias2handle);
+ }
+ if ($registriert ne "true") {
+ if ($cmd eq "ban") {
+ if ($alias2handle ne "") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> existiert nicht in der Benutzerdatenbank und kann so nich verbannt werden !</font></font>");
+ } else {
+ &read_file("data/ban");
+ my @banned = <DATEI>;
+ my ($benutzer);
+ my $nr = $#banned+1;
+ close DATEI;
+ foreach(@banned) {
+ $benutzer = $benutzer." ".$_;
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>Folgende Benutzer sind verbannt [$nr]: <font color=ffa500>$benutzer</font></font>");
+ }
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> existiert nicht in der Benutzerdatenbank und kann so nicht \"entbannt\" werden !</font></font>");
+ }
+ &reload_html($whisper);
+ exit;
+ }
+ &read_file("data/ban");
+ my @banlist = <DATEI>;
+ close DATEI;
+ foreach(@banlist) {
+ if ($_ eq "$alias2handle\n") {
+ if ($cmd eq "ban") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> ist bereits verbannt worden !</font></font>");
+ } else {
+ my $banned = "false";
+ foreach(@banlist) {
+ $banned = "true" if ($_ eq "$alias2handle\n");
+ }
+ if ($banned eq "true") {
+ my @newbanlist;
+ foreach(@banlist) {
+ push @newbanlist,$_ if ($_ ne "$alias2handle\n");
+ }
+ &write_file_new("data/ban");
+ print DATEI @newbanlist;
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> wurde soeben \"entbannt\" !</font></font>");
+ }
+ }
+ &reload_html($whisper);
+ exit;
+ }
+ }
+ if ($cmd eq "ban") {
+ &hirachie($alias2handle);
+ if ($hirachie ne "ow" || $hirachie eq "wa") {
+ &write_file("data/ban");
+ print DATEI "$alias2handle\n";
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> wurde soeben verbannt und kann sich nun nichtmehr in den Chat einloggen !</font></font>");
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> ist ein Oberwächter und kann deshalb nicht verbannt werden !</font></font>");
+ }
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2handle <font color=ffffff> konnte nicht \"entbannt\" werden, da <font color=ffa500>$alias2handle</font> garnicht verbannt war !</font></font>");
+ }
+ }
+ &reload_html($whisper);
+ exit;
+#############>- IP # VON ALIAS ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "ip") {
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ my $alias2prove = $cmd[1];
+ &list_dir("data/online/ident");
+ foreach(@dir) {
+ if ($_ eq $alias2prove) {
+ &read_file("data/online/ident/$_");
+ local $ipnr = <DATEI>;
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$_ <font color=ffffff>hat die IP-Nummer $ipnr !</font></font>");
+ }
+ }
+ }
+ &reload_html($whisper);
+ exit;
+#############>- ALIAS AUS DEM CHAT KATAPULTIEREN -<
+ } elsif ($cmd eq "k") {
+ &hirachie($alias);
+ if ($hirachie eq "wa" || $hirachie eq "ow") {
+ my $alias2kick = $cmd[1];
+ &list_dir("data/online/rooms");
+ foreach $raum (@dir) {
+ &list_dir("data/online/rooms/$raum",2);
+ foreach $chatter (@dir2) {
+ if ($chatter eq $alias2kick) {
+ &hirachie($alias2kick);
+ if ($hirachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist Oberwächter und kann nicht \"gekickt\" werden !</font></font>");
+ } elsif ($hirachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist Wächter und kann nicht \"gekickt\" werden !</font></font>");
+ } else {
+ &post_prv("$alias2kick","<script language=\"JavaScript\">window.open(\"index.pl?tmp=kick\",\"_top\");</script>");
+ &zeit;
+ $_ = undef if ($room eq $raum);
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias katapultiert \"$alias2kick\" aus dem Chat ...</font></i>",$raum);
+ &rm_alias($alias2kick,$raum);
+ &check_online;
+ }
+ &reload_html($whisper);
+ exit;
+ }
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist nicht anwesend und kann nicht \"gekickt\" werden !</font></font>");
+ }
+ &reload_html($whisper);
+ exit;
+#############>- EINEN BENUTZER AUS DEM SYSTEM LÖSCHEN -<
+ } elsif ($cmd eq "kill") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ my $alias2kill = $cmd[1];
+ &hirachie($alias2kill);
+ if ($hirachie eq "ow") {
+ &post_prv($alias,"<font size color=ffa500>$alias2kill</font> <font color=ffffff>ist Oberwächter und kann nicht aus dem System entfernt werden !</font>");
+ } elsif ($hirachie eq "wa") {
+ &post_prv($alias,"<font size color=ffa500>$alias2kill</font> <font color=ffffff>ist Wächter und kann nicht aus dem System entfernt werden !</font>");
+ } else {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias killt \"$alias2kill\" ganz und gar aus dem System ...</font></i>");
+ unlink("data/user/options/$alias2kill");
+ unlink("data/user/profiles/$alias2kill");
+ unlink("data/user/gbooks/$alias2kill");
+ unlink("data/user/counts/$alias2kill");
+ unlink("data/user/counts/$alias2kill.online");
+ unlink("data/user/lastlogin/$alias2kill");
+ unlink("data/user/memos/$alias2kill");
+ }
+ }
+ &reload_html($whisper);
+ exit;
+ #############>- SYSTEMNACHRICHT IN ALLE BESTEHENDEN RÄUME POSTEN -<
+ } elsif ($cmd eq "sys") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $sys_msg = $sys_msg." ".$cmd[$i];
+ }
+ &zeit;
+ &post_all("<i><font color=ffffff>($hours:$min:$sec)</font></i> <b><font size=2 color=red>SYSTEMNACHRICHT</font></b><i><font color=ffffff>: $sys_msg ...</font></i>");
+ }
+ &reload_html($whisper);
+ exit;
+#############>- ALIAS ZUM WÄCHTER ERNNENNEN -<
+ } elsif ($cmd eq "wa") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ my $alias2wa = $cmd[1];
+ &hirachie($alias2wa);
+ if ($hirachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2wa <font color=ffffff>ist bereits als Wächter eingetragen. Eine erneuerte Eintragung ist nicht möglich!</font></font>");
+ &reload_html($whisper);
+ exit;
+ } elsif ($hirachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2wa <font color=ffffff>ist bereits als Oberwächter eingetragen. Oberwächter können nicht gleichzeitig Wächter sein!</font></font>");
+ &reload_html($whisper);
+ exit;
+ }
+ if (-f "data/user/options/$alias2wa") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font><font color=ffa500> $alias ernennt \"$alias2wa\" zum Wächter ...</font></i>");
+ open(WA,">>data/wa");
+ print WA $alias2wa."\n";
+ close WA;
+ &reload_html($whisper);
+ exit;
+ }
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2wa <font color=ffffff>kann nicht zum Wächter ernannt werden da Benutzername nicht existiert!</font></font>");
+ &reload_html($whisper);
+ exit;
+ }
+#############>- ALIAS DIE WÄCHTERRECHTE ENTZIEHEN -<
+ } elsif ($cmd eq "rwa") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ my $alias2rwa = $cmd[1];
+ &hirachie($alias2rwa);
+ if ($hirachie eq "wa") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat \"$alias2rwa\" vom Wächter zum normalen Chatter degradiert ...</font></i>");
+ open(WA,"<data/wa");
+ @wa = <WA>;
+ close WA;
+ my @wa2;
+ foreach $wa (@wa) {
+ push(@wa2,$wa) if ($wa ne $alias2rwa."\n");
+ }
+ open(WA,">data/wa");
+ print WA @wa2;
+ close WA;
+ } else {
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2rwa <font color=ffffff>ist kein Wächter und können die Wächterrechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html($whisper);
+ exit;
+ }
+#############>- ADMINISTRATORBEFEHLE -<
+#############>- ALIAS ZUM OBERWÄCHTER ERNENNEN -<
+ } elsif ($cmd eq "ow" && $alias eq "Snooper") {
+ my $alias2ow = $cmd[1];
+ &hirachie($alias2ow);
+ if ($hirachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2ow <font color=ffffff>ist bereits als Wächter eingetragen. Wächter können nicht gleichzeitig Oberwächter sein!</font></font>");
+ &reload_html($whisper);
+ exit;
+ } elsif ($hirachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2ow <font color=ffffff>ist bereits als Oberwächter eingetragen!</font></font>");
+ &reload_html($whisper);
+ exit;
+ }
+ if (-f "data/user/options/$alias2ow") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font><font color=ffa500> $alias ernennt \"$alias2ow\" zum Oberwächter ...</font></i>");
+ open(OW,">>data/ow");
+ print OW $alias2ow."\n";
+ close OW;
+ &reload_html($whisper);
+ exit;
+ }
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2ow <font color=ffffff>kann nicht zum Oberwächter ernannt werden da Benutzername nicht existiert!</font></font>");
+ &reload_html($whisper);
+ exit;
+#############>- ALIAS DIE OBERWÄCHTERRECHTE ENTZIEHEN -<
+ } elsif ($cmd eq "row" && $alias eq "Snooper") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ my $alias2row = $cmd[1];
+ &hirachie($alias2row);
+ if ($hirachie eq "ow") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat \"$alias2row\" vom Oberwächter zum normalen Chatter degradiert ...</font></i>");
+ open(OW,"<data/ow");
+ @ow = <OW>;
+ close OW;
+ my @ow2;
+ foreach $ow (@ow) {
+ push(@ow2,$ow) if ($ow ne $alias2row."\n");
+ }
+ open(OW,">data/ow");
+ print OW @ow2;
+ close OW;
+ } else {
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2row <font color=ffffff>ist kein Oberwächter und können die Wächterrechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html($whisper);
+ exit;
+ }
+#############>- PASSWORD EINES BENUTZERS ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "pw" && $alias eq "Snooper") {
+ my $pw2show = $cmd[1];
+ if (-f "data/user/options/$pw2show") {
+ open(PW,"<data/user/options/$pw2show");
+ @pw = <PW>;
+ close PW;
+ &post_prv($alias,"<font size=2 color=ffa500>$pw2show <font color=ffffff> hat das Passwort \"".$pw[0]."\" !</font></font>");
+ &reload_html($whisper);
+ exit;
+ }
+ &post_prv($alias,"<font size=2 color=ffa500>$pw2show <font color=ffffff> existiert nicht in der Benutzerdatenbank !</font></font>");
+ &reload_html($whisper);
+ exit;
+#############>- SYSTEMMELDUNG POSTEN -<
+ } elsif ($cmd eq "cool" && $alias eq "Snooper") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$msg2post</font></i>");
+ &reload_html($whisper);
+ exit;
+#############>- ENDE DER CHATBEFEHLE -<
+}
+&reload_html($whisper,$action);
+}
+
+sub change_room { # Den Chat-Raum wechseln
+ my ($method,$newroom,$oldroom,$alias2follow) = @_;
+ open(RSTAT, "<data/online/rstat/$newroom"); #Überprüfen, ob Alias Raum betreten darf
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ if ($rstat[0] eq "1\n") {
+ &hirachie($alias);
+ if ($hirachie eq "wa" || $hirachie eq "ow") { } else {
+ &post_prv("$alias","<font size=2 color=ffffff>Der Raum \"<font color=ffa500>$newroom</font>\" ist leider abgesperrt!</font>");
+ &reload_html($whisper,$action);
+ exit;
+ }
+ }
+ $room = $oldroom;
+ &zeit;
+ if ($method eq "j") {
+ unlink("data/online/rooms/$oldroom/$alias");
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias wechselt in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias kommt aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ &post_prv("$alias","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>Du wechselst aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ } elsif ($method eq "ju") {
+ unlink("data/online/rooms/$oldroom/$alias");
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias folgt \"$alias2follow\" in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias kommt aus dem Raum \"$oldroom\" und folgt \"$alias2follow\" herein nach \"$newroom\" ...</font></i>");
+ &post_prv("$alias","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>Du folgst \"$alias2follow\" aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ }
+ unlink("data/online/rooms/$oldroom/$alias");
+ &rm_rstat($alias,$oldroom);
+ &check_online;
+}
+
+sub prove_besetzer { # Prüfen, ob Benutzer Raumbesetzerrechte hat
+ my ($r_alias,$r_room) = @_;
+ $r_besetzer = "false";
+ &read_file("data/online/rstat/$r_room");
+ @r_stat = <DATEI>;
+ close DATEI;
+ for($i=2;$i<=$#r_stat;$i++) {
+ $r_besetzer = "true" if ($r_stat[$i] eq $r_alias || $r_stat[$i] eq $r_alias."\n");
+ }
+} \ No newline at end of file
diff --git a/0.4.3a/main2.pl b/0.4.3a/main2.pl
new file mode 100644
index 0000000..6b4ffb4
--- /dev/null
+++ b/0.4.3a/main2.pl
@@ -0,0 +1,601 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+
+$var = $q->param("var");
+if ($var eq "list_alias_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &list_alias_html;
+} elsif ($var eq "alias_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $tmp = $q->param("tmp");
+ &alias_html;
+} elsif ($var eq "edit_profile_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ &edit_html("edit_profile_html");
+} elsif ($var eq "edit_options_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ &edit_html("edit_options_html");
+} elsif ($var eq "gb_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &gb_html;
+} elsif ($var eq "post_gb") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $msg = $q->param("msg");
+ $tmp = $q->param("tmp");
+ $id = $q->param("id");
+ &post_gb;
+} elsif ($var eq "edit_profile") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ &secure_checkid($alias);
+ &edit("edit_profile");
+} elsif ($var eq "edit_options") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $tmp = $q->param("tmp");
+ $id = $q->param("id");
+ $room = $q->param("room");
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ &edit("edit_options");
+} elsif ($var eq "rm_gb_alias") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $tmp = $q->param("tmp");
+ $id = $q->param("id");
+ &rm_gb;
+} else {
+ &error("Parameter fehlt");
+}
+
+###########################
+##HAUPTTEIL DIESER DATEI:##
+###########################
+
+sub gb_html { # Das Benutzerboard/Gästebuch.
+ my $message = $_[0];
+ &start_html("Benutzerboard");
+if ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </i>
+ einen Text und poste
+ <u>dann</u>
+ !
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Vielen Dank für Deinen Beitrag. Wenn Du willst, kannst Du jetzt gleich noch einen Eintrag posten ...
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Falls Du Anregungen oder Verbesserungsvorschläge für die Community hast, dann poste doch einen kleinen Eintrag :-)
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="guestbook">
+ <input type="hidden" name="id" value="y">
+ <input size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+ if (-e "data/guestbook") {
+ open (DATEI,"<data/guestbook") || &error("Konnte dat/guestbook nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ print
+ $q->div(@datei);
+ }
+ print
+ $q->end_html;
+}
+
+
+sub post_gb { # Wenn etwas in ein Gästebuch eingetragen wird
+ &zeit;
+ if ($msg eq "") {
+ if ($id eq "y") { # Überprüfen, ob Benutzerboard- oder Privatgästebuch
+ &gb_html("post_empty");
+ } else {
+ &alias_html("post_empty");
+ }
+ exit;
+ }
+ $msg =~ s#<#&lt\;#g;
+ my $tmpath = "";
+ if ($id eq "y") {
+ $tmpath = "data/guestbook";
+ } else {
+ $tmpath = "data/user/gbooks/$tmp";
+ }
+ if (-e "$tmpath") {
+ &read_file("$tmpath");
+ my @datei = <DATEI>;
+ close DATEI;
+ pop(@datei) if ($#datei > 99);
+ my @newdatei = "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ @newdatei = ("@newdatei", "@datei");
+ &write_file_new("$tmpath");
+ print DATEI @newdatei;
+ close DATEI;
+ } else {
+ &write_file_new("$tmpath");
+ print DATEI "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ close DATEI;
+ }
+ if ($id eq "y") {
+ &gb_html("post_ok");
+ exit;
+ } else {
+ post_prv("$tmp","<font size=2 color=ffffff><a href=\"main2.pl?alias=$alias&var=alias_html&tmp=$tmp&tmpid=$tmpid\" target=\"_new\">$alias</a> hat soeben einen Pin in <a href=\"main2.pl?alias=$alias&var=alias_html&tmp=$tmp&tmpid=$tmpid\" target=\"_new\">Dein Profil</a> gehängt ... </font>");
+ &alias_html;
+ exit;
+ }
+}
+
+sub rm_gb { # Gästebucheintrag entfernen
+ &read_file("data/user/gbooks/$alias");
+ my @gbfile = <DATEI>;
+ close DATEI;
+ my @newgbfile = ();
+ for($i=0; $i <= $#gbfile; $i++) {
+ push(@newgbfile,$gbfile[$i]) if ($i != $id);
+ }
+ &write_file_new("data/user/gbooks/$alias");
+ print DATEI @newgbfile;
+ close DATEI;
+ &alias_html("rm_ok");
+}
+
+sub list_alias_html { # Liste aller Benutzer
+ &start_html("Alle Benutzer");
+ &list_dir("data/user/options");
+ my @liste = sort(@dir);
+ my $nr = $#dir-1;
+print <<END;
+ <div>
+ Es sind z.Z. genau $nr Benutzernamen in der Datenbank vorhanden! (Sortiert nach #, A-Z, a-z)
+ </div>
+ <hr>
+ <div>
+END
+ foreach(@liste) {
+ if (-f "data/user/options/$_") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid" },
+ "$_"),
+ " ";
+ }
+ }
+print <<END;
+ </div>
+</body>
+</html>
+END
+}
+
+sub alias_html { # Anzeigen eines Benutzerprofils
+ my $message = $_[0];
+ local $counter = undef;
+ &read_file("data/user/counts/$tmp");
+ $counter = <DATEI>;
+ close DATEI;
+ $counter++;
+ &write_file_new("data/user/counts/$tmp");
+ print DATEI $counter."\n".$counter[1];
+ close DATEI;
+ &start_html($tmp);
+print <<END;
+<div>
+ <a href="htdocs.pl?var=werda_html&alias=$alias&tmpid=$tmpid">Hier</a>
+ gehts zur Gesamtübersicht !
+</div>
+<hr>
+END
+if ($message eq "rm_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Der von Dir gewählte Eintrag wurde erfolgreich gelöscht.
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </u>
+ einen Text und poste
+ <u>dann</u>
+ !
+ <hr>
+END
+}
+ &read_file("data/user/profiles/$tmp");
+ @data = <DATEI>;
+ close DATEI;
+print <<END;
+ <div>
+ Dieses Profil wurde insgesamt schon $counter mal aufgerufen !
+ <br>
+ <br>
+ Alias: $tmp
+ <br>
+ <br>
+ Nachname: $data[0]
+ <br>
+ <br>
+ Vorname: $data[1]
+ <br>
+ <br>
+ Alter: $data[2]
+ <br>
+ <br>
+ Wohnort: $data[3]
+ <br>
+ <br>
+ E-Mail:
+ <a href="mailto:$data[4]">$data[4]</a>
+ <br>
+ <br>
+ ICQ-Nummer: $data[5]
+ <br>
+ <br>
+ Homepage:
+ <a href="$data[6]" target="_new">$data[6]</a>
+ <br>
+ <br>
+ Weiteres:
+ <br>
+ $data[7]
+ <hr>
+ Hier kannst Du $tmp eine Nachricht hinterlassen!
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input type="text" size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+if (-e "data/user/gbooks/$tmp") {
+ open (DATEI,"<data/user/gbooks/$tmp") || &error("Konnte data/user/gbooks/$tmp nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ if ($alias ne $tmp) {
+ print @datei;
+ } else {
+print <<END;
+ <table>
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="rm_gb_alias">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="$tmp">
+END
+for($i=0; $i <= $#datei; $i++) {
+print <<END;
+ <tr>
+ <td>
+ <input type="radio" name="id" value="$i">
+ </td>
+ <td>
+ <div class=q>
+ $datei[$i]
+ </div>
+ </td>
+ </tr>
+END
+}
+print <<END;
+ </table>
+ <table>
+ <tr>
+ <td>
+ <font color=ffffff>
+ <input type="submit" value="Makierten Eintrag löschen">
+ </font>
+ </td>
+ <td>
+ <font color=ffffff>
+ <input type="reset" value="Makierung rückgängig machen">
+ </font>
+ </td>
+ </tr>
+ </table>
+ </form>
+END
+}
+}
+ print
+ $q->end_html;
+}
+
+sub edit_html { # Chat-Optionen / Benutzerprofil editieren
+ my ($method,$message) = @_;
+ &start_html("Benutzerprofil ändern");
+ if ($method eq "edit_options_html") {
+ &read_file("data/user/options/$alias");
+ } elsif ($method eq "edit_profile_html") {
+ &read_file("data/user/profiles/$alias");
+ }
+ @data = <DATEI>;
+ close DATEI;
+ if ($method eq "edit_options_html") {
+ chomp($data[0]);
+ if ($message eq "edit_options_ok") {
+print <<END;
+<script language="JavaScript">
+ open("main.pl?var=input_html&alias=$alias&room=$room&col=$col&secol=$secol&tmpid=$tmpid","input");
+ open("htdocs.pl?var=menu_html&alias=$alias&room=$room&col=$col&secol=$secol&tmpid=$tmpid","menu");
+</script>
+<div class=b>
+ Hinweis:
+</div>
+<div>
+ Du hast soeben Deine Chat-Optionen erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren. Um
+ weiterzuchatten einfach Fenster schliessen!
+</div>
+<hr>
+END
+ } elsif ($message eq "edit_pw_wrong") {
+print <<END;
+<div class=b>
+ ACHTUNG!
+</div>
+<div>
+ Du hast soeben versucht, dein Passwort zu ändern. Jedoch stimmte die Erste Eingabe nicht mit der Zweiten überein.
+ Bitte versuch es erneuert ...
+</div>
+<hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Deine Chat-Optionen editieren!" ),
+ $q->hr;
+ }
+print <<END;
+<script lang="javascript" type="text/javascript">
+<!--
+
+function radioWert(rObj) {
+ for (var i=0; i<rObj.length; i++) if (rObj[i].checked) return rObj[i].value;
+ return false;
+}
+
+function insertcode( code ) {
+ document.optionen.elements[radioWert(document.optionen.eingabe)].value = code;
+}
+
+//-->
+</script>
+
+<form name="optionen" action="main2.pl">
+ <input type="hidden" name="var" value="edit_options">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Passwort
+ <font color=ffa500>
+ (Gut merken !!)
+ </font>
+ <br>
+ <input type="password" name="id" value="$data[0]">
+ </div>
+ </td>
+ <td width=20>
+ </td>
+ <td>
+ <div>
+ Geb hier das Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp" value="$data[0]">
+ </div>
+ </td>
+ </tr>
+ </table>
+<br>
+<br>
+ <table>
+ <tr>
+ <td>
+ <div>
+ <input type="radio" name="eingabe" value="col" checked>
+ Auswahl von Farbe 1
+ <br>
+ (Farbe Deines Nicks):
+ <br>
+ <input name="col" size="6" maxlength="6" value="$data[1]">
+ </div>
+ </td>
+ <td width=20>
+ </td>
+ <td>
+ <div>
+ <input type="radio" name="eingabe" value="secol">
+ Auswahl von Farbe 2
+ <br>
+ (Farbe Deiner Nachrichten):
+ <br>
+ <input name="secol" size="6" maxlength="6" value="$data[2]">
+ </div>
+ </td>
+ </tr>
+ </table>
+<br>
+ <div>
+ Beliebige Auswahl makieren und Farbe wählen. Um Deine Optionen abzuspeichern,
+ auf "Daten ändern" klicken!
+ </div>
+ <br>
+END
+ &read_file("colors.sno");
+ @colors = <DATEI>;
+ close DATEI;
+ print @colors;
+ } elsif ($method eq "edit_profile_html") {
+ if ($message eq "edit_profile_ok") {
+print <<END;
+ <div class=b>
+ Hinweis:
+ </div>
+ <div>
+ Du hast soeben Dein Profil erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren:
+ <hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Dein Profil editieren!" ),
+ $q->hr;
+ }
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="edit_profile">
+ <div>
+ Dein Nachname:
+ <br>
+ <input name="nachname" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ Dein Vorname:
+ <br>
+ <input name="vorname" value="$data[1]">
+ </div>
+ <br>
+ <div>
+ Dein Alter:
+ <br>
+ <input name="alter" value="$data[2]">
+ </div>
+ <br>
+ <div>
+ Dein Wohnort:
+ <br>
+ <input name="wohnort" value="$data[3]">
+ </div>
+ <br>
+ <div>
+ Deine E-Mail Adresse:
+ <br>
+ <input name="email" value="$data[4]">
+ </div>
+ <br>
+ <div>
+ Deine ICQ-Nummer:
+ <br>
+ <input name="icq" value="$data[5]">
+ </div>
+ <br>
+ <div>
+ Deine Homepage:
+ <br>
+ <input name="homepage" value="$data[6]">
+ </div>
+ <br>
+ <div>
+ Weiteres:
+ <br>
+ <textarea rows="5" cols="40"name="weiteres" wrap="virtual">$data[7]</textarea>
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <font color=ffffff>
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="room" value="$room">
+ <input type="submit" value="Daten ändern ...">
+ </font>
+ </form>
+</body>
+</html>
+END
+}
+
+
+sub edit { # Benutzerprofil od. Chat-Optionen abspeichern
+ my $method = $_[0];
+ &zeit;
+ if ($method eq "edit_profile") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat sein Profil geändert ...</font></i>");
+ &write_file_new("data/user/profiles/$alias");
+ print DATEI $q->param('nachname')."\n".$q->param('vorname')."\n".$q->param('alter')."\n".$q->param('wohnort')."\n".$q->param('email')."\n".$q->param('icq')."\n".$q->param('homepage')."\n".$q->param('weiteres');
+ close DATEI;
+ &edit_html("edit_profile_html","edit_profile_ok");
+ } elsif ($method eq "edit_options") {
+ if ($id ne $tmp) {
+ &edit_html("edit_options_html","edit_pw_wrong");
+ exit;
+ }
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat seine Chateinstellungen geändert ...</font></i>");
+ &write_file_new("data/user/options/$alias");
+ print DATEI $id."\n".$col."\n".$secol;
+ close DATEI;
+ &edit_html("edit_options_html","edit_options_ok");
+ }
+}
diff --git a/0.4.3a/online.pl b/0.4.3a/online.pl
new file mode 100644
index 0000000..b77f845
--- /dev/null
+++ b/0.4.3a/online.pl
@@ -0,0 +1,71 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI; # CGI-Modul laden
+$q = new CGI;
+
+require config; # config.pm in Dokument laden
+
+print
+ $q->header(); # HTTP-Header erzeugen
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+$room = $q->param("room");
+
+&secure_checkid($alias);
+
+# Onlinezeit zählen !
+&read_file("data/online/users/$alias");
+ my $oldstamp = <DATEI>;
+close DATEI;
+ if ($oldstamp > (time - 60)) {
+ &read_file("data/user/counts/$alias.online");
+ my $online = <DATEI>;
+ close DATEI;
+ my $total = (time-$oldstamp+$online);
+ &write_file_new("data/user/counts/$alias.online");
+ print DATEI $total;
+ close DATEI;
+ }
+##### ENDE
+
+&start_html("Online","online");
+&online($alias,$room);
+&list_dir("data/online/rooms/".$room);
+print
+ $q->div( "$room:" ),
+ "<font size=1 color=ffffef face=arial>";
+ foreach $online (@dir) {
+ if (-f "data/online/rooms/$room/$online") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$online&tmpid=$tmpid",
+ -target=>"$online" }, "$online"), $q->br;
+ }
+ }
+print
+ "</font>",
+ $q->end_html;
+
+sub online { # Benutzer in die Onlineliste hinzufügen bzw. erneuern
+ my ($alias,$room) = @_;
+ &write_file_new("data/online/users/$alias");
+ print DATEI time;
+ close DATEI;
+ if (-f "data/online/rooms/$room") { } else { mkdir "data/online/rooms/$room", 0777; }
+ if (-f "data/online/rstat/$room") { } else {
+ &write_file_new("data/online/rstat/$room"); # Raumbesetzerstatus setzen
+ print DATEI "0\n\n$alias\n";
+ close DATEI;
+ }
+ &write_file_new("data/online/rooms/$room/$alias");
+ print DATEI time;
+ close DATEI;
+ &read_file("data/online/prove"); # Räume und Chatter auf Existenz überprüfen
+ my $provetime = <DATEI>;
+ close DATEI;
+ if ($provetime < (time - 30)) {
+ &check_online;
+ }
+} \ No newline at end of file
diff --git a/0.4.3a/ow b/0.4.3a/ow
new file mode 100644
index 0000000..806a90d
--- /dev/null
+++ b/0.4.3a/ow
@@ -0,0 +1,7 @@
+Snooper
+Truhe
+RocketKid
+Anklepper
+Peacemaker
+bilke
+Nilo
diff --git a/0.4.3a/push.pl b/0.4.3a/push.pl
new file mode 100644
index 0000000..5b037bf
--- /dev/null
+++ b/0.4.3a/push.pl
@@ -0,0 +1,99 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+CGI->compile(':all');
+$q = new CGI;
+
+$| = 1; # Cache von Perl ausschalten
+
+print
+ $q->header; # HTML-Header erzeugen
+
+require config;
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+&secure_checkid($alias);
+
+########################################
+##ANFANG DER ZU STREAMENDEN HTML-DATEI##
+########################################
+
+print <<END;
+<html>
+ <head>
+<script language="JavaScript">
+<!--
+// Scroll-Routine von Anklepper (http://www.anklepper.de)
+// speziell für yChat (http://www.yChat.de), Copyright 2000
+scrolling = true;
+moves_steps = 4; // Schrittgröße
+moves_interval = 4; // Schrittgeschwindigkeit
+
+function moves()
+{
+ if( scrolling != false )
+ window.scrollBy( 0, moves_steps );
+ window.setTimeout( "moves()", moves_interval );
+}
+
+moves();
+//-->
+</script>
+ </head>
+<body bgcolor=000000 link=FFFFFF alink=FFFFEF vlink=FFFFEF>
+END
+
+#############################
+##BEGRÜSSUNGSTEXT SCHREIBEN##
+#############################
+
+my $msgfile;
+
+ print
+ $q->font( { -size=>1,
+ -color=>"ffffff",
+ -face=>"arial"},
+ "$title - Created & Copyright by Paul C. Bütow $tmp\n");
+
+ if (-f "data/user/memos/$alias") { # Nach Memonachrichten checken!
+ print "\n<br>";
+ &read_file("data/user/memos/$alias");
+ my $memos = <DATEI>;
+ close DATEI;
+ print $memos;
+ unlink("data/user/memos/$alias");
+ }
+ my $msgfile = "data/msgs/$alias";
+ &write_file_new($msgfile);
+ print DATEI $q->br;
+ close DATEI;
+ print $q->br;
+ open (MSGFILE, $msgfile);
+
+###############################
+##ENDLOSSCHLEIFE FÜR DEN PUSH##
+###############################
+
+my ($times,$online) = (0,"false");
+for (;;) {
+ for ($curpos = tell(MSGFILE); <MSGFILE>; $curpos = tell(MSGFILE)) {
+ print $_ ;
+ }
+ $times++;
+ if ($times > 14) { # Nach 15 Sekunden
+ print "\n<!--PING//-->"; # Ping zum Browser senden
+ $times = 0; # Sekundenzahl auf 0 zurücksetzen
+ $online = "true" if (-e "data/online/users/$alias");
+ if ($online eq "false") {
+ print "<font size=2 color=red>Aus technischen Gründen bitte auf <a href=\"push.pl?alias=$alias&room=$room&var=clear_screen&tmpid=$tmpid\">Weiterchatten</a> klicken.</font>";
+ exit;
+ }
+ $online = "false"
+ }
+ sleep 1;
+ seek(MSGFILE, $curpos, 0); # Position wiederherstellen
+}
+
diff --git a/0.4.3a/setup.sh b/0.4.3a/setup.sh
new file mode 100644
index 0000000..1859d19
--- /dev/null
+++ b/0.4.3a/setup.sh
@@ -0,0 +1,45 @@
+#!/bin/sh
+echo
+echo yChat wird konfiguriert!
+echo
+mkdir data
+mkdir data/logs
+chmod 777 data/logs
+mkdir data/msgs
+chmod 777 data/msgs
+mkdir data/user
+chmod 777 data/user
+mkdir data/user/counts
+chmod 777 data/user/counts
+mkdir data/user/memos
+chmod 777 data/user/memos
+mkdir data/user/options
+chmod 777 data/user/options
+mkdir data/user/profiles
+chmod 777 data/user/profiles
+mkdir data/user/gbooks
+chmod 777 data/user/gbooks
+mkdir data/user/lastlogin
+chmod 777 data/user/lastlogin
+mkdir data/online
+chmod 777 data/online
+mkdir data/online/rooms
+chmod 777 data/online/rooms
+mkdir data/online/rstat
+chmod 777 data/online/rstat
+mkdir data/online/users
+chmod 777 data/online/users
+mkdir data/online/ident
+chmod 777 data/online/ident
+chmod 777 data/htdocs/*
+chmod 777 *.pl
+chmod 777 config.pm
+mkdir dokus/
+mv *.txt dokus/
+mkdir ../../htdocs/yChat/
+mv *.gif ../../htdocs/yChat/
+echo
+echo yChat Setup beendet ...
+echo Created and Copyright by Paul C. Bütow
+echo
+
diff --git a/0.4.3a/y.gif b/0.4.3a/y.gif
new file mode 100644
index 0000000..356175d
--- /dev/null
+++ b/0.4.3a/y.gif
Binary files differ
diff --git a/0.4.3a/y_.gif b/0.4.3a/y_.gif
new file mode 100644
index 0000000..f8b6ee5
--- /dev/null
+++ b/0.4.3a/y_.gif
Binary files differ
diff --git a/0.4.4a3/CREDITS.txt b/0.4.4a3/CREDITS.txt
new file mode 100644
index 0000000..2304a4c
--- /dev/null
+++ b/0.4.4a3/CREDITS.txt
@@ -0,0 +1,22 @@
+########################### yChat.de CREDITS ################################
+## Copyright by Paul C. Bütow 200 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+Vielen Dank an alle Personen, dir mit geholfen haben ( und immernoch helfen )
+yChat besser zu machen:
+
+ - Andreas Buchwald aka Anklepper, für die Programmierung des
+ "Nach-UntenScroll-JavaScripts", des "Ferlaufform-JavaScripts" im
+ Texteingabeframe und für die technische Umsetzung, daß sich das
+ Inputframe bei jedem Textposting nicht wieder reloadet.
+ Für ein nettes JavaScript, welches erlaubt, Formularwerte
+ frameübergreifend zu ändern.
+ ( www.anklepper.de ).
+
+ - Dave aka Truhe, für die Erstellung der Farbtabelle unter Chatoptionen inkl.
+ Auswähl-JavaScript!
+ ( maligree.yi.org )
+
+ - Larry Wall, für die Erfindung von Perl !
+
+ - Stefan Münz, für die Erstellung von SelfHTML !
diff --git a/0.4.4a3/README.txt b/0.4.4a3/README.txt
new file mode 100644
index 0000000..2e943ff
--- /dev/null
+++ b/0.4.4a3/README.txt
@@ -0,0 +1,36 @@
+############################## yChat.de README ##############################
+## Copyright by Paul C. Bütow 200 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+Allgemeine Bedingungen bezgl. yChat:
+
+ - Das yChat-System darf ohne Erleubnis des Autors nicht auf irgendeiner Art
+ und Weise weitergegeben- oder eingesetzt werden.
+
+ - Wird das yChat-System eingesetzt, so darf es manipuliert werden, soweit
+ die Copyright-Hinweise des Autors, die Versionsbezeichnung und der Link
+ auf der Startseite nach servers.yChat.de unverändert bleibt.
+ Ansonsten darf der gesamte Code manipuliert werden.
+
+ - Wird das yChat-System erlaubter Weise manipuliert, so muß das veränderte
+ Skript auf Anforderung an den Autor weitergegeben werden. Dieser darf
+ die Veränderungen in das Standard-yChat-System integrieren.
+
+ - Wird das yChat-System eingesetzt, su muß dem Autor die Location bzw. die
+ URL bekanntgegeben werden. Diese wird in servers.yChat.de eingetragen.
+ und mit einer URL wwX.yChat.de verlinkt. Wobei X für die Nummer des jew.
+ Servers steht.
+
+ - Es ist verboten, Sourcecode aus dem yChat-System zu kopieren und
+ für andere, nicht von yChat abhängige Perl-Programme einzusetzen.
+
+Im Flogenden einige yChat-bezügl. Verknüpfungen:
+
+ www.credits.yChat.de => Creditsliste
+ www.download.yChat.de => Das Skript zum downloaden
+ www.readme.yChat.de => Allgemeine Bedingungen usw.
+ www.servers.yChat.de => Liste aller laufenden yChat-Systeme
+ www.setup.yChat.de => Installationsdokumentation
+ www.todo.yChat.de => Funktionen, die später integriert werden
+ www.updates.yChat.de => Update-Liste
+ www.yChat.de => Das Skript im Einsatz
diff --git a/0.4.4a3/SETUP.txt b/0.4.4a3/SETUP.txt
new file mode 100644
index 0000000..e46056c
--- /dev/null
+++ b/0.4.4a3/SETUP.txt
@@ -0,0 +1,133 @@
+############################## yChat.de SETUP ###############################
+## Copyright by Paul C. Bütow 200 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+yChat findest Du im Internet unter der Adresse www.yChat.de. Bei Kritik,
+Anregungen oder Fragen bitte in das dort vorhandene Board posten oder eine
+E-Mail an die oben stehende Adresse senden. Ich bemühe mich, yChat so gut wie
+möglich zu machen und bin über Ratschläge immer sehr erfreut :-) ...
+
+Die Installation kann auf Unix-Systemen voll automatisch duchgeführt werden.
+Allerdings ist dafür ein Telnet-Zugang notwendig. Kopiere alle vorhandenen
+Dateien in das Verzeichnis cgi-bin/yChat und führe dann das Shellskript
+setup.sh mit dem Befehl ./setup.sh aus. Alle Verzeichnisse werden
+automatisch erstellt. Dies wurde allerdings nur auf SuSE Linux Systemen
+mit root-Zugriff getestet. Solltest Du ein anderes System verwenden oder
+den Chat auf einen virtuellen Webserver installieren wollen, dann mußt Du
+unter Umständen das Verzeichnis "../../htdocs/yChat" nach "../../yChat"
+in der setup.sh umbenennen. Ansonsten werden die dazugehörigen Grafikdateien
+falsch oder garnicht kopiert.
+
+Wenn Du keinen Telnet-Zugang hast, kannst Du hier die Verzeichnisse manuell
+einrichten:
+
+Folgende Basis-Dateien sind im Chat enthalten und müssen in das cgi-bin
+Verzeichnis kopiert werden. Z.B. nach ./cgi-bin/yChat/:
+
+config.pm => Configurationsdatei ("Shared subs")
+htdocs.pl => Generiert dynamische HTML-Inhalte
+index.pl => Startskript (Registrierung, Login, Chatframeset)
+input.pl => Skript für das Chateingabeframe
+main.pl => Hauptskript (Alle Hauptfunktionen des Chats)
+main2.pl => Skript für editieren der Benutzerdaten etc
+online.pl => Anzeige und Überprüfung der eingelogten Benutzer
+push.pl => Server-Push-Routine
+setup.sh => Dient zur automatischen Einrichtung des Chats
+README.txt => Beinhaltet wichtige Informationen
+UPDATES.txt => Updateliste der verschiedenen Versionen
+CREDITS.txt => Personen, die geolfen haben yChat zu proggen
+SETUP.txt => Dieses Dokument
+colors.sno => Datei beinhaltet alle Farben in hex. für die Chatoptionen
+help.sno => Datei beinhaltet alle Chatbefehle
+
+Folgende Verzeichnisse müssen erstellt werden (chmod 777 sollte
+funktionieren):
+
+- Hier befinden sich alle für den Chat notwenidgen Daten:
+ ./cgi-bin/yChat/data/*
+
+- Hier befinden sich alle Logdateien, die vom Chat erstellt werden:
+ ./cgi-bin/yChat/data/logs/*
+
+- Hier befinden sich die Message-Dateien der eingelogten Benutzer:
+ ./cgi-bin/yChat/data/msgs/*
+
+- Hier befinden sich alle Daten der registrierten Benutzer:
+ ./cgi-bin/yChat/data/user/*
+
+- Hier wird abgespeichert, wie oft ein Benutzerprofil insgesant schon
+ aufgerufen wurde und wie lange die Chatter schon online waren:
+ ./cgi-bin/yChat/data/user/counts/*
+
+- Hier werden alle Memos abgespeichert.
+ ./cgi-bin/yChat/data/user/memos/*
+
+- Hier befinden sich alle Chat-Optionen und Passwörter der registrierten
+ Benutzer:
+ ./cgi-bin/yChat/data/user/options/*
+
+- Hier befinden sich alle Benutzerprofile der Benutzer:
+ ./cgi-bin/yChat/data/user/profiles/*
+
+- Hier befinden sich alle Gästebucheinträge der Benutzer:
+ ./cgi-bin/yChat/data/user/gbooks/*
+
+- Hier wird abgespeichert, wann der der jew. benutzer zum letzten mal das
+ System betreten hat.
+ ./cgi-bin/yChat/data/user/lastlogin/*
+
+- Hier befinden sich alle Daten zu den aktuellen Chaträumen und User die
+ online sind
+ ./cgi-bin/yChat/data/online/*
+
+- Hier befinden sich alle offnenen Räume
+ ./cgi-bin/yChat/data/online/rooms/*
+
+- Hier befinden sich die Chatter, die sich in den jew. Räumen befinden. Die
+ Verzeichnisse der Räume werden automatisch erstellt.
+ ./cgi-bin/yChat/data/online/rooms/RAUMNAME/*
+
+- Hier befinden sich alle Chatter, die sich z.Z. im System befinden
+ ./cgi-bin/yChat/data/online/users/*
+
+- Hier befinden sich alle IP-Nummern und TempIDs der eingelogten Chatter
+ ./cgi-bin/yChat/data/online/ident/*
+
+Alle Grafikdateien (+.gif und *.jpg) sollten in ein nicht-CGI-BIN-Verzeichnis
+kopiert werden. Z.B. nach ./yChat/.
+
+Zum schluß sollte die config.pm-Datei nach wünschen editiert werden.
+Allerdings sollten die Copyright Hinweise und die Versionsnummern nicht
+manipuliert werden.
+
+Im Folgendem werde ich ein wenig auf die im yChat-Sourcecode oft verwendeten .
+Variablen eingehen:
+
+ $var => Sagt dem Skript, wie es gestartet werden soll.
+ $alias => Teilt dem Skript den Benutzername mit.
+ $tmpid => Beim einloggen in den Chat wird für den Benutzer eine
+ temporäre ID generiert. Diese wird so wohl in der Variable
+ $tmpid als auch in eine Datei geschrieben. Handelt der
+ Benutzer, so wird vom Skript die Variable $tmpid mit dem
+ Eintrag in der Datei verglichen. Sind beide Werte
+ identisch, dann wird die Handlung des Benutzers
+ ausgeführt. Stimmen die Werte nicht überein, dann wird
+ die Fehlermeldung, daß der Benutzer die falsche $tmpid hat
+ um mit $alias zu handeln,ausgegeben und das Skript beendet
+ sich. Dies ist eine Sicherheitsmaßnahme welche verbietet,
+ mit fremden Benutzernamen im System zu handeln.
+ $room => Sagt dem Skript, wie der aktuelle Raumname lautet.
+ $col => Sagt dem Skript, wie die aktuelle Chatfarbe des Nicks von
+ $alias lautet.
+ $seccol => Sagt dem Skript, wie die aktuelle Chatfarbe der Schrift von
+ $alias lautet.
+ $msg => Beinhaltet den von $alias zu postenden Text im Chat.
+ Hiervon wird auch in den Benutzergästebüchern und im
+ Benutzerboard Gebrauch gemacht.
+ $whisper => Beinhaltet den Benutzernamen, zu dem $alias zuletzt
+ geflüstert hat.
+ $id und $tmp => Temporäre Variablen zwecks Übermittlung diverser Daten.
+ $pw => Wird im Skript index.pl verwendet um das Zugangspassword
+ zu übermitteln.
+
+Viel Spaß beim Chatten ... \ No newline at end of file
diff --git a/0.4.4a3/TODO.txt b/0.4.4a3/TODO.txt
new file mode 100644
index 0000000..306537f
--- /dev/null
+++ b/0.4.4a3/TODO.txt
@@ -0,0 +1,38 @@
+############################## yChat.de TODO ################################
+## Copyright by Paul C. Bütow 200 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+Folgende Funktionen werden demnächst in yChat integriert:
+
+ - Neue Befehle:
+ Für WÄs:
+ /sl $room - Einen anderen Raum öffnen/schliessen
+ /st $room $msg - Einen anderen Raum ein Thema ageben
+
+ - Nach 5 Minuten Inaktivität soll der Benutzer automatisch
+ auf "away" gesetzt werden.
+ Nach 20 Minuten Inaktivität soll der Benutzer automatisch
+ aus dem System ausgelogt werden.
+
+ - Die Schlucht (Ein Raum wo Chatter hineingeworfen werden,
+ die sich nicht benehmen und noch nicht aus dem Chat
+ katapultiert werden sollen).
+
+ - Löschung aller Chatter, die sich seit 60 Tagen nicht mehr
+ eingelogt haben.
+
+ - IP-Adressen ver-/entbannen.
+
+ - E-Mail zusendung bei verlorenem Passwort.
+
+ - Eine Top 20 (Onlinezeit) der Chatter
+
+ - Unter "Benutzer" sollen Chatter über eine Eingabemaske nach
+ dem Anfangsbuchstaben gesucht werden können (vergl. Kilahu).
+
+ - Der Cybarkeeper (künstlich intilligenter Chatroboter, der
+ sich im Hauptraum Cyberbar aufhält, virtuelle Drinks verteilt
+ und von Real-Chattern übernommen werden kann. (Zukunftsmusik)
+
+Für weitere Vorschläge bitte in das yChat-Board unter www.yChat.de
+texten oder eine E-Mail an paul@buetow.oxg.de :-) \ No newline at end of file
diff --git a/0.4.4a3/UPDATES.txt b/0.4.4a3/UPDATES.txt
new file mode 100644
index 0000000..6ba8316
--- /dev/null
+++ b/0.4.4a3/UPDATES.txt
@@ -0,0 +1,150 @@
+########################### yChat.de UPDATE LIST ###########################
+## Copyright by Paul C. Bütow 200 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+Hier sind alle Erneuerungen der Versionen dokumentiert:
+
+Update von 0.4.4 auf 0.4.4 (04.01.01)
+ - Optimiertung aller Chatbefehle.
+ - Neuer WÄ-Befehl: Mit "/ss Raum Nachricht" wird aus dem aktuellen
+ Raum heraus in den angegebenen Raum eine beliebige Nachricht
+ gerufen.
+ - Das Skript main.pl wurde in zwei verschiedene Skripts unterteilt:
+ main.pl => Beinhaltet hauptsächlich die Chatbefehle
+ input.pl => Beinhaltet das zu generierende Chateingabeframe.
+ - Das Chateingabeframe wird nun nie wieder reloadet. (Dies geschah
+ bisher noch nach Ausführung der Befehle /col /j /ju /msg und nach
+ Änderung der Chateinstellungen und erwies sich als recht nervige
+ Angelegenheit.) JavaScript macht es möglich.
+ - Überarbeitung und Erweiterung der Dokudateien.
+
+Update von 0.4.2 auf 0.4.3 (30.12.2k)
+ - Optimierung der Zuweisung der Variabeln im Programmcode:
+ Variablen werden nun wirklich nur deffiniert, wenn diese auch
+ erforderlich sind.
+ - Komplette Neuprogrammierung diverser Subs (nun leistungsfähiger)
+ - Bei Aufrug der Login-Seite wird der gesamte Chat auf leerstehende
+ Räume und "alte" Chatter überprüft und ggf. entfernt.
+ - Verbesserung diverser JavaScript-Codes.
+ - Editiert ein Benutzer sein Profil, so wird dies mit der Meldung
+ "Alias hat sein Profil geändert ..." bekanntgegeben.
+ - Mit "/t" ohne weiteren Text erscheint die Nachricht "Alias hat das
+ Thema des Raums gelöscht ..."
+ - Hinzufügung diverser Administratorbefehle: "/pw Alias" zeigt
+ Zugangspassword von Alias an. "/ow Alias" ernennt Alias zum OW.
+ "/row Alias" entzieht Alias die OW-Rechte.
+
+Update von 0.4.1 auf 0.4.2 (25.12.2k)
+ - Im Texteingabeformular werden nun per JavaScript die letzten 10
+ Postings zwischengespeichert und können per Drop-Down-Menü
+ wieder in das Submittextfeld geladen werden um erneuert getextet
+ zu werden.
+ - Neues Design.
+ - Diverse Dateien wurden umbenannt:
+ INSTALL.txt -> SETUP.txt
+ LIESMICH.txt -> README.txt
+ - Die Datei CREDITS.txt wurde angelegt und somit auch die URL
+ www.credits.yChat.de.
+
+Update von 0.4.0 auf 0.4.1 (22.12.2k)
+ - Design wurde geändert.
+ - Unter "Optionen" ist nun eine komplette Farbtabelle eingebaut.
+ - Folgende Oberwächterbefehle wurden nun auch für normale Wächter
+ freigegeben: /ip /ban /rban.
+
+Update von 0.2.6 auf 0.4.0 (19.12.2k)
+ - Der berüchtigte "IP-Bug" wurde beseitigt! Und zwar wurden TempIDs
+ eingeführt => Eine dauerhafte Überprüfung der Benutzer-IP-Nummer
+ ist also nicht mehr notwendig.
+ - Die totale Chat-Online-Zeit wird protokolliert und kann jew. mit
+ "/online Alias" aufgerufen werden. Die Onlinezeit wird alle 20 Sek.
+ aktualisiert.
+ - Neue Befehle: "/seen Alias" zeigt an, vor wieviel St. sich Alias
+ zuletzt in das System eingelogt hat. Der Befehle "/rmgb" entfernt
+ alle Einträge des eigenen Benutzergästebuchs im Profil.
+
+Update von 0.2.5 auf 0.2.6 (17.12.2k)
+ - Das Eingabeframe reloaded sich nicht mehr nach jedem Posting.
+ Vielen Dank an Truhe aka Dave und Klepper aka Andreas Buchwald!
+ Bei den Chatbefehlen /col /away /j und /ju muß sich das
+ Eingabeframe weiterhin reloaden.
+ - Der Befehl // wurde entfernt. Dieser war nicht mehr erforderlich.
+ weil Nachrichten werden nur noch sehr selten verschluckt. Dieser
+ Chatbefehl postete die letzte Nachricht nocheinmal.
+ - Neuer Befehl: mit "/memo Alias hier der Text" hinterläßt man
+ Alias eine Memo. Logt sich Alias in den Chat ein, dann erhält
+ er diese sofort. Dafür wurde das Verzeichnis ".data/user/memos/"
+ angelegt.
+ - Programmcode wurde ein wenig optimiert.
+ - Das Design wurde ein wenig geändert.
+ - Beseitigung diverser Bugs.
+
+Update von 0.2.4 auf 0.2.5 (15.12.2k)
+ - Derjenige, der einen Raum zuerst betritt, hat Raumbesetzerrechte.
+ - Raumbesetzer, Wächter und Oberwächte können weitere Raumbesetzer
+ bestimmen. Diese können Raumbeseter auch wieder degradieren.
+ - Raumbesetzer, Wächter und Oberwächter können dem aktuellen Raum
+ auf/absperren und Themen geben. Wächter und Oberwächter können
+ abgesperrte Räume betreten.
+ - Das Verzeichnis ".data/htdocs" wurde entfernt. Die Datei help_html
+ heist nun help.sno und befindet sich im yChat-Hauptverzeichnis.
+ - Das Verzeichnis ".data/user/lastlogin" wurde hinzugefügt. Hier
+ wird beim erfolgreichen Einloggen ein "Timestamp" gesetzt. Später
+ sollen Oberwächter "veraltete" Benutzer entfernen können.
+ - Neuer Oberwächterbefehl: "/kill Alias" entfernt Alias ganz und gar
+ vom System. Oberwächter und Wächter können nicht entfernt werden.
+ - Perl-Cache wurde im gesamten System komplett deaktiviert ( Weniger
+ Ladezeiten der HTML-Dokumente ).
+ - Nur Nachrichten aus dem Raum "Cyberbar" werden gelogt.
+ Selbsterstellte Räume werden nichtmehr gelogt. Viele Logfunktionen
+ wurden entfernt (weniger Serverbalast).
+ - Beseitigung einiger kleinen Bugs.
+ - Unter "Optionen" im Chat wir die Farbe nun mit einem Drop-Down-Menü
+ ausgewählt ( Vielen dank an Michi aka Snoopy ).
+ - Auf der Startseite wird nun angezeigt wieviele Benutzer eingelogt
+ sind. Ist keiner eingelogt, dann wird das System "aufgeräumt". D.h.
+ Dateien die nicht mehr gebraucht werden und noch nicht gelöscht
+ wurden werden entfernt ( z.B. Nachrichtendateien der einzelnen
+ Chatter und die Dateien die die IP-Nummern der eingelogten Benutzer
+ beinhalteten usw.).
+ - Hunzufügung einer TODO-Liste. Hier sind mehrere Funktionen
+ vermerkt, die in späteren yChat-Versionen eingebaut werden sollen.
+ (www.todo.yChat.de oder TODO.txt).
+
+Update von 0.2.3 auf 0.2.4 (30.11.2k)
+ - Optimierung bzw. Verbesserung der Push-Routine push.pl.
+ - Server-Ping wurde von 2-Pings-per-Minute auf 4 erhöht.
+ - yChat-Banner wurde erstellt und ist unter
+ documents.yChat.de/yBanner.jpg vorzufinden.
+ - Unter der URL servers.yChat.de wurde eine Serverliste angelegt,
+ welche anzeigt wo yChat-Systeme laufen.
+ - Des weiteren wurden die URLs updates.yChat.de, install.yChat.de
+ und liesmich.yChat.de eingerichtet.
+ - Die Menüpunkte wurden zusammengefaßt, damit sie unter einer
+ Auflösung von 800x600 nur eine Zeile belegen.
+ - Einige Bugs wurden entfernt.
+
+Update von 0.2.2 auf 0.2.3 (25.11.2k)
+ - Smooth scrolling JavaScript ( Vielen Dank an Andreas Buchwald ).
+ - "IP#-Fehler" wurde so gut wie beseitigt.
+ - Aufrufe der einzelnen Benutzerprofile wird gezählt und angezeigt.
+ Diese werden in data/user/counts/* gespeichert.
+ - Automatische Einrichtung des Chats mit setup.sh und Telnet.
+ - Menüpunkt "Dein Profil" wurde entfernt da eigenes Profil auch
+ stets über die Onlineliste aufgerufen werden kann.
+
+Update von 0.2.1 auf 0.2.2 (23.11.2k)
+ - Einige Bugs wurden entfernt.
+ - Geschwindigkeit des Chats wurde optimiert.
+ - Eine Liste aller eingelogten Benutzer erscheint am Rand. Hierfür
+ wurde die Datei online.pl eingeführt. Sie aktuallisiert sich alle
+ 20 Sekunden.
+ - Die UPDATES.txt wurde eingeführt.
+
+Update von 0.2.0 auf 0.2.1
+ - Einige Bugs wurden entfernt.
+ - Die IP# der eingelogten Benutzer werden nun anders verwaltet.
+
+Update von Alpha XVIII auf 0.2.0
+ - Die Handhabung der eingelogten Benutzer im System wurde komplett neu
+ überarbeitet.
+ - Neue Versionsnumern wurden eingeführt. \ No newline at end of file
diff --git a/0.4.4a3/colors.sno b/0.4.4a3/colors.sno
new file mode 100644
index 0000000..3640b9e
--- /dev/null
+++ b/0.4.4a3/colors.sno
@@ -0,0 +1,290 @@
+ <table cellspacing=0 cellpadding=5 border=0>
+ <tr>
+ <td bgcolor="000000"><span style="color:#FFFFFF; text-decoration:line-through;">000000</span></td>
+ <td bgcolor="000033"><span style="color:#FFFFFF; text-decoration:line-through;">000033</span></td>
+ <td bgcolor="000066"><span style="color:#FFFFFF; text-decoration:line-through;">000066</span></td>
+ <td bgcolor="000099"><span style="color:#FFFFFF; text-decoration:line-through;">000099</span></td>
+ <td bgcolor="0000CC"><span style="color:#FFFFFF; text-decoration:line-through;">0000CC</span></td>
+ <td bgcolor="0000FF"><a href="javascript:insertcode('0000FF');" style="color:#FFFFFF;">0000FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="003300"><span style="color:#FFFFFF; text-decoration:line-through;">003300</span></td>
+ <td bgcolor="003333"><span style="color:#FFFFFF; text-decoration:line-through;">003333</span></td>
+ <td bgcolor="003366"><span style="color:#FFFFFF; text-decoration:line-through;">003366</span></td>
+ <td bgcolor="003399"><a href="javascript:insertcode('003399');" style="color:#FFFFFF;">003399</a></td>
+ <td bgcolor="0033CC"><a href="javascript:insertcode('0033CC');" style="color:#FFFFFF;">0033CC</a></td>
+ <td bgcolor="0033FF"><a href="javascript:insertcode('0033FF');" style="color:#FFFFFF;">0033FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="006600"><span style="color:#FFFFFF; text-decoration:line-through;">006600</span></td>
+ <td bgcolor="006633"><span style="color:#FFFFFF; text-decoration:line-through;">006633</span></td>
+ <td bgcolor="006666"><a href="javascript:insertcode('006666');" style="color:#FFFFFF;">006666</a></td>
+ <td bgcolor="006699"><a href="javascript:insertcode('006699');" style="color:#FFFFFF;">006699</a></td>
+ <td bgcolor="0066CC"><a href="javascript:insertcode('0066CC');" style="color:#FFFFFF;">0066CC</a></td>
+ <td bgcolor="0066FF"><a href="javascript:insertcode('0066FF');" style="color:#FFFFFF;">0066FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="009900"><a href="javascript:insertcode('009900');" style="color:#FFFFFF;">009900</a></td>
+ <td bgcolor="009933"><a href="javascript:insertcode('009933');" style="color:#FFFFFF;">009933</a></td>
+ <td bgcolor="009966"><a href="javascript:insertcode('009966');" style="color:#FFFFFF;">009966</a></td>
+ <td bgcolor="009999"><a href="javascript:insertcode('009999');" style="color:#FFFFFF;">009999</a></td>
+ <td bgcolor="0099CC"><a href="javascript:insertcode('0099CC');" style="color:#FFFFFF;">0099CC</a></td>
+ <td bgcolor="0099FF"><a href="javascript:insertcode('0099FF');" style="color:#FFFFFF;">0099FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00CC00"><a href="javascript:insertcode('00CC00');" style="color:#000000;">00CC00</a></td>
+ <td bgcolor="00CC33"><a href="javascript:insertcode('00CC33');" style="color:#000000;">00CC33</a></td>
+ <td bgcolor="00CC66"><a href="javascript:insertcode('00CC66');" style="color:#000000;">00CC66</a></td>
+ <td bgcolor="00CC99"><a href="javascript:insertcode('00CC99');" style="color:#000000;">00CC99</a></td>
+ <td bgcolor="00CCCC"><a href="javascript:insertcode('00CCCC');" style="color:#000000;">00CCCC</a></td>
+ <td bgcolor="00CCFF"><a href="javascript:insertcode('00CCFF');" style="color:#000000;">00CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00FF00"><a href="javascript:insertcode('00FF00');" style="color:#000000;">00FF00</a></td>
+ <td bgcolor="00FF33"><a href="javascript:insertcode('00FF33');" style="color:#000000;">00FF33</a></td>
+ <td bgcolor="00FF66"><a href="javascript:insertcode('00FF66');" style="color:#000000;">00FF66</a></td>
+ <td bgcolor="00FF99"><a href="javascript:insertcode('00FF99');" style="color:#000000;">00FF99</a></td>
+ <td bgcolor="00FFCC"><a href="javascript:insertcode('00FFCC');" style="color:#000000;">00FFCC</a></td>
+ <td bgcolor="00FFFF"><a href="javascript:insertcode('00FFFF');" style="color:#000000;">00FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="330000"><span style="color:#FFFFFF; text-decoration:line-through;">330000</span></td>
+ <td bgcolor="330033"><span style="color:#FFFFFF; text-decoration:line-through;">330033</span></td>
+ <td bgcolor="330066"><span style="color:#FFFFFF; text-decoration:line-through;">330066</span></td>
+ <td bgcolor="330099"><a href="javascript:insertcode('330099');" style="color:#FFFFFF;">330099</a></td>
+ <td bgcolor="3300CC"><a href="javascript:insertcode('3300CC');" style="color:#FFFFFF;">3300CC</a></td>
+ <td bgcolor="3300FF"><a href="javascript:insertcode('3300FF');" style="color:#FFFFFF;">3300FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="333300"><span style="color:#FFFFFF; text-decoration:line-through;">333300</span></td>
+ <td bgcolor="333333"><span style="color:#FFFFFF; text-decoration:line-through;">333333</span></td>
+ <td bgcolor="333366"><a href="javascript:insertcode('333366');" style="color:#FFFFFF;">333366</a></td>
+ <td bgcolor="333399"><a href="javascript:insertcode('333399');" style="color:#FFFFFF;">333399</a></td>
+ <td bgcolor="3333CC"><a href="javascript:insertcode('3333CC');" style="color:#FFFFFF;">3333CC</a></td>
+ <td bgcolor="3333FF"><a href="javascript:insertcode('3333FF');" style="color:#FFFFFF;">3333FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="336600"><a href="javascript:insertcode('336600');" style="color:#FFFFFF;">336600</a></td>
+ <td bgcolor="336633"><a href="javascript:insertcode('336633');" style="color:#FFFFFF;">336633</a></td>
+ <td bgcolor="336666"><a href="javascript:insertcode('336666');" style="color:#FFFFFF;">336666</a></td>
+ <td bgcolor="336699"><a href="javascript:insertcode('336699');" style="color:#FFFFFF;">336699</a></td>
+ <td bgcolor="3366CC"><a href="javascript:insertcode('3366CC');" style="color:#FFFFFF;">3366CC</a></td>
+ <td bgcolor="3366FF"><a href="javascript:insertcode('3366FF');" style="color:#FFFFFF;">3366FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="339900"><a href="javascript:insertcode('339900');" style="color:#FFFFFF;">339900</a></td>
+ <td bgcolor="339933"><a href="javascript:insertcode('339933');" style="color:#FFFFFF;">339933</a></td>
+ <td bgcolor="339966"><a href="javascript:insertcode('339966');" style="color:#FFFFFF;">339966</a></td>
+ <td bgcolor="339999"><a href="javascript:insertcode('339999');" style="color:#FFFFFF;">339999</a></td>
+ <td bgcolor="3399CC"><a href="javascript:insertcode('3399CC');" style="color:#FFFFFF;">3399CC</a></td>
+ <td bgcolor="3399FF"><a href="javascript:insertcode('3399FF');" style="color:#FFFFFF;">3399FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33CC00"><a href="javascript:insertcode('33CC00');" style="color:#000000;">33CC00</a></td>
+ <td bgcolor="33CC33"><a href="javascript:insertcode('33CC33');" style="color:#000000;">33CC33</a></td>
+ <td bgcolor="33CC66"><a href="javascript:insertcode('33CC66');" style="color:#000000;">33CC66</a></td>
+ <td bgcolor="33CC99"><a href="javascript:insertcode('33CC99');" style="color:#000000;">33CC99</a></td>
+ <td bgcolor="33CCCC"><a href="javascript:insertcode('33CCCC');" style="color:#000000;">33CCCC</a></td>
+ <td bgcolor="33CCFF"><a href="javascript:insertcode('33CCFF');" style="color:#000000;">33CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33FF00"><a href="javascript:insertcode('33FF00');" style="color:#000000;">33FF00</a></td>
+ <td bgcolor="33FF33"><a href="javascript:insertcode('33FF33');" style="color:#000000;">33FF33</a></td>
+ <td bgcolor="33FF66"><a href="javascript:insertcode('33FF66');" style="color:#000000;">33FF66</a></td>
+ <td bgcolor="33FF99"><a href="javascript:insertcode('33FF99');" style="color:#000000;">33FF99</a></td>
+ <td bgcolor="33FFCC"><a href="javascript:insertcode('33FFCC');" style="color:#000000;">33FFCC</a></td>
+ <td bgcolor="33FFFF"><a href="javascript:insertcode('33FFFF');" style="color:#000000;">33FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="660000"><span style="color:#FFFFFF; text-decoration:line-through;">660000</span></td>
+ <td bgcolor="660033"><span style="color:#FFFFFF; text-decoration:line-through;">660033</span></td>
+ <td bgcolor="660066"><a href="javascript:insertcode('660066');" style="color:#FFFFFF;">660066</a></td>
+ <td bgcolor="660099"><a href="javascript:insertcode('660099');" style="color:#FFFFFF;">660099</a></td>
+ <td bgcolor="6600CC"><a href="javascript:insertcode('6600CC');" style="color:#FFFFFF;">6600CC</a></td>
+ <td bgcolor="6600FF"><a href="javascript:insertcode('6600FF');" style="color:#FFFFFF;">6600FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="663300"><a href="javascript:insertcode('663300');" style="color:#FFFFFF;">663300</a></td>
+ <td bgcolor="663333"><a href="javascript:insertcode('663333');" style="color:#FFFFFF;">663333</a></td>
+ <td bgcolor="663366"><a href="javascript:insertcode('663366');" style="color:#FFFFFF;">663366</a></td>
+ <td bgcolor="663399"><a href="javascript:insertcode('663399');" style="color:#FFFFFF;">663399</a></td>
+ <td bgcolor="6633CC"><a href="javascript:insertcode('6633CC');" style="color:#FFFFFF;">6633CC</a></td>
+ <td bgcolor="6633FF"><a href="javascript:insertcode('6633FF');" style="color:#FFFFFF;">6633FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="666600"><a href="javascript:insertcode('666600');" style="color:#FFFFFF;">666600</a></td>
+ <td bgcolor="666633"><a href="javascript:insertcode('666633');" style="color:#FFFFFF;">666633</a></td>
+ <td bgcolor="666666"><a href="javascript:insertcode('666666');" style="color:#FFFFFF;">666666</a></td>
+ <td bgcolor="666699"><a href="javascript:insertcode('666699');" style="color:#FFFFFF;">666699</a></td>
+ <td bgcolor="6666CC"><a href="javascript:insertcode('6666CC');" style="color:#FFFFFF;">6666CC</a></td>
+ <td bgcolor="6666FF"><a href="javascript:insertcode('6666FF');" style="color:#FFFFFF;">6666FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="669900"><a href="javascript:insertcode('669900');" style="color:#000000;">669900</a></td>
+ <td bgcolor="669933"><a href="javascript:insertcode('669933');" style="color:#000000;">669933</a></td>
+ <td bgcolor="669966"><a href="javascript:insertcode('669966');" style="color:#000000;">669966</a></td>
+ <td bgcolor="669999"><a href="javascript:insertcode('669999');" style="color:#000000;">669999</a></td>
+ <td bgcolor="6699CC"><a href="javascript:insertcode('6699CC');" style="color:#000000;">6699CC</a></td>
+ <td bgcolor="6699FF"><a href="javascript:insertcode('6699FF');" style="color:#000000;">6699FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66CC00"><a href="javascript:insertcode('66CC00');" style="color:#000000;">66CC00</a></td>
+ <td bgcolor="66CC33"><a href="javascript:insertcode('66CC33');" style="color:#000000;">66CC33</a></td>
+ <td bgcolor="66CC66"><a href="javascript:insertcode('66CC66');" style="color:#000000;">66CC66</a></td>
+ <td bgcolor="66CC99"><a href="javascript:insertcode('66CC99');" style="color:#000000;">66CC99</a></td>
+ <td bgcolor="66CCCC"><a href="javascript:insertcode('66CCCC');" style="color:#000000;">66CCCC</a></td>
+ <td bgcolor="66CCFF"><a href="javascript:insertcode('66CCFF');" style="color:#000000;">66CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66FF00"><a href="javascript:insertcode('66FF00');" style="color:#000000;">66FF00</a></td>
+ <td bgcolor="66FF33"><a href="javascript:insertcode('66FF33');" style="color:#000000;">66FF33</a></td>
+ <td bgcolor="66FF66"><a href="javascript:insertcode('66FF66');" style="color:#000000;">66FF66</a></td>
+ <td bgcolor="66FF99"><a href="javascript:insertcode('66FF99');" style="color:#000000;">66FF99</a></td>
+ <td bgcolor="66FFCC"><a href="javascript:insertcode('66FFCC');" style="color:#000000;">66FFCC</a></td>
+ <td bgcolor="66FFFF"><a href="javascript:insertcode('66FFFF');" style="color:#000000;">66FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="990000"><a href="javascript:insertcode('990000');" style="color:#FFFFFF;">990000</a></td>
+ <td bgcolor="990033"><a href="javascript:insertcode('990033');" style="color:#FFFFFF;">990033</a></td>
+ <td bgcolor="990066"><a href="javascript:insertcode('990066');" style="color:#FFFFFF;">990066</a></td>
+ <td bgcolor="990099"><a href="javascript:insertcode('990099');" style="color:#FFFFFF;">990099</a></td>
+ <td bgcolor="9900CC"><a href="javascript:insertcode('9900CC');" style="color:#FFFFFF;">9900CC</a></td>
+ <td bgcolor="9900FF"><a href="javascript:insertcode('9900FF');" style="color:#FFFFFF;">9900FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="993300"><a href="javascript:insertcode('993300');" style="color:#FFFFFF;">993300</a></td>
+ <td bgcolor="993333"><a href="javascript:insertcode('993333');" style="color:#FFFFFF;">993333</a></td>
+ <td bgcolor="993366"><a href="javascript:insertcode('993366');" style="color:#FFFFFF;">993366</a></td>
+ <td bgcolor="993399"><a href="javascript:insertcode('993399');" style="color:#FFFFFF;">993399</a></td>
+ <td bgcolor="9933CC"><a href="javascript:insertcode('9933CC');" style="color:#FFFFFF;">9933CC</a></td>
+ <td bgcolor="9933FF"><a href="javascript:insertcode('9933FF');" style="color:#FFFFFF;">9933FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="996600"><a href="javascript:insertcode('996600');" style="color:#FFFFFF;">996600</a></td>
+ <td bgcolor="996633"><a href="javascript:insertcode('996633');" style="color:#FFFFFF;">996633</a></td>
+ <td bgcolor="996666"><a href="javascript:insertcode('996666');" style="color:#FFFFFF;">996666</a></td>
+ <td bgcolor="996699"><a href="javascript:insertcode('996699');" style="color:#FFFFFF;">996699</a></td>
+ <td bgcolor="9966CC"><a href="javascript:insertcode('9966CC');" style="color:#FFFFFF;">9966CC</a></td>
+ <td bgcolor="9966FF"><a href="javascript:insertcode('9966FF');" style="color:#FFFFFF;">9966FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="999900"><a href="javascript:insertcode('999900');" style="color:#000000;">999900</a></td>
+ <td bgcolor="999933"><a href="javascript:insertcode('999933');" style="color:#000000;">999933</a></td>
+ <td bgcolor="999966"><a href="javascript:insertcode('999966');" style="color:#000000;">999966</a></td>
+ <td bgcolor="999999"><a href="javascript:insertcode('999999');" style="color:#000000;">999999</a></td>
+ <td bgcolor="9999CC"><a href="javascript:insertcode('9999CC');" style="color:#000000;">9999CC</a></td>
+ <td bgcolor="9999FF"><a href="javascript:insertcode('9999FF');" style="color:#000000;">9999FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99CC00"><a href="javascript:insertcode('99CC00');" style="color:#000000;">99CC00</a></td>
+ <td bgcolor="99CC33"><a href="javascript:insertcode('99CC33');" style="color:#000000;">99CC33</a></td>
+ <td bgcolor="99CC66"><a href="javascript:insertcode('99CC66');" style="color:#000000;">99CC66</a></td>
+ <td bgcolor="99CC99"><a href="javascript:insertcode('99CC99');" style="color:#000000;">99CC99</a></td>
+ <td bgcolor="99CCCC"><a href="javascript:insertcode('99CCCC');" style="color:#000000;">99CCCC</a></td>
+ <td bgcolor="99CCFF"><a href="javascript:insertcode('99CCFF');" style="color:#000000;">99CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99FF00"><a href="javascript:insertcode('99FF00');" style="color:#000000;">99FF00</a></td>
+ <td bgcolor="99FF33"><a href="javascript:insertcode('99FF33');" style="color:#000000;">99FF33</a></td>
+ <td bgcolor="99FF66"><a href="javascript:insertcode('99FF66');" style="color:#000000;">99FF66</a></td>
+ <td bgcolor="99FF99"><a href="javascript:insertcode('99FF99');" style="color:#000000;">99FF99</a></td>
+ <td bgcolor="99FFCC"><a href="javascript:insertcode('99FFCC');" style="color:#000000;">99FFCC</a></td>
+ <td bgcolor="99FFFF"><a href="javascript:insertcode('99FFFF');" style="color:#000000;">99FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC0000"><a href="javascript:insertcode('CC0000');" style="color:#FFFFFF;">CC0000</a></td>
+ <td bgcolor="CC0033"><a href="javascript:insertcode('CC0033');" style="color:#FFFFFF;">CC0033</a></td>
+ <td bgcolor="CC0066"><a href="javascript:insertcode('CC0066');" style="color:#FFFFFF;">CC0066</a></td>
+ <td bgcolor="CC0099"><a href="javascript:insertcode('CC0099');" style="color:#FFFFFF;">CC0099</a></td>
+ <td bgcolor="CC00CC"><a href="javascript:insertcode('CC00CC');" style="color:#FFFFFF;">CC00CC</a></td>
+ <td bgcolor="CC00FF"><a href="javascript:insertcode('CC00FF');" style="color:#FFFFFF;">CC00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC3300"><a href="javascript:insertcode('CC3300');" style="color:#FFFFFF;">CC3300</a></td>
+ <td bgcolor="CC3333"><a href="javascript:insertcode('CC3333');" style="color:#FFFFFF;">CC3333</a></td>
+ <td bgcolor="CC3366"><a href="javascript:insertcode('CC3366');" style="color:#FFFFFF;">CC3366</a></td>
+ <td bgcolor="CC3399"><a href="javascript:insertcode('CC3399');" style="color:#FFFFFF;">CC3399</a></td>
+ <td bgcolor="CC33CC"><a href="javascript:insertcode('CC33CC');" style="color:#FFFFFF;">CC33CC</a></td>
+ <td bgcolor="CC33FF"><a href="javascript:insertcode('CC33FF');" style="color:#FFFFFF;">CC33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC6600"><a href="javascript:insertcode('CC6600');" style="color:#000000;">CC6600</a></td>
+ <td bgcolor="CC6633"><a href="javascript:insertcode('CC6633');" style="color:#000000;">CC6633</a></td>
+ <td bgcolor="CC6666"><a href="javascript:insertcode('CC6666');" style="color:#000000;">CC6666</a></td>
+ <td bgcolor="CC6699"><a href="javascript:insertcode('CC6699');" style="color:#000000;">CC6699</a></td>
+ <td bgcolor="CC66CC"><a href="javascript:insertcode('CC66CC');" style="color:#000000;">CC66CC</a></td>
+ <td bgcolor="CC66FF"><a href="javascript:insertcode('CC66FF');" style="color:#000000;">CC66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC9900"><a href="javascript:insertcode('CC9900');" style="color:#000000;">CC9900</a></td>
+ <td bgcolor="CC9933"><a href="javascript:insertcode('CC9933');" style="color:#000000;">CC9933</a></td>
+ <td bgcolor="CC9966"><a href="javascript:insertcode('CC9966');" style="color:#000000;">CC9966</a></td>
+ <td bgcolor="CC9999"><a href="javascript:insertcode('CC9999');" style="color:#000000;">CC9999</a></td>
+ <td bgcolor="CC99CC"><a href="javascript:insertcode('CC99CC');" style="color:#000000;">CC99CC</a></td>
+ <td bgcolor="CC99FF"><a href="javascript:insertcode('CC99FF');" style="color:#000000;">CC99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCCC00"><a href="javascript:insertcode('CCCC00');" style="color:#000000;">CCCC00</a></td>
+ <td bgcolor="CCCC33"><a href="javascript:insertcode('CCCC33');" style="color:#000000;">CCCC33</a></td>
+ <td bgcolor="CCCC66"><a href="javascript:insertcode('CCCC66');" style="color:#000000;">CCCC66</a></td>
+ <td bgcolor="CCCC99"><a href="javascript:insertcode('CCCC99');" style="color:#000000;">CCCC99</a></td>
+ <td bgcolor="CCCCCC"><a href="javascript:insertcode('CCCCCC');" style="color:#000000;">CCCCCC</a></td>
+ <td bgcolor="CCCCFF"><a href="javascript:insertcode('CCCCFF');" style="color:#000000;">CCCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCFF00"><a href="javascript:insertcode('CCFF00');" style="color:#000000;">CCFF00</a></td>
+ <td bgcolor="CCFF33"><a href="javascript:insertcode('CCFF33');" style="color:#000000;">CCFF33</a></td>
+ <td bgcolor="CCFF66"><a href="javascript:insertcode('CCFF66');" style="color:#000000;">CCFF66</a></td>
+ <td bgcolor="CCFF99"><a href="javascript:insertcode('CCFF99');" style="color:#000000;">CCFF99</a></td>
+ <td bgcolor="CCFFCC"><a href="javascript:insertcode('CCFFCC');" style="color:#000000;">CCFFCC</a></td>
+ <td bgcolor="CCFFFF"><a href="javascript:insertcode('CCFFFF');" style="color:#000000;">CCFFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF0000"><a href="javascript:insertcode('FF0000');" style="color:#FFFFFF;">FF0000</a></td>
+ <td bgcolor="FF0033"><a href="javascript:insertcode('FF0033');" style="color:#FFFFFF;">FF0033</a></td>
+ <td bgcolor="FF0066"><a href="javascript:insertcode('FF0066');" style="color:#FFFFFF;">FF0066</a></td>
+ <td bgcolor="FF0099"><a href="javascript:insertcode('FF0099');" style="color:#FFFFFF;">FF0099</a></td>
+ <td bgcolor="FF00CC"><a href="javascript:insertcode('FF00CC');" style="color:#FFFFFF;">FF00CC</a></td>
+ <td bgcolor="FF00FF"><a href="javascript:insertcode('FF00FF');" style="color:#FFFFFF;">FF00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF3300"><a href="javascript:insertcode('FF3300');" style="color:#FFFFFF;">FF3300</a></td>
+ <td bgcolor="FF3333"><a href="javascript:insertcode('FF3333');" style="color:#FFFFFF;">FF3333</a></td>
+ <td bgcolor="FF3366"><a href="javascript:insertcode('FF3366');" style="color:#FFFFFF;">FF3366</a></td>
+ <td bgcolor="FF3399"><a href="javascript:insertcode('FF3399');" style="color:#FFFFFF;">FF3399</a></td>
+ <td bgcolor="FF33CC"><a href="javascript:insertcode('FF33CC');" style="color:#FFFFFF;">FF33CC</a></td>
+ <td bgcolor="FF33FF"><a href="javascript:insertcode('FF33FF');" style="color:#FFFFFF;">FF33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF6600"><a href="javascript:insertcode('FF6600');" style="color:#000000;">FF6600</a></td>
+ <td bgcolor="FF6633"><a href="javascript:insertcode('FF6633');" style="color:#000000;">FF6633</a></td>
+ <td bgcolor="FF6666"><a href="javascript:insertcode('FF6666');" style="color:#000000;">FF6666</a></td>
+ <td bgcolor="FF6699"><a href="javascript:insertcode('FF6699');" style="color:#000000;">FF6699</a></td>
+ <td bgcolor="FF66CC"><a href="javascript:insertcode('FF66CC');" style="color:#000000;">FF66CC</a></td>
+ <td bgcolor="FF66FF"><a href="javascript:insertcode('FF66FF');" style="color:#000000;">FF66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF9900"><a href="javascript:insertcode('FF9900');" style="color:#000000;">FF9900</a></td>
+ <td bgcolor="FF9933"><a href="javascript:insertcode('FF9933');" style="color:#000000;">FF9933</a></td>
+ <td bgcolor="FF9966"><a href="javascript:insertcode('FF9966');" style="color:#000000;">FF9966</a></td>
+ <td bgcolor="FF9999"><a href="javascript:insertcode('FF9999');" style="color:#000000;">FF9999</a></td>
+ <td bgcolor="FF99CC"><a href="javascript:insertcode('FF99CC');" style="color:#000000;">FF99CC</a></td>
+ <td bgcolor="FF99FF"><a href="javascript:insertcode('FF99FF');" style="color:#000000;">FF99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFCC00"><a href="javascript:insertcode('FFCC00');" style="color:#000000;">FFCC00</a></td>
+ <td bgcolor="FFCC33"><a href="javascript:insertcode('FFCC33');" style="color:#000000;">FFCC33</a></td>
+ <td bgcolor="FFCC66"><a href="javascript:insertcode('FFCC66');" style="color:#000000;">FFCC66</a></td>
+ <td bgcolor="FFCC99"><a href="javascript:insertcode('FFCC99');" style="color:#000000;">FFCC99</a></td>
+ <td bgcolor="FFCCCC"><a href="javascript:insertcode('FFCCCC');" style="color:#000000;">FFCCCC</a></td>
+ <td bgcolor="FFCCFF"><a href="javascript:insertcode('FFCCFF');" style="color:#000000;">FFCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFFF00"><a href="javascript:insertcode('FFFF00');" style="color:#000000;">FFFF00</a></td>
+ <td bgcolor="FFFF33"><a href="javascript:insertcode('FFFF33');" style="color:#000000;">FFFF33</a></td>
+ <td bgcolor="FFFF66"><a href="javascript:insertcode('FFFF66');" style="color:#000000;">FFFF66</a></td>
+ <td bgcolor="FFFF99"><a href="javascript:insertcode('FFFF99');" style="color:#000000;">FFFF99</a></td>
+ <td bgcolor="FFFFCC"><a href="javascript:insertcode('FFFFCC');" style="color:#000000;">FFFFCC</a></td>
+ <td bgcolor="FFFFFF"><a href="javascript:insertcode('FFFFFF');" style="color:#000000;">FFFFFF</a></td>
+ </tr>
+</table> \ No newline at end of file
diff --git a/0.4.4a3/config.pm b/0.4.4a3/config.pm
new file mode 100644
index 0000000..52e1500
--- /dev/null
+++ b/0.4.4a3/config.pm
@@ -0,0 +1,245 @@
+# yChat - Copyright by Paul C. Bütow
+
+########################### Dieser Teil bestimmt die Standart-Variabeln.
+##STANDART-CONFIGURATION:## (CSS, Farben, Version etc.)
+###########################
+$datum = "04.01.01";
+$version = "0.4.4";
+$title = "yChat [$version]";
+$gfxpath = "../../yChat";
+$style = <<ENDCSS;
+<style rel="stylesheet" type="text/css">
+ body { background-color: 005146 }
+ body.blank { background-color: 000000 }
+ body.online { background-color: 000000 }
+ div { font-family: arial, verdana, helvetiva; font-size: 9pt; color: ffffff }
+ div.b { font-weight: bold; color: ffa500 }
+ a { color: ffffef }
+ a:hover { color: ffffff; text-decoration: none }
+</style>
+ENDCSS
+
+############### Dieser TeFil enthält Programmcode, der an verschiedenen
+##SHARED-SUBS## Stellen ausgeführt werden muß und jedem Skript zur
+############### Verfügung steht.
+
+sub printfile { # Liest eine externe Datei ein und gibt sie mit print aus
+ my ($file2print,$pagetitle,$bodyclass) = @_;
+ if ($pagetitle ne "") {
+ &start_html($pagetitle,$bodyclass);
+ }
+ open(FILE2PRINT,"<$file2print");
+ @file2print = <FILE2PRINT>;
+ close FILE2PRINT;
+ print @file2print;
+}
+
+
+sub start_html { # Der HEADER einer HTML-Datei
+print "<html><head>";
+print "<meta http-equiv=\"refresh\" content=\"20\" URL=\"online.pl?room=$room\">" if ($_[1] eq "online");
+print <<END;
+ <title>
+ $title - $_[0]
+ </title>
+ $_[2]
+ $style
+ </head>
+END
+ if ($_[1] eq "start") {
+ print "<body onload=\"document.login.alias.focus();\">";
+ } elsif ($_[1] ne "") {
+ print "<body class=$_[1]>";
+ } else {
+ print "<body>";
+ }
+}
+
+sub post { # Öffentliche Nachricht im aktuellen Raum $room posten.
+ my ($room,$msg2post,$secroom) = @_;
+ local @rooms = $room;
+ @rooms = ($room,$secroom) if ($room ne $secroom);
+ foreach(@rooms) {
+ my $room2post = $_;
+ opendir(ROOMDIR,"data/online/rooms/$room2post");
+ local @roomdir = readdir(ROOMDIR);
+ closedir(ROOMDIR);
+ foreach(@roomdir) {
+ my $alias2post = $_;
+ if (-f "data/online/rooms/$room2post/$alias2post") {
+ open (DATEI,">>data/msgs/$alias2post") || &error("Konnte $file2write nicht öffnen");
+ print DATEI "$msg2post<br>\n";
+ close DATEI;
+ }
+ }
+ }
+ &log($msg2post) if ($room eq "Cyberbar");
+}
+
+
+sub post_all { # Öffentliche Nachricht in ALLEN Räumen gleichzeitig posten.
+ my $msg2post = $_[0];
+ opendir(USERDIR,"data/online/users");
+ local @userdir = readdir(USERDIR);
+ close(USERDIR);
+ foreach $alias2post (@userdir) {
+ if (-f "data/online/users/$alias2post") {
+ open (MSG,">>data/msgs/$alias2post") || &error("Konnte $file2write nicht öffnen");
+ print MSG "$msg2post<br>\n";
+ close MSG;
+ }
+ }
+ &log($msg2post);
+}
+
+sub post_prv { # Private Nachricht posten (flüstern).
+ local ($alias2post,$msg2post) = @_;
+ open(MSG,">>data/msgs/$alias2post");
+ print MSG "$msg2post<br>\n";
+ close MSG;
+}
+
+sub log { # Protokollieren der Nachrichten etc.
+ local $msg2log = $_[0];
+ &zeit;
+ open(LOG,">>data/logs/$day.$month.$year");
+ print LOG "<br><font color=ffffef><i>($hours:$min:$sec)</i></font> $msg2log\n";
+ close LOG;
+}
+
+
+sub zeit { # Aktuelles Datum und Uhrzeit bestimmen.
+ ($sec, $min, $hours, $day, $month, $year) = (localtime)[0..5];
+ $month += 1;
+ $hours = "0".$hours if ($hours < 10);
+ $min = "0".$min if ($min < 10);
+ $sec = "0".$sec if ($sec < 10);
+ $day = "0".$day if ($day < 10);
+ $month = "0".$month if ($month < 10);
+ $year = $year - 100;
+ if ($year < 10) {
+ $year = "200".$year;
+ } else {
+ $year = "20".$year;
+ }
+}
+
+sub read_file { # Datei öffnen.
+ my $file2read = $_[0];
+ if (-e "$file2read") {
+ open (DATEI,"<$file2read") || &error("Konnte $file2read nicht öffnen");
+ }
+}
+
+sub error { # Error-Ausgabe.
+ my $error_msg = $_[0];
+ &start_html( "Error: ($error_msg)" );
+ print $q->div( "Error: ($error_msg)" ),
+ $q->end_html;
+ open(ERROR,">>data/error");
+ print ERROR $error_msg."\n";
+ close ERROR;
+ exit;
+}
+
+sub check_online { # Auf alte Räume und Chatter prüfen und ggf. entfernen.
+ open(PROVE,">data/online/prove");
+ print PROVE time;
+ close PROVE;
+ opendir(RAUMDIR, "data/online/rooms");
+ my @raumdir = readdir(RAUMDIR);
+ closedir(RAUMDIR);
+ foreach $raum (@raumdir) {
+ opendir(BENUTZERDIR, "data/online/rooms/$raum");
+ my @benutzerdir = readdir(BENUTZERDIR);
+ closedir(BENUTZERDIR);
+ my $raumleer= 1;
+ foreach $benutzer (@benutzerdir) {
+ if (-f "data/online/rooms/$raum/$benutzer") {
+ $raumleer = 0;
+ open (BENUTZER,"<data/online/rooms/$raum/$benutzer");
+ my $benutzerstamp = <BENUTZER>;
+ close BENUTZER;
+ if ($benutzerstamp < (time - 40)) {
+ unlink("data/online/$raum/$benutzer");
+ open (BENUTZER2,"<data/online/users/$benutzer");
+ my $benutzerstamp2 = <BENUTZER2>;
+ close BENUTZER2;
+ if ($benutzerstamp2 < (time - 40)) {
+ if ($benutzer ne $alias) {
+ &rm_alias($benutzer,$raum); # ohne $raum/benutzer entf.
+ } else {
+ unlink("data/online/rooms/$raum/$benutzer");
+ }
+ &zeit;
+ &post($raum,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$benutzer hat den Chat verlassen ... </font></i>");
+ }
+ }
+ }
+ }
+ if ($raumleer == 1) { # Falls Raum leer ist => entf.
+ rmdir("data/online/rooms/$raum");
+ unlink("data/online/rstat/$raum");
+ }
+ }
+}
+
+sub rm_alias { # Falls Benutzer offline gegangen ist
+ my($benutzer,$raum) = @_;
+ unlink("data/online/rooms/$raum/$benutzer");
+ unlink("data/online/users/$benutzer");
+ unlink("data/online/ident/$benutzer");
+ unlink("data/msgs/$benutzer");
+ &rm_rstat($benutzer,$raum);
+}
+
+
+sub rm_rstat { # Benutzer als Raumbesetzer austragen
+ my ($r_alias,$rstatroom) = @_;
+ open (RSTAT,"<data/online/rstat/$rstatroom");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ my @rstat2 = ($rstat[0],$rstat[1]);
+ for ($i=2;$i<=$#rstat;$i++) {
+ push(@rstat2,$rstat[$i]) if ($rstat[$i] ne $r_alias."\n");
+ }
+ open (RSTAT,">data/online/rstat/$rstatroom");
+ print RSTAT @rstat2;
+ close RSTAT;
+}
+
+
+sub secure_checkid { # TmpID überprüfen
+ my ($alias2check) = @_;
+ open(IDENT,"<data/online/ident/$alias2check");
+ my @ident = <IDENT>;
+ close IDENT;
+ if ($ident[1] ne $tmpid) {
+ &error("Falsche TempID ! Du bist nicht befugt zu handeln !");
+ }
+}
+
+sub hirachie { # Chatter nach Sonderrechte überprüfen.
+ my $alias2prove = $_[0];
+ $hirachie = undef;
+ open(WA,"<data/wa");
+ @was = <WA>;
+ close WA;
+ foreach $wa (@was) {
+ if ($wa eq $alias2prove || $wa eq "$alias2prove\n") {
+ $hirachie = "wa";
+ }
+ }
+ open(OW,"<data/ow");
+ @ows = <OW>;
+ close OW;
+ if ($hirachie ne "wa" || $_ eq "$alias2prove\n") {
+ foreach $ow (@ows) {
+ if ($ow eq $alias2prove || $ow eq "$alias2prove\n") {
+ $hirachie = "ow";
+ }
+ }
+ }
+}
+
+$| = 1; # Cache von Perl ausschalten \ No newline at end of file
diff --git a/0.4.4a3/help.sno b/0.4.4a3/help.sno
new file mode 100644
index 0000000..1c14b76
--- /dev/null
+++ b/0.4.4a3/help.sno
@@ -0,0 +1,57 @@
+<div>
+ Alle Chat-Befehle:
+</div>
+<hr>
+<table width=100% bgcolor=000000>
+<tr><th bgcolor=666666><div>SU</div></th><th bgcolor=666666><div>Befehl</div></th><th bgcolor=666666><div>Beschreibung</div></th></tr>
+<tr><td><div>NC</div></td><td><div>/about</div></td><td><div>Zeigt aktuelle Version und andere Infos der Community an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/away <font color=red>Nachricht</font></div></td><td><div>Abmelden mit einer<font color=red>Abmeldenachricht</font></div></td></tr>
+<tr><td><div>NC</div></td><td><div>/clear</div></td><td><div>Bildschirm wird gelöscht</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/col <font color=red>XXXXXX</font> <font color=ffa500>XXXXXX</font></div></td><td><div>Farbe/n (<font color=red>Namensfarbe</font> / <font color=ffa500>Textfarbe</font>) wechseln. Angabe in Hexadezimal.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/date</div></td><td><div>Zeigt aktuelles Datum und Urzeit an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/j <font color=red>Raumname</font></div></td><td><div>Raum wechseln/erstellen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ju <font color=red>Alias</font></div></td><td><div>In den Raum wechseln/folgen, wo sich <font color=red>Alias</font> befindet.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/m <font color=red>Aktion</font></div></td><td><div>Handeln mit 2 Farben</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/me <font color=red>Aktion</font></div></td><td><div>Handeln mit einer Farbe</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/memo <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine <font color=ffa500>Memonachricht</font> hinterlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/msg <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine private <font color=ffa500>Nachricht</font> flüstern</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ <font color=ffa500>Nachricht</font></div></td><td><div>Eine private <font color=ffa500>Nachricht</font> demjenigen flüstern, dem zuletzt eine geflüstert wurde</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/online <font color=red>Alias</font></div></td><td><div>Zeigt Onlineminuten von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/q</div></td><td><div>Cumunnity verlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/rmgb</div></td><td><div>Das eigene Gästebuch komplett weglöschen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/s <font color=red>Nachricht</font></div></td><td><div><font color=red>Nachricht</font> schreien</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/seen <font color=red>Alias</font></div></td><td><div>Zeigt an, vor wieviel Stunden sich <font color=red>Nachricht</font> zum letzten Mal in das System eingelogt hat</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/w</div></td><td><div>Zeigt an, wer sich im aktuellen Raum befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc <font color=red>Raum</font></div></td><td><div>Zeigt an, wer sich im <font color=red>Raum</font> befindet. Wird kein Raum angegeben, dann wird jedeglich angezeigt, wer sich im System befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc/</div></td><td><div>Zeigt alle offenen Räume und deren Chatter an</div></td></tr>
+<tr><td><div>NC</div></td><td> <div>/wj <font color=red>Alias</font></div></td><td><div>Zeigt an, in welchen Raum sich <font color=red>Alias</font> befindet</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/l</div></td><td><div>Der aktuelle Raum wird ab- bzw. aufgesperrt</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/rsu <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> die Raumbesetzerrechte entnehmen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/su <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Raumbesetzer ernennen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/t <font color=red>Thema</font></div></td><td><div>Dem aktuellen Raum wird ein <font color=red>Thema</font> gegeben</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban</div></td><td><div>Zeigt alle verbannten Benutzer an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> verbannen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/rban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> "entbannen"</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ip <font color=red>Alias</font></div></td><td><div>Zeigt die IP-Nummer von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/k <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird aus dem Chat katapultiert!</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ss <font color=red>Raum</font> <font color=ffa500>Nachricht</font></div></td><td><div>Eine <font color=ffa500>Nachricht</font> in <font color=red>Raum</font> hinüber rufen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/kill <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird ganz und gar aus dem System entfernt</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/wa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Wächter ernennen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/rwa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom Wächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/sys <font color=red>Nachricht</font></div></td><td><div>Systemnachricht schreiben. (Erscheint in allen existierenden Räumen)</div></td></tr>
+</table><hr>
+<div>
+ Zur Erklärung: NC steht für "Normale Chatter", RB für "Raumbesetzer", WÄ für "Wächter" und OW für "Oberwächter".
+ Obrige Befehle können nur von der/den jeweiligen Benutzergruppe/n werden.<br><br>
+ Allerdings gibt es folgendes zu beachten: Oberwächter verfügen über alle Chatbefehle. Normale Wächter über alle Chatbefehle, außer über die der Oberwächter.
+ Raumbesetzer können nur Raumbesetzerbefehle und die Befehle der normalen Chatter durchführen. Normale Chatter haben jedeglich die Standardbefehle zu verwenden.<br><br>
+ Weitere Besonderheiten der Wächter und Oberwächter:<br><br>
+ Wächter und Oberwächter können ....<br>
+ ... abgesperrte Chaträume problemlos betreten.<br>
+ ... nicht gekickt, verbannt oder gekillt werden.<br>
+ ... Logdateien der Cyberbar lesen.<br><br>
+
+ Des weiteren: Oberwächter ernennt nur der Systemadministrator!
+</div>
+</body>
+</html> \ No newline at end of file
diff --git a/0.4.4a3/htdocs.pl b/0.4.4a3/htdocs.pl
new file mode 100644
index 0000000..fcc0f88
--- /dev/null
+++ b/0.4.4a3/htdocs.pl
@@ -0,0 +1,225 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header;
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+$var = $q->param("var");
+if ($var eq "help_html") {
+ &printfile("help.sno","Alle Chatbefehle");
+} elsif ($var eq "logo_html") {
+ &start_html("Logo");
+ print "<layer top=-3 left=0><div style=\"position:absolute; top:5; left:10\">",
+ "<img src=\"$gfxpath/y_.gif\"></div></layer>";
+ $q->end_html;
+} elsif ($var eq "menu_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ $tmp = $q->param("tmp");
+ &menu_html;
+} elsif ($var eq "werda_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &werda_html;
+} elsif ($var eq "logs_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ &logs_html;
+} elsif ($var eq "view_logs_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $tmp = $q->param("tmp");
+ &secure_checkid($alias);
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ &printfile($tmp,"Logdatei","blank");
+ }
+} elsif ($var eq "superuser_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ &superuser_html;
+} else {
+ print
+ $q->start_html(-bgcolor=>"000000"),
+ $q->end_html;
+}
+
+sub menu_html {
+if ($tmp eq "quit") {
+ &start_html("Quit","blank","<script language=\"JavaScript\">open(\"index.pl?tmp=quit\",\"_top\");</script>");
+ print $q->end_html;
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias verläßt den Chat ... </font></i>");
+ sleep 2;
+ &rm_alias($alias,$room);
+ exit;
+}
+ENDJS
+ &start_html("Menü","blank");
+print <<END;
+<script language="JavaScript">
+function fenster(fenster,target) {
+ open(fenster,target,"width=500,height=500,screenX=100,screenY=100,scrollbars");
+}
+</script>
+<font size=2 face=verdana>
+ <a href='javascript:fenster("htdocs.pl?var=werda_html&alias=$alias&room=$room&col=$col&secol=$secol&&tmp=$tmp&tmpid=$tmpid","weristda")'>Wer ist da?</a>
+ <a href='javascript:fenster("main2.pl?var=edit_profile_html&alias=$alias&tmpid=$tmpid&room=$room","ProfilAendern")'>Profil ändern</a>
+ <a href='javascript:fenster("main2.pl?var=edit_options_html&alias=$alias&tmpid=$tmpid&room=$room","Optionen")'>Chatoptionen</a>
+ <a href='javascript:fenster("main2.pl?var=list_alias_html&alias=$alias&tmpid=$tmpid","Benutzerliste")'>Benutzerliste</a>
+ <a href='javascript:fenster("htdocs.pl?var=help_html&tmpid=$tmpid","Befehle")'>Chatbefehle</a><br>
+ <a href='javascript:fenster("main2.pl?var=gb_html&alias=$alias&tmpid=$tmpid","Board")'>Benutzerboard</a>
+ <a href='javascript:fenster("htdocs.pl?var=superuser_html&alias=$alias&tmpid=$tmpid","Superuser")'>Superuser</a>
+ <a href='javascript:fenster("htdocs.pl?var=logs_html&alias=$alias&tmpid=$tmpid","Logdateien")'>Logdateien</a>
+ <a href="http://www.updates.yChat.de" target="Updates">Updates</a>
+ <a href="http://www.credits.yChat.de" target="Credits">Credits</a>
+ <a href="htdocs.pl?alias=$alias&var=menu_html&room=$room&tmpid=$tmpid&tmp=quit">Verlassen</a>
+</font>
+</body>
+</html>
+END
+}
+
+sub werda_html { # Anzeige, wer eingelogt ist.
+ &start_html("Wer ist da?");
+ print <<END;
+<div>
+ $alias, schön daß Du hier bist :-)
+</div>
+<hr>
+<div>
+ Folgende Personen befinden sich im Chat:
+</div>
+<br>
+<div>
+END
+ opendir(ROOMDIRS,"data/online/rooms");
+ local @roomdirs = readdir(ROOMDIRS);
+ close(ROOMDIRS);
+ foreach(@roomdirs) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ my $room = $_;
+ open(RSTAT,"<data/online/rstat/$room");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ opendir(ROOMDIR,"data/online/rooms/$room");
+ my @roomdir = readdir(ROOMDIR);
+ close(ROOMDIR);
+ local $nr = $#roomdir-1;
+ print $q->b( $_ ),
+ " $door ($nr) Raumthema: $rstat[1]",
+ $q->br;
+ foreach(@roomdir) {
+ if ($_ ne ".." && $_ ne ".") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid" }, "$_"), " ";
+ }
+ }
+ print $q->br, $q->br;
+ }
+ }
+ print
+ "</div>",
+ $q->end_html;
+}
+
+sub logs_html {
+ &start_html("Logdateien");
+ print <<END;
+<div>
+ Hier befinden sich alle Logdateien
+</div>
+<hr>
+END
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ print $q->div( "Folgende Logdateien des Raumes \"Cyberbar\" können nur von Oberwächtern gelesen werden (Sortiert nach A-Z, a-z):" ),
+ $q->br;
+ opendir(LOGS,"data/logs");
+ local @logs = readdir(LOGS);
+ closedir(LOGS);
+ local @sortedir = sort(@logs);
+ foreach(@sortedir) {
+ if (-f "data/logs/$_") {
+ print $q->a( { -href=>"htdocs.pl?alias=$alias&var=view_logs_html&tmp=data/logs/$_&tmpid=$tmpid",
+ -target=>"_new" },
+ "$_" ),
+ " ";
+ }
+ }
+ } else {
+ print $q->div( "Logdateien können nur von Oberwächtern (OW) gelesen werden. Du bist jedoch ein Wächter (WÄ) oder ein",
+ "\"Normaler Chatter\". Oberwächter können alles nachlesen, was öffentlich im Raum \"Cyberbar\" gechattet wurde." ),
+ $q->hr;
+ &printfile("data/htdocs/logs_html");
+ }
+ print
+ $q->end_html;
+}
+
+sub superuser_html { # Zeigt an, wer Superuser ist
+ &start_html("Superuser");
+ print "<div>Hallo $alias. Du bist als ";
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ print
+ $q->b( "Oberwächter" ),
+ " (OW) eingetragen.</div>",
+ $q->hr;
+ } elsif ( $hirachie eq "wa") {
+ print
+ $q->b( "Wächter" ),
+ " (WÄ) eingetragen.</div>",
+ $q->hr;
+ } else {
+ print
+ $q->b( "normaler Chatter" ),
+ " (NC) eingetragen.</div>",
+ $q->hr;
+ }
+
+ my $nrow = $#ows+1;
+ print
+ "<div>",
+ $q->b( "OW" ),
+ "s ($nrow Stück)";
+ foreach(@ows) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+ my $nrwa = $#was+1;
+ print
+ "</div>",
+ $q->hr,
+ "<div>",
+ $q->b( "WÄ" ),
+ "s ($nrwa Stück)";
+ foreach(@was) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+print <<END;
+<hr>
+ Die jeweiligen Fähigkeiten der Oberwächter (OW) und der Wächter (WÄ) sind unter
+ "<a href="htdocs.pl?var=help_html">Chat-Befehle</a>"
+ dokumentiert.
+</div>
+</body>
+</html>
+END
+} \ No newline at end of file
diff --git a/0.4.4a3/index.pl b/0.4.4a3/index.pl
new file mode 100644
index 0000000..141fb38
--- /dev/null
+++ b/0.4.4a3/index.pl
@@ -0,0 +1,406 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header;
+
+#####################################
+##WELCHE SUB MUß AUFGERUFEN WERDEN?##
+#####################################
+
+$var = $q->param("var");
+$alias = $q->param("alias");
+$pw = $q->param("pw");
+$tmp = $q->param("tmp");
+
+if ($var eq "create_alias_html") {
+ &create_alias_html;
+} elsif ($var eq "create_alias") {
+ &create_alias;
+} elsif ($var eq "login_html") {
+ $tmp = $q->param("tmp");
+ &login_html;
+} elsif ($alias eq "") {
+ &login_html;
+} else {
+ &checklogin;
+}
+
+sub login_html { # Erste Startseite
+&check_online;
+local $counter = undef;
+open(COUNT,"<data/count");
+ $counter = <COUNT>;
+close COUNT;
+$counter++;
+open(COUNT,">data/count");
+ print COUNT $counter;
+close COUNT;
+opendir(USERS,"data/online/users");
+ local @users = readdir(USERS);
+closedir(USERS);
+opendir(REGISTRED,"data/user/options");
+ local @registred = readdir(REGISTRED);
+closedir(REGISTRED);
+local ($logtin,$users) = ($#users-1,$#registred-1);
+&start_html("Created & Copyright by Paul C. Bütow","start");
+print <<END;
+ <center>
+ <table width=500>
+ <tr>
+ <td>
+ <center>
+ <table>
+ <tr>
+ <td>
+ <img src="$gfxpath/y.gif">
+ </td>
+ <td>
+ <div>
+ yChat: Version $version
+ <br><br>
+ Letztes Update: $datum
+ <br><br>
+ Seitenaufrufe: $counter
+ <br><br>
+ Benutzer registriert: $users
+ <br><br>
+ Benutzer online: $logtin
+ <br><br>
+ Webmaster: <a href="mailto:paul\@buetow.oxg.de">Paul C. Bütow</a>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </center>
+ </div>
+ <br>
+ <br>
+END
+ if ($tmp eq "true") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Wahrscheinlich existiert Dein Alias "$alias" nicht,
+ <br>
+ Du hast Dich verschrieben oder das Passwort ist falsch.
+ <br>
+ Versuch es erneuert !
+ </div>
+END
+ } elsif ($tmp eq "quit") {
+print <<END;
+ <div>
+ Du hast soeben den Chat verlassen.
+ <br>
+ Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ } elsif ($tmp eq "banned") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein Alias "$alias" wurde verbannt.
+ <br>
+ Z.z. kannst Du Dich leider nicht in den Chat einloggen.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($tmp eq "kick") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wurdest soeben aus dem Chat katapultiert!
+ <br>
+ Schlechtes Verhalten mag die Ursache hierfür sein.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($var eq "create_alias") {
+print "<div>Du hast sich soeben in die Datenbank eingetragen. Einfach auf \"Los Geht's\" klicken :-)</div>";
+ } else {
+print <<END;
+ <div>
+ Herzlich willkommen!
+ <br>
+ Einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <form name="login" action="index.pl" method="post">
+ <input type="hidden" name="tmp" value="true">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Alias:
+ <br>
+ <input name="alias" value="$alias">
+ </div>
+ </td>
+ <td>
+ <div>
+ Dein Passwort:
+ <br>
+ <input type="password" name="pw" value="$pw">
+ </div>
+ </td>
+ </tr>
+ </table>
+ <br>
+ <br>
+ <div>
+ Solltest Du noch keinen Nick besitzen, dann auf "Registrieren" klicken!
+ </div>
+ <br>
+ <table>
+ <tr>
+ <td>
+ <font color="ffffff">
+ <input type="submit" value="Los geht's!">
+ </font>
+ </form>
+ </td>
+ <td>
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias_html">
+ <font color="ffffff">
+ <input type="submit" value="Registrieren">
+ </font>
+ </form>
+ </td>
+ </tr>
+ </table>
+ <hr>
+ </td>
+ </tr>
+ </table>
+ </center>
+</body>
+</html>
+END
+# if ($logtin == 0) {
+# &list_dir("data/msgs");
+# &list_dir("data/online/rstat",2);
+# foreach(@dir) {
+# unlink("data/msgs/$_");
+# unlink("data/online/ident/$_");
+# }
+# foreach(@dir2) {
+# unlink("data/online/rstat/$_");
+# }
+# }
+# # Falls d. Skript das Raumverz. gelöscht hat, neu anlegen
+ if (-d "data/online/rooms") {
+ } else {
+ mkdir "data/online/rooms", 0777;
+ }
+}
+
+
+sub create_alias_html { # HTML-Form für Erstellung eines neuen Benutzers.
+local $reload = $_[0];
+&start_html("Registration");
+print <<END;
+ <center>
+ <table width=500>
+ <tr>
+ <td>
+END
+ if ($reload eq "alias_exists") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Der von Dir gewählte Benutzername "$alias" existiert in unserer Datenbank bereits. Bitte versuch es erneuert mit
+ einem anderen Benutzernamen !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "pw_wrong") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Deine beiden Passworteingaben stimmen nicht überein. Bitte geb das Passwort erneuert an um sicherzugehen, daß
+ kein falsches Passwort abgespeichert wird !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "alias_prohibited") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein gewählter Benutername "$alias" enthält illegale Zeichen. Bitte versuch einen anderen Benutzernamen!
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Hier kannst Du Dich registrieren. Bitte beachte, daß die Passworteingabefelder übereinstimmen!
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias">
+ <div>
+ Dein Alias:
+ <font color="ffa500">
+ (Muß angegeben werden)
+ </font>
+ <br>
+ <input name="alias" VALUE="$alias">
+ </div>
+ <br>
+ <div>
+ Dein gewünschtes Passwort:
+ <br>
+ <input type="password" name="pw" value="$pw">
+ </div>
+ <br>
+ <div>
+ Geb hier Dein Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp">
+ </div>
+ <br>
+ <font color=ffffff>
+ <input type="submit" value="Registrieren">
+ </font>
+ <br>
+ </form>
+ <hr>
+ <div>
+ Um den Chat zu betreten müssen die Daten nach der Registration auf der Startseite erneuert bestätigt werden !
+ </div>
+ </td>
+ </tr>
+ </table>
+</center>
+</body>
+</html>
+END
+}
+
+sub checklogin { # Überprüfen, ob die Login-Daten korrekt sind.
+ my $lognotexists = "true";
+ opendir(USERDIR,"data/user/options");
+ my @userdir = readdir(USERDIR);
+ closedir(USERDIR);
+ foreach $user (@userdir) {
+ if ($user eq $alias) {
+ open(OPTIONS,"<data/user/options/$alias");
+ my @options = <OPTIONS>;
+ close OPTIONS;
+ chomp($options[0]);
+ if ($options[0] eq $pw) {
+ open(BAN,"<data/ban");
+ my @ban = <BAN>;
+ close BAN;
+ foreach(@ban) {
+ if ($_ eq "$alias\n") {
+ $tmp = "banned";
+ &login_html;
+ exit;
+ }
+ }
+ if ($options[1] eq undef) {
+ $col = "ffffff";
+ } else {
+ $col = $options[1];
+ }
+ if ($options[2] eq undef) {
+ $secol = "ffffef";
+ } else {
+ $secol = $options[2];
+ }
+ $tmpid = time;
+ open(IDENT,">data/online/ident/$alias");
+ print IDENT $ENV{'REMOTE_ADDR'}."\n".$tmpid;
+ close IDENT;
+ open(LASTLOGIN,">data/user/lastlogin/$alias");
+ print LASTLOGIN time;
+ close LASTLOGIN;
+ &frameset_html;
+ exit;
+ } else {
+ $lognotexists = "false";
+ }
+ }
+ }
+ &login_html; # Falls Login-Daten inkorrekt sind, zurück zur Startseite.
+}
+
+sub create_alias { # Erstellung eines neuen Benutzers.
+ if ($alias =~ /[\W]/ || $alias eq "") {
+ &create_alias_html("alias_prohibited");;
+ exit;
+ } elsif ($pw ne $tmp) {
+ &create_alias_html("pw_wrong");
+ exit;
+ }
+ opendir(USERDIR,"data/user/options");
+ my @user = readdir(USERDIR);
+ close USERDIR;
+ foreach $user (@user) {
+ if ($user eq $alias) {
+ &create_alias_html("alias_exists");
+ exit;
+ }
+ }
+ open(OPTIONS,">data/user/options/$alias");
+ print OPTIONS $pw."\n";
+ close OPTIONS;
+ local $number = $#user;
+ &zeit;
+ &post("Cyberbar","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias [$number] hat sich soeben als neuer Benutzer registriert :-) ...</font></i>");
+ &login_html;
+}
+
+sub frameset_html {
+print <<END;
+<html>
+ <head>
+ <title>
+ $title - Created & Copyright by Paul C. Bütow
+ </title>
+ </head>
+<frameset border=0 frameborder=0 framespacing=0 cols="130,*">
+ <frameset border=0 frameborder=0 framespacing=0 rows="300,*,55">
+ <frame name="online" src="online.pl?room=Cyberbar&alias=$alias&tmpid=$tmpid">
+ <frame src="htdocs.pl">
+ <frameset border=0 frameborder=0 framespacing=0 cols="70,*">
+ <frame name="logo" src="htdocs.pl?var=logo_html" scrolling="no">
+ <frame name="reload" src="htdocs.pl" scrolling="no">
+ </frameset>
+ </frameset>
+ <frameset border=0 frameborder=0 framespacing=0 rows="60,*,55">
+ <frame name="menu" src="htdocs.pl?alias=$alias&var=menu_html&room=Cyberbar&col=$col&secol=$secol&tmpid=$tmpid" scrolling="no">
+ <frame name="main" src="push.pl?room=Cyberbar&alias=$alias&tmpid=$tmpid">
+ <frame name="input" src="input.pl?alias=$alias&room=Cyberbar&col=$col&secol=$secol&tmp=login&tmpid=$tmpid" scrolling="no">
+ </frameset>
+</frameset>
+</html>
+END
+}
diff --git a/0.4.4a3/input.pl b/0.4.4a3/input.pl
new file mode 100644
index 0000000..da91dcb
--- /dev/null
+++ b/0.4.4a3/input.pl
@@ -0,0 +1,138 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header();
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+&secure_checkid($alias);
+$room = $q->param("room");
+$col = $q->param("col");
+$secol = $q->param("secol");
+$tmp = $q->param("tmp");
+$whisper = $q->param('whisper');
+
+if ($tmp eq "login") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat den Chat betreten ...</font></i>");
+}
+
+print <<END;
+<html>
+ <head>
+ <script language="JavaScript">
+
+maxVerlauf = 10; // Anzahl der Einträge des Verlaufs
+maxPreview = 20; // Zeichenlänge der Verlaufsvorschau
+fullVerlauf = new Array( maxVerlauf );
+
+function delout()
+{
+ addVerlauf( document.inf.msg.value );
+ document.inf.submit(); // Formular absenden
+ document.inf.msg.focus(); // Fukus in das Eingabeform
+ document.inf.msg.select(); // Text im Eigabeform markieren
+ return false;
+}
+
+function CheckAuswahl()
+{
+ id = document.verlaufform.verlauf.selectedIndex;
+
+ if( fullVerlauf[ id-1 ] == null ) // Falls das Feld leer ist
+ return false; // Aufruf ignorieren
+
+ document.inf.msg.value = fullVerlauf[ id-1 ];
+ document.inf.msg.focus();
+
+ return true;
+}
+
+function addVerlauf( msg )
+{
+ if( msg == "" ) // Falls msg leer
+ return false; // Aufruf ignorieren
+
+ for( i=0; i<(maxVerlauf-1); i++ ) // Alle Einträge einen aufrutschen
+ {
+ document.verlaufform.verlauf.options[i+1].text = document.verlaufform.verlauf.options[i+2].text;
+ fullVerlauf[i] = fullVerlauf[i+1];
+ }
+ if( msg.length > maxPreview )
+ pre = msg.slice( 0, maxPreview-3 ) + "...";
+ else
+ pre = msg;
+
+ document.verlaufform.verlauf.options[ maxVerlauf ].text = pre; // Neue Vorschau anfügen
+ fullVerlauf[ maxVerlauf-1 ] = msg; // Neuen Eintrag anfügen
+
+// document.verlaufform.verlauf.selectedIndex = maxVerlauf; // Fokus auf den letzten Eintrag
+ document.verlaufform.verlauf.selectedIndex = 0; // Fokus auf den ersten Eintrag (Überschrift)
+}
+
+ </script>
+
+$style
+<style type="text/css" media="all">
+input {
+ border:2px solid #000000;
+ font-size:12px;
+ color:#000000;
+ height:23px;
+ padding:2px;
+}
+select {
+ border:2px solid #000000;
+ font-family:arial, verdana, helvetica;
+ font-size:11px;
+ color:#000000;
+ height:21px;
+ padding:2px;
+}
+</style>
+ </head>
+<body class="blank" onload="document.inf.msg.focus();">
+ <div align="left">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td>
+ <form name="inf" target="reload" action="main.pl" onsubmit="return delout()">
+ <input type="hidden" name="var" value="post_msg">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="room" value="$room">
+ <input type="hidden" name="col" value="$col">
+ <input type="hidden" name="secol" value="$secol">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="whisper" value="$whisper">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input size="50" name="msg">
+ </form>
+ </td>
+ <td>
+ <form name="verlaufform">
+ <select size="1" name="verlauf" size="40" onChange="CheckAuswahl()">
+ <option value>- Nachrichten-Verlauf -</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ </select>
+ </form>
+ </td>
+ </tr>
+ </table>
+ </div>
+</body>
+</html>
+END
diff --git a/0.4.4a3/main.pl b/0.4.4a3/main.pl
new file mode 100644
index 0000000..030f76d
--- /dev/null
+++ b/0.4.4a3/main.pl
@@ -0,0 +1,817 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header();
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+&secure_checkid($alias);
+$room = $q->param("room");
+$col = $q->param("col");
+$secol = $q->param("secol");
+$tmp = $q->param("tmp");
+$msg = $q->param("msg");
+$whisper = $q->param("whisper");
+
+&reload_html("","change_colors") if ($q->param('var') eq "change_colors");
+
+if ($tmp eq "away") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat sich zurück gemeldet ... </font></i>");
+ &post_prv($alias,"<script language=\"JavaScript\"> parent.input.document.inf.tmp.value = \"notaway\";</script>");
+}
+$msg =~ s#<#&lt\;#g;
+if (substr($msg,0,1) ne "/") {
+ &post($room,"<b><font color=$col>$alias: <font color=$secol>".$msg."</font></font></b>");
+ &reload_html($whisper,$tmp);
+} else {
+ &cmd($msg);
+}
+
+sub reload_html { # Wird neugeladen, wenn eine Nachricht getextet wird!
+ my ($whisper,$action) = @_;
+ print "<html><head><script language=\"JavaScript\">";
+ if ($action eq "change_room") {
+ print "open(\"online.pl?alias=$alias&room=$room&tmpid=$tmpid\",\"online\");";
+ print "parent.input.document.inf.room.value = \"$room\";";
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol&tmpid=$tmpid\",\"menu\");";
+ } elsif ($action eq "change_colors") {
+ print "parent.input.document.inf.col.value = \"$col\";";
+ print "parent.input.document.inf.secol.value = \"$secol\";";
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol&tmpid=$tmpid\",\"menu\");";
+ } elsif ($action eq "whisper") {
+ print "parent.input.document.inf.whisper.value = \"$whisper\";";
+ } elsif ($action eq "away") {
+ print "parent.input.document.inf.tmp.value = \"away\";";
+ } elsif ($action eq "quit") {
+ print "open(\"index.pl?tmp=quit\",\"_top\");";
+ }
+ print "</script></head><body bgcolor=$col>";
+ print
+ $q->end_html;
+exit 0;
+}
+
+sub change_room { # Den Chat-Raum wechseln
+ my ($method,$newroom,$oldroom,$alias2follow) = @_;
+ open(RSTAT, "<data/online/rstat/$newroom"); #Überprüfen, ob Alias Raum betreten darf
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ if ($rstat[0] eq "1\n") {
+ &hirachie($alias);
+ if ($hirachie eq "wa" || $hirachie eq "ow") { } else {
+ &post_prv("$alias","<font size=2 color=ffffff>Der Raum \"<font color=ffa500>$newroom</font>\" ist leider abgesperrt!</font>");
+ &reload_html($whisper,$action);
+ exit;
+ }
+ }
+ $room = $oldroom;
+ &zeit;
+ if ($method eq "j") {
+ unlink("data/online/rooms/$oldroom/$alias");
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias wechselt in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias kommt aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ &post_prv("$alias","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>Du wechselst aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ } elsif ($method eq "ju") {
+ unlink("data/online/rooms/$oldroom/$alias");
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias folgt \"$alias2follow\" in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias kommt aus dem Raum \"$oldroom\" und folgt \"$alias2follow\" herein nach \"$newroom\" ...</font></i>");
+ &post_prv("$alias","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>Du folgst \"$alias2follow\" aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ }
+ unlink("data/online/rooms/$oldroom/$alias");
+ &rm_rstat($alias,$oldroom);
+ &check_online;
+}
+
+sub prove_besetzer { # Prüfen, ob Benutzer Raumbesetzerrechte hat
+ my ($r_alias,$r_room) = @_;
+ $r_besetzer = "false";
+ open(DATEI,"<data/online/rstat/$r_room");
+ @r_stat = <DATEI>;
+ close DATEI;
+ for($i=2;$i<=$#r_stat;$i++) {
+ $r_besetzer = "true" if ($r_stat[$i] eq $r_alias || $r_stat[$i] eq $r_alias."\n");
+ }
+}
+
+sub cmd { # Alle Chatbefehle, die über input_html eingegeben werden können.
+ $_[0] = $_[0]." ";
+ $_[0] = substr($_[0], 1, length($_[0])-1);
+ my @cmd = split(/ /, $_[0]);
+ my $cmd = substr($_[0],0 , index($_[0], " "));
+#############>- NORMALE CHATBEFEHLE ( Alphabetisch sortiert ) -<
+#############>- INFORMATIONEN ÜBER DAS SYSTEM AUSGEBEN -<
+ if ($cmd eq "about") {
+ &post_prv("$alias","<font size=2 color=ffffff>Aktuelle Version ist $title und wurde am $datum aktuallisiert. Created by Paul C. Bütow 2k.</font>");
+ &reload_html;
+ exit;
+#############>- ABMELDEN MIT 'AWAY-NACHRICHT' -<
+ } elsif ($cmd eq "away") {
+ if ($tmp eq "away") { # Falls 2 mal hintereinander /away eingegeben wurde
+ my $away_msg = "";
+ }
+ for ($i=1; $i <= $#cmd; $i++) {
+ $away_msg = $away_msg." ".$cmd[$i];
+ }
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias meldet sich ab (<font color=red>$away_msg</font> ) ...</i></font>");
+ &reload_html($whisper,"away");
+ exit;
+#############>- EIGENEN CHATBILDSCHIRM LÖSCHEN -<
+ } elsif ($cmd eq "clear") {
+ &post_prv($alias,"<script language=\"JavaScript\">window.open(\"push.pl?alias=$alias&room=$room&var=clear_screen&tmpid=$tmpid\",\"main\");</script>");
+ &reload_html;
+ exit;
+#############>- FARBEN WECHSELN -<
+ } elsif ($cmd eq "col") {
+ $col = $cmd[1];
+ my $tmpsecol = $cmd[2];
+ if ($tmpsecol eq "") {
+ $secol = $col
+ } else {
+ $secol = $tmpsecol;
+ }
+ open(OPTIONS,"<data/user/options/$alias");
+ my @options = <OPTIONS>;
+ close OPTIONS;
+ open(OPTIONS,">data/user/options/$alias");
+ print OPTIONS $options[0]."".$col."\n".$secol;
+ close OPTIONS;
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat die Farbe gewechselt ...</font></i>");
+ &reload_html($whisper,"change_colors");
+ exit;
+#############>- AKTUELLES DATUM UND URZEIT AUSGEBEN -<
+ } elsif ($cmd eq "date") {
+ &zeit;
+ &post_prv("$alias","<font size=2 color=ffffff>Heute ist der $day.$month. Jahr $year. Es ist genau $hours:$min Uhr und $sec Sekunden.</font>");
+ &reload_html;
+ exit;
+#############>- EINEN NEUEN RAUM ERSTELLEN BZW. IN EINEN BESTEHENDEN RAUM WECHSELN -<
+ } elsif ($cmd eq "j") {
+ &change_room("j",$cmd[1],$room);
+ &reload_html($whisper,"change_room");
+ exit;
+#############>- HANDELN -<
+ } elsif ($cmd eq "me" || $cmd eq "m") {
+ my $me_msg;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $me_msg = $me_msg." ".$cmd[$i];
+ }
+ if ($cmd eq "m") {
+ &post($room,"<i><font color=$col>$alias <font color=$secol>$me_msg</font></font></i>");
+ } else {
+ &post($room,"<i><font color=$col>$alias $me_msg</font></i>");
+ }
+ &reload_html;
+ exit;
+#############>- MEMO SCHREIBEN -<
+ } elsif ($cmd eq "memo") {
+ my $alias2memo = $cmd[1];
+ if(-f "data/user/options/$alias2memo") {
+ my $memo_msg;
+ for ($i=2; $i <= $#cmd; $i++) {
+ $memo_msg = $memo_msg." ".$cmd[$i];
+ }
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2memo <font color=ffffff>wurde folgende memo erfolgreich hinterlassen: $memo_msg</font></font>");
+ &zeit;
+ open(MEMO,">>data/user/memos/$alias2memo") || &error("Konnte >>data/user/memos/$alias2memo nicht öffnen");
+ print MEMO "<font size=2 color=ffffff>($day.$month. - $hours:$min:$sec) <font color=ffa500>$alias</font> hat Dir eine Memo hinterlassen: <font color=ffa500>$memo_msg</font></font><br>\n";
+ close MEMO;
+ &reload_html;
+ exit;
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2memo <font color=ffffff>existiert in der Datenbank nicht !</font></font>");
+ &reload_html;
+ exit;
+#############>- FLÜSTERN ( Auch mit '/' ) -<
+ } elsif ($cmd eq "msg" || $cmd eq "") {
+ my ($alias2post,$msg2post,$action) = ($cmd[1]);
+ if ($cmd eq "msg") {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ $action = "whisper";
+ } else {
+ $alias2post = $whisper;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ }
+ if (-f "data/online/users/$alias2post") {
+ open(MSGS,">>data/msgs/$alias2post");
+ print MSGS "<i><font color=$col>$alias flüstert <font color=ffffff>=></font><font color=$secol>$msg2post</font></font></i><br>\n";
+ close MSGS;
+ open(MSGS,">>data/msgs/$alias");
+ print MSGS "<i><font color=$col>Zu $alias2post geflüstert <font color=ffffff>=></font><font color=$secol>$msg2post</font></font></i><br>\n";
+ close MSGS;
+ &reload_html($alias2post,$action);
+ exit;
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2post <font color=ffffff>ist momentan nicht anwesend !</font></font>");
+ &reload_html;
+ exit;
+#############>- TOTALONLINEZEIT VON ALIAS ANZEIGEN -<
+ } elsif ($cmd eq "online") {
+ my $alias2prove= $cmd[1];
+ if (-f "data/user/options/$alias2prove") {
+ open(ONLINE,"<data/user/counts/$alias2prove.online");
+ my $online = <ONLINE>;
+ close ONLINE;
+ my $totaltime = sprintf("%.2f",($online / 60));
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff> war insgesamt schon $totaltime Minuten online!</font></font>");
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff>existiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+ &reload_html;
+ exit;
+#############>- DAS SYSTEM VERLASSEN -<
+ } elsif ($cmd eq "q") {
+ &reload_html($whisper,"quit");
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias verläßt den Chat ... </font></i>");
+ sleep 2;
+ &rm_alias($alias,$room);
+ exit;
+#############>- DAS EIGENE GÄSTEBUCH LÖSCHEN -<
+ } elsif ($cmd eq "rmgb") {
+ unlink("data/user/gbooks/$alias");
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias löscht sein gesamtes Gästebuch ...</font></i>");
+ &reload_html;
+ exit;
+#############>- SCHREIEN -<
+ } elsif ($cmd eq "s") {
+ my $msg2scream;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2scream = $msg2scream." ".$cmd[$i];
+ }
+ my $msg2post = "\U$msg2scream";
+ &post($room,"<font color=$col><i>$alias schreit:</i> <b><font color=$secol>".$msg2post."</font></font></b>");
+ &reload_html;
+ exit;
+#############>- SEHEN, WANN SICH ALIAS ZUM LETZTEN MAL EINGELOGT HAT -<
+ } elsif ($cmd eq "seen") {
+ my $alias2prove = $cmd[1];
+ if (-f "data/user/options/$alias2prove") {
+ if (-f "data/user/lastlogin/$alias2prove") {
+ open(LASTLOGIN,"<data/user/lastlogin/$alias2prove");
+ local $lastlogin = <LASTLOGIN>;
+ close LASTLOGIN;
+ local $timestamp = sprintf("%.2f",((time() - $lastlogin) / 3600));
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff> hat sich vor $timestamp Stunden zuletzt in das System eingelogt!</font></font>");
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff> hat sich seit der Einführung dieses Befehls noch nie eingelogt!</font></font>");
+ }
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff> exsistiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+ &reload_html;
+ exit;
+#############>- ANZEIGEN WER SICH IM AKTUELLEN RAUM BEFINDET -<
+ } elsif ($cmd eq "w") {
+ open(RSTAT,"data/online/rstat/$room");
+ local @rstat = <RSTAT>;
+ close RSTAT;
+ local $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ local ($is,$nr) = ("t",0);
+ opendir(DIR,"data/online/rooms/$room");
+ local @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ if (-f "data/online/rooms/$room/$_") {
+ $personen = $personen." ".$_;
+ $nr++;
+ }
+ }
+ &post_prv($alias,"<font size=2 color=ffffff>Der aktuelle Raum: $room $door ($nr) [".$rstat[1]."] : <font color=ffa500>$personen</font></font>");
+ &reload_html;
+ exit;
+#############>- ANZEIGEN WER SICH IM SYSTEM BEFINDET -<
+ } elsif ($cmd eq "wc" || $cmd eq "wc/") {
+ my $raum = $cmd[1];
+ my $personen;
+ if ($raum eq "" && $cmd eq "wc") {
+ opendir(USERS,"data/online/users");
+ my @users = readdir(USERS);
+ close USERS;
+ foreach(@users) {
+ $personen = $personen." ".$_ if (-f "data/online/users/$_");
+ }
+ my $nr = ($#users-1);
+ my ($nrs,$is) = ("","ist");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "sind";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>$nr Person$nrs $is insgesamt eingelogt: <font color=ffa500>$personen</font></font>");
+ } elsif ($raum eq "" && $cmd eq "wc/") {
+ my $msg2post;
+ opendir(DIR,"data/online/rooms");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ opendir(DIR,"data/online/rooms/$_");
+ my @dir2 = readdir(DIR);
+ closedir(DIR);
+ open(RSTAT,"<data/online/rstat/$_");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ my $nr = $#dir2-1;
+ $msg2post = $msg2post."<tr><td><b><font size=2 color=ffffff>$_ $door ($nr) [".$rstat[1]."]: </font></b></td></tr><tr><td><font size=2 color=ffa500>";
+ foreach $chatter (@dir2) {
+ if (-f "data/online/rooms/$_/$chatter") {
+ $msg2post = $msg2post."$chatter ";
+ }
+ }
+ print "</font></td>";
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>Folgende Räume sind offen:</font><table>$msg2post</table>");
+ } elsif ($raum ne "") {
+ my $personen;
+ opendir(DIR,"data/online/rooms/$raum");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/rooms/$raum/$_");
+ }
+ my ($nr,$is) = (($#dir-1),"t");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "n";
+ }
+ &post_prv($alias,"<font size=2 color=ffffff> $nr Person$nrs befinde$is sich im Raum \"$raum\": <font color=ffa500>$personen</font></font>");
+ }
+ &reload_html;
+ exit;
+#############>- ANZEIGEN IN WELCHEN RAUM SICH JMD. BEFINDET BZW. JMD IN EINEN RAUM FOLGEN -<
+ } elsif ($cmd eq "wj" || $cmd eq "ju") {
+ my $alias2search = $cmd[1];
+ opendir(ROOMS,"data/online/rooms");
+ my @dir = readdir(ROOMS);
+ closedir(ROOMS);
+ foreach $raum (@dir) {
+ opendir(DIR2,"data/online/rooms/$raum");
+ my @dir2 = readdir(DIR2);
+ closedir(DIR2);
+ foreach $user (@dir2) {
+ if (-f "data/online/rooms/$raum/$user") {
+ if ($user eq $alias2search) {
+ if ($cmd eq "wj") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2search <font color=ffffff>befindet sich im Raum \"$raum\" !</font></font>");
+ } else {
+ &change_room("ju",$raum,$room,$alias2search);
+ }
+ &reload_html($whisper,"change_room");
+ exit;
+ }
+ }
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2search <font color=ffffff> ist nicht eingelogt !</font></font>");
+ &reload_html;
+ exit;
+#############>- RAUMNESETZER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- RAUM ABSCHLIESSEN/AUFSCHLIESSEN -<
+ } elsif ($cmd eq "l") {
+ &prove_besetzer($alias,$room);
+ &hirachie($alias);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ my $lock = "0\n";
+ &zeit;
+ if ($room eq "Cyberbar") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum ohne Erfolg ab ...</font></i>");
+ } else {
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum ab ...</font></i>");
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum auf ...</font></i>");
+ }
+ for ($i=1;$i<=$#r_stat;$i++) {
+ $lock = $lock.$r_stat[$i];
+ }
+ open(RSTAT,">data/online/rstat/$room");
+ print RSTAT $lock;
+ close RSTAT;
+ }
+ }
+ &reload_html;
+ exit;
+#############>- RAUMBESETZER ERNENNEN -<
+ } elsif ($cmd eq "su") {
+ &prove_besetzer($alias,$room);
+ &hirachie($alias);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ my $alias2su = $cmd[1];
+ opendir(DIR,"data/online/rooms/$room");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ if ($_ eq $alias2su) {
+ open(DATEI,"<data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ &hirachie($alias2su);
+ &prove_besetzer($alias2su,$room);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ &reload_html;
+ &post_prv($alias,"<font color=ffa500>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist bereits RB, WÄ oder OW)</font>");
+ exit;
+ }
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias ernennt \"$alias2su\" zum Raumbesetzer ...</font></i>");
+ open(DATEI,">>data/online/rstat/$room");
+ print DATEI $alias2su."\n";
+ close DATEI;
+ &reload_html;
+ exit;
+ }
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist nicht anwesend)</font>");
+ }
+ &reload_html;
+ exit;
+#############>- RAUMBESETZER ENTNENNEN -<
+ } elsif ($cmd eq "rsu") {
+ &prove_besetzer($alias,$room);
+ &hirachie($alias);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ my $alias2rsu = $cmd[1];
+ open(DATEI,"<data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ &prove_besetzer($alias2rsu,$room);
+ if ($r_besetzer eq "true") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias entzieht \"$alias2rsu\" die Raumbesetzerrechte ...</font></i>");
+ my $newrstat = $rstat[0].$rstat[1];
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $newrstat = $newrstat.$r_stat[$i] if ($r_stat[$i] ne $alias2rsu."\n");
+ }
+ open(DATEI,">data/online/rstat/$room");
+ print DATEI $newrstat;
+ close DATEI;
+ } else {
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2rsu <font color=ffffff>ist kein Raumbesetzer und kann dieser Status auch nicht aberkannt werden !</font></font>");
+ }
+ }
+ &reload_html;
+ exit;
+#############>- RAUM EIN THEMA GEBEN -<
+ } elsif ($cmd eq "t") {
+ &prove_besetzer($alias,$room);
+ &hirachie($alias);
+ if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") {
+ my $theme;
+ &zeit;
+ if ($cmd[1] ne undef) {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $theme = $theme." ".$cmd[$i];
+ }
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias gibt dem Raum das Thema (<font color=red> $theme </font>) ...</font></i>");
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias löscht das Thema des Raums ...</font></i>");
+ }
+ $theme = $r_stat[0].$theme."\n";
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $theme = $theme.$r_stat[$i];
+ }
+ open(RSTAT,">data/online/rstat/$room");
+ print RSTAT $theme;
+ close RSTAT;
+ }
+ &reload_html;
+ exit;
+#############>- SUPERUSER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- ALIAS VERBANNEN -<
+ } elsif ($cmd eq "ban") {
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ my $alias2ban = $cmd[1];
+ open(BAN,"<data/ban");
+ my @ban = <BAN>;
+ close BAN;
+ if ($cmd[1] eq undef) {
+ my $banned;
+ local $nr = @ban;
+ for ($i=0;$i<=$#ban;$i++) {
+ $banned .= $ban[$i];
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>Folgende Benutzer sind verbannt [$nr]: <font color=ffa500>$banned</font></font>");
+ &reload_html;
+ exit;
+ } elsif (-f "data/user/options/$alias2ban") {
+ &hirachie($alias2ban);
+ if ($hirachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2ban <font color=ffffff>ist Wächter und kann nicht verbannt werden!</font></font>");
+ &reload_html;
+ exit;
+ } elsif ($hirachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2ban <font color=ffffff>ist Oberwächter und kann nicht verbannt werden!</font></font>");
+ &reload_html;
+ exit;
+ }
+ foreach $ban (@ban) {
+ if ($ban eq $alias2ban."\n") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2ban <font color=ffffff>ist bereits verbannt!</font></font>");
+ &reload_html;
+ exit;
+ }
+ }
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias verbannt \"$alias2ban\" aus dem Chat ...</font></i>");
+ open(BAN,">>data/ban");
+ print BAN $alias2ban."\n";
+ close BAN;
+ &reload_html;
+ exit;
+ }
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2ban <font color=ffffff>kann nicht verbannt werden da Benutzername nicht existiert!</font></font>");
+ &reload_html;
+ exit;
+ }
+#############>- ALIAS ENTBANNEN -<
+ } elsif ($cmd eq "rban") {
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ my $alias2rban = $cmd[1];
+ open(BAN,"<data/ban");
+ @ban = <BAN>;
+ close BAN;
+ foreach $ban (@ban) {
+ if ($ban eq $alias2rban."\n") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias entbannt \"$alias2rban\" ...</font></i>");
+ my @ban2;
+ foreach $ban (@ban) {
+ push(@wa2,$wa) if ($ban ne $alias2rban."\n");
+ }
+ open(BAN,">data/ban");
+ print BAN @ban2;
+ close BAN;
+ &reload_html;
+ exit;
+ }
+ }
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2rban <font color=ffffff>ist nicht verbannt!</font></font>");
+ &reload_html;
+ exit;
+ }
+#############>- IP # VON ALIAS ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "ip") {
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ my $alias2prove = $cmd[1];
+ opendir(DIR,"data/online/ident");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ if ($_ eq $alias2prove) {
+ open(DATEI,"<data/online/ident/$_");
+ local $ipnr = <DATEI>;
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$_ <font color=ffffff>hat die IP-Nummer $ipnr !</font></font>");
+ }
+ }
+ }
+ &reload_html;
+ exit;
+#############>- ALIAS AUS DEM CHAT KATAPULTIEREN -<
+ } elsif ($cmd eq "k") {
+ &hirachie($alias);
+ if ($hirachie eq "wa" || $hirachie eq "ow") {
+ my $alias2kick = $cmd[1];
+ opendir(DIR,"data/online/rooms");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach $raum (@dir) {
+ opendir(DIR,"data/online/rooms/$raum");
+ my @dir2 = readdir(DIR);
+ closedir(DIR);
+ foreach $chatter (@dir2) {
+ if ($chatter eq $alias2kick) {
+ &hirachie($alias2kick);
+ if ($hirachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist Oberwächter und kann nicht \"gekickt\" werden !</font></font>");
+ } elsif ($hirachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist Wächter und kann nicht \"gekickt\" werden !</font></font>");
+ } else {
+ &post_prv("$alias2kick","<script language=\"JavaScript\">window.open(\"index.pl?tmp=kick\",\"_top\");</script>");
+ &zeit;
+ $_ = undef if ($room eq $raum);
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias katapultiert \"$alias2kick\" aus dem Chat ...</font></i>",$raum);
+ &rm_alias($alias2kick,$raum);
+ &check_online;
+ }
+ &reload_html;
+ exit;
+ }
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist nicht anwesend und kann nicht \"gekickt\" werden !</font></font>");
+ }
+ &reload_html;
+ exit;
+#############>- EINEN BENUTZER AUS DEM SYSTEM LÖSCHEN -<
+ } elsif ($cmd eq "kill") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ my $alias2kill = $cmd[1];
+ &hirachie($alias2kill);
+ if ($hirachie eq "ow") {
+ &post_prv($alias,"<font size color=ffa500>$alias2kill</font> <font color=ffffff>ist Oberwächter und kann nicht aus dem System entfernt werden !</font>");
+ } elsif ($hirachie eq "wa") {
+ &post_prv($alias,"<font size color=ffa500>$alias2kill</font> <font color=ffffff>ist Wächter und kann nicht aus dem System entfernt werden !</font>");
+ } else {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias killt \"$alias2kill\" ganz und gar aus dem System ...</font></i>");
+ unlink("data/user/options/$alias2kill");
+ unlink("data/user/profiles/$alias2kill");
+ unlink("data/user/gbooks/$alias2kill");
+ unlink("data/user/counts/$alias2kill");
+ unlink("data/user/counts/$alias2kill.online");
+ unlink("data/user/lastlogin/$alias2kill");
+ unlink("data/user/memos/$alias2kill");
+ }
+ }
+ &reload_html;
+ exit;
+ #############>- IN EINEN ANDEREN RAUM HINEINRUFEN -<
+ } elsif ($cmd eq "ss") {
+ &hirachie($alias);
+ if ($hirachie eq "ow" || $hirachie eq "wa") {
+ my $ss_room = $cmd[1];
+ if (-e "data/online/rooms/$ss_room") {
+ my $ss_msg;
+ for ($i=2; $i <= $#cmd; $i++) {
+ $ss_msg = $ss_msg." ".$cmd[$i];
+ }
+ my $msg2scream = "\U$ss_msg";
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias ruft aus dem Raum \"$room\" hinein in den Raum \"$ss_room\": <font color=$col>$msg2scream</font> ...</font></i>",$ss_room);
+ &reload_html;
+ exit;
+ } else {
+ &post_prv($alias,"<font size=2 color=ffffff>Der Raum <font color=ffa500>$ss_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ exit;
+ }
+ #############>- SYSTEMNACHRICHT IN ALLE BESTEHENDEN RÄUME POSTEN -<
+ } elsif ($cmd eq "sys") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $sys_msg = $sys_msg." ".$cmd[$i];
+ }
+ &zeit;
+ &post_all("<i><font color=ffffff>($hours:$min:$sec)</font></i> <b><font size=2 color=red>SYSTEMNACHRICHT</font></b><i><font color=ffffff>: $sys_msg ...</font></i>");
+ }
+ &reload_html;
+ exit;
+#############>- ALIAS ZUM WÄCHTER ERNNENNEN -<
+ } elsif ($cmd eq "wa") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ my $alias2wa = $cmd[1];
+ &hirachie($alias2wa);
+ if ($hirachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2wa <font color=ffffff>ist bereits als Wächter eingetragen. Eine erneuerte Eintragung ist nicht möglich!</font></font>");
+ &reload_html;
+ exit;
+ } elsif ($hirachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2wa <font color=ffffff>ist bereits als Oberwächter eingetragen. Oberwächter können nicht gleichzeitig Wächter sein!</font></font>");
+ &reload_html;
+ exit;
+ }
+ if (-f "data/user/options/$alias2wa") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font><font color=ffa500> $alias ernennt \"$alias2wa\" zum Wächter ...</font></i>");
+ open(WA,">>data/wa");
+ print WA $alias2wa."\n";
+ close WA;
+ &reload_html;
+ exit;
+ }
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2wa <font color=ffffff>kann nicht zum Wächter ernannt werden da Benutzername nicht existiert!</font></font>");
+ &reload_html;
+ exit;
+ }
+#############>- ALIAS DIE WÄCHTERRECHTE ENTZIEHEN -<
+ } elsif ($cmd eq "rwa") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ my $alias2rwa = $cmd[1];
+ &hirachie($alias2rwa);
+ if ($hirachie eq "wa") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat \"$alias2rwa\" vom Wächter zum normalen Chatter degradiert ...</font></i>");
+ open(WA,"<data/wa");
+ @wa = <WA>;
+ close WA;
+ my @wa2;
+ foreach $wa (@wa) {
+ push(@wa2,$wa) if ($wa ne $alias2rwa."\n");
+ }
+ open(WA,">data/wa");
+ print WA @wa2;
+ close WA;
+ } else {
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2rwa <font color=ffffff>ist kein Wächter und können die Wächterrechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ exit;
+ }
+#############>- ADMINISTRATORBEFEHLE -<
+#############>- ALIAS ZUM OBERWÄCHTER ERNENNEN -<
+ } elsif ($cmd eq "ow" && $alias eq "Snooper") {
+ my $alias2ow = $cmd[1];
+ &hirachie($alias2ow);
+ if ($hirachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2ow <font color=ffffff>ist bereits als Wächter eingetragen. Wächter können nicht gleichzeitig Oberwächter sein!</font></font>");
+ &reload_html;
+ exit;
+ } elsif ($hirachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2ow <font color=ffffff>ist bereits als Oberwächter eingetragen!</font></font>");
+ &reload_html;
+ exit;
+ }
+ if (-f "data/user/options/$alias2ow") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font><font color=ffa500> $alias ernennt \"$alias2ow\" zum Oberwächter ...</font></i>");
+ open(OW,">>data/ow");
+ print OW $alias2ow."\n";
+ close OW;
+ &reload_html;
+ exit;
+ }
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2ow <font color=ffffff>kann nicht zum Oberwächter ernannt werden da Benutzername nicht existiert!</font></font>");
+ &reload_html;
+ exit;
+#############>- ALIAS DIE OBERWÄCHTERRECHTE ENTZIEHEN -<
+ } elsif ($cmd eq "row" && $alias eq "Snooper") {
+ &hirachie($alias);
+ if ($hirachie eq "ow") {
+ my $alias2row = $cmd[1];
+ &hirachie($alias2row);
+ if ($hirachie eq "ow") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat \"$alias2row\" vom Oberwächter zum normalen Chatter degradiert ...</font></i>");
+ open(OW,"<data/ow");
+ @ow = <OW>;
+ close OW;
+ my @ow2;
+ foreach $ow (@ow) {
+ push(@ow2,$ow) if ($ow ne $alias2row."\n");
+ }
+ open(OW,">data/ow");
+ print OW @ow2;
+ close OW;
+ } else {
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2row <font color=ffffff>ist kein Oberwächter und können die Wächterrechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ exit;
+ }
+#############>- PASSWORD EINES BENUTZERS ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "pw" && $alias eq "Snooper") {
+ my $pw2show = $cmd[1];
+ if (-f "data/user/options/$pw2show") {
+ open(PW,"<data/user/options/$pw2show");
+ @pw = <PW>;
+ close PW;
+ &post_prv($alias,"<font size=2 color=ffa500>$pw2show <font color=ffffff> hat das Passwort \"".$pw[0]."\" !</font></font>");
+ &reload_html;
+ exit;
+ }
+ &post_prv($alias,"<font size=2 color=ffa500>$pw2show <font color=ffffff> existiert nicht in der Benutzerdatenbank !</font></font>");
+ &reload_html;
+ exit;
+#############>- SYSTEMMELDUNG POSTEN -<
+ } elsif ($cmd eq "cool" && $alias eq "Snooper" || $alias eq "Peacemaker") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$msg2post</font></i>");
+ &reload_html;
+ exit;
+#############>- ENDE DER CHATBEFEHLE -<
+ }
+&post_prv($alias,"<font size=2 color=ffffff>Der Chatbefehl <font color=ffa500>/$cmd</font> existiert nicht oder Du hast keine Berechtigung diesen Befehl auszuführen!</font></font>");
+&reload_html;
+} \ No newline at end of file
diff --git a/0.4.4a3/main2.pl b/0.4.4a3/main2.pl
new file mode 100644
index 0000000..36a0012
--- /dev/null
+++ b/0.4.4a3/main2.pl
@@ -0,0 +1,594 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header();
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+
+$var = $q->param("var");
+if ($var eq "list_alias_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &list_alias_html;
+} elsif ($var eq "alias_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $tmp = $q->param("tmp");
+ &alias_html;
+} elsif ($var eq "edit_profile_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ &edit_html("edit_profile_html");
+} elsif ($var eq "edit_options_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ &edit_html("edit_options_html");
+} elsif ($var eq "gb_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &gb_html;
+} elsif ($var eq "post_gb") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $msg = $q->param("msg");
+ $tmp = $q->param("tmp");
+ $id = $q->param("id");
+ &post_gb;
+} elsif ($var eq "edit_profile") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ &secure_checkid($alias);
+ &edit("edit_profile");
+} elsif ($var eq "edit_options") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $tmp = $q->param("tmp");
+ $id = $q->param("id");
+ $room = $q->param("room");
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ &edit("edit_options");
+} elsif ($var eq "rm_gb_alias") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $tmp = $q->param("tmp");
+ $id = $q->param("id");
+ &rm_gb;
+} else {
+ &error("Parameter fehlt");
+}
+
+###########################
+##HAUPTTEIL DIESER DATEI:##
+###########################
+
+sub gb_html { # Das Benutzerboard/Gästebuch.
+ my $message = $_[0];
+ &start_html("Benutzerboard");
+if ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </i>
+ einen Text und poste
+ <u>dann</u>
+ !
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Vielen Dank für Deinen Beitrag. Wenn Du willst, kannst Du jetzt gleich noch einen Eintrag posten ...
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Falls Du Anregungen oder Verbesserungsvorschläge für die Community hast, dann poste doch einen kleinen Eintrag :-)
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="guestbook">
+ <input type="hidden" name="id" value="y">
+ <input size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+ if (-e "data/guestbook") {
+ open (DATEI,"<data/guestbook") || &error("Konnte dat/guestbook nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ print
+ $q->div(@datei);
+ }
+ print
+ $q->end_html;
+}
+
+
+sub post_gb { # Wenn etwas in ein Gästebuch eingetragen wird
+ &zeit;
+ if ($msg eq "") {
+ if ($id eq "y") { # Überprüfen, ob Benutzerboard- oder Privatgästebuch
+ &gb_html("post_empty");
+ } else {
+ &alias_html("post_empty");
+ }
+ exit;
+ }
+ $msg =~ s#<#&lt\;#g;
+ my $tmpath = "";
+ if ($id eq "y") {
+ $tmpath = "data/guestbook";
+ } else {
+ $tmpath = "data/user/gbooks/$tmp";
+ }
+ open(GB,"$tmpath");
+ my @gb = <GB>;
+ close GB;
+ pop(@gb) if ($#gb > 99);
+ my @newdatei = "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ push(@newdatei,@gb);
+ open(GB,">$tmpath");
+ print GB @newdatei;
+ close GB;
+ if ($id eq "y") {
+ &gb_html("post_ok");
+ exit;
+ } else {
+ post_prv("$tmp","<font size=2 color=ffffff><a href=\"main2.pl?alias=$alias&var=alias_html&tmp=$tmp&tmpid=$tmpid\" target=\"_new\">$alias</a> hat soeben einen Pin in <a href=\"main2.pl?alias=$alias&var=alias_html&tmp=$tmp&tmpid=$tmpid\" target=\"_new\">Dein Profil</a> gehängt ... </font>");
+ &alias_html;
+ exit;
+ }
+}
+
+sub rm_gb { # Gästebucheintrag entfernen
+ open(GB,"<data/user/gbooks/$alias");
+ my @gbfile = <GB>;
+ close GB;
+ my @newgbfile = ();
+ for ($i=0; $i <= $#gbfile; $i++) {
+ push(@newgbfile,$gbfile[$i]) if ($i != $id);
+ }
+ open(GB,">data/user/gbooks/$alias");
+ print GB @newgbfile;
+ close GB;
+ &alias_html("rm_ok");
+}
+
+sub list_alias_html { # Liste aller Benutzer
+ &start_html("Alle Benutzer");
+ opendir(REGISTERED,"data/user/options");
+ my @users = readdir(REGISTERED);
+ closedir(REGISTERED);
+ my @liste = sort(@users);
+ my $nr = $#users-1;
+print <<END;
+ <div>
+ Es sind z.Z. genau $nr Benutzernamen in der Datenbank vorhanden! (Sortiert nach #, A-Z, a-z)
+ </div>
+ <hr>
+ <div>
+END
+ foreach(@liste) {
+ if (-f "data/user/options/$_") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid" },
+ "$_"),
+ " ";
+ }
+ }
+print <<END;
+ </div>
+</body>
+</html>
+END
+}
+
+sub alias_html { # Anzeigen eines Benutzerprofils
+ my $message = $_[0];
+ open(COUNTS,"<data/user/counts/$tmp");
+ local $counter = <COUNTS>;
+ close COUNTS;
+ $counter++;
+ open(COUNTS,">data/user/counts/$tmp");
+ print COUNTS $counter;
+ close COUNTS;
+ &start_html($tmp);
+print <<END;
+<div>
+ <a href="htdocs.pl?var=werda_html&alias=$alias&tmpid=$tmpid">Hier</a>
+ gehts zur Gesamtübersicht !
+</div>
+<hr>
+END
+if ($message eq "rm_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Der von Dir gewählte Eintrag wurde erfolgreich gelöscht.
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </u>
+ einen Text und poste
+ <u>dann</u>
+ !
+ <hr>
+END
+}
+ open(PROFILE,"<data/user/profiles/$tmp");
+ @data = <PROFILE>;
+ close PROFILE;
+print <<END;
+ <div>
+ Dieses Profil wurde insgesamt schon $counter mal aufgerufen !
+ <br>
+ <br>
+ Alias: $tmp
+ <br>
+ <br>
+ Nachname: $data[0]
+ <br>
+ <br>
+ Vorname: $data[1]
+ <br>
+ <br>
+ Alter: $data[2]
+ <br>
+ <br>
+ Wohnort: $data[3]
+ <br>
+ <br>
+ E-Mail:
+ <a href="mailto:$data[4]">$data[4]</a>
+ <br>
+ <br>
+ ICQ-Nummer: $data[5]
+ <br>
+ <br>
+ Homepage:
+ <a href="$data[6]" target="_new">$data[6]</a>
+ <br>
+ <br>
+ Weiteres:
+ <br>
+ $data[7]
+ <hr>
+ Hier kannst Du $tmp eine Nachricht hinterlassen!
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input type="text" size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+if (-e "data/user/gbooks/$tmp") {
+ open (DATEI,"<data/user/gbooks/$tmp") || &error("Konnte data/user/gbooks/$tmp nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ if ($alias ne $tmp) {
+ print @datei;
+ } else {
+print <<END;
+ <table>
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="rm_gb_alias">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="$tmp">
+END
+for($i=0; $i <= $#datei; $i++) {
+print <<END;
+ <tr>
+ <td>
+ <input type="radio" name="id" value="$i">
+ </td>
+ <td>
+ <div class=q>
+ $datei[$i]
+ </div>
+ </td>
+ </tr>
+END
+}
+print <<END;
+ </table>
+ <table>
+ <tr>
+ <td>
+ <font color=ffffff>
+ <input type="submit" value="Makierten Eintrag löschen">
+ </font>
+ </td>
+ <td>
+ <font color=ffffff>
+ <input type="reset" value="Makierung rückgängig machen">
+ </font>
+ </td>
+ </tr>
+ </table>
+ </form>
+END
+}
+}
+ print
+ $q->end_html;
+}
+
+sub edit_html { # Chat-Optionen / Benutzerprofil editieren
+ my ($method,$message) = @_;
+ &start_html("Benutzerprofil ändern");
+ if ($method eq "edit_options_html") {
+ open(DATEI,"<data/user/options/$alias");
+ } elsif ($method eq "edit_profile_html") {
+ open(DATEI,"<data/user/profiles/$alias");
+ }
+ @data = <DATEI>;
+ close DATEI;
+ if ($method eq "edit_options_html") {
+ chomp($data[0]);
+ if ($message eq "edit_options_ok") {
+print <<END;
+<script language="JavaScript">
+ open("main.pl?var=change_colors&alias=$alias&col=$col&secol=$secol&tmpid=$tmpid","reload");
+ open("htdocs.pl?var=menu_html&alias=$alias&room=$room&col=$col&secol=$secol&tmpid=$tmpid","menu");
+</script>
+<div class=b>
+ Hinweis:
+</div>
+<div>
+ Du hast soeben Deine Chat-Optionen erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren. Um
+ weiterzuchatten einfach Fenster schliessen!
+</div>
+<hr>
+END
+ } elsif ($message eq "edit_pw_wrong") {
+print <<END;
+<div class=b>
+ ACHTUNG!
+</div>
+<div>
+ Du hast soeben versucht, dein Passwort zu ändern. Jedoch stimmte die Erste Eingabe nicht mit der Zweiten überein.
+ Bitte versuch es erneuert ...
+</div>
+<hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Deine Chat-Optionen editieren!" ),
+ $q->hr;
+ }
+print <<END;
+<script lang="javascript" type="text/javascript">
+<!--
+
+function radioWert(rObj) {
+ for (var i=0; i<rObj.length; i++) if (rObj[i].checked) return rObj[i].value;
+ return false;
+}
+
+function insertcode( code ) {
+ document.optionen.elements[radioWert(document.optionen.eingabe)].value = code;
+}
+
+//-->
+</script>
+
+<form name="optionen" action="main2.pl">
+ <input type="hidden" name="var" value="edit_options">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Passwort
+ <font color=ffa500>
+ (Gut merken !!)
+ </font>
+ <br>
+ <input type="password" name="id" value="$data[0]">
+ </div>
+ </td>
+ <td width=20>
+ </td>
+ <td>
+ <div>
+ Geb hier das Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp" value="$data[0]">
+ </div>
+ </td>
+ </tr>
+ </table>
+<br>
+<br>
+ <table>
+ <tr>
+ <td>
+ <div>
+ <input type="radio" name="eingabe" value="col" checked>
+ Auswahl von Farbe 1
+ <br>
+ (Farbe Deines Nicks):
+ <br>
+ <input name="col" size="6" maxlength="6" value="$data[1]">
+ </div>
+ </td>
+ <td width=20>
+ </td>
+ <td>
+ <div>
+ <input type="radio" name="eingabe" value="secol">
+ Auswahl von Farbe 2
+ <br>
+ (Farbe Deiner Nachrichten):
+ <br>
+ <input name="secol" size="6" maxlength="6" value="$data[2]">
+ </div>
+ </td>
+ </tr>
+ </table>
+<br>
+ <div>
+ Beliebige Auswahl makieren und Farbe wählen. Um Deine Optionen abzuspeichern,
+ auf "Daten ändern" klicken!
+ </div>
+ <br>
+END
+ open(COLORS,"<colors.sno");
+ @colors = <COLORS>;
+ close COLORS;
+ print @colors;
+ } elsif ($method eq "edit_profile_html") {
+ if ($message eq "edit_profile_ok") {
+print <<END;
+ <div class=b>
+ Hinweis:
+ </div>
+ <div>
+ Du hast soeben Dein Profil erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren:
+ <hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Dein Profil editieren!" ),
+ $q->hr;
+ }
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="edit_profile">
+ <div>
+ Dein Nachname:
+ <br>
+ <input name="nachname" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ Dein Vorname:
+ <br>
+ <input name="vorname" value="$data[1]">
+ </div>
+ <br>
+ <div>
+ Dein Alter:
+ <br>
+ <input name="alter" value="$data[2]">
+ </div>
+ <br>
+ <div>
+ Dein Wohnort:
+ <br>
+ <input name="wohnort" value="$data[3]">
+ </div>
+ <br>
+ <div>
+ Deine E-Mail Adresse:
+ <br>
+ <input name="email" value="$data[4]">
+ </div>
+ <br>
+ <div>
+ Deine ICQ-Nummer:
+ <br>
+ <input name="icq" value="$data[5]">
+ </div>
+ <br>
+ <div>
+ Deine Homepage:
+ <br>
+ <input name="homepage" value="$data[6]">
+ </div>
+ <br>
+ <div>
+ Weiteres:
+ <br>
+ <textarea rows="5" cols="40"name="weiteres" wrap="virtual">$data[7]</textarea>
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <font color=ffffff>
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="room" value="$room">
+ <input type="submit" value="Daten ändern ...">
+ </font>
+ </form>
+</body>
+</html>
+END
+}
+
+
+sub edit { # Benutzerprofil od. Chat-Optionen abspeichern
+ my $method = $_[0];
+ &zeit;
+ if ($method eq "edit_profile") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat sein Profil geändert ...</font></i>");
+ open(PROFILE,">data/user/profiles/$alias");
+ print PROFILE $q->param('nachname')."\n".$q->param('vorname')."\n".$q->param('alter')."\n".$q->param('wohnort')."\n".$q->param('email')."\n".$q->param('icq')."\n".$q->param('homepage')."\n".$q->param('weiteres');
+ close PROFILE;
+ &edit_html("edit_profile_html","edit_profile_ok");
+ } elsif ($method eq "edit_options") {
+ if ($id ne $tmp) {
+ &edit_html("edit_options_html","edit_pw_wrong");
+ exit;
+ }
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat seine Chateinstellungen geändert ...</font></i>");
+ open(OPTIONS,">data/user/options/$alias");
+ print OPTIONS $id."\n".$col."\n".$secol;
+ close OPTIONS;
+ &edit_html("edit_options_html","edit_options_ok");
+ }
+}
diff --git a/0.4.4a3/online.pl b/0.4.4a3/online.pl
new file mode 100644
index 0000000..b6346c5
--- /dev/null
+++ b/0.4.4a3/online.pl
@@ -0,0 +1,71 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header();
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+$room = $q->param("room");
+
+&secure_checkid($alias);
+
+# Onlinezeit zählen !
+open(DATEI,"<data/online/users/$alias");
+ my $oldstamp = <DATEI>;
+close DATEI;
+ if ($oldstamp > (time - 60)) {
+ open(DATEI,"<data/user/counts/$alias.online");
+ my $online = <DATEI>;
+ close DATEI;
+ my $total = (time-$oldstamp+$online);
+ open(DATEI,">data/user/counts/$alias.online");
+ print DATEI $total;
+ close DATEI;
+ }
+##### ENDE
+
+&start_html("Online","online");
+&online($alias,$room);
+opendir(ROOMS,"data/online/rooms/".$room);
+ my @rooms = readdir(ROOMS);
+closedir(ROOMS);
+print
+ $q->div( "$room:" ),
+ "<font size=1 color=ffffef face=arial>";
+ foreach $online (@rooms) {
+ if (-f "data/online/rooms/$room/$online") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$online&tmpid=$tmpid",
+ -target=>"$online" }, "$online"), $q->br;
+ }
+ }
+print
+ "</font>",
+ $q->end_html;
+
+sub online { # Benutzer in die Onlineliste hinzufügen bzw. erneuern
+ my ($alias,$room) = @_;
+ open(DATEI,">data/online/users/$alias");
+ print DATEI time;
+ close DATEI;
+ if (-f "data/online/rooms/$room") { } else { mkdir "data/online/rooms/$room", 0777; }
+ if (-f "data/online/rstat/$room") { } else {
+ open(DATEI,">data/online/rstat/$room"); # Raumbesetzerstatus setzen
+ print DATEI "0\n\n$alias\n";
+ close DATEI;
+ }
+ open(DATEI,">data/online/rooms/$room/$alias");
+ print DATEI time;
+ close DATEI;
+ open(DATEI,"<data/online/prove"); # Räume und Chatter auf Existenz überprüfen
+ my $provetime = <DATEI>;
+ close DATEI;
+ if ($provetime < (time - 30)) {
+ &check_online;
+ }
+} \ No newline at end of file
diff --git a/0.4.4a3/push.pl b/0.4.4a3/push.pl
new file mode 100644
index 0000000..bb420f6
--- /dev/null
+++ b/0.4.4a3/push.pl
@@ -0,0 +1,96 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+CGI->compile(':all');
+$q = new CGI;
+print
+ $q->header;
+require config;
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+&secure_checkid($alias);
+
+########################################
+##ANFANG DER ZU STREAMENDEN HTML-DATEI##
+########################################
+
+print <<END;
+<html>
+ <head>
+<script language="JavaScript">
+<!--
+// Scroll-Routine von Anklepper (http://www.anklepper.de)
+// speziell für yChat (http://www.yChat.de), Copyright 2000
+scrolling = true;
+moves_steps = 4; // Schrittgröße
+moves_interval = 4; // Schrittgeschwindigkeit
+
+function moves()
+{
+ if( scrolling != false )
+ window.scrollBy( 0, moves_steps );
+ window.setTimeout( "moves()", moves_interval );
+}
+
+moves();
+//-->
+</script>
+ </head>
+<body bgcolor=000000 link=FFFFFF alink=FFFFEF vlink=FFFFEF>
+END
+
+#############################
+##BEGRÜSSUNGSTEXT SCHREIBEN##
+#############################
+
+my $msgfile;
+
+print
+ $q->font( { -size=>1,
+ -color=>"ffffff",
+ -face=>"arial"},
+ "$title - Created & Copyright by Paul C. Bütow $tmp\n");
+
+if (-f "data/user/memos/$alias") {
+ print "\n<br>";
+ open(MEMOS,"<data/user/memos/$alias");
+ my $memos = <MEMOS>;
+ close MEMOS;
+ print $memos;
+ unlink("data/user/memos/$alias");
+}
+
+my $msgfile = "data/msgs/$alias";
+open(MSG,">$msgfile");
+ print MSG $q->br;
+close MSG;
+print $q->br;
+
+###############################
+##ENDLOSSCHLEIFE FÜR DEN PUSH##
+###############################
+
+my ($times,$online) = (0,"false");
+open(MSGFILE,$msgfile);
+for (;;) {
+ for ($curpos = tell(MSGFILE); <MSGFILE>; $curpos = tell(MSGFILE)) {
+ print $_ ;
+ }
+ $times++;
+ if ($times > 14) {
+ print "\n<!--PING//-->";
+ $times = 0;
+ $online = "true" if (-e "data/online/users/$alias");
+ if ($online eq "false") {
+ print "<font size=2 color=red>Aus technischen Gründen bitte auf <a href=\"push.pl?alias=$alias&room=$room&var=clear_screen&tmpid=$tmpid\">Weiterchatten</a> klicken.</font>";
+ exit;
+ }
+ $online = "false"
+ }
+ sleep 1;
+ seek(MSGFILE, $curpos, 0); # Position wiederherstellen
+}
+
diff --git a/0.4.4a3/setup.sh b/0.4.4a3/setup.sh
new file mode 100644
index 0000000..b3706b6
--- /dev/null
+++ b/0.4.4a3/setup.sh
@@ -0,0 +1,46 @@
+#!/bin/sh
+echo
+echo yChat wird konfiguriert!
+echo
+mkdir data
+chmod 777 data
+mkdir data/logs
+chmod 777 data/logs
+mkdir data/msgs
+chmod 777 data/msgs
+mkdir data/user
+chmod 777 data/user
+mkdir data/user/counts
+chmod 777 data/user/counts
+mkdir data/user/memos
+chmod 777 data/user/memos
+mkdir data/user/options
+chmod 777 data/user/options
+mkdir data/user/profiles
+chmod 777 data/user/profiles
+mkdir data/user/gbooks
+chmod 777 data/user/gbooks
+mkdir data/user/lastlogin
+chmod 777 data/user/lastlogin
+mkdir data/online
+chmod 777 data/online
+mkdir data/online/rooms
+chmod 777 data/online/rooms
+mkdir data/online/rstat
+chmod 777 data/online/rstat
+mkdir data/online/users
+chmod 777 data/online/users
+mkdir data/online/ident
+chmod 777 data/online/ident
+chmod 777 data/htdocs/*
+chmod 777 *.pl
+chmod 777 config.pm
+mkdir dokus/
+mv *.txt dokus/
+mkdir ../../htdocs/yChat/
+mv *.gif ../../htdocs/yChat/
+echo
+echo yChat Setup beendet ...
+echo Created and Copyright by Paul C. Bütow
+echo
+
diff --git a/0.4.4a3/y.gif b/0.4.4a3/y.gif
new file mode 100644
index 0000000..356175d
--- /dev/null
+++ b/0.4.4a3/y.gif
Binary files differ
diff --git a/0.4.4a3/y_.gif b/0.4.4a3/y_.gif
new file mode 100644
index 0000000..f8b6ee5
--- /dev/null
+++ b/0.4.4a3/y_.gif
Binary files differ
diff --git a/0.4.5a/CREDITS.txt b/0.4.5a/CREDITS.txt
new file mode 100644
index 0000000..b520354
--- /dev/null
+++ b/0.4.5a/CREDITS.txt
@@ -0,0 +1,21 @@
+########################### yChat.de CREDITS ################################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+Vielen Dank an alle Personen, dir mit geholfen haben ( und immernoch helfen )
+yChat besser zu machen:
+
+ - Andreas Buchwald aka Anklepper, für die Programmierung des
+ "Nach-UntenScroll-JavaScripts", des "Ferlaufform-JavaScripts" im
+ Texteingabeframe und für die technische Umsetzung, daß sich das
+ Inputframe bei jedem Textposting nicht wieder reloadet.
+ Für ein nettes JavaScript, welches erlaubt, Formularwerte
+ frameübergreifend zu ändern.
+ Für die Erstellung der Flashanimationen.
+ ( www.anklepper.de ).
+
+ - Dave aka Truhe, für die Erstellung der Farbtabelle unter Chatoptionen inkl.
+ Auswähl-JavaScript!
+ ( maligree.yi.org )
+
+ - Larry Wall, für die Erfindung von Perl ! \ No newline at end of file
diff --git a/0.4.5a/README.txt b/0.4.5a/README.txt
new file mode 100644
index 0000000..2e943ff
--- /dev/null
+++ b/0.4.5a/README.txt
@@ -0,0 +1,36 @@
+############################## yChat.de README ##############################
+## Copyright by Paul C. Bütow 200 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+Allgemeine Bedingungen bezgl. yChat:
+
+ - Das yChat-System darf ohne Erleubnis des Autors nicht auf irgendeiner Art
+ und Weise weitergegeben- oder eingesetzt werden.
+
+ - Wird das yChat-System eingesetzt, so darf es manipuliert werden, soweit
+ die Copyright-Hinweise des Autors, die Versionsbezeichnung und der Link
+ auf der Startseite nach servers.yChat.de unverändert bleibt.
+ Ansonsten darf der gesamte Code manipuliert werden.
+
+ - Wird das yChat-System erlaubter Weise manipuliert, so muß das veränderte
+ Skript auf Anforderung an den Autor weitergegeben werden. Dieser darf
+ die Veränderungen in das Standard-yChat-System integrieren.
+
+ - Wird das yChat-System eingesetzt, su muß dem Autor die Location bzw. die
+ URL bekanntgegeben werden. Diese wird in servers.yChat.de eingetragen.
+ und mit einer URL wwX.yChat.de verlinkt. Wobei X für die Nummer des jew.
+ Servers steht.
+
+ - Es ist verboten, Sourcecode aus dem yChat-System zu kopieren und
+ für andere, nicht von yChat abhängige Perl-Programme einzusetzen.
+
+Im Flogenden einige yChat-bezügl. Verknüpfungen:
+
+ www.credits.yChat.de => Creditsliste
+ www.download.yChat.de => Das Skript zum downloaden
+ www.readme.yChat.de => Allgemeine Bedingungen usw.
+ www.servers.yChat.de => Liste aller laufenden yChat-Systeme
+ www.setup.yChat.de => Installationsdokumentation
+ www.todo.yChat.de => Funktionen, die später integriert werden
+ www.updates.yChat.de => Update-Liste
+ www.yChat.de => Das Skript im Einsatz
diff --git a/0.4.5a/SETUP.txt b/0.4.5a/SETUP.txt
new file mode 100644
index 0000000..dc93551
--- /dev/null
+++ b/0.4.5a/SETUP.txt
@@ -0,0 +1,133 @@
+############################## yChat.de SETUP ###############################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+yChat findest Du im Internet unter der Adresse www.yChat.de. Bei Kritik,
+Anregungen oder Fragen bitte in das dort vorhandene Board posten oder eine
+E-Mail an die oben stehende Adresse senden. Ich bemühe mich, yChat so gut wie
+möglich zu machen und bin über Ratschläge immer sehr erfreut :-) ...
+
+Die Installation kann auf Unix-Systemen voll automatisch duchgeführt werden.
+Allerdings ist dafür ein Telnet-Zugang notwendig. Kopiere alle vorhandenen
+Dateien in das Verzeichnis cgi-bin/yChat und führe dann das Shellskript
+setup.sh mit dem Befehl ./setup.sh aus. Alle Verzeichnisse werden
+automatisch erstellt. Dies wurde allerdings nur auf SuSE Linux Systemen
+mit root-Zugriff getestet. Solltest Du ein anderes System verwenden oder
+den Chat auf einen virtuellen Webserver installieren wollen, dann mußt Du
+unter Umständen das Verzeichnis "../../htdocs/yChat" nach "../../yChat"
+in der setup.sh umbenennen. Ansonsten werden die dazugehörigen Grafikdateien
+falsch oder garnicht kopiert.
+
+Wenn Du keinen Telnet-Zugang hast, kannst Du hier die Verzeichnisse manuell
+einrichten:
+
+Folgende Basis-Dateien sind im Chat enthalten und müssen in das cgi-bin
+Verzeichnis kopiert werden. Z.B. nach ./cgi-bin/yChat/:
+
+config.pm => Configurationsdatei ("Shared subs")
+htdocs.pl => Generiert dynamische HTML-Inhalte
+index.pl => Startskript (Registrierung, Login, Chatframeset)
+input.pl => Skript für das Chateingabeframe
+main.pl => Hauptskript (Alle Hauptfunktionen des Chats)
+main2.pl => Skript für editieren der Benutzerdaten etc
+online.pl => Anzeige und Überprüfung der eingelogten Benutzer
+push.pl => Server-Push-Routine
+setup.sh => Dient zur automatischen Einrichtung des Chats
+README.txt => Beinhaltet wichtige Informationen
+UPDATES.txt => Updateliste der verschiedenen Versionen
+CREDITS.txt => Personen, die geolfen haben yChat zu proggen
+SETUP.txt => Dieses Dokument
+colors.sno => Datei beinhaltet alle Farben in hex. für die Chatoptionen
+help.sno => Datei beinhaltet alle Chatbefehle
+
+Folgende Verzeichnisse müssen erstellt werden (chmod 777 sollte
+funktionieren):
+
+- Hier befinden sich alle für den Chat notwenidgen Daten:
+ ./cgi-bin/yChat/data/*
+
+- Hier befinden sich alle Logdateien, die vom Chat erstellt werden:
+ ./cgi-bin/yChat/data/logs/*
+
+- Hier befinden sich die Message-Dateien der eingelogten Benutzer:
+ ./cgi-bin/yChat/data/msgs/*
+
+- Hier befinden sich alle Daten der registrierten Benutzer:
+ ./cgi-bin/yChat/data/user/*
+
+- Hier wird abgespeichert, wie oft ein Benutzerprofil insgesant schon
+ aufgerufen wurde und wie lange die Chatter schon online waren:
+ ./cgi-bin/yChat/data/user/counts/*
+
+- Hier werden alle Memos abgespeichert.
+ ./cgi-bin/yChat/data/user/memos/*
+
+- Hier befinden sich alle Chat-Optionen und Passwörter der registrierten
+ Benutzer:
+ ./cgi-bin/yChat/data/user/options/*
+
+- Hier befinden sich alle Benutzerprofile der Benutzer:
+ ./cgi-bin/yChat/data/user/profiles/*
+
+- Hier befinden sich alle Gästebucheinträge der Benutzer:
+ ./cgi-bin/yChat/data/user/gbooks/*
+
+- Hier wird abgespeichert, wann der der jew. benutzer zum letzten mal das
+ System betreten hat.
+ ./cgi-bin/yChat/data/user/lastlogin/*
+
+- Hier befinden sich alle Daten zu den aktuellen Chaträumen und User die
+ online sind
+ ./cgi-bin/yChat/data/online/*
+
+- Hier befinden sich alle offnenen Räume
+ ./cgi-bin/yChat/data/online/rooms/*
+
+- Hier befinden sich die Chatter, die sich in den jew. Räumen befinden. Die
+ Verzeichnisse der Räume werden automatisch erstellt.
+ ./cgi-bin/yChat/data/online/rooms/RAUMNAME/*
+
+- Hier befinden sich alle Chatter, die sich z.Z. im System befinden
+ ./cgi-bin/yChat/data/online/users/*
+
+- Hier befinden sich alle IP-Nummern und TempIDs der eingelogten Chatter
+ ./cgi-bin/yChat/data/online/ident/*
+
+Alle Grafikdateien (+.gif und *.jpg) sollten in ein nicht-CGI-BIN-Verzeichnis
+kopiert werden. Z.B. nach ./yChat/.
+
+Zum schluß sollte die config.pm-Datei nach wünschen editiert werden.
+Allerdings sollten die Copyright Hinweise und die Versionsnummern nicht
+manipuliert werden.
+
+Im Folgendem werde ich ein wenig auf die im yChat-Sourcecode oft verwendeten .
+Variablen eingehen:
+
+ $var => Sagt dem Skript, wie es gestartet werden soll.
+ $alias => Teilt dem Skript den Benutzername mit.
+ $tmpid => Beim einloggen in den Chat wird für den Benutzer eine
+ temporäre ID generiert. Diese wird so wohl in der Variable
+ $tmpid als auch in eine Datei geschrieben. Handelt der
+ Benutzer, so wird vom Skript die Variable $tmpid mit dem
+ Eintrag in der Datei verglichen. Sind beide Werte
+ identisch, dann wird die Handlung des Benutzers
+ ausgeführt. Stimmen die Werte nicht überein, dann wird
+ die Fehlermeldung, daß der Benutzer die falsche $tmpid hat
+ um mit $alias zu handeln,ausgegeben und das Skript beendet
+ sich. Dies ist eine Sicherheitsmaßnahme welche verbietet,
+ mit fremden Benutzernamen im System zu handeln.
+ $room => Sagt dem Skript, wie der aktuelle Raumname lautet.
+ $col => Sagt dem Skript, wie die aktuelle Chatfarbe des Nicks von
+ $alias lautet.
+ $seccol => Sagt dem Skript, wie die aktuelle Chatfarbe der Schrift von
+ $alias lautet.
+ $msg => Beinhaltet den von $alias zu postenden Text im Chat.
+ Hiervon wird auch in den Benutzergästebüchern und im
+ Benutzerboard Gebrauch gemacht.
+ $whisper => Beinhaltet den Benutzernamen, zu dem $alias zuletzt
+ geflüstert hat.
+ $id und $tmp => Temporäre Variablen zwecks Übermittlung diverser Daten.
+ $pw => Wird im Skript index.pl verwendet um das Zugangspassword
+ zu übermitteln.
+
+Viel Spaß beim Chatten ... \ No newline at end of file
diff --git a/0.4.5a/TODO.txt b/0.4.5a/TODO.txt
new file mode 100644
index 0000000..8c9c445
--- /dev/null
+++ b/0.4.5a/TODO.txt
@@ -0,0 +1,33 @@
+############################## yChat.de TODO ################################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+Folgende Funktionen werden demnächst in yChat integriert:
+
+ - Nach 5 Minuten Inaktivität soll der Benutzer automatisch
+ auf "away" gesetzt werden.
+ Nach 20 Minuten Inaktivität soll der Benutzer automatisch
+ aus dem System ausgelogt werden.
+
+ - Die Schlucht (Ein Raum wo Chatter hineingeworfen werden,
+ die sich nicht benehmen und noch nicht aus dem Chat
+ katapultiert werden sollen).
+
+ - Löschung aller Chatter, die sich seit 60 Tagen nicht mehr
+ eingelogt haben.
+
+ - IP-Adressen ver-/entbannen.
+
+ - E-Mail zusendung bei verlorenem Passwort.
+
+ - Eine Top 20 (Onlinezeit) der Chatter
+
+ - Unter "Benutzer" sollen Chatter über eine Eingabemaske nach
+ dem Anfangsbuchstaben gesucht werden können (vergl. Kilahu).
+
+ - Der Cybarkeeper (künstlich intilligenter Chatroboter, der
+ sich im Hauptraum Cyberbar aufhält, virtuelle Drinks verteilt
+ und von Real-Chattern übernommen werden kann. (Zukunftsmusik)
+
+Für weitere Vorschläge bitte in das yChat-Board unter www.yChat.de
+texten oder eine E-Mail an paul@buetow.oxg.de :-) \ No newline at end of file
diff --git a/0.4.5a/UPDATES.txt b/0.4.5a/UPDATES.txt
new file mode 100644
index 0000000..c254a53
--- /dev/null
+++ b/0.4.5a/UPDATES.txt
@@ -0,0 +1,162 @@
+########################### yChat.de UPDATE LIST ###########################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+Hier sind alle Erneuerungen der Versionen dokumentiert:
+
+Update von 0.4.4 auf 0.4.5 (16.01.01)
+ - Jeder Chatraum hat nun eine globale Nachrichtendatei. Bisher
+ existierte für jeden Chatter enzelnd eine. Die Nachrichten werden
+ nun schneller gepostet.
+ - Neue Wächterbefehle:
+ "/st Raum Thema" ermöglicht das Ändern das Themas eines anderen
+ Raums.
+ "/sl Raum" ermöglicht das auf- und absperren eines anderen Raums.
+ - Nur noch Oberwächter können die Chatlogs lesen.
+ - Referenzierung der Variable $msg in main.pl.
+ - Flashanimationen.
+
+Update von 0.4.3 auf 0.4.4 (04.01.01)
+ - Optimiertung aller Chatbefehle.
+ - Neuer WÄ-Befehl: Mit "/ss Raum Nachricht" wird aus dem aktuellen
+ Raum heraus in den angegebenen Raum eine beliebige Nachricht
+ gerufen.
+ - Das Skript main.pl wurde in zwei verschiedene Skripts unterteilt:
+ main.pl => Beinhaltet hauptsächlich die Chatbefehle
+ input.pl => Beinhaltet das zu generierende Chateingabeframe.
+ - Das Chateingabeframe wird nun nie wieder reloadet. (Dies geschah
+ bisher noch nach Ausführung der Befehle /col /j /ju /msg und nach
+ Änderung der Chateinstellungen und erwies sich als recht nervige
+ Angelegenheit.) JavaScript macht es möglich.
+ - Überarbeitung und Erweiterung der Dokudateien.
+
+Update von 0.4.2 auf 0.4.3 (30.12.2k)
+ - Optimierung der Zuweisung der Variabeln im Programmcode:
+ Variablen werden nun wirklich nur deffiniert, wenn diese auch
+ erforderlich sind.
+ - Komplette Neuprogrammierung diverser Subs (nun leistungsfähiger)
+ - Bei Aufrug der Login-Seite wird der gesamte Chat auf leerstehende
+ Räume und "alte" Chatter überprüft und ggf. entfernt.
+ - Verbesserung diverser JavaScript-Codes.
+ - Editiert ein Benutzer sein Profil, so wird dies mit der Meldung
+ "Alias hat sein Profil geändert ..." bekanntgegeben.
+ - Mit "/t" ohne weiteren Text erscheint die Nachricht "Alias hat das
+ Thema des Raums gelöscht ..."
+ - Hinzufügung diverser Administratorbefehle: "/pw Alias" zeigt
+ Zugangspassword von Alias an. "/ow Alias" ernennt Alias zum OW.
+ "/row Alias" entzieht Alias die OW-Rechte.
+
+Update von 0.4.1 auf 0.4.2 (25.12.2k)
+ - Im Texteingabeformular werden nun per JavaScript die letzten 10
+ Postings zwischengespeichert und können per Drop-Down-Menü
+ wieder in das Submittextfeld geladen werden um erneuert getextet
+ zu werden.
+ - Neues Design.
+ - Diverse Dateien wurden umbenannt:
+ INSTALL.txt -> SETUP.txt
+ LIESMICH.txt -> README.txt
+ - Die Datei CREDITS.txt wurde angelegt und somit auch die URL
+ www.credits.yChat.de.
+
+Update von 0.4.0 auf 0.4.1 (22.12.2k)
+ - Design wurde geändert.
+ - Unter "Optionen" ist nun eine komplette Farbtabelle eingebaut.
+ - Folgende Oberwächterbefehle wurden nun auch für normale Wächter
+ freigegeben: /ip /ban /rban.
+
+Update von 0.2.6 auf 0.4.0 (19.12.2k)
+ - Der berüchtigte "IP-Bug" wurde beseitigt! Und zwar wurden TempIDs
+ eingeführt => Eine dauerhafte Überprüfung der Benutzer-IP-Nummer
+ ist also nicht mehr notwendig.
+ - Die totale Chat-Online-Zeit wird protokolliert und kann jew. mit
+ "/online Alias" aufgerufen werden. Die Onlinezeit wird alle 20 Sek.
+ aktualisiert.
+ - Neue Befehle: "/seen Alias" zeigt an, vor wieviel St. sich Alias
+ zuletzt in das System eingelogt hat. Der Befehle "/rmgb" entfernt
+ alle Einträge des eigenen Benutzergästebuchs im Profil.
+
+Update von 0.2.5 auf 0.2.6 (17.12.2k)
+ - Das Eingabeframe reloaded sich nicht mehr nach jedem Posting.
+ Vielen Dank an Truhe aka Dave und Klepper aka Andreas Buchwald!
+ Bei den Chatbefehlen /col /away /j und /ju muß sich das
+ Eingabeframe weiterhin reloaden.
+ - Der Befehl // wurde entfernt. Dieser war nicht mehr erforderlich.
+ weil Nachrichten werden nur noch sehr selten verschluckt. Dieser
+ Chatbefehl postete die letzte Nachricht nocheinmal.
+ - Neuer Befehl: mit "/memo Alias hier der Text" hinterläßt man
+ Alias eine Memo. Logt sich Alias in den Chat ein, dann erhält
+ er diese sofort. Dafür wurde das Verzeichnis ".data/user/memos/"
+ angelegt.
+ - Programmcode wurde ein wenig optimiert.
+ - Das Design wurde ein wenig geändert.
+ - Beseitigung diverser Bugs.
+
+Update von 0.2.4 auf 0.2.5 (15.12.2k)
+ - Derjenige, der einen Raum zuerst betritt, hat Raumbesetzerrechte.
+ - Raumbesetzer, Wächter und Oberwächte können weitere Raumbesetzer
+ bestimmen. Diese können Raumbeseter auch wieder degradieren.
+ - Raumbesetzer, Wächter und Oberwächter können dem aktuellen Raum
+ auf/absperren und Themen geben. Wächter und Oberwächter können
+ abgesperrte Räume betreten.
+ - Das Verzeichnis ".data/htdocs" wurde entfernt. Die Datei help_html
+ heist nun help.sno und befindet sich im yChat-Hauptverzeichnis.
+ - Das Verzeichnis ".data/user/lastlogin" wurde hinzugefügt. Hier
+ wird beim erfolgreichen Einloggen ein "Timestamp" gesetzt. Später
+ sollen Oberwächter "veraltete" Benutzer entfernen können.
+ - Neuer Oberwächterbefehl: "/kill Alias" entfernt Alias ganz und gar
+ vom System. Oberwächter und Wächter können nicht entfernt werden.
+ - Perl-Cache wurde im gesamten System komplett deaktiviert ( Weniger
+ Ladezeiten der HTML-Dokumente ).
+ - Nur Nachrichten aus dem Raum "Cyberbar" werden gelogt.
+ Selbsterstellte Räume werden nichtmehr gelogt. Viele Logfunktionen
+ wurden entfernt (weniger Serverbalast).
+ - Beseitigung einiger kleinen Bugs.
+ - Unter "Optionen" im Chat wir die Farbe nun mit einem Drop-Down-Menü
+ ausgewählt ( Vielen dank an Michi aka Snoopy ).
+ - Auf der Startseite wird nun angezeigt wieviele Benutzer eingelogt
+ sind. Ist keiner eingelogt, dann wird das System "aufgeräumt". D.h.
+ Dateien die nicht mehr gebraucht werden und noch nicht gelöscht
+ wurden werden entfernt ( z.B. Nachrichtendateien der einzelnen
+ Chatter und die Dateien die die IP-Nummern der eingelogten Benutzer
+ beinhalteten usw.).
+ - Hunzufügung einer TODO-Liste. Hier sind mehrere Funktionen
+ vermerkt, die in späteren yChat-Versionen eingebaut werden sollen.
+ (www.todo.yChat.de oder TODO.txt).
+
+Update von 0.2.3 auf 0.2.4 (30.11.2k)
+ - Optimierung bzw. Verbesserung der Push-Routine push.pl.
+ - Server-Ping wurde von 2-Pings-per-Minute auf 4 erhöht.
+ - yChat-Banner wurde erstellt und ist unter
+ documents.yChat.de/yBanner.jpg vorzufinden.
+ - Unter der URL servers.yChat.de wurde eine Serverliste angelegt,
+ welche anzeigt wo yChat-Systeme laufen.
+ - Des weiteren wurden die URLs updates.yChat.de, install.yChat.de
+ und liesmich.yChat.de eingerichtet.
+ - Die Menüpunkte wurden zusammengefaßt, damit sie unter einer
+ Auflösung von 800x600 nur eine Zeile belegen.
+ - Einige Bugs wurden entfernt.
+
+Update von 0.2.2 auf 0.2.3 (25.11.2k)
+ - Smooth scrolling JavaScript ( Vielen Dank an Andreas Buchwald ).
+ - "IP#-Fehler" wurde so gut wie beseitigt.
+ - Aufrufe der einzelnen Benutzerprofile wird gezählt und angezeigt.
+ Diese werden in data/user/counts/* gespeichert.
+ - Automatische Einrichtung des Chats mit setup.sh und Telnet.
+ - Menüpunkt "Dein Profil" wurde entfernt da eigenes Profil auch
+ stets über die Onlineliste aufgerufen werden kann.
+
+Update von 0.2.1 auf 0.2.2 (23.11.2k)
+ - Einige Bugs wurden entfernt.
+ - Geschwindigkeit des Chats wurde optimiert.
+ - Eine Liste aller eingelogten Benutzer erscheint am Rand. Hierfür
+ wurde die Datei online.pl eingeführt. Sie aktuallisiert sich alle
+ 20 Sekunden.
+ - Die UPDATES.txt wurde eingeführt.
+
+Update von 0.2.0 auf 0.2.1
+ - Einige Bugs wurden entfernt.
+ - Die IP# der eingelogten Benutzer werden nun anders verwaltet.
+
+Update von Alpha XVIII auf 0.2.0
+ - Die Handhabung der eingelogten Benutzer im System wurde komplett neu
+ überarbeitet.
+ - Neue Versionsnumern wurden eingeführt. \ No newline at end of file
diff --git a/0.4.5a/colors.sno b/0.4.5a/colors.sno
new file mode 100644
index 0000000..3640b9e
--- /dev/null
+++ b/0.4.5a/colors.sno
@@ -0,0 +1,290 @@
+ <table cellspacing=0 cellpadding=5 border=0>
+ <tr>
+ <td bgcolor="000000"><span style="color:#FFFFFF; text-decoration:line-through;">000000</span></td>
+ <td bgcolor="000033"><span style="color:#FFFFFF; text-decoration:line-through;">000033</span></td>
+ <td bgcolor="000066"><span style="color:#FFFFFF; text-decoration:line-through;">000066</span></td>
+ <td bgcolor="000099"><span style="color:#FFFFFF; text-decoration:line-through;">000099</span></td>
+ <td bgcolor="0000CC"><span style="color:#FFFFFF; text-decoration:line-through;">0000CC</span></td>
+ <td bgcolor="0000FF"><a href="javascript:insertcode('0000FF');" style="color:#FFFFFF;">0000FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="003300"><span style="color:#FFFFFF; text-decoration:line-through;">003300</span></td>
+ <td bgcolor="003333"><span style="color:#FFFFFF; text-decoration:line-through;">003333</span></td>
+ <td bgcolor="003366"><span style="color:#FFFFFF; text-decoration:line-through;">003366</span></td>
+ <td bgcolor="003399"><a href="javascript:insertcode('003399');" style="color:#FFFFFF;">003399</a></td>
+ <td bgcolor="0033CC"><a href="javascript:insertcode('0033CC');" style="color:#FFFFFF;">0033CC</a></td>
+ <td bgcolor="0033FF"><a href="javascript:insertcode('0033FF');" style="color:#FFFFFF;">0033FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="006600"><span style="color:#FFFFFF; text-decoration:line-through;">006600</span></td>
+ <td bgcolor="006633"><span style="color:#FFFFFF; text-decoration:line-through;">006633</span></td>
+ <td bgcolor="006666"><a href="javascript:insertcode('006666');" style="color:#FFFFFF;">006666</a></td>
+ <td bgcolor="006699"><a href="javascript:insertcode('006699');" style="color:#FFFFFF;">006699</a></td>
+ <td bgcolor="0066CC"><a href="javascript:insertcode('0066CC');" style="color:#FFFFFF;">0066CC</a></td>
+ <td bgcolor="0066FF"><a href="javascript:insertcode('0066FF');" style="color:#FFFFFF;">0066FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="009900"><a href="javascript:insertcode('009900');" style="color:#FFFFFF;">009900</a></td>
+ <td bgcolor="009933"><a href="javascript:insertcode('009933');" style="color:#FFFFFF;">009933</a></td>
+ <td bgcolor="009966"><a href="javascript:insertcode('009966');" style="color:#FFFFFF;">009966</a></td>
+ <td bgcolor="009999"><a href="javascript:insertcode('009999');" style="color:#FFFFFF;">009999</a></td>
+ <td bgcolor="0099CC"><a href="javascript:insertcode('0099CC');" style="color:#FFFFFF;">0099CC</a></td>
+ <td bgcolor="0099FF"><a href="javascript:insertcode('0099FF');" style="color:#FFFFFF;">0099FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00CC00"><a href="javascript:insertcode('00CC00');" style="color:#000000;">00CC00</a></td>
+ <td bgcolor="00CC33"><a href="javascript:insertcode('00CC33');" style="color:#000000;">00CC33</a></td>
+ <td bgcolor="00CC66"><a href="javascript:insertcode('00CC66');" style="color:#000000;">00CC66</a></td>
+ <td bgcolor="00CC99"><a href="javascript:insertcode('00CC99');" style="color:#000000;">00CC99</a></td>
+ <td bgcolor="00CCCC"><a href="javascript:insertcode('00CCCC');" style="color:#000000;">00CCCC</a></td>
+ <td bgcolor="00CCFF"><a href="javascript:insertcode('00CCFF');" style="color:#000000;">00CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00FF00"><a href="javascript:insertcode('00FF00');" style="color:#000000;">00FF00</a></td>
+ <td bgcolor="00FF33"><a href="javascript:insertcode('00FF33');" style="color:#000000;">00FF33</a></td>
+ <td bgcolor="00FF66"><a href="javascript:insertcode('00FF66');" style="color:#000000;">00FF66</a></td>
+ <td bgcolor="00FF99"><a href="javascript:insertcode('00FF99');" style="color:#000000;">00FF99</a></td>
+ <td bgcolor="00FFCC"><a href="javascript:insertcode('00FFCC');" style="color:#000000;">00FFCC</a></td>
+ <td bgcolor="00FFFF"><a href="javascript:insertcode('00FFFF');" style="color:#000000;">00FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="330000"><span style="color:#FFFFFF; text-decoration:line-through;">330000</span></td>
+ <td bgcolor="330033"><span style="color:#FFFFFF; text-decoration:line-through;">330033</span></td>
+ <td bgcolor="330066"><span style="color:#FFFFFF; text-decoration:line-through;">330066</span></td>
+ <td bgcolor="330099"><a href="javascript:insertcode('330099');" style="color:#FFFFFF;">330099</a></td>
+ <td bgcolor="3300CC"><a href="javascript:insertcode('3300CC');" style="color:#FFFFFF;">3300CC</a></td>
+ <td bgcolor="3300FF"><a href="javascript:insertcode('3300FF');" style="color:#FFFFFF;">3300FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="333300"><span style="color:#FFFFFF; text-decoration:line-through;">333300</span></td>
+ <td bgcolor="333333"><span style="color:#FFFFFF; text-decoration:line-through;">333333</span></td>
+ <td bgcolor="333366"><a href="javascript:insertcode('333366');" style="color:#FFFFFF;">333366</a></td>
+ <td bgcolor="333399"><a href="javascript:insertcode('333399');" style="color:#FFFFFF;">333399</a></td>
+ <td bgcolor="3333CC"><a href="javascript:insertcode('3333CC');" style="color:#FFFFFF;">3333CC</a></td>
+ <td bgcolor="3333FF"><a href="javascript:insertcode('3333FF');" style="color:#FFFFFF;">3333FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="336600"><a href="javascript:insertcode('336600');" style="color:#FFFFFF;">336600</a></td>
+ <td bgcolor="336633"><a href="javascript:insertcode('336633');" style="color:#FFFFFF;">336633</a></td>
+ <td bgcolor="336666"><a href="javascript:insertcode('336666');" style="color:#FFFFFF;">336666</a></td>
+ <td bgcolor="336699"><a href="javascript:insertcode('336699');" style="color:#FFFFFF;">336699</a></td>
+ <td bgcolor="3366CC"><a href="javascript:insertcode('3366CC');" style="color:#FFFFFF;">3366CC</a></td>
+ <td bgcolor="3366FF"><a href="javascript:insertcode('3366FF');" style="color:#FFFFFF;">3366FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="339900"><a href="javascript:insertcode('339900');" style="color:#FFFFFF;">339900</a></td>
+ <td bgcolor="339933"><a href="javascript:insertcode('339933');" style="color:#FFFFFF;">339933</a></td>
+ <td bgcolor="339966"><a href="javascript:insertcode('339966');" style="color:#FFFFFF;">339966</a></td>
+ <td bgcolor="339999"><a href="javascript:insertcode('339999');" style="color:#FFFFFF;">339999</a></td>
+ <td bgcolor="3399CC"><a href="javascript:insertcode('3399CC');" style="color:#FFFFFF;">3399CC</a></td>
+ <td bgcolor="3399FF"><a href="javascript:insertcode('3399FF');" style="color:#FFFFFF;">3399FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33CC00"><a href="javascript:insertcode('33CC00');" style="color:#000000;">33CC00</a></td>
+ <td bgcolor="33CC33"><a href="javascript:insertcode('33CC33');" style="color:#000000;">33CC33</a></td>
+ <td bgcolor="33CC66"><a href="javascript:insertcode('33CC66');" style="color:#000000;">33CC66</a></td>
+ <td bgcolor="33CC99"><a href="javascript:insertcode('33CC99');" style="color:#000000;">33CC99</a></td>
+ <td bgcolor="33CCCC"><a href="javascript:insertcode('33CCCC');" style="color:#000000;">33CCCC</a></td>
+ <td bgcolor="33CCFF"><a href="javascript:insertcode('33CCFF');" style="color:#000000;">33CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33FF00"><a href="javascript:insertcode('33FF00');" style="color:#000000;">33FF00</a></td>
+ <td bgcolor="33FF33"><a href="javascript:insertcode('33FF33');" style="color:#000000;">33FF33</a></td>
+ <td bgcolor="33FF66"><a href="javascript:insertcode('33FF66');" style="color:#000000;">33FF66</a></td>
+ <td bgcolor="33FF99"><a href="javascript:insertcode('33FF99');" style="color:#000000;">33FF99</a></td>
+ <td bgcolor="33FFCC"><a href="javascript:insertcode('33FFCC');" style="color:#000000;">33FFCC</a></td>
+ <td bgcolor="33FFFF"><a href="javascript:insertcode('33FFFF');" style="color:#000000;">33FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="660000"><span style="color:#FFFFFF; text-decoration:line-through;">660000</span></td>
+ <td bgcolor="660033"><span style="color:#FFFFFF; text-decoration:line-through;">660033</span></td>
+ <td bgcolor="660066"><a href="javascript:insertcode('660066');" style="color:#FFFFFF;">660066</a></td>
+ <td bgcolor="660099"><a href="javascript:insertcode('660099');" style="color:#FFFFFF;">660099</a></td>
+ <td bgcolor="6600CC"><a href="javascript:insertcode('6600CC');" style="color:#FFFFFF;">6600CC</a></td>
+ <td bgcolor="6600FF"><a href="javascript:insertcode('6600FF');" style="color:#FFFFFF;">6600FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="663300"><a href="javascript:insertcode('663300');" style="color:#FFFFFF;">663300</a></td>
+ <td bgcolor="663333"><a href="javascript:insertcode('663333');" style="color:#FFFFFF;">663333</a></td>
+ <td bgcolor="663366"><a href="javascript:insertcode('663366');" style="color:#FFFFFF;">663366</a></td>
+ <td bgcolor="663399"><a href="javascript:insertcode('663399');" style="color:#FFFFFF;">663399</a></td>
+ <td bgcolor="6633CC"><a href="javascript:insertcode('6633CC');" style="color:#FFFFFF;">6633CC</a></td>
+ <td bgcolor="6633FF"><a href="javascript:insertcode('6633FF');" style="color:#FFFFFF;">6633FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="666600"><a href="javascript:insertcode('666600');" style="color:#FFFFFF;">666600</a></td>
+ <td bgcolor="666633"><a href="javascript:insertcode('666633');" style="color:#FFFFFF;">666633</a></td>
+ <td bgcolor="666666"><a href="javascript:insertcode('666666');" style="color:#FFFFFF;">666666</a></td>
+ <td bgcolor="666699"><a href="javascript:insertcode('666699');" style="color:#FFFFFF;">666699</a></td>
+ <td bgcolor="6666CC"><a href="javascript:insertcode('6666CC');" style="color:#FFFFFF;">6666CC</a></td>
+ <td bgcolor="6666FF"><a href="javascript:insertcode('6666FF');" style="color:#FFFFFF;">6666FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="669900"><a href="javascript:insertcode('669900');" style="color:#000000;">669900</a></td>
+ <td bgcolor="669933"><a href="javascript:insertcode('669933');" style="color:#000000;">669933</a></td>
+ <td bgcolor="669966"><a href="javascript:insertcode('669966');" style="color:#000000;">669966</a></td>
+ <td bgcolor="669999"><a href="javascript:insertcode('669999');" style="color:#000000;">669999</a></td>
+ <td bgcolor="6699CC"><a href="javascript:insertcode('6699CC');" style="color:#000000;">6699CC</a></td>
+ <td bgcolor="6699FF"><a href="javascript:insertcode('6699FF');" style="color:#000000;">6699FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66CC00"><a href="javascript:insertcode('66CC00');" style="color:#000000;">66CC00</a></td>
+ <td bgcolor="66CC33"><a href="javascript:insertcode('66CC33');" style="color:#000000;">66CC33</a></td>
+ <td bgcolor="66CC66"><a href="javascript:insertcode('66CC66');" style="color:#000000;">66CC66</a></td>
+ <td bgcolor="66CC99"><a href="javascript:insertcode('66CC99');" style="color:#000000;">66CC99</a></td>
+ <td bgcolor="66CCCC"><a href="javascript:insertcode('66CCCC');" style="color:#000000;">66CCCC</a></td>
+ <td bgcolor="66CCFF"><a href="javascript:insertcode('66CCFF');" style="color:#000000;">66CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66FF00"><a href="javascript:insertcode('66FF00');" style="color:#000000;">66FF00</a></td>
+ <td bgcolor="66FF33"><a href="javascript:insertcode('66FF33');" style="color:#000000;">66FF33</a></td>
+ <td bgcolor="66FF66"><a href="javascript:insertcode('66FF66');" style="color:#000000;">66FF66</a></td>
+ <td bgcolor="66FF99"><a href="javascript:insertcode('66FF99');" style="color:#000000;">66FF99</a></td>
+ <td bgcolor="66FFCC"><a href="javascript:insertcode('66FFCC');" style="color:#000000;">66FFCC</a></td>
+ <td bgcolor="66FFFF"><a href="javascript:insertcode('66FFFF');" style="color:#000000;">66FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="990000"><a href="javascript:insertcode('990000');" style="color:#FFFFFF;">990000</a></td>
+ <td bgcolor="990033"><a href="javascript:insertcode('990033');" style="color:#FFFFFF;">990033</a></td>
+ <td bgcolor="990066"><a href="javascript:insertcode('990066');" style="color:#FFFFFF;">990066</a></td>
+ <td bgcolor="990099"><a href="javascript:insertcode('990099');" style="color:#FFFFFF;">990099</a></td>
+ <td bgcolor="9900CC"><a href="javascript:insertcode('9900CC');" style="color:#FFFFFF;">9900CC</a></td>
+ <td bgcolor="9900FF"><a href="javascript:insertcode('9900FF');" style="color:#FFFFFF;">9900FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="993300"><a href="javascript:insertcode('993300');" style="color:#FFFFFF;">993300</a></td>
+ <td bgcolor="993333"><a href="javascript:insertcode('993333');" style="color:#FFFFFF;">993333</a></td>
+ <td bgcolor="993366"><a href="javascript:insertcode('993366');" style="color:#FFFFFF;">993366</a></td>
+ <td bgcolor="993399"><a href="javascript:insertcode('993399');" style="color:#FFFFFF;">993399</a></td>
+ <td bgcolor="9933CC"><a href="javascript:insertcode('9933CC');" style="color:#FFFFFF;">9933CC</a></td>
+ <td bgcolor="9933FF"><a href="javascript:insertcode('9933FF');" style="color:#FFFFFF;">9933FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="996600"><a href="javascript:insertcode('996600');" style="color:#FFFFFF;">996600</a></td>
+ <td bgcolor="996633"><a href="javascript:insertcode('996633');" style="color:#FFFFFF;">996633</a></td>
+ <td bgcolor="996666"><a href="javascript:insertcode('996666');" style="color:#FFFFFF;">996666</a></td>
+ <td bgcolor="996699"><a href="javascript:insertcode('996699');" style="color:#FFFFFF;">996699</a></td>
+ <td bgcolor="9966CC"><a href="javascript:insertcode('9966CC');" style="color:#FFFFFF;">9966CC</a></td>
+ <td bgcolor="9966FF"><a href="javascript:insertcode('9966FF');" style="color:#FFFFFF;">9966FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="999900"><a href="javascript:insertcode('999900');" style="color:#000000;">999900</a></td>
+ <td bgcolor="999933"><a href="javascript:insertcode('999933');" style="color:#000000;">999933</a></td>
+ <td bgcolor="999966"><a href="javascript:insertcode('999966');" style="color:#000000;">999966</a></td>
+ <td bgcolor="999999"><a href="javascript:insertcode('999999');" style="color:#000000;">999999</a></td>
+ <td bgcolor="9999CC"><a href="javascript:insertcode('9999CC');" style="color:#000000;">9999CC</a></td>
+ <td bgcolor="9999FF"><a href="javascript:insertcode('9999FF');" style="color:#000000;">9999FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99CC00"><a href="javascript:insertcode('99CC00');" style="color:#000000;">99CC00</a></td>
+ <td bgcolor="99CC33"><a href="javascript:insertcode('99CC33');" style="color:#000000;">99CC33</a></td>
+ <td bgcolor="99CC66"><a href="javascript:insertcode('99CC66');" style="color:#000000;">99CC66</a></td>
+ <td bgcolor="99CC99"><a href="javascript:insertcode('99CC99');" style="color:#000000;">99CC99</a></td>
+ <td bgcolor="99CCCC"><a href="javascript:insertcode('99CCCC');" style="color:#000000;">99CCCC</a></td>
+ <td bgcolor="99CCFF"><a href="javascript:insertcode('99CCFF');" style="color:#000000;">99CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99FF00"><a href="javascript:insertcode('99FF00');" style="color:#000000;">99FF00</a></td>
+ <td bgcolor="99FF33"><a href="javascript:insertcode('99FF33');" style="color:#000000;">99FF33</a></td>
+ <td bgcolor="99FF66"><a href="javascript:insertcode('99FF66');" style="color:#000000;">99FF66</a></td>
+ <td bgcolor="99FF99"><a href="javascript:insertcode('99FF99');" style="color:#000000;">99FF99</a></td>
+ <td bgcolor="99FFCC"><a href="javascript:insertcode('99FFCC');" style="color:#000000;">99FFCC</a></td>
+ <td bgcolor="99FFFF"><a href="javascript:insertcode('99FFFF');" style="color:#000000;">99FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC0000"><a href="javascript:insertcode('CC0000');" style="color:#FFFFFF;">CC0000</a></td>
+ <td bgcolor="CC0033"><a href="javascript:insertcode('CC0033');" style="color:#FFFFFF;">CC0033</a></td>
+ <td bgcolor="CC0066"><a href="javascript:insertcode('CC0066');" style="color:#FFFFFF;">CC0066</a></td>
+ <td bgcolor="CC0099"><a href="javascript:insertcode('CC0099');" style="color:#FFFFFF;">CC0099</a></td>
+ <td bgcolor="CC00CC"><a href="javascript:insertcode('CC00CC');" style="color:#FFFFFF;">CC00CC</a></td>
+ <td bgcolor="CC00FF"><a href="javascript:insertcode('CC00FF');" style="color:#FFFFFF;">CC00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC3300"><a href="javascript:insertcode('CC3300');" style="color:#FFFFFF;">CC3300</a></td>
+ <td bgcolor="CC3333"><a href="javascript:insertcode('CC3333');" style="color:#FFFFFF;">CC3333</a></td>
+ <td bgcolor="CC3366"><a href="javascript:insertcode('CC3366');" style="color:#FFFFFF;">CC3366</a></td>
+ <td bgcolor="CC3399"><a href="javascript:insertcode('CC3399');" style="color:#FFFFFF;">CC3399</a></td>
+ <td bgcolor="CC33CC"><a href="javascript:insertcode('CC33CC');" style="color:#FFFFFF;">CC33CC</a></td>
+ <td bgcolor="CC33FF"><a href="javascript:insertcode('CC33FF');" style="color:#FFFFFF;">CC33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC6600"><a href="javascript:insertcode('CC6600');" style="color:#000000;">CC6600</a></td>
+ <td bgcolor="CC6633"><a href="javascript:insertcode('CC6633');" style="color:#000000;">CC6633</a></td>
+ <td bgcolor="CC6666"><a href="javascript:insertcode('CC6666');" style="color:#000000;">CC6666</a></td>
+ <td bgcolor="CC6699"><a href="javascript:insertcode('CC6699');" style="color:#000000;">CC6699</a></td>
+ <td bgcolor="CC66CC"><a href="javascript:insertcode('CC66CC');" style="color:#000000;">CC66CC</a></td>
+ <td bgcolor="CC66FF"><a href="javascript:insertcode('CC66FF');" style="color:#000000;">CC66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC9900"><a href="javascript:insertcode('CC9900');" style="color:#000000;">CC9900</a></td>
+ <td bgcolor="CC9933"><a href="javascript:insertcode('CC9933');" style="color:#000000;">CC9933</a></td>
+ <td bgcolor="CC9966"><a href="javascript:insertcode('CC9966');" style="color:#000000;">CC9966</a></td>
+ <td bgcolor="CC9999"><a href="javascript:insertcode('CC9999');" style="color:#000000;">CC9999</a></td>
+ <td bgcolor="CC99CC"><a href="javascript:insertcode('CC99CC');" style="color:#000000;">CC99CC</a></td>
+ <td bgcolor="CC99FF"><a href="javascript:insertcode('CC99FF');" style="color:#000000;">CC99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCCC00"><a href="javascript:insertcode('CCCC00');" style="color:#000000;">CCCC00</a></td>
+ <td bgcolor="CCCC33"><a href="javascript:insertcode('CCCC33');" style="color:#000000;">CCCC33</a></td>
+ <td bgcolor="CCCC66"><a href="javascript:insertcode('CCCC66');" style="color:#000000;">CCCC66</a></td>
+ <td bgcolor="CCCC99"><a href="javascript:insertcode('CCCC99');" style="color:#000000;">CCCC99</a></td>
+ <td bgcolor="CCCCCC"><a href="javascript:insertcode('CCCCCC');" style="color:#000000;">CCCCCC</a></td>
+ <td bgcolor="CCCCFF"><a href="javascript:insertcode('CCCCFF');" style="color:#000000;">CCCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCFF00"><a href="javascript:insertcode('CCFF00');" style="color:#000000;">CCFF00</a></td>
+ <td bgcolor="CCFF33"><a href="javascript:insertcode('CCFF33');" style="color:#000000;">CCFF33</a></td>
+ <td bgcolor="CCFF66"><a href="javascript:insertcode('CCFF66');" style="color:#000000;">CCFF66</a></td>
+ <td bgcolor="CCFF99"><a href="javascript:insertcode('CCFF99');" style="color:#000000;">CCFF99</a></td>
+ <td bgcolor="CCFFCC"><a href="javascript:insertcode('CCFFCC');" style="color:#000000;">CCFFCC</a></td>
+ <td bgcolor="CCFFFF"><a href="javascript:insertcode('CCFFFF');" style="color:#000000;">CCFFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF0000"><a href="javascript:insertcode('FF0000');" style="color:#FFFFFF;">FF0000</a></td>
+ <td bgcolor="FF0033"><a href="javascript:insertcode('FF0033');" style="color:#FFFFFF;">FF0033</a></td>
+ <td bgcolor="FF0066"><a href="javascript:insertcode('FF0066');" style="color:#FFFFFF;">FF0066</a></td>
+ <td bgcolor="FF0099"><a href="javascript:insertcode('FF0099');" style="color:#FFFFFF;">FF0099</a></td>
+ <td bgcolor="FF00CC"><a href="javascript:insertcode('FF00CC');" style="color:#FFFFFF;">FF00CC</a></td>
+ <td bgcolor="FF00FF"><a href="javascript:insertcode('FF00FF');" style="color:#FFFFFF;">FF00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF3300"><a href="javascript:insertcode('FF3300');" style="color:#FFFFFF;">FF3300</a></td>
+ <td bgcolor="FF3333"><a href="javascript:insertcode('FF3333');" style="color:#FFFFFF;">FF3333</a></td>
+ <td bgcolor="FF3366"><a href="javascript:insertcode('FF3366');" style="color:#FFFFFF;">FF3366</a></td>
+ <td bgcolor="FF3399"><a href="javascript:insertcode('FF3399');" style="color:#FFFFFF;">FF3399</a></td>
+ <td bgcolor="FF33CC"><a href="javascript:insertcode('FF33CC');" style="color:#FFFFFF;">FF33CC</a></td>
+ <td bgcolor="FF33FF"><a href="javascript:insertcode('FF33FF');" style="color:#FFFFFF;">FF33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF6600"><a href="javascript:insertcode('FF6600');" style="color:#000000;">FF6600</a></td>
+ <td bgcolor="FF6633"><a href="javascript:insertcode('FF6633');" style="color:#000000;">FF6633</a></td>
+ <td bgcolor="FF6666"><a href="javascript:insertcode('FF6666');" style="color:#000000;">FF6666</a></td>
+ <td bgcolor="FF6699"><a href="javascript:insertcode('FF6699');" style="color:#000000;">FF6699</a></td>
+ <td bgcolor="FF66CC"><a href="javascript:insertcode('FF66CC');" style="color:#000000;">FF66CC</a></td>
+ <td bgcolor="FF66FF"><a href="javascript:insertcode('FF66FF');" style="color:#000000;">FF66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF9900"><a href="javascript:insertcode('FF9900');" style="color:#000000;">FF9900</a></td>
+ <td bgcolor="FF9933"><a href="javascript:insertcode('FF9933');" style="color:#000000;">FF9933</a></td>
+ <td bgcolor="FF9966"><a href="javascript:insertcode('FF9966');" style="color:#000000;">FF9966</a></td>
+ <td bgcolor="FF9999"><a href="javascript:insertcode('FF9999');" style="color:#000000;">FF9999</a></td>
+ <td bgcolor="FF99CC"><a href="javascript:insertcode('FF99CC');" style="color:#000000;">FF99CC</a></td>
+ <td bgcolor="FF99FF"><a href="javascript:insertcode('FF99FF');" style="color:#000000;">FF99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFCC00"><a href="javascript:insertcode('FFCC00');" style="color:#000000;">FFCC00</a></td>
+ <td bgcolor="FFCC33"><a href="javascript:insertcode('FFCC33');" style="color:#000000;">FFCC33</a></td>
+ <td bgcolor="FFCC66"><a href="javascript:insertcode('FFCC66');" style="color:#000000;">FFCC66</a></td>
+ <td bgcolor="FFCC99"><a href="javascript:insertcode('FFCC99');" style="color:#000000;">FFCC99</a></td>
+ <td bgcolor="FFCCCC"><a href="javascript:insertcode('FFCCCC');" style="color:#000000;">FFCCCC</a></td>
+ <td bgcolor="FFCCFF"><a href="javascript:insertcode('FFCCFF');" style="color:#000000;">FFCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFFF00"><a href="javascript:insertcode('FFFF00');" style="color:#000000;">FFFF00</a></td>
+ <td bgcolor="FFFF33"><a href="javascript:insertcode('FFFF33');" style="color:#000000;">FFFF33</a></td>
+ <td bgcolor="FFFF66"><a href="javascript:insertcode('FFFF66');" style="color:#000000;">FFFF66</a></td>
+ <td bgcolor="FFFF99"><a href="javascript:insertcode('FFFF99');" style="color:#000000;">FFFF99</a></td>
+ <td bgcolor="FFFFCC"><a href="javascript:insertcode('FFFFCC');" style="color:#000000;">FFFFCC</a></td>
+ <td bgcolor="FFFFFF"><a href="javascript:insertcode('FFFFFF');" style="color:#000000;">FFFFFF</a></td>
+ </tr>
+</table> \ No newline at end of file
diff --git a/0.4.5a/config.pm b/0.4.5a/config.pm
new file mode 100644
index 0000000..69cf341
--- /dev/null
+++ b/0.4.5a/config.pm
@@ -0,0 +1,233 @@
+# yChat - Copyright by Paul C. Bütow
+
+########################### Dieser Teil bestimmt die Standart-Variabeln.
+##STANDART-CONFIGURATION:## (CSS, Farben, Version etc.)
+###########################
+$datum = "18.01.01";
+$version = "0.4.5a";
+$title = "yChat [$version]";
+$gfxpath = "../../yChat";
+$style = <<ENDCSS;
+<style rel="stylesheet" type="text/css">
+ body { background-color: #005146 }
+ body.blank { background-color: #000000 }
+ body.online { background-color: #000000 }
+ div { font-family: arial, verdana, helvetiva; font-size: 9pt; color: #ffffff }
+ div.b { font-weight: bold; color: #ffa500 }
+ a { color: #ffffef }
+ a:hover { color: #ffffff; text-decoration: none }
+</style>
+ENDCSS
+
+############### Dieser TeFil enthält Programmcode, der an verschiedenen
+##SHARED-SUBS## Stellen ausgeführt werden muß und jedem Skript zur
+############### Verfügung steht.
+
+sub printfile { # Liest eine externe Datei ein und gibt sie mit print aus
+ my ($file2print,$pagetitle,$bodyclass) = @_;
+ if ($pagetitle ne "") {
+ &start_html($pagetitle,$bodyclass);
+ }
+ open(FILE2PRINT,"<$file2print");
+ @file2print = <FILE2PRINT>;
+ close FILE2PRINT;
+ print @file2print;
+}
+
+
+sub start_html { # Der HEADER einer HTML-Datei
+print "<html><head>";
+print "<meta http-equiv=\"refresh\" content=\"20\" URL=\"online.pl?room=$room\">" if ($_[1] eq "online");
+print <<END;
+ <title>
+ $title - $_[0]
+ </title>
+ $_[2]
+ $style
+ </head>
+END
+ if ($_[1] eq "start") {
+ print "<body onload=\"document.login.alias.focus();\">";
+ } elsif ($_[1] ne "") {
+ print "<body class=$_[1]>";
+ } else {
+ print "<body>";
+ }
+}
+
+sub post { # Öffentliche Nachricht posten.
+ my ($room,$msg2post,$secroom) = @_;
+ local @rooms = $room;
+ @rooms = ($room,$secroom) if ($room ne $secroom);
+ foreach(@rooms) {
+ open(MSGFILE,">>data/msgs/$_");
+ print MSGFILE "!<;".time."<;!<;!<;$msg2post<;\n";
+ close MSGFILE;
+ }
+ &log($msg2post) if ($room eq "Cyberbar");
+}
+
+sub post_prv { # Private Nachricht posten (flüstern).
+ my ($alias2post,$msg2post) = @_;
+ opendir(DIR,"data/online/rooms");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach $raum (@dir) {
+ opendir(DIR,"data/online/rooms/$raum");
+ my @chatter = readdir(DIR);
+ closedir(DIR);
+ foreach $chatter (@chatter) {
+ if ($chatter eq $alias2post) {
+ open(MSGFILE,">>data/msgs/$raum");
+ print MSGFILE "$alias2post<;".time."<;!<;!<;$msg2post<;\n";
+ close MSGFILE;
+ goto ENDPRV;
+ }
+ }
+ }
+ENDPRV:
+}
+
+sub log { # Protokollieren der Nachrichten etc.
+ local $msg2log = $_[0];
+ &zeit;
+ open(LOG,">>data/logs/$day.$month.$year");
+ print LOG "<br><font color=ffffef><i>($hours:$min:$sec)</i></font> $msg2log\n";
+ close LOG;
+}
+
+
+sub zeit { # Aktuelles Datum und Uhrzeit bestimmen.
+ ($sec, $min, $hours, $day, $month, $year) = (localtime)[0..5];
+ $month += 1;
+ $hours = "0".$hours if ($hours < 10);
+ $min = "0".$min if ($min < 10);
+ $sec = "0".$sec if ($sec < 10);
+ $day = "0".$day if ($day < 10);
+ $month = "0".$month if ($month < 10);
+ $year = $year - 100;
+ if ($year < 10) {
+ $year = "200".$year;
+ } else {
+ $year = "20".$year;
+ }
+}
+
+sub read_file { # Datei öffnen.
+ my $file2read = $_[0];
+ if (-e "$file2read") {
+ open (DATEI,"<$file2read") || &error("Konnte $file2read nicht öffnen");
+ }
+}
+
+sub error { # Error-Ausgabe.
+ my $error_msg = $_[0];
+ &start_html( "Error: ($error_msg)" );
+ print $q->div( "Error: ($error_msg)" ),
+ $q->end_html;
+ open(ERROR,">>data/error");
+ print ERROR $error_msg."\n";
+ close ERROR;
+ exit;
+}
+
+sub check_online { # Auf alte Räume und Chatter prüfen und ggf. entfernen.
+ open(PROVE,">data/online/prove");
+ print PROVE time;
+ close PROVE;
+ opendir(RAUMDIR, "data/online/rooms");
+ my @raumdir = readdir(RAUMDIR);
+ closedir(RAUMDIR);
+ foreach $raum (@raumdir) {
+ opendir(BENUTZERDIR, "data/online/rooms/$raum");
+ my @benutzerdir = readdir(BENUTZERDIR);
+ closedir(BENUTZERDIR);
+ my $raumleer= 1;
+ foreach $benutzer (@benutzerdir) {
+ if (-f "data/online/rooms/$raum/$benutzer") {
+ $raumleer = 0;
+ open (BENUTZER,"<data/online/rooms/$raum/$benutzer");
+ my $benutzerstamp = <BENUTZER>;
+ close BENUTZER;
+ if ($benutzerstamp < (time - 40)) {
+ unlink("data/online/$raum/$benutzer");
+ open (BENUTZER2,"<data/online/users/$benutzer");
+ my $benutzerstamp2 = <BENUTZER2>;
+ close BENUTZER2;
+ if ($benutzerstamp2 < (time - 40)) {
+ if ($benutzer ne $alias) {
+ &rm_alias($benutzer,$raum); # ohne $raum/benutzer entf.
+ } else {
+ unlink("data/online/rooms/$raum/$benutzer");
+ }
+ &zeit;
+ &post($raum,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$benutzer hat den Chat verlassen ... </font></i>");
+ }
+ }
+ }
+ }
+ if ($raumleer == 1) { # Falls Raum leer ist => entf.
+ rmdir("data/online/rooms/$raum");
+ unlink("data/online/rstat/$raum");
+ unlink("data/msgs/$raum");
+ }
+ }
+}
+
+sub rm_alias { # Falls Benutzer offline gegangen ist
+ my($benutzer,$raum) = @_;
+ unlink("data/online/rooms/$raum/$benutzer");
+ unlink("data/online/users/$benutzer");
+ unlink("data/online/ident/$benutzer");
+ &rm_rstat($benutzer,$raum);
+}
+
+sub rm_rstat { # Benutzer als Raumbesetzer austragen
+ my ($r_alias,$rstatroom) = @_;
+ open (RSTAT,"<data/online/rstat/$rstatroom");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ my @rstat2 = ($rstat[0],$rstat[1]);
+ for ($i=2;$i<=$#rstat;$i++) {
+ push(@rstat2,$rstat[$i]) if ($rstat[$i] ne $r_alias."\n");
+ }
+ open (RSTAT,">data/online/rstat/$rstatroom");
+ print RSTAT @rstat2;
+ close RSTAT;
+}
+
+
+sub secure_checkid { # TmpID überprüfen
+ my ($alias2check) = @_;
+ open(IDENT,"<data/online/ident/$alias2check");
+ my @ident = <IDENT>;
+ close IDENT;
+ if ($ident[1] ne $tmpid) {
+ &error("Falsche TempID ! Du bist nicht befugt zu handeln !");
+ }
+}
+
+sub hierachie { # Chatter nach Sonderrechte überprüfen.
+ my $alias2prove = $_[0];
+ $hierachie = undef;
+ open(WA,"<data/wa");
+ @was = <WA>;
+ close WA;
+ foreach $wa (@was) {
+ if ($wa eq $alias2prove || $wa eq "$alias2prove\n") {
+ $hierachie = "wa";
+ }
+ }
+ open(OW,"<data/ow");
+ @ows = <OW>;
+ close OW;
+ if ($hierachie ne "wa" || $_ eq "$alias2prove\n") {
+ foreach $ow (@ows) {
+ if ($ow eq $alias2prove || $ow eq "$alias2prove\n") {
+ $hierachie = "ow";
+ }
+ }
+ }
+}
+
+$| = 1; # Cache von Perl ausschalten \ No newline at end of file
diff --git a/0.4.5a/help.sno b/0.4.5a/help.sno
new file mode 100644
index 0000000..558d4fd
--- /dev/null
+++ b/0.4.5a/help.sno
@@ -0,0 +1,57 @@
+<div>
+ Alle Chat-Befehle:
+</div>
+<hr>
+<table width=100% bgcolor=000000>
+<tr><th bgcolor=666666><div>SU</div></th><th bgcolor=666666><div>Befehl</div></th><th bgcolor=666666><div>Beschreibung</div></th></tr>
+<tr><td><div>NC</div></td><td><div>/about</div></td><td><div>Zeigt aktuelle Version und andere Infos der Community an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/away <font color=red>Nachricht</font></div></td><td><div>Abmelden mit einer<font color=red>Abmeldenachricht</font></div></td></tr>
+<tr><td><div>NC</div></td><td><div>/clear</div></td><td><div>Bildschirm wird gelöscht</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/col <font color=red>XXXXXX</font> <font color=ffa500>XXXXXX</font></div></td><td><div>Farbe/n (<font color=red>Namensfarbe</font> / <font color=ffa500>Textfarbe</font>) wechseln. Angabe in Hexadezimal.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/date</div></td><td><div>Zeigt aktuelles Datum und Urzeit an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/j <font color=red>Raumname</font></div></td><td><div>Raum wechseln/erstellen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ju <font color=red>Alias</font></div></td><td><div>In den Raum wechseln/folgen, wo sich <font color=red>Alias</font> befindet.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/m <font color=red>Aktion</font></div></td><td><div>Handeln mit 2 Farben</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/me <font color=red>Aktion</font></div></td><td><div>Handeln mit einer Farbe</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/memo <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine <font color=ffa500>Memonachricht</font> hinterlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/msg <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine private <font color=ffa500>Nachricht</font> flüstern</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ <font color=ffa500>Nachricht</font></div></td><td><div>Eine private <font color=ffa500>Nachricht</font> demjenigen flüstern, dem zuletzt eine geflüstert wurde</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/online <font color=red>Alias</font></div></td><td><div>Zeigt Onlineminuten von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/q</div></td><td><div>Cumunnity verlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/rmgb</div></td><td><div>Das eigene Gästebuch komplett weglöschen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/s <font color=red>Nachricht</font></div></td><td><div><font color=red>Nachricht</font> schreien</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/seen <font color=red>Alias</font></div></td><td><div>Zeigt an, vor wieviel Stunden sich <font color=red>Nachricht</font> zum letzten Mal in das System eingelogt hat</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/w</div></td><td><div>Zeigt an, wer sich im aktuellen Raum befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc <font color=red>Raum</font></div></td><td><div>Zeigt an, wer sich im <font color=red>Raum</font> befindet. Wird kein Raum angegeben, dann wird ledeglich angezeigt, wer sich im System befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc/</div></td><td><div>Zeigt alle offenen Räume und deren Chatter an</div></td></tr>
+<tr><td><div>NC</div></td><td> <div>/wj <font color=red>Alias</font></div></td><td><div>Zeigt an, in welchen Raum sich <font color=red>Alias</font> befindet</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/l</div></td><td><div>Der aktuelle Raum wird ab- bzw. aufgesperrt</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/rsu <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> die Raumbesetzerrechte entnehmen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/su <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Raumbesetzer ernennen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/t <font color=red>Thema</font></div></td><td><div>Dem aktuellen Raum wird ein <font color=red>Thema</font> gegeben</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban</div></td><td><div>Zeigt alle verbannten Benutzer an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> verbannen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/rban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> "entbannen"</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ip <font color=red>Alias</font></div></td><td><div>Zeigt die IP-Nummer von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/k <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird aus dem Chat katapultiert!</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ss <font color=red>Raum</font> <font color=ffa500>Nachricht</font></div></td><td><div>Eine <font color=ffa500>Nachricht</font> in <font color=red>Raum</font> hinüber rufen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/kill <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird ganz und gar aus dem System entfernt</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/wa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Wächter ernennen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/rwa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom Wächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/sys <font color=red>Nachricht</font></div></td><td><div>Systemnachricht schreiben. (Erscheint in allen existierenden Räumen)</div></td></tr>
+</table><hr>
+<div>
+ Zur Erklärung: NC steht für "Normale Chatter", RB für "Raumbesetzer", WÄ für "Wächter" und OW für "Oberwächter".
+ Obrige Befehle können nur von der/den jeweiligen Benutzergruppe/n werden.<br><br>
+ Allerdings gibt es folgendes zu beachten: Oberwächter verfügen über alle Chatbefehle. Normale Wächter über alle Chatbefehle, außer über die der Oberwächter.
+ Raumbesetzer können nur Raumbesetzerbefehle und die Befehle der normalen Chatter durchführen. Normale Chatter haben jedeglich die Standardbefehle zu verwenden.<br><br>
+ Weitere Besonderheiten der Wächter und Oberwächter:<br><br>
+ Wächter und Oberwächter können ....<br>
+ ... abgesperrte Chaträume problemlos betreten.<br>
+ ... nicht gekickt, verbannt oder gekillt werden.<br>
+ ... Logdateien der Cyberbar lesen.<br><br>
+
+ Des weiteren: Oberwächter ernennt nur der Systemadministrator!
+</div>
+</body>
+</html> \ No newline at end of file
diff --git a/0.4.5a/htdocs.pl b/0.4.5a/htdocs.pl
new file mode 100644
index 0000000..6167fde
--- /dev/null
+++ b/0.4.5a/htdocs.pl
@@ -0,0 +1,240 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header;
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+$var = $q->param("var");
+if ($var eq "help_html") {
+ &printfile("help.sno","Alle Chatbefehle");
+} elsif ($var eq "logo_html") {
+ &start_html("Logo");
+print<<END;
+<layer top=-3 left=0><div style="position:absolute; top:5; left:10">
+<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
+ codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0"
+ WIDTH=48 HEIGHT=48>
+ <PARAM NAME=movie VALUE="$gfxpath/ySymbol.swf">
+ <PARAM NAME=loop VALUE=false>
+ <PARAM NAME=menu VALUE=false>
+ <PARAM NAME=quality VALUE=high>
+ <PARAM NAME=scale VALUE=noborder>
+ <PARAM NAME=wmode VALUE=opaque>
+ <PARAM NAME=bgcolor VALUE=#005146>
+ <EMBED src="$gfxpath/ySymbol.swf" loop=false menu=false quality=high scale=noborder wmode=opaque bgcolor=#005146
+ WIDTH=48 HEIGHT=48 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED>
+</OBJECT>
+</div></layer>
+END
+print $q->end_html;
+} elsif ($var eq "menu_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ $tmp = $q->param("tmp");
+ &menu_html;
+} elsif ($var eq "werda_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &werda_html;
+} elsif ($var eq "logs_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ &logs_html;
+} elsif ($var eq "view_logs_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $tmp = $q->param("tmp");
+ &secure_checkid($alias);
+ &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ &printfile($tmp,"Logdatei","blank");
+ }
+} elsif ($var eq "superuser_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ &superuser_html;
+} else {
+ print
+ $q->start_html(-bgcolor=>"000000"),
+ $q->end_html;
+}
+
+sub menu_html {
+if ($tmp eq "quit") {
+ &start_html("Quit","blank","<script language=\"JavaScript\">open(\"index.pl?tmp=quit\",\"_top\");</script>");
+ print $q->end_html;
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias verläßt den Chat ... </font></i>");
+ sleep 2;
+ &rm_alias($alias,$room);
+ exit;
+}
+ENDJS
+ &start_html("Menü","blank");
+print <<END;
+<script language="JavaScript">
+function fenster(fenster,target) {
+ open(fenster,target,"width=500,height=500,screenX=100,screenY=100,scrollbars");
+}
+</script>
+<font size=2 face=verdana>
+ <a href='javascript:fenster("htdocs.pl?var=werda_html&alias=$alias&room=$room&col=$col&secol=$secol&&tmp=$tmp&tmpid=$tmpid","weristda")'>Wer ist da?</a>
+ <a href='javascript:fenster("main2.pl?var=edit_profile_html&alias=$alias&tmpid=$tmpid&room=$room","ProfilAendern")'>Profil ändern</a>
+ <a href='javascript:fenster("main2.pl?var=edit_options_html&alias=$alias&tmpid=$tmpid&room=$room","Optionen")'>Chatoptionen</a>
+ <a href='javascript:fenster("main2.pl?var=list_alias_html&alias=$alias&tmpid=$tmpid","Benutzerliste")'>Benutzerliste</a>
+ <a href='javascript:fenster("htdocs.pl?var=help_html&tmpid=$tmpid","Befehle")'>Chatbefehle</a><br>
+ <a href='javascript:fenster("main2.pl?var=gb_html&alias=$alias&tmpid=$tmpid","Board")'>Benutzerboard</a>
+ <a href='javascript:fenster("htdocs.pl?var=superuser_html&alias=$alias&tmpid=$tmpid","Superuser")'>Superuser</a>
+ <a href='javascript:fenster("htdocs.pl?var=logs_html&alias=$alias&tmpid=$tmpid","Logdateien")'>Logdateien</a>
+ <a href="http://www.updates.yChat.de" target="Updates">Updates</a>
+ <a href="http://www.credits.yChat.de" target="Credits">Credits</a>
+ <a href="htdocs.pl?alias=$alias&var=menu_html&room=$room&tmpid=$tmpid&tmp=quit">Verlassen</a>
+</font>
+</body>
+</html>
+END
+}
+
+sub werda_html { # Anzeige, wer eingelogt ist.
+ &start_html("Wer ist da?");
+ print <<END;
+<div>
+ $alias, schön daß Du hier bist :-)
+</div>
+<hr>
+<div>
+ Folgende Personen befinden sich im Chat:
+</div>
+<br>
+<div>
+END
+ opendir(ROOMDIRS,"data/online/rooms");
+ local @roomdirs = readdir(ROOMDIRS);
+ close(ROOMDIRS);
+ foreach(@roomdirs) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ my $room = $_;
+ open(RSTAT,"<data/online/rstat/$room");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ opendir(ROOMDIR,"data/online/rooms/$room");
+ my @roomdir = readdir(ROOMDIR);
+ close(ROOMDIR);
+ local $nr = $#roomdir-1;
+ print $q->b( $_ ),
+ " $door ($nr) Raumthema: $rstat[1]",
+ $q->br;
+ foreach(@roomdir) {
+ if ($_ ne ".." && $_ ne ".") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid" }, "$_"), " ";
+ }
+ }
+ print $q->br, $q->br;
+ }
+ }
+ print
+ "</div>",
+ $q->end_html;
+}
+
+sub logs_html {
+ &start_html("Logdateien");
+ print <<END;
+<div>
+ Hier befinden sich alle Logdateien
+</div>
+<hr>
+END
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ print $q->div( "Folgende Logdateien des Raumes \"Cyberbar\" können nur von Oberwächtern gelesen werden (Sortiert nach A-Z, a-z):" ),
+ $q->br;
+ opendir(LOGS,"data/logs");
+ local @logs = readdir(LOGS);
+ closedir(LOGS);
+ local @sortedir = sort(@logs);
+ foreach(@sortedir) {
+ if (-f "data/logs/$_") {
+ print $q->a( { -href=>"htdocs.pl?alias=$alias&var=view_logs_html&tmp=data/logs/$_&tmpid=$tmpid",
+ -target=>"_new" },
+ "$_" ),
+ " ";
+ }
+ }
+ } else {
+ print $q->div( "Logdateien können nur von Oberwächtern (OW) gelesen werden. Du bist jedoch ein Wächter (WÄ) oder ein",
+ "\"Normaler Chatter\". Oberwächter können alles nachlesen, was öffentlich im Raum \"Cyberbar\" gechattet wurde." ),
+ $q->hr;
+ &printfile("data/htdocs/logs_html");
+ }
+ print
+ $q->end_html;
+}
+
+sub superuser_html { # Zeigt an, wer Superuser ist
+ &start_html("Superuser");
+ print "<div>Hallo $alias. Du bist als ";
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ print
+ $q->b( "Oberwächter" ),
+ " (OW) eingetragen.</div>",
+ $q->hr;
+ } elsif ( $hierachie eq "wa") {
+ print
+ $q->b( "Wächter" ),
+ " (WÄ) eingetragen.</div>",
+ $q->hr;
+ } else {
+ print
+ $q->b( "normaler Chatter" ),
+ " (NC) eingetragen.</div>",
+ $q->hr;
+ }
+
+ my $nrow = $#ows+1;
+ print
+ "<div>",
+ $q->b( "OW" ),
+ "s ($nrow Stück)";
+ foreach(@ows) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+ my $nrwa = $#was+1;
+ print
+ "</div>",
+ $q->hr,
+ "<div>",
+ $q->b( "WÄ" ),
+ "s ($nrwa Stück)";
+ foreach(@was) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+print <<END;
+<hr>
+ Die jeweiligen Fähigkeiten der Oberwächter (OW) und der Wächter (WÄ) sind unter
+ "<a href="htdocs.pl?var=help_html">Chat-Befehle</a>"
+ dokumentiert.
+</div>
+</body>
+</html>
+END
+} \ No newline at end of file
diff --git a/0.4.5a/index.pl b/0.4.5a/index.pl
new file mode 100644
index 0000000..aeb6af2
--- /dev/null
+++ b/0.4.5a/index.pl
@@ -0,0 +1,418 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header;
+
+#####################################
+##WELCHE SUB MUß AUFGERUFEN WERDEN?##
+#####################################
+
+$var = $q->param("var");
+$alias = $q->param("alias");
+$pw = $q->param("pw");
+$tmp = $q->param("tmp");
+
+if ($var eq "create_alias_html") {
+ &create_alias_html;
+} elsif ($var eq "create_alias") {
+ &create_alias;
+} elsif ($var eq "login_html") {
+ $tmp = $q->param("tmp");
+ &login_html;
+} elsif ($alias eq "") {
+ &login_html;
+} else {
+ &checklogin;
+}
+
+sub login_html { # Erste Startseite
+&check_online;
+local $counter = undef;
+open(COUNT,"<data/count");
+ $counter = <COUNT>;
+close COUNT;
+$counter++;
+open(COUNT,">data/count");
+ print COUNT $counter;
+close COUNT;
+opendir(USERS,"data/online/users");
+ local @users = readdir(USERS);
+closedir(USERS);
+opendir(REGISTRED,"data/user/options");
+ local @registred = readdir(REGISTRED);
+closedir(REGISTRED);
+local ($logtin,$users) = ($#users-1,$#registred-1);
+&start_html("Created & Copyright by Paul C. Bütow","start");
+print <<END;
+ <center>
+ <table width=500>
+ <tr>
+ <td>
+ <center>
+ <table>
+ <tr>
+ <td>
+<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
+ codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0"
+ WIDTH=240 HEIGHT=240>
+ <PARAM NAME=movie VALUE="$gfxpath/yIntro.swf">
+ <PARAM NAME=loop VALUE=false>
+ <PARAM NAME=menu VALUE=false>
+ <PARAM NAME=quality VALUE=high>
+ <PARAM NAME=scale VALUE=noborder>
+ <PARAM NAME=wmode VALUE=opaque>
+ <PARAM NAME=bgcolor VALUE=#005146>
+ <EMBED src="$gfxpath/yIntro.swf" loop=false menu=false quality=high scale=noborder wmode=opaque bgcolor=#005146
+ WIDTH=240 HEIGHT=240 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED>
+</OBJECT>
+ </td>
+ <td>
+ <div>
+ yChat: Version $version
+ <br><br>
+ Letztes Update: $datum
+ <br><br>
+ Seitenaufrufe: $counter
+ <br><br>
+ Benutzer registriert: $users
+ <br><br>
+ Benutzer online: $logtin
+ <br><br>
+ Webmaster: <a href="mailto:paul\@buetow.oxg.de">Paul C. Bütow</a>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </center>
+ </div>
+ <br>
+ <br>
+END
+ if ($tmp eq "true") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Wahrscheinlich existiert Dein Alias "$alias" nicht,
+ <br>
+ Du hast Dich verschrieben oder das Passwort ist falsch.
+ <br>
+ Versuch es erneuert !
+ </div>
+END
+ } elsif ($tmp eq "quit") {
+print <<END;
+ <div>
+ Du hast soeben den Chat verlassen.
+ <br>
+ Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ } elsif ($tmp eq "banned") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein Alias "$alias" wurde verbannt.
+ <br>
+ Z.z. kannst Du Dich leider nicht in den Chat einloggen.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($tmp eq "kick") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wurdest soeben aus dem Chat katapultiert!
+ <br>
+ Schlechtes Verhalten mag die Ursache hierfür sein.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($var eq "create_alias") {
+print "<div>Du hast sich soeben in die Datenbank eingetragen. Einfach auf \"Los Geht's\" klicken :-)</div>";
+ } else {
+print <<END;
+ <div>
+ Herzlich willkommen!
+ <br>
+ Einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <form name="login" action="index.pl" method="post">
+ <input type="hidden" name="tmp" value="true">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Alias:
+ <br>
+ <input name="alias" value="$alias">
+ </div>
+ </td>
+ <td>
+ <div>
+ Dein Passwort:
+ <br>
+ <input type="password" name="pw" value="$pw">
+ </div>
+ </td>
+ </tr>
+ </table>
+ <br>
+ <br>
+ <div>
+ Solltest Du noch keinen Nick besitzen, dann auf "Registrieren" klicken!
+ </div>
+ <br>
+ <table>
+ <tr>
+ <td>
+ <font color="ffffff">
+ <input type="submit" value="Los geht's!">
+ </font>
+ </form>
+ </td>
+ <td>
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias_html">
+ <font color="ffffff">
+ <input type="submit" value="Registrieren">
+ </font>
+ </form>
+ </td>
+ </tr>
+ </table>
+ <hr>
+ </td>
+ </tr>
+ </table>
+ </center>
+</body>
+</html>
+END
+# if ($logtin == 0) {
+# &list_dir("data/msgs");
+# &list_dir("data/online/rstat",2);
+# foreach(@dir) {
+# unlink("data/msgs/$_");
+# unlink("data/online/ident/$_");
+# }
+# foreach(@dir2) {
+# unlink("data/online/rstat/$_");
+# }
+# }
+# # Falls d. Skript das Raumverz. gelöscht hat, neu anlegen
+ if (-d "data/online/rooms") {
+ } else {
+ mkdir "data/online/rooms", 0777;
+ }
+}
+
+
+sub create_alias_html { # HTML-Form für Erstellung eines neuen Benutzers.
+local $reload = $_[0];
+&start_html("Registration");
+print <<END;
+ <center>
+ <table width=500>
+ <tr>
+ <td>
+END
+ if ($reload eq "alias_exists") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Der von Dir gewählte Benutzername "$alias" existiert in unserer Datenbank bereits. Bitte versuch es erneuert mit
+ einem anderen Benutzernamen !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "pw_wrong") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Deine beiden Passworteingaben stimmen nicht überein. Bitte geb das Passwort erneuert an um sicherzugehen, daß
+ kein falsches Passwort abgespeichert wird !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "alias_prohibited") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein gewählter Benutername "$alias" enthält illegale Zeichen. Bitte versuch einen anderen Benutzernamen!
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Hier kannst Du Dich registrieren. Bitte beachte, daß die Passworteingabefelder übereinstimmen!
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias">
+ <div>
+ Dein Alias:
+ <font color="ffa500">
+ (Muß angegeben werden)
+ </font>
+ <br>
+ <input name="alias" VALUE="$alias">
+ </div>
+ <br>
+ <div>
+ Dein gewünschtes Passwort:
+ <br>
+ <input type="password" name="pw" value="$pw">
+ </div>
+ <br>
+ <div>
+ Geb hier Dein Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp">
+ </div>
+ <br>
+ <font color=ffffff>
+ <input type="submit" value="Registrieren">
+ </font>
+ <br>
+ </form>
+ <hr>
+ <div>
+ Um den Chat zu betreten müssen die Daten nach der Registration auf der Startseite erneuert bestätigt werden !
+ </div>
+ </td>
+ </tr>
+ </table>
+</center>
+</body>
+</html>
+END
+}
+
+sub checklogin { # Überprüfen, ob die Login-Daten korrekt sind.
+ my $lognotexists = "true";
+ opendir(USERDIR,"data/user/options");
+ my @userdir = readdir(USERDIR);
+ closedir(USERDIR);
+ foreach $user (@userdir) {
+ if ($user eq $alias) {
+ open(OPTIONS,"<data/user/options/$alias");
+ my @options = <OPTIONS>;
+ close OPTIONS;
+ chomp($options[0]);
+ if ($options[0] eq $pw) {
+ open(BAN,"<data/ban");
+ my @ban = <BAN>;
+ close BAN;
+ foreach(@ban) {
+ if ($_ eq "$alias\n") {
+ $tmp = "banned";
+ &login_html;
+ exit;
+ }
+ }
+ if ($options[1] eq undef) {
+ $col = "ffffff";
+ } else {
+ $col = $options[1];
+ }
+ if ($options[2] eq undef) {
+ $secol = "ffffef";
+ } else {
+ $secol = $options[2];
+ }
+ $tmpid = time;
+ open(IDENT,">data/online/ident/$alias");
+ print IDENT $ENV{'REMOTE_ADDR'}."\n".$tmpid;
+ close IDENT;
+ open(LASTLOGIN,">data/user/lastlogin/$alias");
+ print LASTLOGIN time;
+ close LASTLOGIN;
+ &frameset_html;
+ exit;
+ } else {
+ $lognotexists = "false";
+ }
+ }
+ }
+ &login_html; # Falls Login-Daten inkorrekt sind, zurück zur Startseite.
+}
+
+sub create_alias { # Erstellung eines neuen Benutzers.
+ if ($alias =~ /[\W]/ || $alias eq "") {
+ &create_alias_html("alias_prohibited");;
+ exit;
+ } elsif ($pw ne $tmp) {
+ &create_alias_html("pw_wrong");
+ exit;
+ }
+ opendir(USERDIR,"data/user/options");
+ my @user = readdir(USERDIR);
+ close USERDIR;
+ foreach $user (@user) {
+ if ($user eq $alias) {
+ &create_alias_html("alias_exists");
+ exit;
+ }
+ }
+ open(OPTIONS,">data/user/options/$alias");
+ print OPTIONS $pw."\n";
+ close OPTIONS;
+ local $number = $#user;
+ &zeit;
+ &post("Cyberbar","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias [$number] hat sich soeben als neuer Benutzer registriert :-) ...</font></i>");
+ &login_html;
+}
+
+sub frameset_html {
+print <<END;
+<html>
+ <head>
+ <title>
+ $title - Created & Copyright by Paul C. Bütow
+ </title>
+ </head>
+<frameset border=0 frameborder=0 framespacing=0 cols="130,*">
+ <frameset border=0 frameborder=0 framespacing=0 rows="300,*,55">
+ <frame name="online" src="online.pl?room=Cyberbar&alias=$alias&tmpid=$tmpid">
+ <frame src="htdocs.pl">
+ <frameset border=0 frameborder=0 framespacing=0 cols="70,*">
+ <frame name="logo" src="htdocs.pl?var=logo_html" scrolling="no">
+ <frame name="reload" src="htdocs.pl" scrolling="no">
+ </frameset>
+ </frameset>
+ <frameset border=0 frameborder=0 framespacing=0 rows="60,*,55">
+ <frame name="menu" src="htdocs.pl?alias=$alias&var=menu_html&room=Cyberbar&col=$col&secol=$secol&tmpid=$tmpid" scrolling="no">
+ <frame name="main" src="push.pl?room=Cyberbar&alias=$alias&tmpid=$tmpid">
+ <frame name="input" src="input.pl?alias=$alias&room=Cyberbar&col=$col&secol=$secol&tmp=login&tmpid=$tmpid" scrolling="no">
+ </frameset>
+</frameset>
+</html>
+END
+}
diff --git a/0.4.5a/input.pl b/0.4.5a/input.pl
new file mode 100644
index 0000000..2c5914e
--- /dev/null
+++ b/0.4.5a/input.pl
@@ -0,0 +1,121 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header();
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+&secure_checkid($alias);
+$room = $q->param("room");
+$col = $q->param("col");
+$secol = $q->param("secol");
+$tmp = $q->param("tmp");
+$whisper = $q->param('whisper');
+
+if ($tmp eq "login") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat den Chat betreten ...</font></i>");
+}
+
+print <<END;
+<html>
+ <head>
+ <script language="JavaScript">
+
+maxVerlauf = 10; // Anzahl der Einträge des Verlaufs
+maxPreview = 20; // Zeichenlänge der Verlaufsvorschau
+fullVerlauf = new Array( maxVerlauf );
+
+function delout()
+{
+ addVerlauf( document.inf.msg.value );
+ document.inf.submit(); // Formular absenden
+ document.inf.msg.focus(); // Fukus in das Eingabeform
+ document.inf.msg.select(); // Text im Eigabeform markieren
+ return false;
+}
+
+function CheckAuswahl()
+{
+ id = document.verlaufform.verlauf.selectedIndex;
+
+ if( fullVerlauf[ id-1 ] == null ) // Falls das Feld leer ist
+ return false; // Aufruf ignorieren
+
+ document.inf.msg.value = fullVerlauf[ id-1 ];
+ document.inf.msg.focus();
+
+ return true;
+}
+
+function addVerlauf( msg )
+{
+ if( msg == "" ) // Falls msg leer
+ return false; // Aufruf ignorieren
+
+ for( i=0; i<(maxVerlauf-1); i++ ) // Alle Einträge einen aufrutschen
+ {
+ document.verlaufform.verlauf.options[i+1].text = document.verlaufform.verlauf.options[i+2].text;
+ fullVerlauf[i] = fullVerlauf[i+1];
+ }
+ if( msg.length > maxPreview )
+ pre = msg.slice( 0, maxPreview-3 ) + "...";
+ else
+ pre = msg;
+
+ document.verlaufform.verlauf.options[ maxVerlauf ].text = pre; // Neue Vorschau anfügen
+ fullVerlauf[ maxVerlauf-1 ] = msg; // Neuen Eintrag anfügen
+
+// document.verlaufform.verlauf.selectedIndex = maxVerlauf; // Fokus auf den letzten Eintrag
+ document.verlaufform.verlauf.selectedIndex = 0; // Fokus auf den ersten Eintrag (Überschrift)
+}
+
+ </script>
+
+$style
+ </head>
+<body class="blank" onload="document.inf.msg.focus();">
+ <div align="left">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td>
+ <form name="inf" target="reload" action="main.pl" onsubmit="return delout()">
+ <input type="hidden" name="var" value="post_msg">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="room" value="$room">
+ <input type="hidden" name="col" value="$col">
+ <input type="hidden" name="secol" value="$secol">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="whisper" value="$whisper">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input size="50" name="msg">
+ </form>
+ </td>
+ <td>
+ <form name="verlaufform">
+ <select size="1" name="verlauf" size="40" onChange="CheckAuswahl()">
+ <option value>- Nachrichten-Verlauf -</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ </select>
+ </form>
+ </td>
+ </tr>
+ </table>
+ </div>
+</body>
+</html>
+END
diff --git a/0.4.5a/main.pl b/0.4.5a/main.pl
new file mode 100644
index 0000000..66dc31a
--- /dev/null
+++ b/0.4.5a/main.pl
@@ -0,0 +1,896 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header();
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+&secure_checkid($alias);
+$room = $q->param("room");
+$col = $q->param("col");
+$secol = $q->param("secol");
+$tmp = $q->param("tmp");
+$rmsg = \$q->param("msg");
+$whisper = $q->param("whisper");
+
+&reload_html("","change_colors") if ($q->param('var') eq "change_colors");
+
+if ($tmp eq "away") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat sich zurück gemeldet ... </font></i>");
+}
+$$rmsg =~ s#<#&lt\;#g;
+if (substr($$rmsg,0,1) ne "/") {
+ open(MSGFILE,">>data/msgs/$room");
+ print MSGFILE "!<;".time."<;!<;!<;<b><font color=$col>$alias: <font color=$secol>$$rmsg</font></font></b><;\n";
+ close MSGFILE;
+ &log("<b><font color=$col>$alias: <font color=$secol>$$rmsg</font></font></b>") if ($room eq "Cyberbar");
+ &reload_html($whisper,$tmp);
+} else {
+ &cmd($$rmsg);
+}
+
+sub reload_html { # Wird neugeladen, wenn eine Nachricht getextet wird!
+ my ($whisper,$action) = @_;
+ print "<html><head><script language=\"JavaScript\">";
+ if ($action eq "change_room") {
+ print "open(\"online.pl?alias=$alias&room=$room&tmpid=$tmpid\",\"online\");";
+ print "parent.input.document.inf.room.value = \"$room\";";
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol&tmpid=$tmpid\",\"menu\");";
+ } elsif ($action eq "change_colors") {
+ print "parent.input.document.inf.col.value = \"$col\";";
+ print "parent.input.document.inf.secol.value = \"$secol\";";
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol&tmpid=$tmpid\",\"menu\");";
+ } elsif ($action eq "whisper") {
+ print "parent.input.document.inf.whisper.value = \"$whisper\";";
+ } elsif ($action eq "away") {
+ print "parent.input.document.inf.tmp.value = \"away\";";
+ } elsif ($action eq "quit") {
+ print "open(\"index.pl?tmp=quit\",\"_top\");";
+ }
+ print "parent.input.document.inf.tmp.value = \"notaway\";" if ($tmp eq "away");
+ print "</script></head><body bgcolor=$col>";
+ print
+ $q->end_html;
+}
+
+sub change_room { # Den Chat-Raum wechseln
+ my ($method,$newroom,$oldroom,$alias2follow) = @_;
+ open(RSTAT, "<data/online/rstat/$newroom"); #Überprüfen, ob Alias Raum betreten darf
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ if ($rstat[0] eq "1\n") {
+ &hierachie($alias);
+ if ($hierachie eq "wa" || $hierachie eq "ow") { } else {
+ &post_prv("$alias","<font size=2 color=ffffff>Der Raum \"<font color=ffa500>$newroom</font>\" ist leider abgesperrt!</font>");
+ &reload_html($whisper,$action);
+ exit;
+ }
+ }
+ open(MSGFILE,">>data/msgs/$room");
+ print MSGFILE "$alias<;".time."<;cr<;$newroom<;!<;\n";
+ close MSGFILE;
+ $room = $oldroom;
+ my $tmpstamp = time+5;
+ &zeit;
+ if ($method eq "j") {
+# unlink("data/online/rooms/$oldroom/$alias");
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias wechselt in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias kommt aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ open(MSGFILE,">>data/msgs/$room");
+ print MSGFILE "$alias<;$tmpstamp<;!<;!<;<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>Du wechselst aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i><;\n";
+ close MSGFILE;
+ } elsif ($method eq "ju") {
+# unlink("data/online/rooms/$oldroom/$alias");
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias folgt \"$alias2follow\" in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias kommt aus dem Raum \"$oldroom\" und folgt \"$alias2follow\" herein nach \"$newroom\" ...</font></i>");
+ open(MSGFILE,">>data/msgs/$room");
+ print MSGFILE "$alias<;$tmpstamp<;!<;!<;<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>Du folgst \"$alias2follow\" aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i><;\n";
+ close MSGFILE;
+ }
+ unlink("data/online/rooms/$oldroom/$alias");
+ &rm_rstat($alias,$oldroom);
+ &check_online;
+}
+
+sub prove_besetzer { # Prüfen, ob Benutzer Raumbesetzerrechte hat
+ my ($r_alias,$r_room) = @_;
+ $r_besetzer = "false";
+ open(DATEI,"<data/online/rstat/$r_room");
+ @r_stat = <DATEI>;
+ close DATEI;
+ for($i=2;$i<=$#r_stat;$i++) {
+ $r_besetzer = "true" if ($r_stat[$i] eq $r_alias || $r_stat[$i] eq $r_alias."\n");
+ }
+}
+
+sub cmd { # Alle Chatbefehle, die über input_html eingegeben werden können.
+ $_[0] = $_[0]." ";
+ $_[0] = substr($_[0], 1, length($_[0])-1);
+ my @cmd = split(/ /, $_[0]);
+ my $cmd = substr($_[0],0 , index($_[0], " "));
+#############>- NORMALE CHATBEFEHLE ( Alphabetisch sortiert ) -<
+#############>- INFORMATIONEN ÜBER DAS SYSTEM AUSGEBEN -<
+ if ($cmd eq "about") {
+ &post_prv("$alias","<font size=2 color=ffffff>Aktuelle Version ist $title und wurde am $datum aktuallisiert. Erstellt von Paul C. Bütow (2000 - 2001).</font>");
+ &reload_html;
+ exit;
+#############>- ABMELDEN MIT 'AWAY-NACHRICHT' -<
+ } elsif ($cmd eq "away") {
+ if ($tmp eq "away") { # Falls 2 mal hintereinander /away eingegeben wurde
+ my $away_msg = "";
+ }
+ for ($i=1; $i <= $#cmd; $i++) {
+ $away_msg = $away_msg." ".$cmd[$i];
+ }
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias meldet sich ab (<font color=red>$away_msg</font> ) ...</i></font>");
+ &reload_html($whisper,"away");
+ exit;
+#############>- EIGENEN CHATBILDSCHIRM LÖSCHEN -<
+ } elsif ($cmd eq "clear") {
+ &post_prv($alias,"<script language=\"JavaScript\">window.open(\"push.pl?alias=$alias&room=$room&var=clear_screen&tmpid=$tmpid\",\"main\");</script>");
+ &reload_html;
+ exit;
+#############>- FARBEN WECHSELN -<
+ } elsif ($cmd eq "col") {
+ $col = $cmd[1];
+ my $tmpsecol = $cmd[2];
+ if ($tmpsecol eq "") {
+ $secol = $col
+ } else {
+ $secol = $tmpsecol;
+ }
+ open(OPTIONS,"<data/user/options/$alias");
+ my @options = <OPTIONS>;
+ close OPTIONS;
+ open(OPTIONS,">data/user/options/$alias");
+ print OPTIONS $options[0]."".$col."\n".$secol;
+ close OPTIONS;
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat die Farbe gewechselt ...</font></i>");
+ &reload_html($whisper,"change_colors");
+ exit;
+#############>- AKTUELLES DATUM UND URZEIT AUSGEBEN -<
+ } elsif ($cmd eq "date") {
+ &zeit;
+ &post_prv("$alias","<font size=2 color=ffffff>Heute ist der $day.$month. Jahr $year. Es ist genau $hours:$min Uhr und $sec Sekunden.</font>");
+ &reload_html;
+ exit;
+#############>- EINEN NEUEN RAUM ERSTELLEN BZW. IN EINEN BESTEHENDEN RAUM WECHSELN -<
+ } elsif ($cmd eq "j") {
+ &change_room("j",$cmd[1],$room);
+ &reload_html($whisper,"change_room");
+ exit;
+#############>- HANDELN -<
+ } elsif ($cmd eq "me" || $cmd eq "m") {
+ my $me_msg;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $me_msg = $me_msg." ".$cmd[$i];
+ }
+ if ($cmd eq "m") {
+ &post($room,"<i><font color=$col>$alias <font color=$secol>$me_msg</font></font></i>");
+ } else {
+ &post($room,"<i><font color=$col>$alias $me_msg</font></i>");
+ }
+ &reload_html;
+ exit;
+#############>- MEMO SCHREIBEN -<
+ } elsif ($cmd eq "memo") {
+ my $alias2memo = $cmd[1];
+ if(-f "data/user/options/$alias2memo") {
+ my $memo_msg;
+ for ($i=2; $i <= $#cmd; $i++) {
+ $memo_msg = $memo_msg." ".$cmd[$i];
+ }
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2memo <font color=ffffff>wurde folgende memo erfolgreich hinterlassen: $memo_msg</font></font>");
+ &zeit;
+ open(MEMO,">>data/user/memos/$alias2memo") || &error("Konnte >>data/user/memos/$alias2memo nicht öffnen");
+ print MEMO "<font size=2 color=ffffff>($day.$month. - $hours:$min:$sec) <font color=ffa500>$alias</font> hat Dir eine Memo hinterlassen: <font color=ffa500>$memo_msg</font></font><br>\n";
+ close MEMO;
+ &reload_html;
+ exit;
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2memo <font color=ffffff>existiert in der Datenbank nicht !</font></font>");
+ &reload_html;
+ exit;
+#############>- FLÜSTERN ( Auch mit '/' ) -<
+ } elsif ($cmd eq "msg" || $cmd eq "") {
+ my ($alias2post,$msg2post,$action) = ($cmd[1]);
+ if ($cmd eq "msg") {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ $action = "whisper";
+ } else {
+ $alias2post = $whisper;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ }
+ if (-f "data/online/users/$alias2post") {
+ &post_prv($alias2post,"<i><font color=$col>$alias flüstert <font color=ffffff>=></font><font color=$secol>$msg2post</font></font></i>");
+ &post_prv($alias,"<i><font color=$col>Zu $alias2post geflüstert <font color=ffffff>=></font><font color=$secol>$msg2post</font></font></i>");
+ &reload_html($alias2post,$action);
+ exit;
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2post <font color=ffffff>ist momentan nicht anwesend !</font></font>");
+ &reload_html;
+ exit;
+#############>- TOTALONLINEZEIT VON ALIAS ANZEIGEN -<
+ } elsif ($cmd eq "online") {
+ my $alias2prove= $cmd[1];
+ if (-f "data/user/options/$alias2prove") {
+ open(ONLINE,"<data/user/counts/$alias2prove.online");
+ my $online = <ONLINE>;
+ close ONLINE;
+ my $totaltime = sprintf("%.2f",($online / 60));
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff> war insgesamt schon $totaltime Minuten online!</font></font>");
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff>existiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+ &reload_html;
+ exit;
+#############>- DAS SYSTEM VERLASSEN -<
+ } elsif ($cmd eq "q") {
+ &reload_html($whisper,"quit");
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias verläßt den Chat ... </font></i>");
+ sleep 2;
+ &rm_alias($alias,$room);
+ exit;
+#############>- DAS EIGENE GÄSTEBUCH LÖSCHEN -<
+ } elsif ($cmd eq "rmgb") {
+ unlink("data/user/gbooks/$alias");
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias löscht sein gesamtes Gästebuch ...</font></i>");
+ &reload_html;
+ exit;
+#############>- SCHREIEN -<
+ } elsif ($cmd eq "s") {
+ my $msg2scream;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2scream = $msg2scream." ".$cmd[$i];
+ }
+ my $msg2post = "\U$msg2scream";
+ &post($room,"<font color=$col><i>$alias schreit:</i> <b><font color=$secol>".$msg2post."</font></font></b>");
+ &reload_html;
+ exit;
+#############>- SEHEN, WANN SICH ALIAS ZUM LETZTEN MAL EINGELOGT HAT -<
+ } elsif ($cmd eq "seen") {
+ my $alias2prove = $cmd[1];
+ if (-f "data/user/options/$alias2prove") {
+ if (-f "data/user/lastlogin/$alias2prove") {
+ open(LASTLOGIN,"<data/user/lastlogin/$alias2prove");
+ local $lastlogin = <LASTLOGIN>;
+ close LASTLOGIN;
+ local $timestamp = sprintf("%.2f",((time() - $lastlogin) / 3600));
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff> hat sich vor $timestamp Stunden zuletzt in das System eingelogt!</font></font>");
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff> hat sich seit der Einführung dieses Befehls noch nie eingelogt!</font></font>");
+ }
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff> exsistiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+ &reload_html;
+ exit;
+#############>- ANZEIGEN WER SICH IM AKTUELLEN RAUM BEFINDET -<
+ } elsif ($cmd eq "w") {
+ open(RSTAT,"data/online/rstat/$room");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ chomp($rstat[1]);
+ my $theme = "Raumthema:".$rstat[1] if ($rstat[1] ne undef);
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ my ($is,$nr) = ("t",0);
+ opendir(DIR,"data/online/rooms/$room");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ my $personen;
+ foreach(@dir) {
+ if (-f "data/online/rooms/$room/$_") {
+ $personen = $personen." ".$_;
+ $nr++;
+ }
+ }
+ &post_prv($alias,"<font size=2 color=ffffff>Der aktuelle Raum: $room $theme $door ($nr) : <font color=ffa500>$personen</font></font>");
+ &reload_html;
+ exit;
+#############>- ANZEIGEN WER SICH IM SYSTEM BEFINDET -<
+ } elsif ($cmd eq "wc" || $cmd eq "wc/") {
+ my $raum = $cmd[1];
+ my $personen;
+ if ($raum eq "" && $cmd eq "wc") {
+ opendir(USERS,"data/online/users");
+ my @users = readdir(USERS);
+ close USERS;
+ foreach(@users) {
+ $personen = $personen." ".$_ if (-f "data/online/users/$_");
+ }
+ my $nr = ($#users-1);
+ my ($nrs,$is) = ("","ist");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "sind";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>$nr Person$nrs $is insgesamt eingelogt: <font color=ffa500>$personen</font></font>");
+ } elsif ($raum eq "" && $cmd eq "wc/") {
+ my $msg2post;
+ opendir(DIR,"data/online/rooms");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ opendir(DIR,"data/online/rooms/$_");
+ my @dir2 = readdir(DIR);
+ closedir(DIR);
+ open(RSTAT,"<data/online/rstat/$_");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ chomp($rstat[1]);
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ my $nr = $#dir2-1;
+ $msg2post = $msg2post."<tr><td><b><font size=2 color=ffffff>$_ $door ($nr) [".$rstat[1]."]: </font></b></td></tr><tr><td><font size=2 color=ffa500>";
+ foreach $chatter (@dir2) {
+ if (-f "data/online/rooms/$_/$chatter") {
+ $msg2post = $msg2post."$chatter ";
+ }
+ }
+ print "</font></td>";
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>Folgende Räume sind offen:</font><table>$msg2post</table>");
+ } elsif ($raum ne "") {
+ my $personen;
+ opendir(DIR,"data/online/rooms/$raum");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/rooms/$raum/$_");
+ }
+ my ($nr,$is) = (($#dir-1),"t");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "n";
+ }
+ &post_prv($alias,"<font size=2 color=ffffff> $nr Person$nrs befinde$is sich im Raum \"$raum\": <font color=ffa500>$personen</font></font>");
+ }
+ &reload_html;
+ exit;
+#############>- ANZEIGEN IN WELCHEN RAUM SICH JMD. BEFINDET BZW. JMD IN EINEN RAUM FOLGEN -<
+ } elsif ($cmd eq "wj" || $cmd eq "ju") {
+ my $alias2search = $cmd[1];
+ opendir(ROOMS,"data/online/rooms");
+ my @dir = readdir(ROOMS);
+ closedir(ROOMS);
+ foreach $raum (@dir) {
+ opendir(DIR2,"data/online/rooms/$raum");
+ my @dir2 = readdir(DIR2);
+ closedir(DIR2);
+ foreach $user (@dir2) {
+ if (-f "data/online/rooms/$raum/$user") {
+ if ($user eq $alias2search) {
+ if ($cmd eq "wj") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2search <font color=ffffff>befindet sich im Raum \"$raum\" !</font></font>");
+ } else {
+ &change_room("ju",$raum,$room,$alias2search);
+ }
+ &reload_html($whisper,"change_room");
+ exit;
+ }
+ }
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2search <font color=ffffff> ist nicht eingelogt !</font></font>");
+ &reload_html;
+ exit;
+#############>- RAUMNESETZER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- RAUM ABSCHLIESSEN/AUFSCHLIESSEN -<
+ } elsif ($cmd eq "l") {
+ &prove_besetzer($alias,$room);
+ &hierachie($alias);
+ if ($r_besetzer eq "true" || $hierachie eq "wa" || $hierachie eq "ow") {
+ my $lock = "0\n";
+ &zeit;
+ if ($room eq "Cyberbar") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum ohne Erfolg ab ...</font></i>");
+ } else {
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum ab ...</font></i>");
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum auf ...</font></i>");
+ }
+ for ($i=1;$i<=$#r_stat;$i++) {
+ $lock = $lock.$r_stat[$i];
+ }
+ open(RSTAT,">data/online/rstat/$room");
+ print RSTAT $lock;
+ close RSTAT;
+ }
+ }
+ &reload_html;
+ exit;
+#############>- RAUMBESETZER ERNENNEN -<
+ } elsif ($cmd eq "su") {
+ &prove_besetzer($alias,$room);
+ &hierachie($alias);
+ if ($r_besetzer eq "true" || $hierachie eq "wa" || $hierachie eq "ow") {
+ my $alias2su = $cmd[1];
+ opendir(DIR,"data/online/rooms/$room");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ if ($_ eq $alias2su) {
+ open(DATEI,"<data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ &hierachie($alias2su);
+ &prove_besetzer($alias2su,$room);
+ if ($r_besetzer eq "true" || $hierachie eq "wa" || $hierachie eq "ow") {
+ &reload_html;
+ &post_prv($alias,"<font color=ffa500>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist bereits RB, WÄ oder OW)</font>");
+ exit;
+ }
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias ernennt \"$alias2su\" zum Raumbesetzer ...</font></i>");
+ open(DATEI,">>data/online/rstat/$room");
+ print DATEI $alias2su."\n";
+ close DATEI;
+ &reload_html;
+ exit;
+ }
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist nicht anwesend)</font>");
+ }
+ &reload_html;
+ exit;
+#############>- RAUMBESETZER ENTNENNEN -<
+ } elsif ($cmd eq "rsu") {
+ &prove_besetzer($alias,$room);
+ &hierachie($alias);
+ if ($r_besetzer eq "true" || $hierachie eq "wa" || $hierachie eq "ow") {
+ my $alias2rsu = $cmd[1];
+ open(DATEI,"<data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ &prove_besetzer($alias2rsu,$room);
+ if ($r_besetzer eq "true") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias entzieht \"$alias2rsu\" die Raumbesetzerrechte ...</font></i>");
+ my $newrstat = $rstat[0].$rstat[1];
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $newrstat = $newrstat.$r_stat[$i] if ($r_stat[$i] ne $alias2rsu."\n");
+ }
+ open(DATEI,">data/online/rstat/$room");
+ print DATEI $newrstat;
+ close DATEI;
+ } else {
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2rsu <font color=ffffff>ist kein Raumbesetzer und kann dieser Status auch nicht aberkannt werden !</font></font>");
+ }
+ }
+ &reload_html;
+ exit;
+#############>- RAUM EIN THEMA GEBEN -<
+ } elsif ($cmd eq "t") {
+ &prove_besetzer($alias,$room);
+ &hierachie($alias);
+ if ($r_besetzer eq "true" || $hierachie eq "wa" || $hierachie eq "ow") {
+ my $theme;
+ &zeit;
+ if ($cmd[1] ne undef) {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $theme = $theme." ".$cmd[$i];
+ }
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias gibt dem Raum das Thema (<font color=red> $theme </font>) ...</font></i>");
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias löscht das Thema des Raums ...</font></i>");
+ }
+ $theme = $r_stat[0].$theme."\n";
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $theme = $theme.$r_stat[$i];
+ }
+ open(RSTAT,">data/online/rstat/$room");
+ print RSTAT $theme;
+ close RSTAT;
+ }
+ &reload_html;
+ exit;
+#############>- SUPERUSER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- ALIAS VERBANNEN -<
+ } elsif ($cmd eq "ban") {
+ &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $alias2ban = $cmd[1];
+ open(BAN,"<data/ban");
+ my @ban = <BAN>;
+ close BAN;
+ if ($cmd[1] eq undef) {
+ my $banned;
+ local $nr = @ban;
+ for ($i=0;$i<=$#ban;$i++) {
+ $banned .= $ban[$i];
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>Folgende Benutzer sind verbannt [$nr]: <font color=ffa500>$banned</font></font>");
+ &reload_html;
+ exit;
+ } elsif (-f "data/user/options/$alias2ban") {
+ &hierachie($alias2ban);
+ if ($hierachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2ban <font color=ffffff>ist Wächter und kann nicht verbannt werden!</font></font>");
+ &reload_html;
+ exit;
+ } elsif ($hierachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2ban <font color=ffffff>ist Oberwächter und kann nicht verbannt werden!</font></font>");
+ &reload_html;
+ exit;
+ }
+ foreach $ban (@ban) {
+ if ($ban eq $alias2ban."\n") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2ban <font color=ffffff>ist bereits verbannt!</font></font>");
+ &reload_html;
+ exit;
+ }
+ }
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias verbannt \"$alias2ban\" aus dem Chat ...</font></i>");
+ open(BAN,">>data/ban");
+ print BAN $alias2ban."\n";
+ close BAN;
+ &reload_html;
+ exit;
+ }
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2ban <font color=ffffff>kann nicht verbannt werden da Benutzername nicht existiert!</font></font>");
+ &reload_html;
+ exit;
+ }
+#############>- ALIAS ENTBANNEN -<
+ } elsif ($cmd eq "rban") {
+ &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $alias2rban = $cmd[1];
+ open(BAN,"<data/ban");
+ @ban = <BAN>;
+ close BAN;
+ foreach $ban (@ban) {
+ if ($ban eq $alias2rban."\n") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias entbannt \"$alias2rban\" ...</font></i>");
+ my @ban2;
+ foreach $ban (@ban) {
+ push(@wa2,$wa) if ($ban ne $alias2rban."\n");
+ }
+ open(BAN,">data/ban");
+ print BAN @ban2;
+ close BAN;
+ &reload_html;
+ exit;
+ }
+ }
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2rban <font color=ffffff>ist nicht verbannt!</font></font>");
+ &reload_html;
+ exit;
+ }
+#############>- IP # VON ALIAS ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "ip") {
+ &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $alias2prove = $cmd[1];
+ opendir(DIR,"data/online/ident");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ if ($_ eq $alias2prove) {
+ open(DATEI,"<data/online/ident/$_");
+ local $ipnr = <DATEI>;
+ close DATEI;
+ &post_prv("$alias","<font size=2 color=ffa500>$_ <font color=ffffff>hat die IP-Nummer $ipnr !</font></font>");
+ }
+ }
+ }
+ &reload_html;
+ exit;
+#############>- ALIAS AUS DEM CHAT KATAPULTIEREN -<
+ } elsif ($cmd eq "k") {
+ &hierachie($alias);
+ if ($hierachie eq "wa" || $hierachie eq "ow") {
+ my $alias2kick = $cmd[1];
+ opendir(DIR,"data/online/rooms");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach $raum (@dir) {
+ opendir(DIR,"data/online/rooms/$raum");
+ my @dir2 = readdir(DIR);
+ closedir(DIR);
+ foreach $chatter (@dir2) {
+ if ($chatter eq $alias2kick) {
+ &hierachie($alias2kick);
+ if ($hierachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist Oberwächter und kann nicht \"gekickt\" werden !</font></font>");
+ } elsif ($hierachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist Wächter und kann nicht \"gekickt\" werden !</font></font>");
+ } else {
+ &post_prv("$alias2kick","<script language=\"JavaScript\">window.open(\"index.pl?tmp=kick\",\"_top\");</script>");
+ &zeit;
+ $_ = undef if ($room eq $raum);
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias katapultiert \"$alias2kick\" aus dem Chat ...</font></i>",$raum);
+ &rm_alias($alias2kick,$raum);
+ &check_online;
+ }
+ &reload_html;
+ exit;
+ }
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist nicht anwesend und kann nicht \"gekickt\" werden !</font></font>");
+ }
+ &reload_html;
+ exit;
+#############>- EINEN BENUTZER AUS DEM SYSTEM LÖSCHEN -<
+ } elsif ($cmd eq "kill") {
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ my $alias2kill = $cmd[1];
+ &hierachie($alias2kill);
+ if ($hierachie eq "ow") {
+ &post_prv($alias,"<font size color=ffa500>$alias2kill</font> <font color=ffffff>ist Oberwächter und kann nicht aus dem System entfernt werden !</font>");
+ } elsif ($hierachie eq "wa") {
+ &post_prv($alias,"<font size color=ffa500>$alias2kill</font> <font color=ffffff>ist Wächter und kann nicht aus dem System entfernt werden !</font>");
+ } else {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias killt \"$alias2kill\" ganz und gar aus dem System ...</font></i>");
+ unlink("data/user/options/$alias2kill");
+ unlink("data/user/profiles/$alias2kill");
+ unlink("data/user/gbooks/$alias2kill");
+ unlink("data/user/counts/$alias2kill");
+ unlink("data/user/counts/$alias2kill.online");
+ unlink("data/user/lastlogin/$alias2kill");
+ unlink("data/user/memos/$alias2kill");
+ }
+ }
+ &reload_html;
+ exit;
+#############>- EINEN ANDEREN RAUM AUF-/ABSPERREN -<
+ } elsif ($cmd eq "sl") {
+ &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $sl_room = $cmd[1];
+ if (-e "data/online/rooms/$sl_room") {
+ my $lock = "0\n";
+ &zeit;
+ open(RSTAT,"<data/online/rstat/$sl_room");
+ my @r_stat = <RSTAT>;
+ close RSTAT;
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum \"$sl_room\" von aussen ab ...</font></i>",$sl_room);
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum \"$sl_room\" von aussen auf ...</font></i>",$sl_room);
+ }
+ for ($i=1;$i<=$#r_stat;$i++) {
+ $lock = $lock.$r_stat[$i];
+ }
+ open(RSTAT,">data/online/rstat/$sl_room");
+ print RSTAT $lock;
+ close RSTAT;
+ } else {
+ &post_prv($alias,"<font size=2 color=ffffff>Der Raum <font color=ffa500>$sl_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ exit;
+ }
+#############>- IN EINEN ANDEREN RAUM HINEINRUFEN -<
+ } elsif ($cmd eq "ss") {
+ &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $ss_room = $cmd[1];
+ if (-e "data/online/rooms/$ss_room") {
+ my $ss_msg;
+ for ($i=2; $i <= $#cmd; $i++) {
+ $ss_msg = $ss_msg." ".$cmd[$i];
+ }
+ my $msg2scream = "\U$ss_msg";
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias ruft aus dem Raum \"$room\" hinein in den Raum \"$ss_room\": <font color=$col>$msg2scream</font> ...</font></i>",$ss_room);
+ &reload_html;
+ exit;
+ } else {
+ &post_prv($alias,"<font size=2 color=ffffff>Der Raum <font color=ffa500>$ss_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ exit;
+ }
+#############>- EINEN ANDEREN RAUM EIN THEMA GEBEN -<
+ } elsif ($cmd eq "st") {
+ &hierachie($alias);
+ if ($hierachie eq "wa" || $hierachie eq "ow") {
+ my $st_room = $cmd[1];
+ if (-e "data/online/rooms/$st_room") {
+ my $theme;
+ &zeit;
+ if ($cmd[2] ne undef) {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $theme = $theme." ".$cmd[$i];
+ }
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias gibt dem Raum \"$st_room\" das Thema (<font color=red> $theme </font>) ...</font></i>",$st_room);
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias löscht das Thema des Raums \"$st_room\" ...</font></i>",$st_room);
+ }
+ open(RSTAT,"<data/online/rstat/$st_room");
+ my @r_stat = <RSTAT>;
+ close RSTAT;
+ $theme = $r_stat[0].$theme."\n";
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $theme = $theme.$r_stat[$i];
+ }
+ open(RSTAT,">data/online/rstat/$st_room");
+ print RSTAT $theme;
+ close RSTAT;
+ } else {
+ &post_prv($alias,"<font size=2 color=ffffff>Der Raum <font color=ffa500>$st_room</font> existiert nicht!</font></font>");
+ }
+ }
+ &reload_html;
+ exit;
+#############>- SYSTEMNACHRICHT IN ALLE BESTEHENDEN RÄUME POSTEN -<
+ } elsif ($cmd eq "sys") {
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ my $sys_msg;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $sys_msg = $sys_msg." ".$cmd[$i];
+ }
+ &zeit;
+ $sys_msg = "<i><font color=ffffff>($hours:$min:$sec)</font></i> <b><font size=2 color=red>SYSTEMNACHRICHT</font></b><i><font color=ffffff>: $sys_msg ...</font></i>";
+ opendir(ROOMS,"data/msgs");
+ my @rooms = readdir(ROOMS);
+ close(ROOMS);
+ foreach(@rooms) {
+ &post($_,$sys_msg);
+ }
+ &log($sys_msg);
+ }
+ &reload_html;
+ exit;
+#############>- ALIAS ZUM WÄCHTER ERNNENNEN -<
+ } elsif ($cmd eq "wa") {
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ my $alias2wa = $cmd[1];
+ &hierachie($alias2wa);
+ if ($hierachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2wa <font color=ffffff>ist bereits als Wächter eingetragen. Eine erneuerte Eintragung ist nicht möglich!</font></font>");
+ &reload_html;
+ exit;
+ } elsif ($hierachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2wa <font color=ffffff>ist bereits als Oberwächter eingetragen. Oberwächter können nicht gleichzeitig Wächter sein!</font></font>");
+ &reload_html;
+ exit;
+ }
+ if (-f "data/user/options/$alias2wa") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font><font color=ffa500> $alias ernennt \"$alias2wa\" zum Wächter ...</font></i>");
+ open(WA,">>data/wa");
+ print WA $alias2wa."\n";
+ close WA;
+ &reload_html;
+ exit;
+ }
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2wa <font color=ffffff>kann nicht zum Wächter ernannt werden da Benutzername nicht existiert!</font></font>");
+ &reload_html;
+ exit;
+ }
+#############>- ALIAS DIE WÄCHTERRECHTE ENTZIEHEN -<
+ } elsif ($cmd eq "rwa") {
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ my $alias2rwa = $cmd[1];
+ &hierachie($alias2rwa);
+ if ($hierachie eq "wa") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat \"$alias2rwa\" vom Wächter zum normalen Chatter degradiert ...</font></i>");
+ open(WA,"<data/wa");
+ @wa = <WA>;
+ close WA;
+ my @wa2;
+ foreach $wa (@wa) {
+ push(@wa2,$wa) if ($wa ne $alias2rwa."\n");
+ }
+ open(WA,">data/wa");
+ print WA @wa2;
+ close WA;
+ } else {
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2rwa <font color=ffffff>ist kein Wächter und können die Wächterrechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ exit;
+ }
+#############>- ADMINISTRATORBEFEHLE -<
+#############>- ALIAS ZUM OBERWÄCHTER ERNENNEN -<
+ } elsif ($cmd eq "ow" && $alias eq "Snooper") {
+ my $alias2ow = $cmd[1];
+ &hierachie($alias2ow);
+ if ($hierachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2ow <font color=ffffff>ist bereits als Wächter eingetragen. Wächter können nicht gleichzeitig Oberwächter sein!</font></font>");
+ &reload_html;
+ exit;
+ } elsif ($hierachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2ow <font color=ffffff>ist bereits als Oberwächter eingetragen!</font></font>");
+ &reload_html;
+ exit;
+ }
+ if (-f "data/user/options/$alias2ow") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font><font color=ffa500> $alias ernennt \"$alias2ow\" zum Oberwächter ...</font></i>");
+ open(OW,">>data/ow");
+ print OW $alias2ow."\n";
+ close OW;
+ &reload_html;
+ exit;
+ }
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2ow <font color=ffffff>kann nicht zum Oberwächter ernannt werden da Benutzername nicht existiert!</font></font>");
+ &reload_html;
+ exit;
+#############>- ALIAS DIE OBERWÄCHTERRECHTE ENTZIEHEN -<
+ } elsif ($cmd eq "row" && $alias eq "Snooper") {
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ my $alias2row = $cmd[1];
+ &hierachie($alias2row);
+ if ($hierachie eq "ow") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat \"$alias2row\" vom Oberwächter zum normalen Chatter degradiert ...</font></i>");
+ open(OW,"<data/ow");
+ @ow = <OW>;
+ close OW;
+ my @ow2;
+ foreach $ow (@ow) {
+ push(@ow2,$ow) if ($ow ne $alias2row."\n");
+ }
+ open(OW,">data/ow");
+ print OW @ow2;
+ close OW;
+ } else {
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2row <font color=ffffff>ist kein Oberwächter und können die Wächterrechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ exit;
+ }
+#############>- PASSWORD EINES BENUTZERS ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "pw" && $alias eq "Snooper") {
+ my $pw2show = $cmd[1];
+ if (-f "data/user/options/$pw2show") {
+ open(PW,"<data/user/options/$pw2show");
+ @pw = <PW>;
+ close PW;
+ &post_prv($alias,"<font size=2 color=ffa500>$pw2show <font color=ffffff> hat das Passwort \"".$pw[0]."\" !</font></font>");
+ &reload_html;
+ exit;
+ }
+ &post_prv($alias,"<font size=2 color=ffa500>$pw2show <font color=ffffff> existiert nicht in der Benutzerdatenbank !</font></font>");
+ &reload_html;
+ exit;
+#############>- SYSTEMMELDUNG POSTEN -<
+ } elsif ($cmd eq "cool" && $alias eq "Snooper" || $alias eq "Peacemaker") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$msg2post</font></i>");
+ &reload_html;
+ exit;
+#############>- ENDE DER CHATBEFEHLE -<
+ }
+&post_prv($alias,"<font size=2 color=ffffff>Der Chatbefehl <font color=ffa500>/$cmd</font> existiert nicht oder Du hast keine Berechtigung diesen Befehl auszuführen!</font></font>");
+&reload_html;
+} \ No newline at end of file
diff --git a/0.4.5a/main2.pl b/0.4.5a/main2.pl
new file mode 100644
index 0000000..36a0012
--- /dev/null
+++ b/0.4.5a/main2.pl
@@ -0,0 +1,594 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header();
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+
+$var = $q->param("var");
+if ($var eq "list_alias_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &list_alias_html;
+} elsif ($var eq "alias_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $tmp = $q->param("tmp");
+ &alias_html;
+} elsif ($var eq "edit_profile_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ &edit_html("edit_profile_html");
+} elsif ($var eq "edit_options_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ &edit_html("edit_options_html");
+} elsif ($var eq "gb_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &gb_html;
+} elsif ($var eq "post_gb") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $msg = $q->param("msg");
+ $tmp = $q->param("tmp");
+ $id = $q->param("id");
+ &post_gb;
+} elsif ($var eq "edit_profile") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ &secure_checkid($alias);
+ &edit("edit_profile");
+} elsif ($var eq "edit_options") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $tmp = $q->param("tmp");
+ $id = $q->param("id");
+ $room = $q->param("room");
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ &edit("edit_options");
+} elsif ($var eq "rm_gb_alias") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $tmp = $q->param("tmp");
+ $id = $q->param("id");
+ &rm_gb;
+} else {
+ &error("Parameter fehlt");
+}
+
+###########################
+##HAUPTTEIL DIESER DATEI:##
+###########################
+
+sub gb_html { # Das Benutzerboard/Gästebuch.
+ my $message = $_[0];
+ &start_html("Benutzerboard");
+if ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </i>
+ einen Text und poste
+ <u>dann</u>
+ !
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Vielen Dank für Deinen Beitrag. Wenn Du willst, kannst Du jetzt gleich noch einen Eintrag posten ...
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Falls Du Anregungen oder Verbesserungsvorschläge für die Community hast, dann poste doch einen kleinen Eintrag :-)
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="guestbook">
+ <input type="hidden" name="id" value="y">
+ <input size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+ if (-e "data/guestbook") {
+ open (DATEI,"<data/guestbook") || &error("Konnte dat/guestbook nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ print
+ $q->div(@datei);
+ }
+ print
+ $q->end_html;
+}
+
+
+sub post_gb { # Wenn etwas in ein Gästebuch eingetragen wird
+ &zeit;
+ if ($msg eq "") {
+ if ($id eq "y") { # Überprüfen, ob Benutzerboard- oder Privatgästebuch
+ &gb_html("post_empty");
+ } else {
+ &alias_html("post_empty");
+ }
+ exit;
+ }
+ $msg =~ s#<#&lt\;#g;
+ my $tmpath = "";
+ if ($id eq "y") {
+ $tmpath = "data/guestbook";
+ } else {
+ $tmpath = "data/user/gbooks/$tmp";
+ }
+ open(GB,"$tmpath");
+ my @gb = <GB>;
+ close GB;
+ pop(@gb) if ($#gb > 99);
+ my @newdatei = "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ push(@newdatei,@gb);
+ open(GB,">$tmpath");
+ print GB @newdatei;
+ close GB;
+ if ($id eq "y") {
+ &gb_html("post_ok");
+ exit;
+ } else {
+ post_prv("$tmp","<font size=2 color=ffffff><a href=\"main2.pl?alias=$alias&var=alias_html&tmp=$tmp&tmpid=$tmpid\" target=\"_new\">$alias</a> hat soeben einen Pin in <a href=\"main2.pl?alias=$alias&var=alias_html&tmp=$tmp&tmpid=$tmpid\" target=\"_new\">Dein Profil</a> gehängt ... </font>");
+ &alias_html;
+ exit;
+ }
+}
+
+sub rm_gb { # Gästebucheintrag entfernen
+ open(GB,"<data/user/gbooks/$alias");
+ my @gbfile = <GB>;
+ close GB;
+ my @newgbfile = ();
+ for ($i=0; $i <= $#gbfile; $i++) {
+ push(@newgbfile,$gbfile[$i]) if ($i != $id);
+ }
+ open(GB,">data/user/gbooks/$alias");
+ print GB @newgbfile;
+ close GB;
+ &alias_html("rm_ok");
+}
+
+sub list_alias_html { # Liste aller Benutzer
+ &start_html("Alle Benutzer");
+ opendir(REGISTERED,"data/user/options");
+ my @users = readdir(REGISTERED);
+ closedir(REGISTERED);
+ my @liste = sort(@users);
+ my $nr = $#users-1;
+print <<END;
+ <div>
+ Es sind z.Z. genau $nr Benutzernamen in der Datenbank vorhanden! (Sortiert nach #, A-Z, a-z)
+ </div>
+ <hr>
+ <div>
+END
+ foreach(@liste) {
+ if (-f "data/user/options/$_") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid" },
+ "$_"),
+ " ";
+ }
+ }
+print <<END;
+ </div>
+</body>
+</html>
+END
+}
+
+sub alias_html { # Anzeigen eines Benutzerprofils
+ my $message = $_[0];
+ open(COUNTS,"<data/user/counts/$tmp");
+ local $counter = <COUNTS>;
+ close COUNTS;
+ $counter++;
+ open(COUNTS,">data/user/counts/$tmp");
+ print COUNTS $counter;
+ close COUNTS;
+ &start_html($tmp);
+print <<END;
+<div>
+ <a href="htdocs.pl?var=werda_html&alias=$alias&tmpid=$tmpid">Hier</a>
+ gehts zur Gesamtübersicht !
+</div>
+<hr>
+END
+if ($message eq "rm_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Der von Dir gewählte Eintrag wurde erfolgreich gelöscht.
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </u>
+ einen Text und poste
+ <u>dann</u>
+ !
+ <hr>
+END
+}
+ open(PROFILE,"<data/user/profiles/$tmp");
+ @data = <PROFILE>;
+ close PROFILE;
+print <<END;
+ <div>
+ Dieses Profil wurde insgesamt schon $counter mal aufgerufen !
+ <br>
+ <br>
+ Alias: $tmp
+ <br>
+ <br>
+ Nachname: $data[0]
+ <br>
+ <br>
+ Vorname: $data[1]
+ <br>
+ <br>
+ Alter: $data[2]
+ <br>
+ <br>
+ Wohnort: $data[3]
+ <br>
+ <br>
+ E-Mail:
+ <a href="mailto:$data[4]">$data[4]</a>
+ <br>
+ <br>
+ ICQ-Nummer: $data[5]
+ <br>
+ <br>
+ Homepage:
+ <a href="$data[6]" target="_new">$data[6]</a>
+ <br>
+ <br>
+ Weiteres:
+ <br>
+ $data[7]
+ <hr>
+ Hier kannst Du $tmp eine Nachricht hinterlassen!
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input type="text" size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+if (-e "data/user/gbooks/$tmp") {
+ open (DATEI,"<data/user/gbooks/$tmp") || &error("Konnte data/user/gbooks/$tmp nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ if ($alias ne $tmp) {
+ print @datei;
+ } else {
+print <<END;
+ <table>
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="rm_gb_alias">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="$tmp">
+END
+for($i=0; $i <= $#datei; $i++) {
+print <<END;
+ <tr>
+ <td>
+ <input type="radio" name="id" value="$i">
+ </td>
+ <td>
+ <div class=q>
+ $datei[$i]
+ </div>
+ </td>
+ </tr>
+END
+}
+print <<END;
+ </table>
+ <table>
+ <tr>
+ <td>
+ <font color=ffffff>
+ <input type="submit" value="Makierten Eintrag löschen">
+ </font>
+ </td>
+ <td>
+ <font color=ffffff>
+ <input type="reset" value="Makierung rückgängig machen">
+ </font>
+ </td>
+ </tr>
+ </table>
+ </form>
+END
+}
+}
+ print
+ $q->end_html;
+}
+
+sub edit_html { # Chat-Optionen / Benutzerprofil editieren
+ my ($method,$message) = @_;
+ &start_html("Benutzerprofil ändern");
+ if ($method eq "edit_options_html") {
+ open(DATEI,"<data/user/options/$alias");
+ } elsif ($method eq "edit_profile_html") {
+ open(DATEI,"<data/user/profiles/$alias");
+ }
+ @data = <DATEI>;
+ close DATEI;
+ if ($method eq "edit_options_html") {
+ chomp($data[0]);
+ if ($message eq "edit_options_ok") {
+print <<END;
+<script language="JavaScript">
+ open("main.pl?var=change_colors&alias=$alias&col=$col&secol=$secol&tmpid=$tmpid","reload");
+ open("htdocs.pl?var=menu_html&alias=$alias&room=$room&col=$col&secol=$secol&tmpid=$tmpid","menu");
+</script>
+<div class=b>
+ Hinweis:
+</div>
+<div>
+ Du hast soeben Deine Chat-Optionen erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren. Um
+ weiterzuchatten einfach Fenster schliessen!
+</div>
+<hr>
+END
+ } elsif ($message eq "edit_pw_wrong") {
+print <<END;
+<div class=b>
+ ACHTUNG!
+</div>
+<div>
+ Du hast soeben versucht, dein Passwort zu ändern. Jedoch stimmte die Erste Eingabe nicht mit der Zweiten überein.
+ Bitte versuch es erneuert ...
+</div>
+<hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Deine Chat-Optionen editieren!" ),
+ $q->hr;
+ }
+print <<END;
+<script lang="javascript" type="text/javascript">
+<!--
+
+function radioWert(rObj) {
+ for (var i=0; i<rObj.length; i++) if (rObj[i].checked) return rObj[i].value;
+ return false;
+}
+
+function insertcode( code ) {
+ document.optionen.elements[radioWert(document.optionen.eingabe)].value = code;
+}
+
+//-->
+</script>
+
+<form name="optionen" action="main2.pl">
+ <input type="hidden" name="var" value="edit_options">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Passwort
+ <font color=ffa500>
+ (Gut merken !!)
+ </font>
+ <br>
+ <input type="password" name="id" value="$data[0]">
+ </div>
+ </td>
+ <td width=20>
+ </td>
+ <td>
+ <div>
+ Geb hier das Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp" value="$data[0]">
+ </div>
+ </td>
+ </tr>
+ </table>
+<br>
+<br>
+ <table>
+ <tr>
+ <td>
+ <div>
+ <input type="radio" name="eingabe" value="col" checked>
+ Auswahl von Farbe 1
+ <br>
+ (Farbe Deines Nicks):
+ <br>
+ <input name="col" size="6" maxlength="6" value="$data[1]">
+ </div>
+ </td>
+ <td width=20>
+ </td>
+ <td>
+ <div>
+ <input type="radio" name="eingabe" value="secol">
+ Auswahl von Farbe 2
+ <br>
+ (Farbe Deiner Nachrichten):
+ <br>
+ <input name="secol" size="6" maxlength="6" value="$data[2]">
+ </div>
+ </td>
+ </tr>
+ </table>
+<br>
+ <div>
+ Beliebige Auswahl makieren und Farbe wählen. Um Deine Optionen abzuspeichern,
+ auf "Daten ändern" klicken!
+ </div>
+ <br>
+END
+ open(COLORS,"<colors.sno");
+ @colors = <COLORS>;
+ close COLORS;
+ print @colors;
+ } elsif ($method eq "edit_profile_html") {
+ if ($message eq "edit_profile_ok") {
+print <<END;
+ <div class=b>
+ Hinweis:
+ </div>
+ <div>
+ Du hast soeben Dein Profil erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren:
+ <hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Dein Profil editieren!" ),
+ $q->hr;
+ }
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="edit_profile">
+ <div>
+ Dein Nachname:
+ <br>
+ <input name="nachname" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ Dein Vorname:
+ <br>
+ <input name="vorname" value="$data[1]">
+ </div>
+ <br>
+ <div>
+ Dein Alter:
+ <br>
+ <input name="alter" value="$data[2]">
+ </div>
+ <br>
+ <div>
+ Dein Wohnort:
+ <br>
+ <input name="wohnort" value="$data[3]">
+ </div>
+ <br>
+ <div>
+ Deine E-Mail Adresse:
+ <br>
+ <input name="email" value="$data[4]">
+ </div>
+ <br>
+ <div>
+ Deine ICQ-Nummer:
+ <br>
+ <input name="icq" value="$data[5]">
+ </div>
+ <br>
+ <div>
+ Deine Homepage:
+ <br>
+ <input name="homepage" value="$data[6]">
+ </div>
+ <br>
+ <div>
+ Weiteres:
+ <br>
+ <textarea rows="5" cols="40"name="weiteres" wrap="virtual">$data[7]</textarea>
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <font color=ffffff>
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="room" value="$room">
+ <input type="submit" value="Daten ändern ...">
+ </font>
+ </form>
+</body>
+</html>
+END
+}
+
+
+sub edit { # Benutzerprofil od. Chat-Optionen abspeichern
+ my $method = $_[0];
+ &zeit;
+ if ($method eq "edit_profile") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat sein Profil geändert ...</font></i>");
+ open(PROFILE,">data/user/profiles/$alias");
+ print PROFILE $q->param('nachname')."\n".$q->param('vorname')."\n".$q->param('alter')."\n".$q->param('wohnort')."\n".$q->param('email')."\n".$q->param('icq')."\n".$q->param('homepage')."\n".$q->param('weiteres');
+ close PROFILE;
+ &edit_html("edit_profile_html","edit_profile_ok");
+ } elsif ($method eq "edit_options") {
+ if ($id ne $tmp) {
+ &edit_html("edit_options_html","edit_pw_wrong");
+ exit;
+ }
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat seine Chateinstellungen geändert ...</font></i>");
+ open(OPTIONS,">data/user/options/$alias");
+ print OPTIONS $id."\n".$col."\n".$secol;
+ close OPTIONS;
+ &edit_html("edit_options_html","edit_options_ok");
+ }
+}
diff --git a/0.4.5a/online.pl b/0.4.5a/online.pl
new file mode 100644
index 0000000..b6346c5
--- /dev/null
+++ b/0.4.5a/online.pl
@@ -0,0 +1,71 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header();
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+$room = $q->param("room");
+
+&secure_checkid($alias);
+
+# Onlinezeit zählen !
+open(DATEI,"<data/online/users/$alias");
+ my $oldstamp = <DATEI>;
+close DATEI;
+ if ($oldstamp > (time - 60)) {
+ open(DATEI,"<data/user/counts/$alias.online");
+ my $online = <DATEI>;
+ close DATEI;
+ my $total = (time-$oldstamp+$online);
+ open(DATEI,">data/user/counts/$alias.online");
+ print DATEI $total;
+ close DATEI;
+ }
+##### ENDE
+
+&start_html("Online","online");
+&online($alias,$room);
+opendir(ROOMS,"data/online/rooms/".$room);
+ my @rooms = readdir(ROOMS);
+closedir(ROOMS);
+print
+ $q->div( "$room:" ),
+ "<font size=1 color=ffffef face=arial>";
+ foreach $online (@rooms) {
+ if (-f "data/online/rooms/$room/$online") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$online&tmpid=$tmpid",
+ -target=>"$online" }, "$online"), $q->br;
+ }
+ }
+print
+ "</font>",
+ $q->end_html;
+
+sub online { # Benutzer in die Onlineliste hinzufügen bzw. erneuern
+ my ($alias,$room) = @_;
+ open(DATEI,">data/online/users/$alias");
+ print DATEI time;
+ close DATEI;
+ if (-f "data/online/rooms/$room") { } else { mkdir "data/online/rooms/$room", 0777; }
+ if (-f "data/online/rstat/$room") { } else {
+ open(DATEI,">data/online/rstat/$room"); # Raumbesetzerstatus setzen
+ print DATEI "0\n\n$alias\n";
+ close DATEI;
+ }
+ open(DATEI,">data/online/rooms/$room/$alias");
+ print DATEI time;
+ close DATEI;
+ open(DATEI,"<data/online/prove"); # Räume und Chatter auf Existenz überprüfen
+ my $provetime = <DATEI>;
+ close DATEI;
+ if ($provetime < (time - 30)) {
+ &check_online;
+ }
+} \ No newline at end of file
diff --git a/0.4.5a/push.pl b/0.4.5a/push.pl
new file mode 100644
index 0000000..0157665
--- /dev/null
+++ b/0.4.5a/push.pl
@@ -0,0 +1,103 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+CGI->compile(':all');
+$q = new CGI;
+print
+ $q->header;
+require config;
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+&secure_checkid($alias);
+$room = $q->param("room");
+
+########################################
+##ANFANG DER ZU STREAMENDEN HTML-DATEI##
+########################################
+
+print <<END;
+<html>
+ <head>
+<script language="JavaScript">
+<!--
+// Scroll-Routine von Anklepper (http://www.anklepper.de)
+// speziell für yChat (http://www.yChat.de), Copyright 2000
+scrolling = true;
+moves_steps = 4; // Schrittgröße
+moves_interval = 4; // Schrittgeschwindigkeit
+
+function moves()
+{
+ if( scrolling != false )
+ window.scrollBy( 0, moves_steps );
+ window.setTimeout( "moves()", moves_interval );
+}
+
+moves();
+//-->
+</script>
+ </head>
+<body bgcolor=000000 link=FFFFFF alink=FFFFEF vlink=FFFFEF>
+END
+
+#############################
+##BEGRÜSSUNGSTEXT SCHREIBEN##
+#############################
+
+my $msgfile;
+
+print
+ $q->font( { -size=>1,
+ -color=>"ffffff",
+ -face=>"arial"},
+ "$title - Created & Copyright by Paul C. Bütow [PID: $$]<br>\n");
+
+if (-f "data/user/memos/$alias") {
+ open(MEMOS,"<data/user/memos/$alias");
+ my $memos = <MEMOS>;
+ close MEMOS;
+ print $memos;
+ unlink("data/user/memos/$alias");
+}
+
+###############################
+##ENDLOSSCHLEIFE FÜR DEN PUSH##
+###############################
+
+my $counter = 0;
+my $startime;
+OPENMSGFILE:
+$startime = time;
+
+if (-e "data/online/users/$alias") {
+ open(MSGFILE,"<data/msgs/$room");
+} else {
+ sleep 1;
+ goto OPENMSGFILE;
+}
+
+while (-e "data/online/users/$alias") {
+ for ($curpos = tell(MSGFILE); <MSGFILE>; $curpos = tell(MSGFILE)) {
+ my ($address, $stamp, $command, $action, $message) = split(/<;/, $_);
+ if ($address eq "!" || $address eq $alias) {
+ if ($stamp > $startime) {
+ if ($command eq "cr") {
+ $room = $action;
+ close MSGFILE;
+ goto OPENMSGFILE;
+ }
+ print "$message<br>\n";
+ }
+ }
+ }
+ $counter++;
+ if ($counter > 14) {
+ print "<!--PING//-->\n";
+ $counter = 0;
+ }
+ sleep 1;
+ seek(MSGFILE, $curpos, 0);
+} \ No newline at end of file
diff --git a/0.4.5a/setup.sh b/0.4.5a/setup.sh
new file mode 100644
index 0000000..4f875ed
--- /dev/null
+++ b/0.4.5a/setup.sh
@@ -0,0 +1,48 @@
+#!/bin/sh
+echo
+echo yChat wird konfiguriert!
+echo
+mkdir data
+chmod 777 data
+mkdir data/logs
+chmod 777 data/logs
+mkdir data/msgs
+chmod 777 data/msgs
+mkdir data/user
+chmod 777 data/user
+mkdir data/user/counts
+chmod 777 data/user/counts
+mkdir data/user/memos
+chmod 777 data/user/memos
+mkdir data/user/options
+chmod 777 data/user/options
+mkdir data/user/profiles
+chmod 777 data/user/profiles
+mkdir data/user/gbooks
+chmod 777 data/user/gbooks
+mkdir data/user/lastlogin
+chmod 777 data/user/lastlogin
+mkdir data/online
+chmod 777 data/online
+mkdir data/online/rooms
+chmod 777 data/online/rooms
+mkdir data/online/rstat
+chmod 777 data/online/rstat
+mkdir data/online/users
+chmod 777 data/online/users
+mkdir data/online/ident
+chmod 777 data/online/ident
+chmod 777 data/htdocs/*
+chmod 777 *.pl
+chmod 777 config.pm
+mkdir dokus/
+mv *.txt dokus/
+mkdir ../../htdocs/yChat/
+mv *.gif ../../htdocs/yChat/
+mv *.swf ../../htdocs/yChat/
+
+echo
+echo yChat Setup beendet ...
+echo Created and Copyright by Paul C. Bütow
+echo
+
diff --git a/0.4.5a/y.gif b/0.4.5a/y.gif
new file mode 100644
index 0000000..356175d
--- /dev/null
+++ b/0.4.5a/y.gif
Binary files differ
diff --git a/0.4.5a/yIntro.swf b/0.4.5a/yIntro.swf
new file mode 100644
index 0000000..d592826
--- /dev/null
+++ b/0.4.5a/yIntro.swf
Binary files differ
diff --git a/0.4.5a/ySymbol.swf b/0.4.5a/ySymbol.swf
new file mode 100644
index 0000000..2b899bb
--- /dev/null
+++ b/0.4.5a/ySymbol.swf
Binary files differ
diff --git a/0.4.5a/y_.gif b/0.4.5a/y_.gif
new file mode 100644
index 0000000..f8b6ee5
--- /dev/null
+++ b/0.4.5a/y_.gif
Binary files differ
diff --git a/0.4.6/CREDITS.txt b/0.4.6/CREDITS.txt
new file mode 100644
index 0000000..b520354
--- /dev/null
+++ b/0.4.6/CREDITS.txt
@@ -0,0 +1,21 @@
+########################### yChat.de CREDITS ################################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+Vielen Dank an alle Personen, dir mit geholfen haben ( und immernoch helfen )
+yChat besser zu machen:
+
+ - Andreas Buchwald aka Anklepper, für die Programmierung des
+ "Nach-UntenScroll-JavaScripts", des "Ferlaufform-JavaScripts" im
+ Texteingabeframe und für die technische Umsetzung, daß sich das
+ Inputframe bei jedem Textposting nicht wieder reloadet.
+ Für ein nettes JavaScript, welches erlaubt, Formularwerte
+ frameübergreifend zu ändern.
+ Für die Erstellung der Flashanimationen.
+ ( www.anklepper.de ).
+
+ - Dave aka Truhe, für die Erstellung der Farbtabelle unter Chatoptionen inkl.
+ Auswähl-JavaScript!
+ ( maligree.yi.org )
+
+ - Larry Wall, für die Erfindung von Perl ! \ No newline at end of file
diff --git a/0.4.6/README.txt b/0.4.6/README.txt
new file mode 100644
index 0000000..2e943ff
--- /dev/null
+++ b/0.4.6/README.txt
@@ -0,0 +1,36 @@
+############################## yChat.de README ##############################
+## Copyright by Paul C. Bütow 200 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+Allgemeine Bedingungen bezgl. yChat:
+
+ - Das yChat-System darf ohne Erleubnis des Autors nicht auf irgendeiner Art
+ und Weise weitergegeben- oder eingesetzt werden.
+
+ - Wird das yChat-System eingesetzt, so darf es manipuliert werden, soweit
+ die Copyright-Hinweise des Autors, die Versionsbezeichnung und der Link
+ auf der Startseite nach servers.yChat.de unverändert bleibt.
+ Ansonsten darf der gesamte Code manipuliert werden.
+
+ - Wird das yChat-System erlaubter Weise manipuliert, so muß das veränderte
+ Skript auf Anforderung an den Autor weitergegeben werden. Dieser darf
+ die Veränderungen in das Standard-yChat-System integrieren.
+
+ - Wird das yChat-System eingesetzt, su muß dem Autor die Location bzw. die
+ URL bekanntgegeben werden. Diese wird in servers.yChat.de eingetragen.
+ und mit einer URL wwX.yChat.de verlinkt. Wobei X für die Nummer des jew.
+ Servers steht.
+
+ - Es ist verboten, Sourcecode aus dem yChat-System zu kopieren und
+ für andere, nicht von yChat abhängige Perl-Programme einzusetzen.
+
+Im Flogenden einige yChat-bezügl. Verknüpfungen:
+
+ www.credits.yChat.de => Creditsliste
+ www.download.yChat.de => Das Skript zum downloaden
+ www.readme.yChat.de => Allgemeine Bedingungen usw.
+ www.servers.yChat.de => Liste aller laufenden yChat-Systeme
+ www.setup.yChat.de => Installationsdokumentation
+ www.todo.yChat.de => Funktionen, die später integriert werden
+ www.updates.yChat.de => Update-Liste
+ www.yChat.de => Das Skript im Einsatz
diff --git a/0.4.6/SETUP.txt b/0.4.6/SETUP.txt
new file mode 100644
index 0000000..b1e17f8
--- /dev/null
+++ b/0.4.6/SETUP.txt
@@ -0,0 +1,136 @@
+############################## yChat.de SETUP ###############################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+yChat findest Du im Internet unter der Adresse www.yChat.de. Bei Kritik,
+Anregungen oder Fragen bitte in das dort vorhandene Board posten oder eine
+E-Mail an die oben stehende Adresse senden. Ich bemühe mich, yChat so gut wie
+möglich zu machen und bin über Ratschläge immer sehr erfreut :-) ...
+
+Die Installation kann auf Unix-Systemen voll automatisch duchgeführt werden.
+Allerdings ist dafür ein Telnet-Zugang notwendig. Kopiere alle vorhandenen
+Dateien in das Verzeichnis cgi-bin/yChat und führe dann das Shellskript
+setup.sh mit dem Befehl ./setup.sh aus. Alle Verzeichnisse werden
+automatisch erstellt. Dies wurde allerdings nur auf SuSE Linux Systemen
+mit root-Zugriff getestet. Solltest Du ein anderes System verwenden oder
+den Chat auf einen virtuellen Webserver installieren wollen, dann mußt Du
+unter Umständen das Verzeichnis "../../htdocs/yChat" nach "../../yChat"
+in der setup.sh umbenennen. Ansonsten werden die dazugehörigen Grafikdateien
+falsch oder garnicht kopiert.
+
+Wenn Du keinen Telnet-Zugang hast, kannst Du hier die Verzeichnisse manuell
+einrichten:
+
+Folgende Basis-Dateien sind im Chat enthalten und müssen in das cgi-bin
+Verzeichnis kopiert werden. Z.B. nach ./cgi-bin/yChat/:
+
+config.pm => Configurationsdatei ("Shared subs")
+htdocs.pl => Generiert dynamische HTML-Inhalte
+index.pl => Startskript (Registrierung, Login, Chatframeset)
+input.pl => Skript für das Chateingabeframe
+main.pl => Hauptskript (Alle Hauptfunktionen des Chats)
+main2.pl => Skript für editieren der Benutzerdaten etc
+online.pl => Anzeige und Überprüfung der eingelogten Benutzer
+push.pl => Server-Push-Routine
+setup.sh => Dient zur automatischen Einrichtung des Chats
+README.txt => Beinhaltet wichtige Informationen
+UPDATES.txt => Updateliste der verschiedenen Versionen
+CREDITS.txt => Personen, die geolfen haben yChat zu proggen
+SETUP.txt => Dieses Dokument
+colors.sno => Datei beinhaltet alle Farben in hex. für die Chatoptionen
+help.sno => Datei beinhaltet alle Chatbefehle
+
+Folgende Verzeichnisse müssen erstellt werden (chmod 777 sollte
+funktionieren):
+
+- Hier befinden sich alle für den Chat notwenidgen Daten:
+ ./cgi-bin/yChat/data/*
+
+- Hier befinden sich alle Logdateien, die vom Chat erstellt werden:
+ ./cgi-bin/yChat/data/logs/*
+
+- Hier befinden sich die Message-Dateien der eingelogten Benutzer:
+ ./cgi-bin/yChat/data/msgs/*
+
+- Hier befinden sich alle Daten der registrierten Benutzer:
+ ./cgi-bin/yChat/data/user/*
+
+- Hier wird abgespeichert, wie oft ein Benutzerprofil insgesant schon
+ aufgerufen wurde und wie lange die Chatter schon online waren:
+ ./cgi-bin/yChat/data/user/counts/*
+
+- Hier werden alle Memos abgespeichert.
+ ./cgi-bin/yChat/data/user/memos/*
+
+- Hier befinden sich alle Chat-Optionen und Passwörter der registrierten
+ Benutzer:
+ ./cgi-bin/yChat/data/user/options/*
+
+- Hier befinden sich alle Benutzerprofile der Benutzer:
+ ./cgi-bin/yChat/data/user/profiles/*
+
+- Hier befinden sich alle Gästebucheinträge der Benutzer:
+ ./cgi-bin/yChat/data/user/gbooks/*
+
+- Hier wird abgespeichert, wann der der jew. benutzer zum letzten mal das
+ System betreten hat.
+ ./cgi-bin/yChat/data/user/lastlogin/*
+
+- Hier befinden sich alle Daten zu den aktuellen Chaträumen und User die
+ online sind
+ ./cgi-bin/yChat/data/online/*
+
+- Hier befinden sich alle offnenen Räume
+ ./cgi-bin/yChat/data/online/rooms/*
+
+- Hier befinden sich die Chatter, die sich in den jew. Räumen befinden. Die
+ Verzeichnisse der Räume werden automatisch erstellt.
+ ./cgi-bin/yChat/data/online/rooms/RAUMNAME/*
+
+- Hier befinden sich alle PIDs (Process IDs) der Chatter in den jew. Räumen.
+ ./cgi-bin/yChat/data/online/pids/*
+
+- Hier befinden sich alle Chatter, die sich z.Z. im System befinden
+ ./cgi-bin/yChat/data/online/users/*
+
+- Hier befinden sich alle IP-Nummern und TempIDs der eingelogten Chatter
+ ./cgi-bin/yChat/data/online/ident/*
+
+Alle Grafikdateien (+.gif und *.jpg) sollten in ein nicht-CGI-BIN-Verzeichnis
+kopiert werden. Z.B. nach ./yChat/.
+
+Zum schluß sollte die config.pm-Datei nach wünschen editiert werden.
+Allerdings sollten die Copyright Hinweise und die Versionsnummern nicht
+manipuliert werden.
+
+Im Folgendem werde ich ein wenig auf die im yChat-Sourcecode oft verwendeten .
+Variablen eingehen:
+
+ $var => Sagt dem Skript, wie es gestartet werden soll.
+ $alias => Teilt dem Skript den Benutzername mit.
+ $tmpid => Beim einloggen in den Chat wird für den Benutzer eine
+ temporäre ID generiert. Diese wird so wohl in der Variable
+ $tmpid als auch in eine Datei geschrieben. Handelt der
+ Benutzer, so wird vom Skript die Variable $tmpid mit dem
+ Eintrag in der Datei verglichen. Sind beide Werte
+ identisch, dann wird die Handlung des Benutzers
+ ausgeführt. Stimmen die Werte nicht überein, dann wird
+ die Fehlermeldung, daß der Benutzer die falsche $tmpid hat
+ um mit $alias zu handeln,ausgegeben und das Skript beendet
+ sich. Dies ist eine Sicherheitsmaßnahme welche verbietet,
+ mit fremden Benutzernamen im System zu handeln.
+ $room => Sagt dem Skript, wie der aktuelle Raumname lautet.
+ $col => Sagt dem Skript, wie die aktuelle Chatfarbe des Nicks von
+ $alias lautet.
+ $seccol => Sagt dem Skript, wie die aktuelle Chatfarbe der Schrift von
+ $alias lautet.
+ $msg => Beinhaltet den von $alias zu postenden Text im Chat.
+ Hiervon wird auch in den Benutzergästebüchern und im
+ Benutzerboard Gebrauch gemacht.
+ $whisper => Beinhaltet den Benutzernamen, zu dem $alias zuletzt
+ geflüstert hat.
+ $id und $tmp => Temporäre Variablen zwecks Übermittlung diverser Daten.
+ $pw => Wird im Skript index.pl verwendet um das Zugangspassword
+ zu übermitteln.
+
+Viel Spaß beim Chatten ... \ No newline at end of file
diff --git a/0.4.6/TODO.txt b/0.4.6/TODO.txt
new file mode 100644
index 0000000..8c9c445
--- /dev/null
+++ b/0.4.6/TODO.txt
@@ -0,0 +1,33 @@
+############################## yChat.de TODO ################################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+Folgende Funktionen werden demnächst in yChat integriert:
+
+ - Nach 5 Minuten Inaktivität soll der Benutzer automatisch
+ auf "away" gesetzt werden.
+ Nach 20 Minuten Inaktivität soll der Benutzer automatisch
+ aus dem System ausgelogt werden.
+
+ - Die Schlucht (Ein Raum wo Chatter hineingeworfen werden,
+ die sich nicht benehmen und noch nicht aus dem Chat
+ katapultiert werden sollen).
+
+ - Löschung aller Chatter, die sich seit 60 Tagen nicht mehr
+ eingelogt haben.
+
+ - IP-Adressen ver-/entbannen.
+
+ - E-Mail zusendung bei verlorenem Passwort.
+
+ - Eine Top 20 (Onlinezeit) der Chatter
+
+ - Unter "Benutzer" sollen Chatter über eine Eingabemaske nach
+ dem Anfangsbuchstaben gesucht werden können (vergl. Kilahu).
+
+ - Der Cybarkeeper (künstlich intilligenter Chatroboter, der
+ sich im Hauptraum Cyberbar aufhält, virtuelle Drinks verteilt
+ und von Real-Chattern übernommen werden kann. (Zukunftsmusik)
+
+Für weitere Vorschläge bitte in das yChat-Board unter www.yChat.de
+texten oder eine E-Mail an paul@buetow.oxg.de :-) \ No newline at end of file
diff --git a/0.4.6/UPDATES.txt b/0.4.6/UPDATES.txt
new file mode 100644
index 0000000..c3f21b9
--- /dev/null
+++ b/0.4.6/UPDATES.txt
@@ -0,0 +1,177 @@
+########################### yChat.de UPDATE LIST ###########################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+Hier sind alle Erneuerungen der Versionen dokumentiert:
+
+Update von 0.4.5 auf 0.4.6 (18.01.01)
+ - Verbesserung: Beim Posten einer neuen Chatnachricht wird sogleich
+ ein Signal an alle laufenden Chatprozesse (PIDs) gesendet, so daß
+ diese aufgefordert werden, aus der Nachrichtendatei die neuen
+ Zeilen einzulesen. Das Push-Skript (push.pl) muß so nicht jede
+ Sekunde prüfen, ob neue Nachrichten da sind, da es diese
+ Information über das Signal erhält. Das Push-Skript verbraucht nun
+ weniger Prozessorleistung, da es jetzt 15 Sekunden lang
+ "dauerschläft" (sleep 15;), lediglich einen <!--PING--> versendet
+ und dann weiter schläft usw. Beendet sich push.pl, oder wird ein
+ Raum gewechselt, dann wird auch die PID aus der PID-Liste des
+ aktuellen Raums gelöscht und ggf. neu geschrieben.
+ Die Dateien "./data/online/pids/*" beinhalten alle aktuellen PIDs,
+ wobei * der jew. Raum ist.
+
+Update von 0.4.4 auf 0.4.5 (16.01.01)
+ - Jeder Chatraum hat nun eine globale Nachrichtendatei. Bisher
+ existierte für jeden Chatter enzelnd eine. Die Nachrichten werden
+ nun schneller gepostet.
+ - Neue Wächterbefehle:
+ "/st Raum Thema" ermöglicht das Ändern das Themas eines anderen
+ Raums.
+ "/sl Raum" ermöglicht das auf- und absperren eines anderen Raums.
+ - Nur noch Oberwächter können die Chatlogs lesen.
+ - Referenzierung der Variable $msg in main.pl.
+ - Flashanimationen.
+
+Update von 0.4.3 auf 0.4.4 (04.01.01)
+ - Optimiertung aller Chatbefehle.
+ - Neuer WÄ-Befehl: Mit "/ss Raum Nachricht" wird aus dem aktuellen
+ Raum heraus in den angegebenen Raum eine beliebige Nachricht
+ gerufen.
+ - Das Skript main.pl wurde in zwei verschiedene Skripts unterteilt:
+ main.pl => Beinhaltet hauptsächlich die Chatbefehle
+ input.pl => Beinhaltet das zu generierende Chateingabeframe.
+ - Das Chateingabeframe wird nun nie wieder reloadet. (Dies geschah
+ bisher noch nach Ausführung der Befehle /col /j /ju /msg und nach
+ Änderung der Chateinstellungen und erwies sich als recht nervige
+ Angelegenheit.) JavaScript macht es möglich.
+ - Überarbeitung und Erweiterung der Dokudateien.
+
+Update von 0.4.2 auf 0.4.3 (30.12.2k)
+ - Optimierung der Zuweisung der Variabeln im Programmcode:
+ Variablen werden nun wirklich nur deffiniert, wenn diese auch
+ erforderlich sind.
+ - Komplette Neuprogrammierung diverser Subs (nun leistungsfähiger)
+ - Bei Aufrug der Login-Seite wird der gesamte Chat auf leerstehende
+ Räume und "alte" Chatter überprüft und ggf. entfernt.
+ - Verbesserung diverser JavaScript-Codes.
+ - Editiert ein Benutzer sein Profil, so wird dies mit der Meldung
+ "Alias hat sein Profil geändert ..." bekanntgegeben.
+ - Mit "/t" ohne weiteren Text erscheint die Nachricht "Alias hat das
+ Thema des Raums gelöscht ..."
+ - Hinzufügung diverser Administratorbefehle: "/pw Alias" zeigt
+ Zugangspassword von Alias an. "/ow Alias" ernennt Alias zum OW.
+ "/row Alias" entzieht Alias die OW-Rechte.
+
+Update von 0.4.1 auf 0.4.2 (25.12.2k)
+ - Im Texteingabeformular werden nun per JavaScript die letzten 10
+ Postings zwischengespeichert und können per Drop-Down-Menü
+ wieder in das Submittextfeld geladen werden um erneuert getextet
+ zu werden.
+ - Neues Design.
+ - Diverse Dateien wurden umbenannt:
+ INSTALL.txt -> SETUP.txt
+ LIESMICH.txt -> README.txt
+ - Die Datei CREDITS.txt wurde angelegt und somit auch die URL
+ www.credits.yChat.de.
+
+Update von 0.4.0 auf 0.4.1 (22.12.2k)
+ - Design wurde geändert.
+ - Unter "Optionen" ist nun eine komplette Farbtabelle eingebaut.
+ - Folgende Oberwächterbefehle wurden nun auch für normale Wächter
+ freigegeben: /ip /ban /rban.
+
+Update von 0.2.6 auf 0.4.0 (19.12.2k)
+ - Der berüchtigte "IP-Bug" wurde beseitigt! Und zwar wurden TempIDs
+ eingeführt => Eine dauerhafte Überprüfung der Benutzer-IP-Nummer
+ ist also nicht mehr notwendig.
+ - Die totale Chat-Online-Zeit wird protokolliert und kann jew. mit
+ "/online Alias" aufgerufen werden. Die Onlinezeit wird alle 20 Sek.
+ aktualisiert.
+ - Neue Befehle: "/seen Alias" zeigt an, vor wieviel St. sich Alias
+ zuletzt in das System eingelogt hat. Der Befehle "/rmgb" entfernt
+ alle Einträge des eigenen Benutzergästebuchs im Profil.
+
+Update von 0.2.5 auf 0.2.6 (17.12.2k)
+ - Das Eingabeframe reloaded sich nicht mehr nach jedem Posting.
+ Vielen Dank an Truhe aka Dave und Klepper aka Andreas Buchwald!
+ Bei den Chatbefehlen /col /away /j und /ju muß sich das
+ Eingabeframe weiterhin reloaden.
+ - Der Befehl // wurde entfernt. Dieser war nicht mehr erforderlich.
+ weil Nachrichten werden nur noch sehr selten verschluckt. Dieser
+ Chatbefehl postete die letzte Nachricht nocheinmal.
+ - Neuer Befehl: mit "/memo Alias hier der Text" hinterläßt man
+ Alias eine Memo. Logt sich Alias in den Chat ein, dann erhält
+ er diese sofort. Dafür wurde das Verzeichnis ".data/user/memos/"
+ angelegt.
+ - Programmcode wurde ein wenig optimiert.
+ - Das Design wurde ein wenig geändert.
+ - Beseitigung diverser Bugs.
+
+Update von 0.2.4 auf 0.2.5 (15.12.2k)
+ - Derjenige, der einen Raum zuerst betritt, hat Raumbesetzerrechte.
+ - Raumbesetzer, Wächter und Oberwächte können weitere Raumbesetzer
+ bestimmen. Diese können Raumbeseter auch wieder degradieren.
+ - Raumbesetzer, Wächter und Oberwächter können dem aktuellen Raum
+ auf/absperren und Themen geben. Wächter und Oberwächter können
+ abgesperrte Räume betreten.
+ - Das Verzeichnis ".data/htdocs" wurde entfernt. Die Datei help_html
+ heist nun help.sno und befindet sich im yChat-Hauptverzeichnis.
+ - Das Verzeichnis ".data/user/lastlogin" wurde hinzugefügt. Hier
+ wird beim erfolgreichen Einloggen ein "Timestamp" gesetzt. Später
+ sollen Oberwächter "veraltete" Benutzer entfernen können.
+ - Neuer Oberwächterbefehl: "/kill Alias" entfernt Alias ganz und gar
+ vom System. Oberwächter und Wächter können nicht entfernt werden.
+ - Perl-Cache wurde im gesamten System komplett deaktiviert ( Weniger
+ Ladezeiten der HTML-Dokumente ).
+ - Nur Nachrichten aus dem Raum "Cyberbar" werden gelogt.
+ Selbsterstellte Räume werden nichtmehr gelogt. Viele Logfunktionen
+ wurden entfernt (weniger Serverbalast).
+ - Beseitigung einiger kleinen Bugs.
+ - Unter "Optionen" im Chat wir die Farbe nun mit einem Drop-Down-Menü
+ ausgewählt ( Vielen dank an Michi aka Snoopy ).
+ - Auf der Startseite wird nun angezeigt wieviele Benutzer eingelogt
+ sind. Ist keiner eingelogt, dann wird das System "aufgeräumt". D.h.
+ Dateien die nicht mehr gebraucht werden und noch nicht gelöscht
+ wurden werden entfernt ( z.B. Nachrichtendateien der einzelnen
+ Chatter und die Dateien die die IP-Nummern der eingelogten Benutzer
+ beinhalteten usw.).
+ - Hunzufügung einer TODO-Liste. Hier sind mehrere Funktionen
+ vermerkt, die in späteren yChat-Versionen eingebaut werden sollen.
+ (www.todo.yChat.de oder TODO.txt).
+
+Update von 0.2.3 auf 0.2.4 (30.11.2k)
+ - Optimierung bzw. Verbesserung der Push-Routine push.pl.
+ - Server-Ping wurde von 2-Pings-per-Minute auf 4 erhöht.
+ - yChat-Banner wurde erstellt und ist unter
+ documents.yChat.de/yBanner.jpg vorzufinden.
+ - Unter der URL servers.yChat.de wurde eine Serverliste angelegt,
+ welche anzeigt wo yChat-Systeme laufen.
+ - Des weiteren wurden die URLs updates.yChat.de, install.yChat.de
+ und liesmich.yChat.de eingerichtet.
+ - Die Menüpunkte wurden zusammengefaßt, damit sie unter einer
+ Auflösung von 800x600 nur eine Zeile belegen.
+ - Einige Bugs wurden entfernt.
+
+Update von 0.2.2 auf 0.2.3 (25.11.2k)
+ - Smooth scrolling JavaScript ( Vielen Dank an Andreas Buchwald ).
+ - "IP#-Fehler" wurde so gut wie beseitigt.
+ - Aufrufe der einzelnen Benutzerprofile wird gezählt und angezeigt.
+ Diese werden in data/user/counts/* gespeichert.
+ - Automatische Einrichtung des Chats mit setup.sh und Telnet.
+ - Menüpunkt "Dein Profil" wurde entfernt da eigenes Profil auch
+ stets über die Onlineliste aufgerufen werden kann.
+
+Update von 0.2.1 auf 0.2.2 (23.11.2k)
+ - Einige Bugs wurden entfernt.
+ - Geschwindigkeit des Chats wurde optimiert.
+ - Eine Liste aller eingelogten Benutzer erscheint am Rand. Hierfür
+ wurde die Datei online.pl eingeführt. Sie aktuallisiert sich alle
+ 20 Sekunden.
+ - Die UPDATES.txt wurde eingeführt.
+
+Update von 0.2.0 auf 0.2.1
+ - Einige Bugs wurden entfernt.
+ - Die IP# der eingelogten Benutzer werden nun anders verwaltet.
+
+Update von Alpha XVIII auf 0.2.0
+ - Die Handhabung der eingelogten Benutzer im System wurde komplett neu
+ überarbeitet.
+ - Neue Versionsnumern wurden eingeführt. \ No newline at end of file
diff --git a/0.4.6/colors.sno b/0.4.6/colors.sno
new file mode 100644
index 0000000..3640b9e
--- /dev/null
+++ b/0.4.6/colors.sno
@@ -0,0 +1,290 @@
+ <table cellspacing=0 cellpadding=5 border=0>
+ <tr>
+ <td bgcolor="000000"><span style="color:#FFFFFF; text-decoration:line-through;">000000</span></td>
+ <td bgcolor="000033"><span style="color:#FFFFFF; text-decoration:line-through;">000033</span></td>
+ <td bgcolor="000066"><span style="color:#FFFFFF; text-decoration:line-through;">000066</span></td>
+ <td bgcolor="000099"><span style="color:#FFFFFF; text-decoration:line-through;">000099</span></td>
+ <td bgcolor="0000CC"><span style="color:#FFFFFF; text-decoration:line-through;">0000CC</span></td>
+ <td bgcolor="0000FF"><a href="javascript:insertcode('0000FF');" style="color:#FFFFFF;">0000FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="003300"><span style="color:#FFFFFF; text-decoration:line-through;">003300</span></td>
+ <td bgcolor="003333"><span style="color:#FFFFFF; text-decoration:line-through;">003333</span></td>
+ <td bgcolor="003366"><span style="color:#FFFFFF; text-decoration:line-through;">003366</span></td>
+ <td bgcolor="003399"><a href="javascript:insertcode('003399');" style="color:#FFFFFF;">003399</a></td>
+ <td bgcolor="0033CC"><a href="javascript:insertcode('0033CC');" style="color:#FFFFFF;">0033CC</a></td>
+ <td bgcolor="0033FF"><a href="javascript:insertcode('0033FF');" style="color:#FFFFFF;">0033FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="006600"><span style="color:#FFFFFF; text-decoration:line-through;">006600</span></td>
+ <td bgcolor="006633"><span style="color:#FFFFFF; text-decoration:line-through;">006633</span></td>
+ <td bgcolor="006666"><a href="javascript:insertcode('006666');" style="color:#FFFFFF;">006666</a></td>
+ <td bgcolor="006699"><a href="javascript:insertcode('006699');" style="color:#FFFFFF;">006699</a></td>
+ <td bgcolor="0066CC"><a href="javascript:insertcode('0066CC');" style="color:#FFFFFF;">0066CC</a></td>
+ <td bgcolor="0066FF"><a href="javascript:insertcode('0066FF');" style="color:#FFFFFF;">0066FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="009900"><a href="javascript:insertcode('009900');" style="color:#FFFFFF;">009900</a></td>
+ <td bgcolor="009933"><a href="javascript:insertcode('009933');" style="color:#FFFFFF;">009933</a></td>
+ <td bgcolor="009966"><a href="javascript:insertcode('009966');" style="color:#FFFFFF;">009966</a></td>
+ <td bgcolor="009999"><a href="javascript:insertcode('009999');" style="color:#FFFFFF;">009999</a></td>
+ <td bgcolor="0099CC"><a href="javascript:insertcode('0099CC');" style="color:#FFFFFF;">0099CC</a></td>
+ <td bgcolor="0099FF"><a href="javascript:insertcode('0099FF');" style="color:#FFFFFF;">0099FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00CC00"><a href="javascript:insertcode('00CC00');" style="color:#000000;">00CC00</a></td>
+ <td bgcolor="00CC33"><a href="javascript:insertcode('00CC33');" style="color:#000000;">00CC33</a></td>
+ <td bgcolor="00CC66"><a href="javascript:insertcode('00CC66');" style="color:#000000;">00CC66</a></td>
+ <td bgcolor="00CC99"><a href="javascript:insertcode('00CC99');" style="color:#000000;">00CC99</a></td>
+ <td bgcolor="00CCCC"><a href="javascript:insertcode('00CCCC');" style="color:#000000;">00CCCC</a></td>
+ <td bgcolor="00CCFF"><a href="javascript:insertcode('00CCFF');" style="color:#000000;">00CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00FF00"><a href="javascript:insertcode('00FF00');" style="color:#000000;">00FF00</a></td>
+ <td bgcolor="00FF33"><a href="javascript:insertcode('00FF33');" style="color:#000000;">00FF33</a></td>
+ <td bgcolor="00FF66"><a href="javascript:insertcode('00FF66');" style="color:#000000;">00FF66</a></td>
+ <td bgcolor="00FF99"><a href="javascript:insertcode('00FF99');" style="color:#000000;">00FF99</a></td>
+ <td bgcolor="00FFCC"><a href="javascript:insertcode('00FFCC');" style="color:#000000;">00FFCC</a></td>
+ <td bgcolor="00FFFF"><a href="javascript:insertcode('00FFFF');" style="color:#000000;">00FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="330000"><span style="color:#FFFFFF; text-decoration:line-through;">330000</span></td>
+ <td bgcolor="330033"><span style="color:#FFFFFF; text-decoration:line-through;">330033</span></td>
+ <td bgcolor="330066"><span style="color:#FFFFFF; text-decoration:line-through;">330066</span></td>
+ <td bgcolor="330099"><a href="javascript:insertcode('330099');" style="color:#FFFFFF;">330099</a></td>
+ <td bgcolor="3300CC"><a href="javascript:insertcode('3300CC');" style="color:#FFFFFF;">3300CC</a></td>
+ <td bgcolor="3300FF"><a href="javascript:insertcode('3300FF');" style="color:#FFFFFF;">3300FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="333300"><span style="color:#FFFFFF; text-decoration:line-through;">333300</span></td>
+ <td bgcolor="333333"><span style="color:#FFFFFF; text-decoration:line-through;">333333</span></td>
+ <td bgcolor="333366"><a href="javascript:insertcode('333366');" style="color:#FFFFFF;">333366</a></td>
+ <td bgcolor="333399"><a href="javascript:insertcode('333399');" style="color:#FFFFFF;">333399</a></td>
+ <td bgcolor="3333CC"><a href="javascript:insertcode('3333CC');" style="color:#FFFFFF;">3333CC</a></td>
+ <td bgcolor="3333FF"><a href="javascript:insertcode('3333FF');" style="color:#FFFFFF;">3333FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="336600"><a href="javascript:insertcode('336600');" style="color:#FFFFFF;">336600</a></td>
+ <td bgcolor="336633"><a href="javascript:insertcode('336633');" style="color:#FFFFFF;">336633</a></td>
+ <td bgcolor="336666"><a href="javascript:insertcode('336666');" style="color:#FFFFFF;">336666</a></td>
+ <td bgcolor="336699"><a href="javascript:insertcode('336699');" style="color:#FFFFFF;">336699</a></td>
+ <td bgcolor="3366CC"><a href="javascript:insertcode('3366CC');" style="color:#FFFFFF;">3366CC</a></td>
+ <td bgcolor="3366FF"><a href="javascript:insertcode('3366FF');" style="color:#FFFFFF;">3366FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="339900"><a href="javascript:insertcode('339900');" style="color:#FFFFFF;">339900</a></td>
+ <td bgcolor="339933"><a href="javascript:insertcode('339933');" style="color:#FFFFFF;">339933</a></td>
+ <td bgcolor="339966"><a href="javascript:insertcode('339966');" style="color:#FFFFFF;">339966</a></td>
+ <td bgcolor="339999"><a href="javascript:insertcode('339999');" style="color:#FFFFFF;">339999</a></td>
+ <td bgcolor="3399CC"><a href="javascript:insertcode('3399CC');" style="color:#FFFFFF;">3399CC</a></td>
+ <td bgcolor="3399FF"><a href="javascript:insertcode('3399FF');" style="color:#FFFFFF;">3399FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33CC00"><a href="javascript:insertcode('33CC00');" style="color:#000000;">33CC00</a></td>
+ <td bgcolor="33CC33"><a href="javascript:insertcode('33CC33');" style="color:#000000;">33CC33</a></td>
+ <td bgcolor="33CC66"><a href="javascript:insertcode('33CC66');" style="color:#000000;">33CC66</a></td>
+ <td bgcolor="33CC99"><a href="javascript:insertcode('33CC99');" style="color:#000000;">33CC99</a></td>
+ <td bgcolor="33CCCC"><a href="javascript:insertcode('33CCCC');" style="color:#000000;">33CCCC</a></td>
+ <td bgcolor="33CCFF"><a href="javascript:insertcode('33CCFF');" style="color:#000000;">33CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33FF00"><a href="javascript:insertcode('33FF00');" style="color:#000000;">33FF00</a></td>
+ <td bgcolor="33FF33"><a href="javascript:insertcode('33FF33');" style="color:#000000;">33FF33</a></td>
+ <td bgcolor="33FF66"><a href="javascript:insertcode('33FF66');" style="color:#000000;">33FF66</a></td>
+ <td bgcolor="33FF99"><a href="javascript:insertcode('33FF99');" style="color:#000000;">33FF99</a></td>
+ <td bgcolor="33FFCC"><a href="javascript:insertcode('33FFCC');" style="color:#000000;">33FFCC</a></td>
+ <td bgcolor="33FFFF"><a href="javascript:insertcode('33FFFF');" style="color:#000000;">33FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="660000"><span style="color:#FFFFFF; text-decoration:line-through;">660000</span></td>
+ <td bgcolor="660033"><span style="color:#FFFFFF; text-decoration:line-through;">660033</span></td>
+ <td bgcolor="660066"><a href="javascript:insertcode('660066');" style="color:#FFFFFF;">660066</a></td>
+ <td bgcolor="660099"><a href="javascript:insertcode('660099');" style="color:#FFFFFF;">660099</a></td>
+ <td bgcolor="6600CC"><a href="javascript:insertcode('6600CC');" style="color:#FFFFFF;">6600CC</a></td>
+ <td bgcolor="6600FF"><a href="javascript:insertcode('6600FF');" style="color:#FFFFFF;">6600FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="663300"><a href="javascript:insertcode('663300');" style="color:#FFFFFF;">663300</a></td>
+ <td bgcolor="663333"><a href="javascript:insertcode('663333');" style="color:#FFFFFF;">663333</a></td>
+ <td bgcolor="663366"><a href="javascript:insertcode('663366');" style="color:#FFFFFF;">663366</a></td>
+ <td bgcolor="663399"><a href="javascript:insertcode('663399');" style="color:#FFFFFF;">663399</a></td>
+ <td bgcolor="6633CC"><a href="javascript:insertcode('6633CC');" style="color:#FFFFFF;">6633CC</a></td>
+ <td bgcolor="6633FF"><a href="javascript:insertcode('6633FF');" style="color:#FFFFFF;">6633FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="666600"><a href="javascript:insertcode('666600');" style="color:#FFFFFF;">666600</a></td>
+ <td bgcolor="666633"><a href="javascript:insertcode('666633');" style="color:#FFFFFF;">666633</a></td>
+ <td bgcolor="666666"><a href="javascript:insertcode('666666');" style="color:#FFFFFF;">666666</a></td>
+ <td bgcolor="666699"><a href="javascript:insertcode('666699');" style="color:#FFFFFF;">666699</a></td>
+ <td bgcolor="6666CC"><a href="javascript:insertcode('6666CC');" style="color:#FFFFFF;">6666CC</a></td>
+ <td bgcolor="6666FF"><a href="javascript:insertcode('6666FF');" style="color:#FFFFFF;">6666FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="669900"><a href="javascript:insertcode('669900');" style="color:#000000;">669900</a></td>
+ <td bgcolor="669933"><a href="javascript:insertcode('669933');" style="color:#000000;">669933</a></td>
+ <td bgcolor="669966"><a href="javascript:insertcode('669966');" style="color:#000000;">669966</a></td>
+ <td bgcolor="669999"><a href="javascript:insertcode('669999');" style="color:#000000;">669999</a></td>
+ <td bgcolor="6699CC"><a href="javascript:insertcode('6699CC');" style="color:#000000;">6699CC</a></td>
+ <td bgcolor="6699FF"><a href="javascript:insertcode('6699FF');" style="color:#000000;">6699FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66CC00"><a href="javascript:insertcode('66CC00');" style="color:#000000;">66CC00</a></td>
+ <td bgcolor="66CC33"><a href="javascript:insertcode('66CC33');" style="color:#000000;">66CC33</a></td>
+ <td bgcolor="66CC66"><a href="javascript:insertcode('66CC66');" style="color:#000000;">66CC66</a></td>
+ <td bgcolor="66CC99"><a href="javascript:insertcode('66CC99');" style="color:#000000;">66CC99</a></td>
+ <td bgcolor="66CCCC"><a href="javascript:insertcode('66CCCC');" style="color:#000000;">66CCCC</a></td>
+ <td bgcolor="66CCFF"><a href="javascript:insertcode('66CCFF');" style="color:#000000;">66CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66FF00"><a href="javascript:insertcode('66FF00');" style="color:#000000;">66FF00</a></td>
+ <td bgcolor="66FF33"><a href="javascript:insertcode('66FF33');" style="color:#000000;">66FF33</a></td>
+ <td bgcolor="66FF66"><a href="javascript:insertcode('66FF66');" style="color:#000000;">66FF66</a></td>
+ <td bgcolor="66FF99"><a href="javascript:insertcode('66FF99');" style="color:#000000;">66FF99</a></td>
+ <td bgcolor="66FFCC"><a href="javascript:insertcode('66FFCC');" style="color:#000000;">66FFCC</a></td>
+ <td bgcolor="66FFFF"><a href="javascript:insertcode('66FFFF');" style="color:#000000;">66FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="990000"><a href="javascript:insertcode('990000');" style="color:#FFFFFF;">990000</a></td>
+ <td bgcolor="990033"><a href="javascript:insertcode('990033');" style="color:#FFFFFF;">990033</a></td>
+ <td bgcolor="990066"><a href="javascript:insertcode('990066');" style="color:#FFFFFF;">990066</a></td>
+ <td bgcolor="990099"><a href="javascript:insertcode('990099');" style="color:#FFFFFF;">990099</a></td>
+ <td bgcolor="9900CC"><a href="javascript:insertcode('9900CC');" style="color:#FFFFFF;">9900CC</a></td>
+ <td bgcolor="9900FF"><a href="javascript:insertcode('9900FF');" style="color:#FFFFFF;">9900FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="993300"><a href="javascript:insertcode('993300');" style="color:#FFFFFF;">993300</a></td>
+ <td bgcolor="993333"><a href="javascript:insertcode('993333');" style="color:#FFFFFF;">993333</a></td>
+ <td bgcolor="993366"><a href="javascript:insertcode('993366');" style="color:#FFFFFF;">993366</a></td>
+ <td bgcolor="993399"><a href="javascript:insertcode('993399');" style="color:#FFFFFF;">993399</a></td>
+ <td bgcolor="9933CC"><a href="javascript:insertcode('9933CC');" style="color:#FFFFFF;">9933CC</a></td>
+ <td bgcolor="9933FF"><a href="javascript:insertcode('9933FF');" style="color:#FFFFFF;">9933FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="996600"><a href="javascript:insertcode('996600');" style="color:#FFFFFF;">996600</a></td>
+ <td bgcolor="996633"><a href="javascript:insertcode('996633');" style="color:#FFFFFF;">996633</a></td>
+ <td bgcolor="996666"><a href="javascript:insertcode('996666');" style="color:#FFFFFF;">996666</a></td>
+ <td bgcolor="996699"><a href="javascript:insertcode('996699');" style="color:#FFFFFF;">996699</a></td>
+ <td bgcolor="9966CC"><a href="javascript:insertcode('9966CC');" style="color:#FFFFFF;">9966CC</a></td>
+ <td bgcolor="9966FF"><a href="javascript:insertcode('9966FF');" style="color:#FFFFFF;">9966FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="999900"><a href="javascript:insertcode('999900');" style="color:#000000;">999900</a></td>
+ <td bgcolor="999933"><a href="javascript:insertcode('999933');" style="color:#000000;">999933</a></td>
+ <td bgcolor="999966"><a href="javascript:insertcode('999966');" style="color:#000000;">999966</a></td>
+ <td bgcolor="999999"><a href="javascript:insertcode('999999');" style="color:#000000;">999999</a></td>
+ <td bgcolor="9999CC"><a href="javascript:insertcode('9999CC');" style="color:#000000;">9999CC</a></td>
+ <td bgcolor="9999FF"><a href="javascript:insertcode('9999FF');" style="color:#000000;">9999FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99CC00"><a href="javascript:insertcode('99CC00');" style="color:#000000;">99CC00</a></td>
+ <td bgcolor="99CC33"><a href="javascript:insertcode('99CC33');" style="color:#000000;">99CC33</a></td>
+ <td bgcolor="99CC66"><a href="javascript:insertcode('99CC66');" style="color:#000000;">99CC66</a></td>
+ <td bgcolor="99CC99"><a href="javascript:insertcode('99CC99');" style="color:#000000;">99CC99</a></td>
+ <td bgcolor="99CCCC"><a href="javascript:insertcode('99CCCC');" style="color:#000000;">99CCCC</a></td>
+ <td bgcolor="99CCFF"><a href="javascript:insertcode('99CCFF');" style="color:#000000;">99CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99FF00"><a href="javascript:insertcode('99FF00');" style="color:#000000;">99FF00</a></td>
+ <td bgcolor="99FF33"><a href="javascript:insertcode('99FF33');" style="color:#000000;">99FF33</a></td>
+ <td bgcolor="99FF66"><a href="javascript:insertcode('99FF66');" style="color:#000000;">99FF66</a></td>
+ <td bgcolor="99FF99"><a href="javascript:insertcode('99FF99');" style="color:#000000;">99FF99</a></td>
+ <td bgcolor="99FFCC"><a href="javascript:insertcode('99FFCC');" style="color:#000000;">99FFCC</a></td>
+ <td bgcolor="99FFFF"><a href="javascript:insertcode('99FFFF');" style="color:#000000;">99FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC0000"><a href="javascript:insertcode('CC0000');" style="color:#FFFFFF;">CC0000</a></td>
+ <td bgcolor="CC0033"><a href="javascript:insertcode('CC0033');" style="color:#FFFFFF;">CC0033</a></td>
+ <td bgcolor="CC0066"><a href="javascript:insertcode('CC0066');" style="color:#FFFFFF;">CC0066</a></td>
+ <td bgcolor="CC0099"><a href="javascript:insertcode('CC0099');" style="color:#FFFFFF;">CC0099</a></td>
+ <td bgcolor="CC00CC"><a href="javascript:insertcode('CC00CC');" style="color:#FFFFFF;">CC00CC</a></td>
+ <td bgcolor="CC00FF"><a href="javascript:insertcode('CC00FF');" style="color:#FFFFFF;">CC00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC3300"><a href="javascript:insertcode('CC3300');" style="color:#FFFFFF;">CC3300</a></td>
+ <td bgcolor="CC3333"><a href="javascript:insertcode('CC3333');" style="color:#FFFFFF;">CC3333</a></td>
+ <td bgcolor="CC3366"><a href="javascript:insertcode('CC3366');" style="color:#FFFFFF;">CC3366</a></td>
+ <td bgcolor="CC3399"><a href="javascript:insertcode('CC3399');" style="color:#FFFFFF;">CC3399</a></td>
+ <td bgcolor="CC33CC"><a href="javascript:insertcode('CC33CC');" style="color:#FFFFFF;">CC33CC</a></td>
+ <td bgcolor="CC33FF"><a href="javascript:insertcode('CC33FF');" style="color:#FFFFFF;">CC33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC6600"><a href="javascript:insertcode('CC6600');" style="color:#000000;">CC6600</a></td>
+ <td bgcolor="CC6633"><a href="javascript:insertcode('CC6633');" style="color:#000000;">CC6633</a></td>
+ <td bgcolor="CC6666"><a href="javascript:insertcode('CC6666');" style="color:#000000;">CC6666</a></td>
+ <td bgcolor="CC6699"><a href="javascript:insertcode('CC6699');" style="color:#000000;">CC6699</a></td>
+ <td bgcolor="CC66CC"><a href="javascript:insertcode('CC66CC');" style="color:#000000;">CC66CC</a></td>
+ <td bgcolor="CC66FF"><a href="javascript:insertcode('CC66FF');" style="color:#000000;">CC66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC9900"><a href="javascript:insertcode('CC9900');" style="color:#000000;">CC9900</a></td>
+ <td bgcolor="CC9933"><a href="javascript:insertcode('CC9933');" style="color:#000000;">CC9933</a></td>
+ <td bgcolor="CC9966"><a href="javascript:insertcode('CC9966');" style="color:#000000;">CC9966</a></td>
+ <td bgcolor="CC9999"><a href="javascript:insertcode('CC9999');" style="color:#000000;">CC9999</a></td>
+ <td bgcolor="CC99CC"><a href="javascript:insertcode('CC99CC');" style="color:#000000;">CC99CC</a></td>
+ <td bgcolor="CC99FF"><a href="javascript:insertcode('CC99FF');" style="color:#000000;">CC99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCCC00"><a href="javascript:insertcode('CCCC00');" style="color:#000000;">CCCC00</a></td>
+ <td bgcolor="CCCC33"><a href="javascript:insertcode('CCCC33');" style="color:#000000;">CCCC33</a></td>
+ <td bgcolor="CCCC66"><a href="javascript:insertcode('CCCC66');" style="color:#000000;">CCCC66</a></td>
+ <td bgcolor="CCCC99"><a href="javascript:insertcode('CCCC99');" style="color:#000000;">CCCC99</a></td>
+ <td bgcolor="CCCCCC"><a href="javascript:insertcode('CCCCCC');" style="color:#000000;">CCCCCC</a></td>
+ <td bgcolor="CCCCFF"><a href="javascript:insertcode('CCCCFF');" style="color:#000000;">CCCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCFF00"><a href="javascript:insertcode('CCFF00');" style="color:#000000;">CCFF00</a></td>
+ <td bgcolor="CCFF33"><a href="javascript:insertcode('CCFF33');" style="color:#000000;">CCFF33</a></td>
+ <td bgcolor="CCFF66"><a href="javascript:insertcode('CCFF66');" style="color:#000000;">CCFF66</a></td>
+ <td bgcolor="CCFF99"><a href="javascript:insertcode('CCFF99');" style="color:#000000;">CCFF99</a></td>
+ <td bgcolor="CCFFCC"><a href="javascript:insertcode('CCFFCC');" style="color:#000000;">CCFFCC</a></td>
+ <td bgcolor="CCFFFF"><a href="javascript:insertcode('CCFFFF');" style="color:#000000;">CCFFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF0000"><a href="javascript:insertcode('FF0000');" style="color:#FFFFFF;">FF0000</a></td>
+ <td bgcolor="FF0033"><a href="javascript:insertcode('FF0033');" style="color:#FFFFFF;">FF0033</a></td>
+ <td bgcolor="FF0066"><a href="javascript:insertcode('FF0066');" style="color:#FFFFFF;">FF0066</a></td>
+ <td bgcolor="FF0099"><a href="javascript:insertcode('FF0099');" style="color:#FFFFFF;">FF0099</a></td>
+ <td bgcolor="FF00CC"><a href="javascript:insertcode('FF00CC');" style="color:#FFFFFF;">FF00CC</a></td>
+ <td bgcolor="FF00FF"><a href="javascript:insertcode('FF00FF');" style="color:#FFFFFF;">FF00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF3300"><a href="javascript:insertcode('FF3300');" style="color:#FFFFFF;">FF3300</a></td>
+ <td bgcolor="FF3333"><a href="javascript:insertcode('FF3333');" style="color:#FFFFFF;">FF3333</a></td>
+ <td bgcolor="FF3366"><a href="javascript:insertcode('FF3366');" style="color:#FFFFFF;">FF3366</a></td>
+ <td bgcolor="FF3399"><a href="javascript:insertcode('FF3399');" style="color:#FFFFFF;">FF3399</a></td>
+ <td bgcolor="FF33CC"><a href="javascript:insertcode('FF33CC');" style="color:#FFFFFF;">FF33CC</a></td>
+ <td bgcolor="FF33FF"><a href="javascript:insertcode('FF33FF');" style="color:#FFFFFF;">FF33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF6600"><a href="javascript:insertcode('FF6600');" style="color:#000000;">FF6600</a></td>
+ <td bgcolor="FF6633"><a href="javascript:insertcode('FF6633');" style="color:#000000;">FF6633</a></td>
+ <td bgcolor="FF6666"><a href="javascript:insertcode('FF6666');" style="color:#000000;">FF6666</a></td>
+ <td bgcolor="FF6699"><a href="javascript:insertcode('FF6699');" style="color:#000000;">FF6699</a></td>
+ <td bgcolor="FF66CC"><a href="javascript:insertcode('FF66CC');" style="color:#000000;">FF66CC</a></td>
+ <td bgcolor="FF66FF"><a href="javascript:insertcode('FF66FF');" style="color:#000000;">FF66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF9900"><a href="javascript:insertcode('FF9900');" style="color:#000000;">FF9900</a></td>
+ <td bgcolor="FF9933"><a href="javascript:insertcode('FF9933');" style="color:#000000;">FF9933</a></td>
+ <td bgcolor="FF9966"><a href="javascript:insertcode('FF9966');" style="color:#000000;">FF9966</a></td>
+ <td bgcolor="FF9999"><a href="javascript:insertcode('FF9999');" style="color:#000000;">FF9999</a></td>
+ <td bgcolor="FF99CC"><a href="javascript:insertcode('FF99CC');" style="color:#000000;">FF99CC</a></td>
+ <td bgcolor="FF99FF"><a href="javascript:insertcode('FF99FF');" style="color:#000000;">FF99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFCC00"><a href="javascript:insertcode('FFCC00');" style="color:#000000;">FFCC00</a></td>
+ <td bgcolor="FFCC33"><a href="javascript:insertcode('FFCC33');" style="color:#000000;">FFCC33</a></td>
+ <td bgcolor="FFCC66"><a href="javascript:insertcode('FFCC66');" style="color:#000000;">FFCC66</a></td>
+ <td bgcolor="FFCC99"><a href="javascript:insertcode('FFCC99');" style="color:#000000;">FFCC99</a></td>
+ <td bgcolor="FFCCCC"><a href="javascript:insertcode('FFCCCC');" style="color:#000000;">FFCCCC</a></td>
+ <td bgcolor="FFCCFF"><a href="javascript:insertcode('FFCCFF');" style="color:#000000;">FFCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFFF00"><a href="javascript:insertcode('FFFF00');" style="color:#000000;">FFFF00</a></td>
+ <td bgcolor="FFFF33"><a href="javascript:insertcode('FFFF33');" style="color:#000000;">FFFF33</a></td>
+ <td bgcolor="FFFF66"><a href="javascript:insertcode('FFFF66');" style="color:#000000;">FFFF66</a></td>
+ <td bgcolor="FFFF99"><a href="javascript:insertcode('FFFF99');" style="color:#000000;">FFFF99</a></td>
+ <td bgcolor="FFFFCC"><a href="javascript:insertcode('FFFFCC');" style="color:#000000;">FFFFCC</a></td>
+ <td bgcolor="FFFFFF"><a href="javascript:insertcode('FFFFFF');" style="color:#000000;">FFFFFF</a></td>
+ </tr>
+</table> \ No newline at end of file
diff --git a/0.4.6/config.pm b/0.4.6/config.pm
new file mode 100644
index 0000000..f66fa0f
--- /dev/null
+++ b/0.4.6/config.pm
@@ -0,0 +1,241 @@
+# yChat - Copyright by Paul C. Bütow
+
+########################### Dieser Teil bestimmt die Standart-Variabeln.
+##STANDART-CONFIGURATION:## (CSS, Farben, Version etc.)
+###########################
+$datum = "18.01.01";
+$version = "0.4.6";
+$title = "yChat [$version]";
+$gfxpath = "../../yChat";
+$style = <<ENDCSS;
+<style rel="stylesheet" type="text/css">
+ body { background-color: #005146 }
+ body.blank { background-color: #000000 }
+ body.online { background-color: #000000 }
+ div { font-family: arial, verdana, helvetiva; font-size: 9pt; color: #ffffff }
+ div.b { font-weight: bold; color: #ffa500 }
+ a { color: #ffffef }
+ a:hover { color: #ffffff; text-decoration: none }
+</style>
+ENDCSS
+
+############### Dieser TeFil enthält Programmcode, der an verschiedenen
+##SHARED-SUBS## Stellen ausgeführt werden muß und jedem Skript zur
+############### Verfügung steht.
+
+sub printfile { # Liest eine externe Datei ein und gibt sie mit print aus
+ my ($file2print,$pagetitle,$bodyclass) = @_;
+ if ($pagetitle ne "") {
+ &start_html($pagetitle,$bodyclass);
+ }
+ open(FILE2PRINT,"<$file2print");
+ @file2print = <FILE2PRINT>;
+ close FILE2PRINT;
+ print @file2print;
+}
+
+
+sub start_html { # Der HEADER einer HTML-Datei
+print "<html><head>";
+print "<meta http-equiv=\"refresh\" content=\"20\" URL=\"online.pl?room=$room\">" if ($_[1] eq "online");
+print <<END;
+ <title>
+ $title - $_[0]
+ </title>
+ $_[2]
+ $style
+ </head>
+END
+ if ($_[1] eq "start") {
+ print "<body onload=\"document.login.alias.focus();\">";
+ } elsif ($_[1] ne "") {
+ print "<body class=$_[1]>";
+ } else {
+ print "<body>";
+ }
+}
+
+sub post { # Öffentliche Nachricht posten.
+ my ($room,$msg2post,$secroom) = @_;
+ my @rooms,@pids = $room;
+ @rooms = ($room,$secroom) if ($room ne $secroom);
+ foreach(@rooms) {
+ open(MSGFILE,">>data/msgs/$_");
+ open(PID,"<data/online/pids/$_");
+ print MSGFILE "!<;".time."<;!<;!<;$msg2post<;\n";
+ @pids = <PID>;
+ close PID;
+ close MSGFILE;
+ kill INT => @pids;
+ }
+ &log($msg2post) if ($room eq "Cyberbar");
+}
+
+sub post_prv { # Private Nachricht posten (flüstern).
+ my ($alias2post,$msg2post) = @_;
+ opendir(DIR,"data/online/rooms");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach $raum (@dir) {
+ opendir(DIR,"data/online/rooms/$raum");
+ my @chatter = readdir(DIR);
+ closedir(DIR);
+ foreach $chatter (@chatter) {
+ if ($chatter eq $alias2post) {
+ open(MSGFILE,">>data/msgs/$raum");
+ print MSGFILE "$alias2post<;".time."<;!<;!<;$msg2post<;\n";
+ close MSGFILE;
+ open(PID,"<data/online/pids/$raum");
+ my @pids = <PID>;
+ close PID;
+ kill INT => @pids;
+ goto ENDPRV;
+ }
+ }
+ }
+ENDPRV:
+}
+
+sub log { # Protokollieren der Nachrichten etc.
+ local $msg2log = $_[0];
+ &zeit;
+ open(LOG,">>data/logs/$day.$month.$year");
+ print LOG "<br><font color=ffffef><i>($hours:$min:$sec)</i></font> $msg2log\n";
+ close LOG;
+}
+
+
+sub zeit { # Aktuelles Datum und Uhrzeit bestimmen.
+ ($sec, $min, $hours, $day, $month, $year) = (localtime)[0..5];
+ $month += 1;
+ $hours = "0".$hours if ($hours < 10);
+ $min = "0".$min if ($min < 10);
+ $sec = "0".$sec if ($sec < 10);
+ $day = "0".$day if ($day < 10);
+ $month = "0".$month if ($month < 10);
+ $year = $year - 100;
+ if ($year < 10) {
+ $year = "200".$year;
+ } else {
+ $year = "20".$year;
+ }
+}
+
+sub read_file { # Datei öffnen.
+ my $file2read = $_[0];
+ if (-e "$file2read") {
+ open (DATEI,"<$file2read") || &error("Konnte $file2read nicht öffnen");
+ }
+}
+
+sub error { # Error-Ausgabe.
+ my $error_msg = $_[0];
+ &start_html( "Error: ($error_msg)" );
+ print $q->div( "Error: ($error_msg)" ),
+ $q->end_html;
+ open(ERROR,">>data/error");
+ print ERROR $error_msg."\n";
+ close ERROR;
+ exit;
+}
+
+sub check_online { # Auf alte Räume und Chatter prüfen und ggf. entfernen.
+ open(PROVE,">data/online/prove");
+ print PROVE time;
+ close PROVE;
+ opendir(RAUMDIR, "data/online/rooms");
+ my @raumdir = readdir(RAUMDIR);
+ closedir(RAUMDIR);
+ foreach $raum (@raumdir) {
+ opendir(BENUTZERDIR, "data/online/rooms/$raum");
+ my @benutzerdir = readdir(BENUTZERDIR);
+ closedir(BENUTZERDIR);
+ my $raumleer= 1;
+ foreach $benutzer (@benutzerdir) {
+ if (-f "data/online/rooms/$raum/$benutzer") {
+ $raumleer = 0;
+ open (BENUTZER,"<data/online/rooms/$raum/$benutzer");
+ my $benutzerstamp = <BENUTZER>;
+ close BENUTZER;
+ if ($benutzerstamp < (time - 40)) {
+ unlink("data/online/$raum/$benutzer");
+ open (BENUTZER2,"<data/online/users/$benutzer");
+ my $benutzerstamp2 = <BENUTZER2>;
+ close BENUTZER2;
+ if ($benutzerstamp2 < (time - 40)) {
+ if ($benutzer ne $alias) {
+ &rm_alias($benutzer,$raum); # ohne $raum/benutzer entf.
+ } else {
+ unlink("data/online/rooms/$raum/$benutzer");
+ }
+ &zeit;
+ &post($raum,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$benutzer hat den Chat verlassen ... </font></i>");
+ }
+ }
+ }
+ }
+ if ($raumleer == 1) { # Falls Raum leer ist => entf.
+ rmdir("data/online/rooms/$raum");
+ unlink("data/online/rstat/$raum");
+ unlink("data/online/pids/$raum");
+ unlink("data/msgs/$raum");
+ }
+ }
+}
+
+sub rm_alias { # Falls Benutzer offline gegangen ist
+ my($benutzer,$raum) = @_;
+ unlink("data/online/rooms/$raum/$benutzer");
+ unlink("data/online/users/$benutzer");
+ unlink("data/online/ident/$benutzer");
+ &rm_rstat($benutzer,$raum);
+}
+
+sub rm_rstat { # Benutzer als Raumbesetzer austragen
+ my ($r_alias,$rstatroom) = @_;
+ open (RSTAT,"<data/online/rstat/$rstatroom");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ my @rstat2 = ($rstat[0],$rstat[1]);
+ for ($i=2;$i<=$#rstat;$i++) {
+ push(@rstat2,$rstat[$i]) if ($rstat[$i] ne $r_alias."\n");
+ }
+ open (RSTAT,">data/online/rstat/$rstatroom");
+ print RSTAT @rstat2;
+ close RSTAT;
+}
+
+
+sub secure_checkid { # TmpID überprüfen
+ my ($alias2check) = @_;
+ open(IDENT,"<data/online/ident/$alias2check");
+ my @ident = <IDENT>;
+ close IDENT;
+ if ($ident[1] ne $tmpid) {
+ &error("Falsche TempID ! Du bist nicht befugt zu handeln !");
+ }
+}
+
+sub hierachie { # Chatter nach Sonderrechte überprüfen.
+ my $alias2prove = $_[0];
+ $hierachie = undef;
+ open(WA,"<data/wa");
+ @was = <WA>;
+ close WA;
+ foreach $wa (@was) {
+ if ($wa eq $alias2prove || $wa eq "$alias2prove\n") {
+ $hierachie = "wa";
+ }
+ }
+ open(OW,"<data/ow");
+ @ows = <OW>;
+ close OW;
+ if ($hierachie ne "wa" || $_ eq "$alias2prove\n") {
+ foreach $ow (@ows) {
+ if ($ow eq $alias2prove || $ow eq "$alias2prove\n") {
+ $hierachie = "ow";
+ }
+ }
+ }
+}
+
diff --git a/0.4.6/help.sno b/0.4.6/help.sno
new file mode 100644
index 0000000..558d4fd
--- /dev/null
+++ b/0.4.6/help.sno
@@ -0,0 +1,57 @@
+<div>
+ Alle Chat-Befehle:
+</div>
+<hr>
+<table width=100% bgcolor=000000>
+<tr><th bgcolor=666666><div>SU</div></th><th bgcolor=666666><div>Befehl</div></th><th bgcolor=666666><div>Beschreibung</div></th></tr>
+<tr><td><div>NC</div></td><td><div>/about</div></td><td><div>Zeigt aktuelle Version und andere Infos der Community an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/away <font color=red>Nachricht</font></div></td><td><div>Abmelden mit einer<font color=red>Abmeldenachricht</font></div></td></tr>
+<tr><td><div>NC</div></td><td><div>/clear</div></td><td><div>Bildschirm wird gelöscht</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/col <font color=red>XXXXXX</font> <font color=ffa500>XXXXXX</font></div></td><td><div>Farbe/n (<font color=red>Namensfarbe</font> / <font color=ffa500>Textfarbe</font>) wechseln. Angabe in Hexadezimal.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/date</div></td><td><div>Zeigt aktuelles Datum und Urzeit an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/j <font color=red>Raumname</font></div></td><td><div>Raum wechseln/erstellen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ju <font color=red>Alias</font></div></td><td><div>In den Raum wechseln/folgen, wo sich <font color=red>Alias</font> befindet.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/m <font color=red>Aktion</font></div></td><td><div>Handeln mit 2 Farben</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/me <font color=red>Aktion</font></div></td><td><div>Handeln mit einer Farbe</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/memo <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine <font color=ffa500>Memonachricht</font> hinterlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/msg <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine private <font color=ffa500>Nachricht</font> flüstern</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ <font color=ffa500>Nachricht</font></div></td><td><div>Eine private <font color=ffa500>Nachricht</font> demjenigen flüstern, dem zuletzt eine geflüstert wurde</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/online <font color=red>Alias</font></div></td><td><div>Zeigt Onlineminuten von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/q</div></td><td><div>Cumunnity verlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/rmgb</div></td><td><div>Das eigene Gästebuch komplett weglöschen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/s <font color=red>Nachricht</font></div></td><td><div><font color=red>Nachricht</font> schreien</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/seen <font color=red>Alias</font></div></td><td><div>Zeigt an, vor wieviel Stunden sich <font color=red>Nachricht</font> zum letzten Mal in das System eingelogt hat</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/w</div></td><td><div>Zeigt an, wer sich im aktuellen Raum befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc <font color=red>Raum</font></div></td><td><div>Zeigt an, wer sich im <font color=red>Raum</font> befindet. Wird kein Raum angegeben, dann wird ledeglich angezeigt, wer sich im System befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc/</div></td><td><div>Zeigt alle offenen Räume und deren Chatter an</div></td></tr>
+<tr><td><div>NC</div></td><td> <div>/wj <font color=red>Alias</font></div></td><td><div>Zeigt an, in welchen Raum sich <font color=red>Alias</font> befindet</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/l</div></td><td><div>Der aktuelle Raum wird ab- bzw. aufgesperrt</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/rsu <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> die Raumbesetzerrechte entnehmen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/su <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Raumbesetzer ernennen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/t <font color=red>Thema</font></div></td><td><div>Dem aktuellen Raum wird ein <font color=red>Thema</font> gegeben</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban</div></td><td><div>Zeigt alle verbannten Benutzer an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> verbannen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/rban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> "entbannen"</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ip <font color=red>Alias</font></div></td><td><div>Zeigt die IP-Nummer von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/k <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird aus dem Chat katapultiert!</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ss <font color=red>Raum</font> <font color=ffa500>Nachricht</font></div></td><td><div>Eine <font color=ffa500>Nachricht</font> in <font color=red>Raum</font> hinüber rufen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/kill <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird ganz und gar aus dem System entfernt</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/wa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Wächter ernennen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/rwa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom Wächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/sys <font color=red>Nachricht</font></div></td><td><div>Systemnachricht schreiben. (Erscheint in allen existierenden Räumen)</div></td></tr>
+</table><hr>
+<div>
+ Zur Erklärung: NC steht für "Normale Chatter", RB für "Raumbesetzer", WÄ für "Wächter" und OW für "Oberwächter".
+ Obrige Befehle können nur von der/den jeweiligen Benutzergruppe/n werden.<br><br>
+ Allerdings gibt es folgendes zu beachten: Oberwächter verfügen über alle Chatbefehle. Normale Wächter über alle Chatbefehle, außer über die der Oberwächter.
+ Raumbesetzer können nur Raumbesetzerbefehle und die Befehle der normalen Chatter durchführen. Normale Chatter haben jedeglich die Standardbefehle zu verwenden.<br><br>
+ Weitere Besonderheiten der Wächter und Oberwächter:<br><br>
+ Wächter und Oberwächter können ....<br>
+ ... abgesperrte Chaträume problemlos betreten.<br>
+ ... nicht gekickt, verbannt oder gekillt werden.<br>
+ ... Logdateien der Cyberbar lesen.<br><br>
+
+ Des weiteren: Oberwächter ernennt nur der Systemadministrator!
+</div>
+</body>
+</html> \ No newline at end of file
diff --git a/0.4.6/htdocs.pl b/0.4.6/htdocs.pl
new file mode 100644
index 0000000..6167fde
--- /dev/null
+++ b/0.4.6/htdocs.pl
@@ -0,0 +1,240 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header;
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+$var = $q->param("var");
+if ($var eq "help_html") {
+ &printfile("help.sno","Alle Chatbefehle");
+} elsif ($var eq "logo_html") {
+ &start_html("Logo");
+print<<END;
+<layer top=-3 left=0><div style="position:absolute; top:5; left:10">
+<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
+ codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0"
+ WIDTH=48 HEIGHT=48>
+ <PARAM NAME=movie VALUE="$gfxpath/ySymbol.swf">
+ <PARAM NAME=loop VALUE=false>
+ <PARAM NAME=menu VALUE=false>
+ <PARAM NAME=quality VALUE=high>
+ <PARAM NAME=scale VALUE=noborder>
+ <PARAM NAME=wmode VALUE=opaque>
+ <PARAM NAME=bgcolor VALUE=#005146>
+ <EMBED src="$gfxpath/ySymbol.swf" loop=false menu=false quality=high scale=noborder wmode=opaque bgcolor=#005146
+ WIDTH=48 HEIGHT=48 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED>
+</OBJECT>
+</div></layer>
+END
+print $q->end_html;
+} elsif ($var eq "menu_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ $tmp = $q->param("tmp");
+ &menu_html;
+} elsif ($var eq "werda_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &werda_html;
+} elsif ($var eq "logs_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ &logs_html;
+} elsif ($var eq "view_logs_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $tmp = $q->param("tmp");
+ &secure_checkid($alias);
+ &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ &printfile($tmp,"Logdatei","blank");
+ }
+} elsif ($var eq "superuser_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ &superuser_html;
+} else {
+ print
+ $q->start_html(-bgcolor=>"000000"),
+ $q->end_html;
+}
+
+sub menu_html {
+if ($tmp eq "quit") {
+ &start_html("Quit","blank","<script language=\"JavaScript\">open(\"index.pl?tmp=quit\",\"_top\");</script>");
+ print $q->end_html;
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias verläßt den Chat ... </font></i>");
+ sleep 2;
+ &rm_alias($alias,$room);
+ exit;
+}
+ENDJS
+ &start_html("Menü","blank");
+print <<END;
+<script language="JavaScript">
+function fenster(fenster,target) {
+ open(fenster,target,"width=500,height=500,screenX=100,screenY=100,scrollbars");
+}
+</script>
+<font size=2 face=verdana>
+ <a href='javascript:fenster("htdocs.pl?var=werda_html&alias=$alias&room=$room&col=$col&secol=$secol&&tmp=$tmp&tmpid=$tmpid","weristda")'>Wer ist da?</a>
+ <a href='javascript:fenster("main2.pl?var=edit_profile_html&alias=$alias&tmpid=$tmpid&room=$room","ProfilAendern")'>Profil ändern</a>
+ <a href='javascript:fenster("main2.pl?var=edit_options_html&alias=$alias&tmpid=$tmpid&room=$room","Optionen")'>Chatoptionen</a>
+ <a href='javascript:fenster("main2.pl?var=list_alias_html&alias=$alias&tmpid=$tmpid","Benutzerliste")'>Benutzerliste</a>
+ <a href='javascript:fenster("htdocs.pl?var=help_html&tmpid=$tmpid","Befehle")'>Chatbefehle</a><br>
+ <a href='javascript:fenster("main2.pl?var=gb_html&alias=$alias&tmpid=$tmpid","Board")'>Benutzerboard</a>
+ <a href='javascript:fenster("htdocs.pl?var=superuser_html&alias=$alias&tmpid=$tmpid","Superuser")'>Superuser</a>
+ <a href='javascript:fenster("htdocs.pl?var=logs_html&alias=$alias&tmpid=$tmpid","Logdateien")'>Logdateien</a>
+ <a href="http://www.updates.yChat.de" target="Updates">Updates</a>
+ <a href="http://www.credits.yChat.de" target="Credits">Credits</a>
+ <a href="htdocs.pl?alias=$alias&var=menu_html&room=$room&tmpid=$tmpid&tmp=quit">Verlassen</a>
+</font>
+</body>
+</html>
+END
+}
+
+sub werda_html { # Anzeige, wer eingelogt ist.
+ &start_html("Wer ist da?");
+ print <<END;
+<div>
+ $alias, schön daß Du hier bist :-)
+</div>
+<hr>
+<div>
+ Folgende Personen befinden sich im Chat:
+</div>
+<br>
+<div>
+END
+ opendir(ROOMDIRS,"data/online/rooms");
+ local @roomdirs = readdir(ROOMDIRS);
+ close(ROOMDIRS);
+ foreach(@roomdirs) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ my $room = $_;
+ open(RSTAT,"<data/online/rstat/$room");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ opendir(ROOMDIR,"data/online/rooms/$room");
+ my @roomdir = readdir(ROOMDIR);
+ close(ROOMDIR);
+ local $nr = $#roomdir-1;
+ print $q->b( $_ ),
+ " $door ($nr) Raumthema: $rstat[1]",
+ $q->br;
+ foreach(@roomdir) {
+ if ($_ ne ".." && $_ ne ".") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid" }, "$_"), " ";
+ }
+ }
+ print $q->br, $q->br;
+ }
+ }
+ print
+ "</div>",
+ $q->end_html;
+}
+
+sub logs_html {
+ &start_html("Logdateien");
+ print <<END;
+<div>
+ Hier befinden sich alle Logdateien
+</div>
+<hr>
+END
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ print $q->div( "Folgende Logdateien des Raumes \"Cyberbar\" können nur von Oberwächtern gelesen werden (Sortiert nach A-Z, a-z):" ),
+ $q->br;
+ opendir(LOGS,"data/logs");
+ local @logs = readdir(LOGS);
+ closedir(LOGS);
+ local @sortedir = sort(@logs);
+ foreach(@sortedir) {
+ if (-f "data/logs/$_") {
+ print $q->a( { -href=>"htdocs.pl?alias=$alias&var=view_logs_html&tmp=data/logs/$_&tmpid=$tmpid",
+ -target=>"_new" },
+ "$_" ),
+ " ";
+ }
+ }
+ } else {
+ print $q->div( "Logdateien können nur von Oberwächtern (OW) gelesen werden. Du bist jedoch ein Wächter (WÄ) oder ein",
+ "\"Normaler Chatter\". Oberwächter können alles nachlesen, was öffentlich im Raum \"Cyberbar\" gechattet wurde." ),
+ $q->hr;
+ &printfile("data/htdocs/logs_html");
+ }
+ print
+ $q->end_html;
+}
+
+sub superuser_html { # Zeigt an, wer Superuser ist
+ &start_html("Superuser");
+ print "<div>Hallo $alias. Du bist als ";
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ print
+ $q->b( "Oberwächter" ),
+ " (OW) eingetragen.</div>",
+ $q->hr;
+ } elsif ( $hierachie eq "wa") {
+ print
+ $q->b( "Wächter" ),
+ " (WÄ) eingetragen.</div>",
+ $q->hr;
+ } else {
+ print
+ $q->b( "normaler Chatter" ),
+ " (NC) eingetragen.</div>",
+ $q->hr;
+ }
+
+ my $nrow = $#ows+1;
+ print
+ "<div>",
+ $q->b( "OW" ),
+ "s ($nrow Stück)";
+ foreach(@ows) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+ my $nrwa = $#was+1;
+ print
+ "</div>",
+ $q->hr,
+ "<div>",
+ $q->b( "WÄ" ),
+ "s ($nrwa Stück)";
+ foreach(@was) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+print <<END;
+<hr>
+ Die jeweiligen Fähigkeiten der Oberwächter (OW) und der Wächter (WÄ) sind unter
+ "<a href="htdocs.pl?var=help_html">Chat-Befehle</a>"
+ dokumentiert.
+</div>
+</body>
+</html>
+END
+} \ No newline at end of file
diff --git a/0.4.6/index.pl b/0.4.6/index.pl
new file mode 100644
index 0000000..aeb6af2
--- /dev/null
+++ b/0.4.6/index.pl
@@ -0,0 +1,418 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header;
+
+#####################################
+##WELCHE SUB MUß AUFGERUFEN WERDEN?##
+#####################################
+
+$var = $q->param("var");
+$alias = $q->param("alias");
+$pw = $q->param("pw");
+$tmp = $q->param("tmp");
+
+if ($var eq "create_alias_html") {
+ &create_alias_html;
+} elsif ($var eq "create_alias") {
+ &create_alias;
+} elsif ($var eq "login_html") {
+ $tmp = $q->param("tmp");
+ &login_html;
+} elsif ($alias eq "") {
+ &login_html;
+} else {
+ &checklogin;
+}
+
+sub login_html { # Erste Startseite
+&check_online;
+local $counter = undef;
+open(COUNT,"<data/count");
+ $counter = <COUNT>;
+close COUNT;
+$counter++;
+open(COUNT,">data/count");
+ print COUNT $counter;
+close COUNT;
+opendir(USERS,"data/online/users");
+ local @users = readdir(USERS);
+closedir(USERS);
+opendir(REGISTRED,"data/user/options");
+ local @registred = readdir(REGISTRED);
+closedir(REGISTRED);
+local ($logtin,$users) = ($#users-1,$#registred-1);
+&start_html("Created & Copyright by Paul C. Bütow","start");
+print <<END;
+ <center>
+ <table width=500>
+ <tr>
+ <td>
+ <center>
+ <table>
+ <tr>
+ <td>
+<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
+ codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0"
+ WIDTH=240 HEIGHT=240>
+ <PARAM NAME=movie VALUE="$gfxpath/yIntro.swf">
+ <PARAM NAME=loop VALUE=false>
+ <PARAM NAME=menu VALUE=false>
+ <PARAM NAME=quality VALUE=high>
+ <PARAM NAME=scale VALUE=noborder>
+ <PARAM NAME=wmode VALUE=opaque>
+ <PARAM NAME=bgcolor VALUE=#005146>
+ <EMBED src="$gfxpath/yIntro.swf" loop=false menu=false quality=high scale=noborder wmode=opaque bgcolor=#005146
+ WIDTH=240 HEIGHT=240 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED>
+</OBJECT>
+ </td>
+ <td>
+ <div>
+ yChat: Version $version
+ <br><br>
+ Letztes Update: $datum
+ <br><br>
+ Seitenaufrufe: $counter
+ <br><br>
+ Benutzer registriert: $users
+ <br><br>
+ Benutzer online: $logtin
+ <br><br>
+ Webmaster: <a href="mailto:paul\@buetow.oxg.de">Paul C. Bütow</a>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </center>
+ </div>
+ <br>
+ <br>
+END
+ if ($tmp eq "true") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Wahrscheinlich existiert Dein Alias "$alias" nicht,
+ <br>
+ Du hast Dich verschrieben oder das Passwort ist falsch.
+ <br>
+ Versuch es erneuert !
+ </div>
+END
+ } elsif ($tmp eq "quit") {
+print <<END;
+ <div>
+ Du hast soeben den Chat verlassen.
+ <br>
+ Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ } elsif ($tmp eq "banned") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein Alias "$alias" wurde verbannt.
+ <br>
+ Z.z. kannst Du Dich leider nicht in den Chat einloggen.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($tmp eq "kick") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wurdest soeben aus dem Chat katapultiert!
+ <br>
+ Schlechtes Verhalten mag die Ursache hierfür sein.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($var eq "create_alias") {
+print "<div>Du hast sich soeben in die Datenbank eingetragen. Einfach auf \"Los Geht's\" klicken :-)</div>";
+ } else {
+print <<END;
+ <div>
+ Herzlich willkommen!
+ <br>
+ Einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <form name="login" action="index.pl" method="post">
+ <input type="hidden" name="tmp" value="true">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Alias:
+ <br>
+ <input name="alias" value="$alias">
+ </div>
+ </td>
+ <td>
+ <div>
+ Dein Passwort:
+ <br>
+ <input type="password" name="pw" value="$pw">
+ </div>
+ </td>
+ </tr>
+ </table>
+ <br>
+ <br>
+ <div>
+ Solltest Du noch keinen Nick besitzen, dann auf "Registrieren" klicken!
+ </div>
+ <br>
+ <table>
+ <tr>
+ <td>
+ <font color="ffffff">
+ <input type="submit" value="Los geht's!">
+ </font>
+ </form>
+ </td>
+ <td>
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias_html">
+ <font color="ffffff">
+ <input type="submit" value="Registrieren">
+ </font>
+ </form>
+ </td>
+ </tr>
+ </table>
+ <hr>
+ </td>
+ </tr>
+ </table>
+ </center>
+</body>
+</html>
+END
+# if ($logtin == 0) {
+# &list_dir("data/msgs");
+# &list_dir("data/online/rstat",2);
+# foreach(@dir) {
+# unlink("data/msgs/$_");
+# unlink("data/online/ident/$_");
+# }
+# foreach(@dir2) {
+# unlink("data/online/rstat/$_");
+# }
+# }
+# # Falls d. Skript das Raumverz. gelöscht hat, neu anlegen
+ if (-d "data/online/rooms") {
+ } else {
+ mkdir "data/online/rooms", 0777;
+ }
+}
+
+
+sub create_alias_html { # HTML-Form für Erstellung eines neuen Benutzers.
+local $reload = $_[0];
+&start_html("Registration");
+print <<END;
+ <center>
+ <table width=500>
+ <tr>
+ <td>
+END
+ if ($reload eq "alias_exists") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Der von Dir gewählte Benutzername "$alias" existiert in unserer Datenbank bereits. Bitte versuch es erneuert mit
+ einem anderen Benutzernamen !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "pw_wrong") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Deine beiden Passworteingaben stimmen nicht überein. Bitte geb das Passwort erneuert an um sicherzugehen, daß
+ kein falsches Passwort abgespeichert wird !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "alias_prohibited") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein gewählter Benutername "$alias" enthält illegale Zeichen. Bitte versuch einen anderen Benutzernamen!
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Hier kannst Du Dich registrieren. Bitte beachte, daß die Passworteingabefelder übereinstimmen!
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias">
+ <div>
+ Dein Alias:
+ <font color="ffa500">
+ (Muß angegeben werden)
+ </font>
+ <br>
+ <input name="alias" VALUE="$alias">
+ </div>
+ <br>
+ <div>
+ Dein gewünschtes Passwort:
+ <br>
+ <input type="password" name="pw" value="$pw">
+ </div>
+ <br>
+ <div>
+ Geb hier Dein Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp">
+ </div>
+ <br>
+ <font color=ffffff>
+ <input type="submit" value="Registrieren">
+ </font>
+ <br>
+ </form>
+ <hr>
+ <div>
+ Um den Chat zu betreten müssen die Daten nach der Registration auf der Startseite erneuert bestätigt werden !
+ </div>
+ </td>
+ </tr>
+ </table>
+</center>
+</body>
+</html>
+END
+}
+
+sub checklogin { # Überprüfen, ob die Login-Daten korrekt sind.
+ my $lognotexists = "true";
+ opendir(USERDIR,"data/user/options");
+ my @userdir = readdir(USERDIR);
+ closedir(USERDIR);
+ foreach $user (@userdir) {
+ if ($user eq $alias) {
+ open(OPTIONS,"<data/user/options/$alias");
+ my @options = <OPTIONS>;
+ close OPTIONS;
+ chomp($options[0]);
+ if ($options[0] eq $pw) {
+ open(BAN,"<data/ban");
+ my @ban = <BAN>;
+ close BAN;
+ foreach(@ban) {
+ if ($_ eq "$alias\n") {
+ $tmp = "banned";
+ &login_html;
+ exit;
+ }
+ }
+ if ($options[1] eq undef) {
+ $col = "ffffff";
+ } else {
+ $col = $options[1];
+ }
+ if ($options[2] eq undef) {
+ $secol = "ffffef";
+ } else {
+ $secol = $options[2];
+ }
+ $tmpid = time;
+ open(IDENT,">data/online/ident/$alias");
+ print IDENT $ENV{'REMOTE_ADDR'}."\n".$tmpid;
+ close IDENT;
+ open(LASTLOGIN,">data/user/lastlogin/$alias");
+ print LASTLOGIN time;
+ close LASTLOGIN;
+ &frameset_html;
+ exit;
+ } else {
+ $lognotexists = "false";
+ }
+ }
+ }
+ &login_html; # Falls Login-Daten inkorrekt sind, zurück zur Startseite.
+}
+
+sub create_alias { # Erstellung eines neuen Benutzers.
+ if ($alias =~ /[\W]/ || $alias eq "") {
+ &create_alias_html("alias_prohibited");;
+ exit;
+ } elsif ($pw ne $tmp) {
+ &create_alias_html("pw_wrong");
+ exit;
+ }
+ opendir(USERDIR,"data/user/options");
+ my @user = readdir(USERDIR);
+ close USERDIR;
+ foreach $user (@user) {
+ if ($user eq $alias) {
+ &create_alias_html("alias_exists");
+ exit;
+ }
+ }
+ open(OPTIONS,">data/user/options/$alias");
+ print OPTIONS $pw."\n";
+ close OPTIONS;
+ local $number = $#user;
+ &zeit;
+ &post("Cyberbar","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias [$number] hat sich soeben als neuer Benutzer registriert :-) ...</font></i>");
+ &login_html;
+}
+
+sub frameset_html {
+print <<END;
+<html>
+ <head>
+ <title>
+ $title - Created & Copyright by Paul C. Bütow
+ </title>
+ </head>
+<frameset border=0 frameborder=0 framespacing=0 cols="130,*">
+ <frameset border=0 frameborder=0 framespacing=0 rows="300,*,55">
+ <frame name="online" src="online.pl?room=Cyberbar&alias=$alias&tmpid=$tmpid">
+ <frame src="htdocs.pl">
+ <frameset border=0 frameborder=0 framespacing=0 cols="70,*">
+ <frame name="logo" src="htdocs.pl?var=logo_html" scrolling="no">
+ <frame name="reload" src="htdocs.pl" scrolling="no">
+ </frameset>
+ </frameset>
+ <frameset border=0 frameborder=0 framespacing=0 rows="60,*,55">
+ <frame name="menu" src="htdocs.pl?alias=$alias&var=menu_html&room=Cyberbar&col=$col&secol=$secol&tmpid=$tmpid" scrolling="no">
+ <frame name="main" src="push.pl?room=Cyberbar&alias=$alias&tmpid=$tmpid">
+ <frame name="input" src="input.pl?alias=$alias&room=Cyberbar&col=$col&secol=$secol&tmp=login&tmpid=$tmpid" scrolling="no">
+ </frameset>
+</frameset>
+</html>
+END
+}
diff --git a/0.4.6/input.pl b/0.4.6/input.pl
new file mode 100644
index 0000000..2c5914e
--- /dev/null
+++ b/0.4.6/input.pl
@@ -0,0 +1,121 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header();
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+&secure_checkid($alias);
+$room = $q->param("room");
+$col = $q->param("col");
+$secol = $q->param("secol");
+$tmp = $q->param("tmp");
+$whisper = $q->param('whisper');
+
+if ($tmp eq "login") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat den Chat betreten ...</font></i>");
+}
+
+print <<END;
+<html>
+ <head>
+ <script language="JavaScript">
+
+maxVerlauf = 10; // Anzahl der Einträge des Verlaufs
+maxPreview = 20; // Zeichenlänge der Verlaufsvorschau
+fullVerlauf = new Array( maxVerlauf );
+
+function delout()
+{
+ addVerlauf( document.inf.msg.value );
+ document.inf.submit(); // Formular absenden
+ document.inf.msg.focus(); // Fukus in das Eingabeform
+ document.inf.msg.select(); // Text im Eigabeform markieren
+ return false;
+}
+
+function CheckAuswahl()
+{
+ id = document.verlaufform.verlauf.selectedIndex;
+
+ if( fullVerlauf[ id-1 ] == null ) // Falls das Feld leer ist
+ return false; // Aufruf ignorieren
+
+ document.inf.msg.value = fullVerlauf[ id-1 ];
+ document.inf.msg.focus();
+
+ return true;
+}
+
+function addVerlauf( msg )
+{
+ if( msg == "" ) // Falls msg leer
+ return false; // Aufruf ignorieren
+
+ for( i=0; i<(maxVerlauf-1); i++ ) // Alle Einträge einen aufrutschen
+ {
+ document.verlaufform.verlauf.options[i+1].text = document.verlaufform.verlauf.options[i+2].text;
+ fullVerlauf[i] = fullVerlauf[i+1];
+ }
+ if( msg.length > maxPreview )
+ pre = msg.slice( 0, maxPreview-3 ) + "...";
+ else
+ pre = msg;
+
+ document.verlaufform.verlauf.options[ maxVerlauf ].text = pre; // Neue Vorschau anfügen
+ fullVerlauf[ maxVerlauf-1 ] = msg; // Neuen Eintrag anfügen
+
+// document.verlaufform.verlauf.selectedIndex = maxVerlauf; // Fokus auf den letzten Eintrag
+ document.verlaufform.verlauf.selectedIndex = 0; // Fokus auf den ersten Eintrag (Überschrift)
+}
+
+ </script>
+
+$style
+ </head>
+<body class="blank" onload="document.inf.msg.focus();">
+ <div align="left">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td>
+ <form name="inf" target="reload" action="main.pl" onsubmit="return delout()">
+ <input type="hidden" name="var" value="post_msg">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="room" value="$room">
+ <input type="hidden" name="col" value="$col">
+ <input type="hidden" name="secol" value="$secol">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="whisper" value="$whisper">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input size="50" name="msg">
+ </form>
+ </td>
+ <td>
+ <form name="verlaufform">
+ <select size="1" name="verlauf" size="40" onChange="CheckAuswahl()">
+ <option value>- Nachrichten-Verlauf -</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ <option value>(leer)</option>
+ </select>
+ </form>
+ </td>
+ </tr>
+ </table>
+ </div>
+</body>
+</html>
+END
diff --git a/0.4.6/main.pl b/0.4.6/main.pl
new file mode 100644
index 0000000..57e82cb
--- /dev/null
+++ b/0.4.6/main.pl
@@ -0,0 +1,903 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header();
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+&secure_checkid($alias);
+$room = $q->param("room");
+$col = $q->param("col");
+$secol = $q->param("secol");
+$tmp = $q->param("tmp");
+$rmsg = \$q->param("msg");
+$whisper = $q->param("whisper");
+
+&reload_html("","change_colors") if ($q->param('var') eq "change_colors");
+
+if ($tmp eq "away") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat sich zurück gemeldet ... </font></i>");
+}
+$$rmsg =~ s#<#&lt\;#g;
+if (substr($$rmsg,0,1) ne "/") {
+ open(MSGFILE,">>data/msgs/$room");
+ open(PID,"<data/online/pids/$room");
+ print MSGFILE "!<;".time."<;!<;!<;<b><font color=$col>$alias: <font color=$secol>$$rmsg</font></font></b><;\n";
+ my @pids = <PID>;
+ close MSGFILE;
+ close PID;
+ kill INT => @pids;
+ &log("<b><font color=$col>$alias: <font color=$secol>$$rmsg</font></font></b>") if ($room eq "Cyberbar");
+ &reload_html($whisper,$tmp);
+} else {
+ &cmd($$rmsg);
+}
+
+sub reload_html { # Wird neugeladen, wenn eine Nachricht getextet wird!
+ my ($whisper,$action) = @_;
+ print "<html><head><script language=\"JavaScript\">";
+ if ($action eq "change_room") {
+ print "open(\"online.pl?alias=$alias&room=$room&tmpid=$tmpid\",\"online\");";
+ print "parent.input.document.inf.room.value = \"$room\";";
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol&tmpid=$tmpid\",\"menu\");";
+ } elsif ($action eq "change_colors") {
+ print "parent.input.document.inf.col.value = \"$col\";";
+ print "parent.input.document.inf.secol.value = \"$secol\";";
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol&tmpid=$tmpid\",\"menu\");";
+ } elsif ($action eq "whisper") {
+ print "parent.input.document.inf.whisper.value = \"$whisper\";";
+ } elsif ($action eq "away") {
+ print "parent.input.document.inf.tmp.value = \"away\";";
+ } elsif ($action eq "quit") {
+ print "open(\"index.pl?tmp=quit\",\"_top\");";
+ }
+ print "parent.input.document.inf.tmp.value = \"notaway\";" if ($tmp eq "away");
+ print "</script></head><body bgcolor=$col>";
+ print
+ $q->end_html;
+}
+
+sub change_room { # Den Chat-Raum wechseln
+ my ($method,$newroom,$oldroom,$alias2follow) = @_;
+ open(RSTAT, "<data/online/rstat/$newroom"); #Überprüfen, ob Alias Raum betreten darf
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ if ($rstat[0] eq "1\n") {
+ &hierachie($alias);
+ if ($hierachie eq "wa" || $hierachie eq "ow") { } else {
+ &post_prv($alias,"<font size=2 color=ffffff>Der Raum \"<font color=ffa500>$newroom</font>\" ist leider abgesperrt!</font>");
+ &reload_html($whisper,$action);
+ exit;
+ }
+ }
+ open(MSGFILE,">>data/msgs/$room");
+ print MSGFILE "$alias<;".time."<;cr<;$newroom<;!<;\n";
+ close MSGFILE;
+ $room = $oldroom;
+ my $tmpstamp = time+5;
+ &zeit;
+ if ($method eq "j") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias wechselt in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias kommt aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ open(MSGFILE,">>data/msgs/$room");
+ print MSGFILE "$alias<;$tmpstamp<;!<;!<;<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>Du wechselst aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i><;\n";
+ close MSGFILE;
+ } elsif ($method eq "ju") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias folgt \"$alias2follow\" in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias kommt aus dem Raum \"$oldroom\" und folgt \"$alias2follow\" herein nach \"$newroom\" ...</font></i>");
+ open(MSGFILE,">>data/msgs/$room");
+ print MSGFILE "$alias<;$tmpstamp<;!<;!<;<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>Du folgst \"$alias2follow\" aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i><;\n";
+ close MSGFILE;
+ }
+ open(PID,"<data/online/pids/$room");
+ my @pids = <PID>;
+ close PID;
+ kill INT => @pids;
+ unlink("data/online/rooms/$oldroom/$alias");
+ &rm_rstat($alias,$oldroom);
+ &check_online;
+}
+
+sub prove_besetzer { # Prüfen, ob Benutzer Raumbesetzerrechte hat
+ my ($r_alias,$r_room) = @_;
+ $r_besetzer = "false";
+ open(DATEI,"<data/online/rstat/$r_room");
+ @r_stat = <DATEI>;
+ close DATEI;
+ for($i=2;$i<=$#r_stat;$i++) {
+ $r_besetzer = "true" if ($r_stat[$i] eq $r_alias || $r_stat[$i] eq $r_alias."\n");
+ }
+}
+
+sub cmd { # Alle Chatbefehle, die über input_html eingegeben werden können.
+ $_[0] = $_[0]." ";
+ $_[0] = substr($_[0], 1, length($_[0])-1);
+ my @cmd = split(/ /, $_[0]);
+ my $cmd = substr($_[0],0 , index($_[0], " "));
+#############>- NORMALE CHATBEFEHLE ( Alphabetisch sortiert ) -<
+#############>- INFORMATIONEN ÜBER DAS SYSTEM AUSGEBEN -<
+ if ($cmd eq "about") {
+ &post_prv("$alias","<font size=2 color=ffffff>Aktuelle Version ist $title und wurde am $datum aktuallisiert. Erstellt von Paul C. Bütow (2000 - 2001).</font>");
+ &reload_html;
+ exit;
+#############>- ABMELDEN MIT 'AWAY-NACHRICHT' -<
+ } elsif ($cmd eq "away") {
+ if ($tmp eq "away") { # Falls 2 mal hintereinander /away eingegeben wurde
+ my $away_msg = "";
+ }
+ for ($i=1; $i <= $#cmd; $i++) {
+ $away_msg = $away_msg." ".$cmd[$i];
+ }
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias meldet sich ab (<font color=red>$away_msg</font> ) ...</i></font>");
+ &reload_html($whisper,"away");
+ exit;
+#############>- EIGENEN CHATBILDSCHIRM LÖSCHEN -<
+ } elsif ($cmd eq "clear") {
+ &post_prv($alias,"<script language=\"JavaScript\">window.open(\"push.pl?alias=$alias&room=$room&var=clear_screen&tmpid=$tmpid\",\"main\");</script>");
+ &reload_html;
+ exit;
+#############>- FARBEN WECHSELN -<
+ } elsif ($cmd eq "col") {
+ $col = $cmd[1];
+ my $tmpsecol = $cmd[2];
+ if ($tmpsecol eq "") {
+ $secol = $col
+ } else {
+ $secol = $tmpsecol;
+ }
+ open(OPTIONS,"<data/user/options/$alias");
+ my @options = <OPTIONS>;
+ close OPTIONS;
+ open(OPTIONS,">data/user/options/$alias");
+ print OPTIONS $options[0]."".$col."\n".$secol;
+ close OPTIONS;
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat die Farbe gewechselt ...</font></i>");
+ &reload_html($whisper,"change_colors");
+ exit;
+#############>- AKTUELLES DATUM UND URZEIT AUSGEBEN -<
+ } elsif ($cmd eq "date") {
+ &zeit;
+ &post_prv("$alias","<font size=2 color=ffffff>Heute ist der $day.$month. Jahr $year. Es ist genau $hours:$min Uhr und $sec Sekunden.</font>");
+ &reload_html;
+ exit;
+#############>- EINEN NEUEN RAUM ERSTELLEN BZW. IN EINEN BESTEHENDEN RAUM WECHSELN -<
+ } elsif ($cmd eq "j") {
+ &change_room("j",$cmd[1],$room);
+ &reload_html($whisper,"change_room");
+ exit;
+#############>- HANDELN -<
+ } elsif ($cmd eq "me" || $cmd eq "m") {
+ my $me_msg;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $me_msg = $me_msg." ".$cmd[$i];
+ }
+ if ($cmd eq "m") {
+ &post($room,"<i><font color=$col>$alias <font color=$secol>$me_msg</font></font></i>");
+ } else {
+ &post($room,"<i><font color=$col>$alias $me_msg</font></i>");
+ }
+ &reload_html;
+ exit;
+#############>- MEMO SCHREIBEN -<
+ } elsif ($cmd eq "memo") {
+ my $alias2memo = $cmd[1];
+ if(-f "data/user/options/$alias2memo") {
+ my $memo_msg;
+ for ($i=2; $i <= $#cmd; $i++) {
+ $memo_msg = $memo_msg." ".$cmd[$i];
+ }
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2memo <font color=ffffff>wurde folgende memo erfolgreich hinterlassen: $memo_msg</font></font>");
+ &zeit;
+ open(MEMO,">>data/user/memos/$alias2memo") || &error("Konnte >>data/user/memos/$alias2memo nicht öffnen");
+ print MEMO "<font size=2 color=ffffff>($day.$month. - $hours:$min:$sec) <font color=ffa500>$alias</font> hat Dir eine Memo hinterlassen: <font color=ffa500>$memo_msg</font></font><br>\n";
+ close MEMO;
+ &reload_html;
+ exit;
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2memo <font color=ffffff>existiert in der Datenbank nicht !</font></font>");
+ &reload_html;
+ exit;
+#############>- FLÜSTERN ( Auch mit '/' ) -<
+ } elsif ($cmd eq "msg" || $cmd eq "") {
+ my ($alias2post,$msg2post,$action) = ($cmd[1]);
+ if ($cmd eq "msg") {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ $action = "whisper";
+ } else {
+ $alias2post = $whisper;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ }
+ if (-f "data/online/users/$alias2post") {
+ &post_prv($alias2post,"<i><font color=$col>$alias flüstert <font color=ffffff>=></font><font color=$secol>$msg2post</font></font></i>");
+ &post_prv($alias,"<i><font color=$col>Zu $alias2post geflüstert <font color=ffffff>=></font><font color=$secol>$msg2post</font></font></i>");
+ &reload_html($alias2post,$action);
+ exit;
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2post <font color=ffffff>ist momentan nicht anwesend !</font></font>");
+ &reload_html;
+ exit;
+#############>- TOTALONLINEZEIT VON ALIAS ANZEIGEN -<
+ } elsif ($cmd eq "online") {
+ my $alias2prove= $cmd[1];
+ if (-f "data/user/options/$alias2prove") {
+ open(ONLINE,"<data/user/counts/$alias2prove.online");
+ my $online = <ONLINE>;
+ close ONLINE;
+ my $totaltime = sprintf("%.2f",($online / 60));
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff> war insgesamt schon $totaltime Minuten online!</font></font>");
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff>existiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+ &reload_html;
+ exit;
+#############>- DAS SYSTEM VERLASSEN -<
+ } elsif ($cmd eq "q") {
+ &reload_html($whisper,"quit");
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias verläßt den Chat ... </font></i>");
+ sleep 2;
+ &rm_alias($alias,$room);
+ exit;
+#############>- DAS EIGENE GÄSTEBUCH LÖSCHEN -<
+ } elsif ($cmd eq "rmgb") {
+ unlink("data/user/gbooks/$alias");
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias löscht sein gesamtes Gästebuch ...</font></i>");
+ &reload_html;
+ exit;
+#############>- SCHREIEN -<
+ } elsif ($cmd eq "s") {
+ my $msg2scream;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2scream = $msg2scream." ".$cmd[$i];
+ }
+ my $msg2post = "\U$msg2scream";
+ &post($room,"<font color=$col><i>$alias schreit:</i> <b><font color=$secol>".$msg2post."</font></font></b>");
+ &reload_html;
+ exit;
+#############>- SEHEN, WANN SICH ALIAS ZUM LETZTEN MAL EINGELOGT HAT -<
+ } elsif ($cmd eq "seen") {
+ my $alias2prove = $cmd[1];
+ if (-f "data/user/options/$alias2prove") {
+ if (-f "data/user/lastlogin/$alias2prove") {
+ open(LASTLOGIN,"<data/user/lastlogin/$alias2prove");
+ local $lastlogin = <LASTLOGIN>;
+ close LASTLOGIN;
+ local $timestamp = sprintf("%.2f",((time() - $lastlogin) / 3600));
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff> hat sich vor $timestamp Stunden zuletzt in das System eingelogt!</font></font>");
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff> hat sich seit der Einführung dieses Befehls noch nie eingelogt!</font></font>");
+ }
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff> exsistiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+ &reload_html;
+ exit;
+#############>- ANZEIGEN WER SICH IM AKTUELLEN RAUM BEFINDET -<
+ } elsif ($cmd eq "w") {
+ open(RSTAT,"data/online/rstat/$room");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ chomp($rstat[1]);
+ my $theme = "Raumthema:".$rstat[1] if ($rstat[1] ne undef);
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ my ($is,$nr) = ("t",0);
+ opendir(DIR,"data/online/rooms/$room");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ my $personen;
+ foreach(@dir) {
+ if (-f "data/online/rooms/$room/$_") {
+ $personen = $personen." ".$_;
+ $nr++;
+ }
+ }
+ &post_prv($alias,"<font size=2 color=ffffff>Der aktuelle Raum: $room $theme $door ($nr) : <font color=ffa500>$personen</font></font>");
+ &reload_html;
+ exit;
+#############>- ANZEIGEN WER SICH IM SYSTEM BEFINDET -<
+ } elsif ($cmd eq "wc" || $cmd eq "wc/") {
+ my $raum = $cmd[1];
+ my $personen;
+ if ($raum eq "" && $cmd eq "wc") {
+ opendir(USERS,"data/online/users");
+ my @users = readdir(USERS);
+ close USERS;
+ foreach(@users) {
+ $personen = $personen." ".$_ if (-f "data/online/users/$_");
+ }
+ my $nr = ($#users-1);
+ my ($nrs,$is) = ("","ist");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "sind";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>$nr Person$nrs $is insgesamt eingelogt: <font color=ffa500>$personen</font></font>");
+ } elsif ($raum eq "" && $cmd eq "wc/") {
+ my $msg2post;
+ opendir(DIR,"data/online/rooms");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ opendir(DIR,"data/online/rooms/$_");
+ my @dir2 = readdir(DIR);
+ closedir(DIR);
+ open(RSTAT,"<data/online/rstat/$_");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ chomp($rstat[1]);
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ my $nr = $#dir2-1;
+ $msg2post = $msg2post."<tr><td><b><font size=2 color=ffffff>$_ $door ($nr) [".$rstat[1]."]: </font></b></td></tr><tr><td><font size=2 color=ffa500>";
+ foreach $chatter (@dir2) {
+ if (-f "data/online/rooms/$_/$chatter") {
+ $msg2post = $msg2post."$chatter ";
+ }
+ }
+ print "</font></td>";
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>Folgende Räume sind offen:</font><table>$msg2post</table>");
+ } elsif ($raum ne "") {
+ my $personen;
+ opendir(DIR,"data/online/rooms/$raum");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/rooms/$raum/$_");
+ }
+ my ($nr,$is) = (($#dir-1),"t");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "n";
+ }
+ &post_prv($alias,"<font size=2 color=ffffff> $nr Person$nrs befinde$is sich im Raum \"$raum\": <font color=ffa500>$personen</font></font>");
+ }
+ &reload_html;
+ exit;
+#############>- ANZEIGEN IN WELCHEN RAUM SICH JMD. BEFINDET BZW. JMD IN EINEN RAUM FOLGEN -<
+ } elsif ($cmd eq "wj" || $cmd eq "ju") {
+ my $alias2search = $cmd[1];
+ opendir(ROOMS,"data/online/rooms");
+ my @dir = readdir(ROOMS);
+ closedir(ROOMS);
+ foreach $raum (@dir) {
+ opendir(DIR2,"data/online/rooms/$raum");
+ my @dir2 = readdir(DIR2);
+ closedir(DIR2);
+ foreach $user (@dir2) {
+ if (-f "data/online/rooms/$raum/$user") {
+ if ($user eq $alias2search) {
+ if ($cmd eq "wj") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2search <font color=ffffff>befindet sich im Raum \"$raum\" !</font></font>");
+ } else {
+ &change_room("ju",$raum,$room,$alias2search);
+ }
+ &reload_html($whisper,"change_room");
+ exit;
+ }
+ }
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2search <font color=ffffff> ist nicht eingelogt !</font></font>");
+ &reload_html;
+ exit;
+#############>- RAUMNESETZER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- RAUM ABSCHLIESSEN/AUFSCHLIESSEN -<
+ } elsif ($cmd eq "l") {
+ &prove_besetzer($alias,$room);
+ &hierachie($alias);
+ if ($r_besetzer eq "true" || $hierachie eq "wa" || $hierachie eq "ow") {
+ my $lock = "0\n";
+ &zeit;
+ if ($room eq "Cyberbar") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum ohne Erfolg ab ...</font></i>");
+ } else {
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum ab ...</font></i>");
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum auf ...</font></i>");
+ }
+ for ($i=1;$i<=$#r_stat;$i++) {
+ $lock = $lock.$r_stat[$i];
+ }
+ open(RSTAT,">data/online/rstat/$room");
+ print RSTAT $lock;
+ close RSTAT;
+ }
+ }
+ &reload_html;
+ exit;
+#############>- RAUMBESETZER ERNENNEN -<
+ } elsif ($cmd eq "su") {
+ &prove_besetzer($alias,$room);
+ &hierachie($alias);
+ if ($r_besetzer eq "true" || $hierachie eq "wa" || $hierachie eq "ow") {
+ my $alias2su = $cmd[1];
+ opendir(DIR,"data/online/rooms/$room");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ if ($_ eq $alias2su) {
+ open(DATEI,"<data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ &hierachie($alias2su);
+ &prove_besetzer($alias2su,$room);
+ if ($r_besetzer eq "true" || $hierachie eq "wa" || $hierachie eq "ow") {
+ &reload_html;
+ &post_prv($alias,"<font color=ffa500>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist bereits RB, WÄ oder OW)</font>");
+ exit;
+ }
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias ernennt \"$alias2su\" zum Raumbesetzer ...</font></i>");
+ open(DATEI,">>data/online/rstat/$room");
+ print DATEI $alias2su."\n";
+ close DATEI;
+ &reload_html;
+ exit;
+ }
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist nicht anwesend)</font>");
+ }
+ &reload_html;
+ exit;
+#############>- RAUMBESETZER ENTNENNEN -<
+ } elsif ($cmd eq "rsu") {
+ &prove_besetzer($alias,$room);
+ &hierachie($alias);
+ if ($r_besetzer eq "true" || $hierachie eq "wa" || $hierachie eq "ow") {
+ my $alias2rsu = $cmd[1];
+ open(DATEI,"<data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ &prove_besetzer($alias2rsu,$room);
+ if ($r_besetzer eq "true") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias entzieht \"$alias2rsu\" die Raumbesetzerrechte ...</font></i>");
+ my $newrstat = $rstat[0].$rstat[1];
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $newrstat = $newrstat.$r_stat[$i] if ($r_stat[$i] ne $alias2rsu."\n");
+ }
+ open(DATEI,">data/online/rstat/$room");
+ print DATEI $newrstat;
+ close DATEI;
+ } else {
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2rsu <font color=ffffff>ist kein Raumbesetzer und kann dieser Status auch nicht aberkannt werden !</font></font>");
+ }
+ }
+ &reload_html;
+ exit;
+#############>- RAUM EIN THEMA GEBEN -<
+ } elsif ($cmd eq "t") {
+ &prove_besetzer($alias,$room);
+ &hierachie($alias);
+ if ($r_besetzer eq "true" || $hierachie eq "wa" || $hierachie eq "ow") {
+ my $theme;
+ &zeit;
+ if ($cmd[1] ne undef) {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $theme = $theme." ".$cmd[$i];
+ }
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias gibt dem Raum das Thema (<font color=red> $theme </font>) ...</font></i>");
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias löscht das Thema des Raums ...</font></i>");
+ }
+ $theme = $r_stat[0].$theme."\n";
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $theme = $theme.$r_stat[$i];
+ }
+ open(RSTAT,">data/online/rstat/$room");
+ print RSTAT $theme;
+ close RSTAT;
+ }
+ &reload_html;
+ exit;
+#############>- SUPERUSER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- ALIAS VERBANNEN -<
+ } elsif ($cmd eq "ban") {
+ &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $alias2ban = $cmd[1];
+ open(BAN,"<data/ban");
+ my @ban = <BAN>;
+ close BAN;
+ if ($cmd[1] eq undef) {
+ my $banned;
+ local $nr = @ban;
+ for ($i=0;$i<=$#ban;$i++) {
+ $banned .= $ban[$i];
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>Folgende Benutzer sind verbannt [$nr]: <font color=ffa500>$banned</font></font>");
+ &reload_html;
+ exit;
+ } elsif (-f "data/user/options/$alias2ban") {
+ &hierachie($alias2ban);
+ if ($hierachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2ban <font color=ffffff>ist Wächter und kann nicht verbannt werden!</font></font>");
+ &reload_html;
+ exit;
+ } elsif ($hierachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2ban <font color=ffffff>ist Oberwächter und kann nicht verbannt werden!</font></font>");
+ &reload_html;
+ exit;
+ }
+ foreach $ban (@ban) {
+ if ($ban eq $alias2ban."\n") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2ban <font color=ffffff>ist bereits verbannt!</font></font>");
+ &reload_html;
+ exit;
+ }
+ }
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias verbannt \"$alias2ban\" aus dem Chat ...</font></i>");
+ open(BAN,">>data/ban");
+ print BAN $alias2ban."\n";
+ close BAN;
+ &reload_html;
+ exit;
+ }
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2ban <font color=ffffff>kann nicht verbannt werden da Benutzername nicht existiert!</font></font>");
+ &reload_html;
+ exit;
+ }
+#############>- ALIAS ENTBANNEN -<
+ } elsif ($cmd eq "rban") {
+ &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $alias2rban = $cmd[1];
+ open(BAN,"<data/ban");
+ @ban = <BAN>;
+ close BAN;
+ foreach $ban (@ban) {
+ if ($ban eq $alias2rban."\n") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias entbannt \"$alias2rban\" ...</font></i>");
+ my @ban2;
+ foreach $ban (@ban) {
+ push(@wa2,$wa) if ($ban ne $alias2rban."\n");
+ }
+ open(BAN,">data/ban");
+ print BAN @ban2;
+ close BAN;
+ &reload_html;
+ exit;
+ }
+ }
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2rban <font color=ffffff>ist nicht verbannt!</font></font>");
+ &reload_html;
+ exit;
+ }
+#############>- IP # VON ALIAS ANZEIGEN LASSEN -<
+} elsif ($cmd eq "ip") {
+ &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $alias2prove = $cmd[1];
+ opendir(DIR,"data/online/ident");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ if ($_ eq $alias2prove) {
+ open(DATEI,"<data/online/ident/$alias2prove");
+ local $ipnr = <DATEI>;
+ close DATEI;
+ chomp($ipnr);
+ &post_prv("$alias","<font size=2 color=ffa500>$_ <font color=ffffff>hat die IP-Nummer $ipnr !</font></font>");
+ }
+ }
+ }
+ &reload_html;
+ exit;
+#############>- ALIAS AUS DEM CHAT KATAPULTIEREN -<
+ } elsif ($cmd eq "k") {
+ &hierachie($alias);
+ if ($hierachie eq "wa" || $hierachie eq "ow") {
+ my $alias2kick = $cmd[1];
+ opendir(DIR,"data/online/rooms");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach $raum (@dir) {
+ opendir(DIR,"data/online/rooms/$raum");
+ my @dir2 = readdir(DIR);
+ closedir(DIR);
+ foreach $chatter (@dir2) {
+ if ($chatter eq $alias2kick) {
+ &hierachie($alias2kick);
+ if ($hierachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist Oberwächter und kann nicht \"gekickt\" werden !</font></font>");
+ } elsif ($hierachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist Wächter und kann nicht \"gekickt\" werden !</font></font>");
+ } else {
+ &post_prv("$alias2kick","<script language=\"JavaScript\">window.open(\"index.pl?tmp=kick\",\"_top\");</script>");
+ &zeit;
+ $_ = undef if ($room eq $raum);
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias katapultiert \"$alias2kick\" aus dem Chat ...</font></i>",$raum);
+ &rm_alias($alias2kick,$raum);
+ &check_online;
+ }
+ &reload_html;
+ exit;
+ }
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist nicht anwesend und kann nicht \"gekickt\" werden !</font></font>");
+ }
+ &reload_html;
+ exit;
+#############>- EINEN BENUTZER AUS DEM SYSTEM LÖSCHEN -<
+ } elsif ($cmd eq "kill") {
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ my $alias2kill = $cmd[1];
+ &hierachie($alias2kill);
+ if ($hierachie eq "ow") {
+ &post_prv($alias,"<font size color=ffa500>$alias2kill</font> <font color=ffffff>ist Oberwächter und kann nicht aus dem System entfernt werden !</font>");
+ } elsif ($hierachie eq "wa") {
+ &post_prv($alias,"<font size color=ffa500>$alias2kill</font> <font color=ffffff>ist Wächter und kann nicht aus dem System entfernt werden !</font>");
+ } else {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias killt \"$alias2kill\" ganz und gar aus dem System ...</font></i>");
+ unlink("data/user/options/$alias2kill");
+ unlink("data/user/profiles/$alias2kill");
+ unlink("data/user/gbooks/$alias2kill");
+ unlink("data/user/counts/$alias2kill");
+ unlink("data/user/counts/$alias2kill.online");
+ unlink("data/user/lastlogin/$alias2kill");
+ unlink("data/user/memos/$alias2kill");
+ }
+ }
+ &reload_html;
+ exit;
+#############>- EINEN ANDEREN RAUM AUF-/ABSPERREN -<
+ } elsif ($cmd eq "sl") {
+ &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $sl_room = $cmd[1];
+ if (-e "data/online/rooms/$sl_room") {
+ my $lock = "0\n";
+ &zeit;
+ open(RSTAT,"<data/online/rstat/$sl_room");
+ my @r_stat = <RSTAT>;
+ close RSTAT;
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum \"$sl_room\" von aussen ab ...</font></i>",$sl_room);
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum \"$sl_room\" von aussen auf ...</font></i>",$sl_room);
+ }
+ for ($i=1;$i<=$#r_stat;$i++) {
+ $lock = $lock.$r_stat[$i];
+ }
+ open(RSTAT,">data/online/rstat/$sl_room");
+ print RSTAT $lock;
+ close RSTAT;
+ } else {
+ &post_prv($alias,"<font size=2 color=ffffff>Der Raum <font color=ffa500>$sl_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ exit;
+ }
+#############>- IN EINEN ANDEREN RAUM HINEINRUFEN -<
+ } elsif ($cmd eq "ss") {
+ &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $ss_room = $cmd[1];
+ if (-e "data/online/rooms/$ss_room") {
+ my $ss_msg;
+ for ($i=2; $i <= $#cmd; $i++) {
+ $ss_msg = $ss_msg." ".$cmd[$i];
+ }
+ my $msg2scream = "\U$ss_msg";
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias ruft aus dem Raum \"$room\" hinein in den Raum \"$ss_room\": <font color=$col>$msg2scream</font> ...</font></i>",$ss_room);
+ &reload_html;
+ exit;
+ } else {
+ &post_prv($alias,"<font size=2 color=ffffff>Der Raum <font color=ffa500>$ss_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ exit;
+ }
+#############>- EINEN ANDEREN RAUM EIN THEMA GEBEN -<
+ } elsif ($cmd eq "st") {
+ &hierachie($alias);
+ if ($hierachie eq "wa" || $hierachie eq "ow") {
+ my $st_room = $cmd[1];
+ if (-e "data/online/rooms/$st_room") {
+ my $theme;
+ &zeit;
+ if ($cmd[2] ne undef) {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $theme = $theme." ".$cmd[$i];
+ }
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias gibt dem Raum \"$st_room\" das Thema (<font color=red> $theme </font>) ...</font></i>",$st_room);
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias löscht das Thema des Raums \"$st_room\" ...</font></i>",$st_room);
+ }
+ open(RSTAT,"<data/online/rstat/$st_room");
+ my @r_stat = <RSTAT>;
+ close RSTAT;
+ $theme = $r_stat[0].$theme."\n";
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $theme = $theme.$r_stat[$i];
+ }
+ open(RSTAT,">data/online/rstat/$st_room");
+ print RSTAT $theme;
+ close RSTAT;
+ } else {
+ &post_prv($alias,"<font size=2 color=ffffff>Der Raum <font color=ffa500>$st_room</font> existiert nicht!</font></font>");
+ }
+ }
+ &reload_html;
+ exit;
+#############>- SYSTEMNACHRICHT IN ALLE BESTEHENDEN RÄUME POSTEN -<
+ } elsif ($cmd eq "sys") {
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ my $sys_msg;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $sys_msg = $sys_msg." ".$cmd[$i];
+ }
+ &zeit;
+ $sys_msg = "<i><font color=ffffff>($hours:$min:$sec)</font></i> <b><font size=2 color=red>SYSTEMNACHRICHT</font></b><i><font color=ffffff>: $sys_msg ...</font></i>";
+ opendir(ROOMS,"data/msgs");
+ my @rooms = readdir(ROOMS);
+ close(ROOMS);
+ foreach(@rooms) {
+ &post($_,$sys_msg);
+ }
+ &log($sys_msg);
+ }
+ &reload_html;
+ exit;
+#############>- ALIAS ZUM WÄCHTER ERNNENNEN -<
+ } elsif ($cmd eq "wa") {
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ my $alias2wa = $cmd[1];
+ &hierachie($alias2wa);
+ if ($hierachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2wa <font color=ffffff>ist bereits als Wächter eingetragen. Eine erneuerte Eintragung ist nicht möglich!</font></font>");
+ &reload_html;
+ exit;
+ } elsif ($hierachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2wa <font color=ffffff>ist bereits als Oberwächter eingetragen. Oberwächter können nicht gleichzeitig Wächter sein!</font></font>");
+ &reload_html;
+ exit;
+ }
+ if (-f "data/user/options/$alias2wa") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font><font color=ffa500> $alias ernennt \"$alias2wa\" zum Wächter ...</font></i>");
+ open(WA,">>data/wa");
+ print WA $alias2wa."\n";
+ close WA;
+ &reload_html;
+ exit;
+ }
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2wa <font color=ffffff>kann nicht zum Wächter ernannt werden da Benutzername nicht existiert!</font></font>");
+ &reload_html;
+ exit;
+ }
+#############>- ALIAS DIE WÄCHTERRECHTE ENTZIEHEN -<
+ } elsif ($cmd eq "rwa") {
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ my $alias2rwa = $cmd[1];
+ &hierachie($alias2rwa);
+ if ($hierachie eq "wa") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat \"$alias2rwa\" vom Wächter zum normalen Chatter degradiert ...</font></i>");
+ open(WA,"<data/wa");
+ @wa = <WA>;
+ close WA;
+ my @wa2;
+ foreach $wa (@wa) {
+ push(@wa2,$wa) if ($wa ne $alias2rwa."\n");
+ }
+ open(WA,">data/wa");
+ print WA @wa2;
+ close WA;
+ } else {
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2rwa <font color=ffffff>ist kein Wächter und können die Wächterrechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ exit;
+ }
+#############>- ADMINISTRATORBEFEHLE -<
+#############>- ALIAS ZUM OBERWÄCHTER ERNENNEN -<
+ } elsif ($cmd eq "ow" && $alias eq "Snooper") {
+ my $alias2ow = $cmd[1];
+ &hierachie($alias2ow);
+ if ($hierachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2ow <font color=ffffff>ist bereits als Wächter eingetragen. Wächter können nicht gleichzeitig Oberwächter sein!</font></font>");
+ &reload_html;
+ exit;
+ } elsif ($hierachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2ow <font color=ffffff>ist bereits als Oberwächter eingetragen!</font></font>");
+ &reload_html;
+ exit;
+ }
+ if (-f "data/user/options/$alias2ow") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font><font color=ffa500> $alias ernennt \"$alias2ow\" zum Oberwächter ...</font></i>");
+ open(OW,">>data/ow");
+ print OW $alias2ow."\n";
+ close OW;
+ &reload_html;
+ exit;
+ }
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2ow <font color=ffffff>kann nicht zum Oberwächter ernannt werden da Benutzername nicht existiert!</font></font>");
+ &reload_html;
+ exit;
+#############>- ALIAS DIE OBERWÄCHTERRECHTE ENTZIEHEN -<
+ } elsif ($cmd eq "row" && $alias eq "Snooper") {
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ my $alias2row = $cmd[1];
+ &hierachie($alias2row);
+ if ($hierachie eq "ow") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat \"$alias2row\" vom Oberwächter zum normalen Chatter degradiert ...</font></i>");
+ open(OW,"<data/ow");
+ @ow = <OW>;
+ close OW;
+ my @ow2;
+ foreach $ow (@ow) {
+ push(@ow2,$ow) if ($ow ne $alias2row."\n");
+ }
+ open(OW,">data/ow");
+ print OW @ow2;
+ close OW;
+ } else {
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2row <font color=ffffff>ist kein Oberwächter und können die Wächterrechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ exit;
+ }
+#############>- PASSWORD EINES BENUTZERS ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "pw" && $alias eq "Snooper") {
+ my $pw2show = $cmd[1];
+ if (-f "data/user/options/$pw2show") {
+ open(PW,"<data/user/options/$pw2show");
+ @pw = <PW>;
+ close PW;
+ &post_prv($alias,"<font size=2 color=ffa500>$pw2show <font color=ffffff> hat das Passwort \"".$pw[0]."\" !</font></font>");
+ &reload_html;
+ exit;
+ }
+ &post_prv($alias,"<font size=2 color=ffa500>$pw2show <font color=ffffff> existiert nicht in der Benutzerdatenbank !</font></font>");
+ &reload_html;
+ exit;
+#############>- SYSTEMMELDUNG POSTEN -<
+ } elsif ($cmd eq "cool" && $alias eq "Snooper" || $alias eq "Peacemaker") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$msg2post</font></i>");
+ &reload_html;
+ exit;
+#############>- ENDE DER CHATBEFEHLE -<
+ }
+&post_prv($alias,"<font size=2 color=ffffff>Der Chatbefehl <font color=ffa500>/$cmd</font> existiert nicht oder Du hast keine Berechtigung diesen Befehl auszuführen!</font></font>");
+&reload_html;
+} \ No newline at end of file
diff --git a/0.4.6/main2.pl b/0.4.6/main2.pl
new file mode 100644
index 0000000..36a0012
--- /dev/null
+++ b/0.4.6/main2.pl
@@ -0,0 +1,594 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header();
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+
+$var = $q->param("var");
+if ($var eq "list_alias_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &list_alias_html;
+} elsif ($var eq "alias_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $tmp = $q->param("tmp");
+ &alias_html;
+} elsif ($var eq "edit_profile_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ &edit_html("edit_profile_html");
+} elsif ($var eq "edit_options_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ &edit_html("edit_options_html");
+} elsif ($var eq "gb_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &gb_html;
+} elsif ($var eq "post_gb") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $msg = $q->param("msg");
+ $tmp = $q->param("tmp");
+ $id = $q->param("id");
+ &post_gb;
+} elsif ($var eq "edit_profile") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ &secure_checkid($alias);
+ &edit("edit_profile");
+} elsif ($var eq "edit_options") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $tmp = $q->param("tmp");
+ $id = $q->param("id");
+ $room = $q->param("room");
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ &edit("edit_options");
+} elsif ($var eq "rm_gb_alias") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $tmp = $q->param("tmp");
+ $id = $q->param("id");
+ &rm_gb;
+} else {
+ &error("Parameter fehlt");
+}
+
+###########################
+##HAUPTTEIL DIESER DATEI:##
+###########################
+
+sub gb_html { # Das Benutzerboard/Gästebuch.
+ my $message = $_[0];
+ &start_html("Benutzerboard");
+if ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </i>
+ einen Text und poste
+ <u>dann</u>
+ !
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Vielen Dank für Deinen Beitrag. Wenn Du willst, kannst Du jetzt gleich noch einen Eintrag posten ...
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Falls Du Anregungen oder Verbesserungsvorschläge für die Community hast, dann poste doch einen kleinen Eintrag :-)
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="guestbook">
+ <input type="hidden" name="id" value="y">
+ <input size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+ if (-e "data/guestbook") {
+ open (DATEI,"<data/guestbook") || &error("Konnte dat/guestbook nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ print
+ $q->div(@datei);
+ }
+ print
+ $q->end_html;
+}
+
+
+sub post_gb { # Wenn etwas in ein Gästebuch eingetragen wird
+ &zeit;
+ if ($msg eq "") {
+ if ($id eq "y") { # Überprüfen, ob Benutzerboard- oder Privatgästebuch
+ &gb_html("post_empty");
+ } else {
+ &alias_html("post_empty");
+ }
+ exit;
+ }
+ $msg =~ s#<#&lt\;#g;
+ my $tmpath = "";
+ if ($id eq "y") {
+ $tmpath = "data/guestbook";
+ } else {
+ $tmpath = "data/user/gbooks/$tmp";
+ }
+ open(GB,"$tmpath");
+ my @gb = <GB>;
+ close GB;
+ pop(@gb) if ($#gb > 99);
+ my @newdatei = "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ push(@newdatei,@gb);
+ open(GB,">$tmpath");
+ print GB @newdatei;
+ close GB;
+ if ($id eq "y") {
+ &gb_html("post_ok");
+ exit;
+ } else {
+ post_prv("$tmp","<font size=2 color=ffffff><a href=\"main2.pl?alias=$alias&var=alias_html&tmp=$tmp&tmpid=$tmpid\" target=\"_new\">$alias</a> hat soeben einen Pin in <a href=\"main2.pl?alias=$alias&var=alias_html&tmp=$tmp&tmpid=$tmpid\" target=\"_new\">Dein Profil</a> gehängt ... </font>");
+ &alias_html;
+ exit;
+ }
+}
+
+sub rm_gb { # Gästebucheintrag entfernen
+ open(GB,"<data/user/gbooks/$alias");
+ my @gbfile = <GB>;
+ close GB;
+ my @newgbfile = ();
+ for ($i=0; $i <= $#gbfile; $i++) {
+ push(@newgbfile,$gbfile[$i]) if ($i != $id);
+ }
+ open(GB,">data/user/gbooks/$alias");
+ print GB @newgbfile;
+ close GB;
+ &alias_html("rm_ok");
+}
+
+sub list_alias_html { # Liste aller Benutzer
+ &start_html("Alle Benutzer");
+ opendir(REGISTERED,"data/user/options");
+ my @users = readdir(REGISTERED);
+ closedir(REGISTERED);
+ my @liste = sort(@users);
+ my $nr = $#users-1;
+print <<END;
+ <div>
+ Es sind z.Z. genau $nr Benutzernamen in der Datenbank vorhanden! (Sortiert nach #, A-Z, a-z)
+ </div>
+ <hr>
+ <div>
+END
+ foreach(@liste) {
+ if (-f "data/user/options/$_") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid" },
+ "$_"),
+ " ";
+ }
+ }
+print <<END;
+ </div>
+</body>
+</html>
+END
+}
+
+sub alias_html { # Anzeigen eines Benutzerprofils
+ my $message = $_[0];
+ open(COUNTS,"<data/user/counts/$tmp");
+ local $counter = <COUNTS>;
+ close COUNTS;
+ $counter++;
+ open(COUNTS,">data/user/counts/$tmp");
+ print COUNTS $counter;
+ close COUNTS;
+ &start_html($tmp);
+print <<END;
+<div>
+ <a href="htdocs.pl?var=werda_html&alias=$alias&tmpid=$tmpid">Hier</a>
+ gehts zur Gesamtübersicht !
+</div>
+<hr>
+END
+if ($message eq "rm_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Der von Dir gewählte Eintrag wurde erfolgreich gelöscht.
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </u>
+ einen Text und poste
+ <u>dann</u>
+ !
+ <hr>
+END
+}
+ open(PROFILE,"<data/user/profiles/$tmp");
+ @data = <PROFILE>;
+ close PROFILE;
+print <<END;
+ <div>
+ Dieses Profil wurde insgesamt schon $counter mal aufgerufen !
+ <br>
+ <br>
+ Alias: $tmp
+ <br>
+ <br>
+ Nachname: $data[0]
+ <br>
+ <br>
+ Vorname: $data[1]
+ <br>
+ <br>
+ Alter: $data[2]
+ <br>
+ <br>
+ Wohnort: $data[3]
+ <br>
+ <br>
+ E-Mail:
+ <a href="mailto:$data[4]">$data[4]</a>
+ <br>
+ <br>
+ ICQ-Nummer: $data[5]
+ <br>
+ <br>
+ Homepage:
+ <a href="$data[6]" target="_new">$data[6]</a>
+ <br>
+ <br>
+ Weiteres:
+ <br>
+ $data[7]
+ <hr>
+ Hier kannst Du $tmp eine Nachricht hinterlassen!
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input type="text" size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+if (-e "data/user/gbooks/$tmp") {
+ open (DATEI,"<data/user/gbooks/$tmp") || &error("Konnte data/user/gbooks/$tmp nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ if ($alias ne $tmp) {
+ print @datei;
+ } else {
+print <<END;
+ <table>
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="rm_gb_alias">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="$tmp">
+END
+for($i=0; $i <= $#datei; $i++) {
+print <<END;
+ <tr>
+ <td>
+ <input type="radio" name="id" value="$i">
+ </td>
+ <td>
+ <div class=q>
+ $datei[$i]
+ </div>
+ </td>
+ </tr>
+END
+}
+print <<END;
+ </table>
+ <table>
+ <tr>
+ <td>
+ <font color=ffffff>
+ <input type="submit" value="Makierten Eintrag löschen">
+ </font>
+ </td>
+ <td>
+ <font color=ffffff>
+ <input type="reset" value="Makierung rückgängig machen">
+ </font>
+ </td>
+ </tr>
+ </table>
+ </form>
+END
+}
+}
+ print
+ $q->end_html;
+}
+
+sub edit_html { # Chat-Optionen / Benutzerprofil editieren
+ my ($method,$message) = @_;
+ &start_html("Benutzerprofil ändern");
+ if ($method eq "edit_options_html") {
+ open(DATEI,"<data/user/options/$alias");
+ } elsif ($method eq "edit_profile_html") {
+ open(DATEI,"<data/user/profiles/$alias");
+ }
+ @data = <DATEI>;
+ close DATEI;
+ if ($method eq "edit_options_html") {
+ chomp($data[0]);
+ if ($message eq "edit_options_ok") {
+print <<END;
+<script language="JavaScript">
+ open("main.pl?var=change_colors&alias=$alias&col=$col&secol=$secol&tmpid=$tmpid","reload");
+ open("htdocs.pl?var=menu_html&alias=$alias&room=$room&col=$col&secol=$secol&tmpid=$tmpid","menu");
+</script>
+<div class=b>
+ Hinweis:
+</div>
+<div>
+ Du hast soeben Deine Chat-Optionen erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren. Um
+ weiterzuchatten einfach Fenster schliessen!
+</div>
+<hr>
+END
+ } elsif ($message eq "edit_pw_wrong") {
+print <<END;
+<div class=b>
+ ACHTUNG!
+</div>
+<div>
+ Du hast soeben versucht, dein Passwort zu ändern. Jedoch stimmte die Erste Eingabe nicht mit der Zweiten überein.
+ Bitte versuch es erneuert ...
+</div>
+<hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Deine Chat-Optionen editieren!" ),
+ $q->hr;
+ }
+print <<END;
+<script lang="javascript" type="text/javascript">
+<!--
+
+function radioWert(rObj) {
+ for (var i=0; i<rObj.length; i++) if (rObj[i].checked) return rObj[i].value;
+ return false;
+}
+
+function insertcode( code ) {
+ document.optionen.elements[radioWert(document.optionen.eingabe)].value = code;
+}
+
+//-->
+</script>
+
+<form name="optionen" action="main2.pl">
+ <input type="hidden" name="var" value="edit_options">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Passwort
+ <font color=ffa500>
+ (Gut merken !!)
+ </font>
+ <br>
+ <input type="password" name="id" value="$data[0]">
+ </div>
+ </td>
+ <td width=20>
+ </td>
+ <td>
+ <div>
+ Geb hier das Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp" value="$data[0]">
+ </div>
+ </td>
+ </tr>
+ </table>
+<br>
+<br>
+ <table>
+ <tr>
+ <td>
+ <div>
+ <input type="radio" name="eingabe" value="col" checked>
+ Auswahl von Farbe 1
+ <br>
+ (Farbe Deines Nicks):
+ <br>
+ <input name="col" size="6" maxlength="6" value="$data[1]">
+ </div>
+ </td>
+ <td width=20>
+ </td>
+ <td>
+ <div>
+ <input type="radio" name="eingabe" value="secol">
+ Auswahl von Farbe 2
+ <br>
+ (Farbe Deiner Nachrichten):
+ <br>
+ <input name="secol" size="6" maxlength="6" value="$data[2]">
+ </div>
+ </td>
+ </tr>
+ </table>
+<br>
+ <div>
+ Beliebige Auswahl makieren und Farbe wählen. Um Deine Optionen abzuspeichern,
+ auf "Daten ändern" klicken!
+ </div>
+ <br>
+END
+ open(COLORS,"<colors.sno");
+ @colors = <COLORS>;
+ close COLORS;
+ print @colors;
+ } elsif ($method eq "edit_profile_html") {
+ if ($message eq "edit_profile_ok") {
+print <<END;
+ <div class=b>
+ Hinweis:
+ </div>
+ <div>
+ Du hast soeben Dein Profil erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren:
+ <hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Dein Profil editieren!" ),
+ $q->hr;
+ }
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="edit_profile">
+ <div>
+ Dein Nachname:
+ <br>
+ <input name="nachname" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ Dein Vorname:
+ <br>
+ <input name="vorname" value="$data[1]">
+ </div>
+ <br>
+ <div>
+ Dein Alter:
+ <br>
+ <input name="alter" value="$data[2]">
+ </div>
+ <br>
+ <div>
+ Dein Wohnort:
+ <br>
+ <input name="wohnort" value="$data[3]">
+ </div>
+ <br>
+ <div>
+ Deine E-Mail Adresse:
+ <br>
+ <input name="email" value="$data[4]">
+ </div>
+ <br>
+ <div>
+ Deine ICQ-Nummer:
+ <br>
+ <input name="icq" value="$data[5]">
+ </div>
+ <br>
+ <div>
+ Deine Homepage:
+ <br>
+ <input name="homepage" value="$data[6]">
+ </div>
+ <br>
+ <div>
+ Weiteres:
+ <br>
+ <textarea rows="5" cols="40"name="weiteres" wrap="virtual">$data[7]</textarea>
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <font color=ffffff>
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="room" value="$room">
+ <input type="submit" value="Daten ändern ...">
+ </font>
+ </form>
+</body>
+</html>
+END
+}
+
+
+sub edit { # Benutzerprofil od. Chat-Optionen abspeichern
+ my $method = $_[0];
+ &zeit;
+ if ($method eq "edit_profile") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat sein Profil geändert ...</font></i>");
+ open(PROFILE,">data/user/profiles/$alias");
+ print PROFILE $q->param('nachname')."\n".$q->param('vorname')."\n".$q->param('alter')."\n".$q->param('wohnort')."\n".$q->param('email')."\n".$q->param('icq')."\n".$q->param('homepage')."\n".$q->param('weiteres');
+ close PROFILE;
+ &edit_html("edit_profile_html","edit_profile_ok");
+ } elsif ($method eq "edit_options") {
+ if ($id ne $tmp) {
+ &edit_html("edit_options_html","edit_pw_wrong");
+ exit;
+ }
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat seine Chateinstellungen geändert ...</font></i>");
+ open(OPTIONS,">data/user/options/$alias");
+ print OPTIONS $id."\n".$col."\n".$secol;
+ close OPTIONS;
+ &edit_html("edit_options_html","edit_options_ok");
+ }
+}
diff --git a/0.4.6/online.pl b/0.4.6/online.pl
new file mode 100644
index 0000000..b6346c5
--- /dev/null
+++ b/0.4.6/online.pl
@@ -0,0 +1,71 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header();
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+$room = $q->param("room");
+
+&secure_checkid($alias);
+
+# Onlinezeit zählen !
+open(DATEI,"<data/online/users/$alias");
+ my $oldstamp = <DATEI>;
+close DATEI;
+ if ($oldstamp > (time - 60)) {
+ open(DATEI,"<data/user/counts/$alias.online");
+ my $online = <DATEI>;
+ close DATEI;
+ my $total = (time-$oldstamp+$online);
+ open(DATEI,">data/user/counts/$alias.online");
+ print DATEI $total;
+ close DATEI;
+ }
+##### ENDE
+
+&start_html("Online","online");
+&online($alias,$room);
+opendir(ROOMS,"data/online/rooms/".$room);
+ my @rooms = readdir(ROOMS);
+closedir(ROOMS);
+print
+ $q->div( "$room:" ),
+ "<font size=1 color=ffffef face=arial>";
+ foreach $online (@rooms) {
+ if (-f "data/online/rooms/$room/$online") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$online&tmpid=$tmpid",
+ -target=>"$online" }, "$online"), $q->br;
+ }
+ }
+print
+ "</font>",
+ $q->end_html;
+
+sub online { # Benutzer in die Onlineliste hinzufügen bzw. erneuern
+ my ($alias,$room) = @_;
+ open(DATEI,">data/online/users/$alias");
+ print DATEI time;
+ close DATEI;
+ if (-f "data/online/rooms/$room") { } else { mkdir "data/online/rooms/$room", 0777; }
+ if (-f "data/online/rstat/$room") { } else {
+ open(DATEI,">data/online/rstat/$room"); # Raumbesetzerstatus setzen
+ print DATEI "0\n\n$alias\n";
+ close DATEI;
+ }
+ open(DATEI,">data/online/rooms/$room/$alias");
+ print DATEI time;
+ close DATEI;
+ open(DATEI,"<data/online/prove"); # Räume und Chatter auf Existenz überprüfen
+ my $provetime = <DATEI>;
+ close DATEI;
+ if ($provetime < (time - 30)) {
+ &check_online;
+ }
+} \ No newline at end of file
diff --git a/0.4.6/push.pl b/0.4.6/push.pl
new file mode 100644
index 0000000..f8b8a78
--- /dev/null
+++ b/0.4.6/push.pl
@@ -0,0 +1,112 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+CGI->compile(':all');
+$q = new CGI;
+print
+ $q->header;
+require config;
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+&secure_checkid($alias);
+$room = $q->param("room");
+my $pid = $$;
+$| = 1;
+
+print <<END;
+<html>
+ <head>
+<script language="JavaScript">
+<!--
+// Scroll-Routine von Anklepper (http://www.anklepper.de)
+// speziell für yChat (http://www.yChat.de), Copyright 2000
+scrolling = true;
+moves_steps = 4; // Schrittgröße
+moves_interval = 4; // Schrittgeschwindigkeit
+
+function moves()
+{
+ if( scrolling != false )
+ window.scrollBy( 0, moves_steps );
+ window.setTimeout( "moves()", moves_interval );
+}
+
+moves();
+//-->
+</script>
+ </head>
+<body bgcolor=000000 link=FFFFFF alink=FFFFEF vlink=FFFFEF>
+<font size=1 color=ffffff face=arial>$title - Created & Copyright by Paul C. Bütow [PID: $pid]</font><br>
+END
+
+my $msgfile;
+
+
+if (-f "data/user/memos/$alias") {
+ open(MEMOS,"<data/user/memos/$alias");
+ my $memos = <MEMOS>;
+ close MEMOS;
+ print $memos;
+ unlink("data/user/memos/$alias");
+}
+
+my $startime,$change_room,@pids;
+$SIG{INT} = \&sendmsgs;
+OPENMSGFILE:
+$change_room = 0;
+$startime = time;
+
+if (-e "data/msgs/$room") {
+ open(MSGFILE,"<data/msgs/$room");
+ open(PID,">>data/online/pids/$room");
+ print PID $pid."\n";
+ close PID;
+} else {
+ sleep 1;
+ goto OPENMSGFILE;
+}
+
+&sendmsgs;
+
+while (-e "data/online/users/$alias") {
+ goto OPENMSGFILE if ($change_room == 1);
+ sleep 15;
+ print "<!--PING//-->\n";
+}
+
+sub sendmsgs {
+ for ($curpos = tell(MSGFILE); <MSGFILE>; $curpos = tell(MSGFILE)) {
+ my ($address, $stamp, $command, $action, $message) = split(/<;/, $_);
+ if ($address eq "!" || $address eq $alias) {
+ if ($stamp > $startime) {
+ if ($command eq "cr") {
+ &closepid;
+ $room = $action;
+ close MSGFILE;
+ $change_room = 1;
+ }
+ print "$message<br>\n" if ($change_room != 1);
+ }
+ }
+ }
+ seek(MSGFILE, $curpos, 0);
+}
+
+sub closepid {
+ @pids = undef;
+ open(PID,"<data/online/pids/$room");
+ @pids = <PID>;
+ close PID;
+ my @newpids = undef;
+ foreach(@pids) {
+ push @newpids,$_ if ($pid ne $_."\n");
+ }
+open(PID,">data/online/pids/$room");
+ print PID @newpids;
+ close PID;
+}
+
+&closepid; \ No newline at end of file
diff --git a/0.4.6/setup.sh b/0.4.6/setup.sh
new file mode 100644
index 0000000..6b3ef8a
--- /dev/null
+++ b/0.4.6/setup.sh
@@ -0,0 +1,50 @@
+#!/bin/sh
+echo
+echo yChat wird konfiguriert!
+echo
+mkdir data
+chmod 777 data
+mkdir data/logs
+chmod 777 data/logs
+mkdir data/msgs
+chmod 777 data/msgs
+mkdir data/user
+chmod 777 data/user
+mkdir data/user/counts
+chmod 777 data/user/counts
+mkdir data/user/memos
+chmod 777 data/user/memos
+mkdir data/user/options
+chmod 777 data/user/options
+mkdir data/user/profiles
+chmod 777 data/user/profiles
+mkdir data/user/gbooks
+chmod 777 data/user/gbooks
+mkdir data/user/lastlogin
+chmod 777 data/user/lastlogin
+mkdir data/online
+chmod 777 data/online
+mkdir data/online/rooms
+chmod 777 data/online/rooms
+mkdir data/online/pids
+chmod 777 data/online/pids
+mkdir data/online/rstat
+chmod 777 data/online/rstat
+mkdir data/online/users
+chmod 777 data/online/users
+mkdir data/online/ident
+chmod 777 data/online/ident
+chmod 777 data/htdocs/*
+chmod 777 *.pl
+chmod 777 config.pm
+mkdir dokus/
+mv *.txt dokus/
+mkdir ../../htdocs/yChat/
+mv *.gif ../../htdocs/yChat/
+mv *.swf ../../htdocs/yChat/
+
+echo
+echo yChat Setup beendet ...
+echo Created and Copyright by Paul C. Bütow
+echo
+
diff --git a/0.4.6/y.gif b/0.4.6/y.gif
new file mode 100644
index 0000000..356175d
--- /dev/null
+++ b/0.4.6/y.gif
Binary files differ
diff --git a/0.4.6/yIntro.swf b/0.4.6/yIntro.swf
new file mode 100644
index 0000000..d592826
--- /dev/null
+++ b/0.4.6/yIntro.swf
Binary files differ
diff --git a/0.4.6/ySymbol.swf b/0.4.6/ySymbol.swf
new file mode 100644
index 0000000..2b899bb
--- /dev/null
+++ b/0.4.6/ySymbol.swf
Binary files differ
diff --git a/0.4.6/y_.gif b/0.4.6/y_.gif
new file mode 100644
index 0000000..f8b6ee5
--- /dev/null
+++ b/0.4.6/y_.gif
Binary files differ
diff --git a/0.4.7a2/CREDITS.txt b/0.4.7a2/CREDITS.txt
new file mode 100644
index 0000000..6f2a6cc
--- /dev/null
+++ b/0.4.7a2/CREDITS.txt
@@ -0,0 +1,30 @@
+########################### yChat.de CREDITS ################################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+Vielen Dank an alle Personen, dir mit geholfen haben ( und immernoch helfen )
+yChat besser zu machen:
+
+ - Andreas Buchwald aka Anklepper, für ...
+ ... die Programmierung des "Nach-UntenScroll-JavaScripts", des
+ "Nachrichten-Verlauf-JavaScripts" im Texteingabeframe.
+ ... die technische Umsetzung, daß sich das Inputframe bei jedem
+ Textposting nicht wieder reloadet.
+ ... ein nettes JavaScript, welches erlaubt, Formularwerte
+ frameübergreifend zu ändern.
+ ... die Erstellung der Flashanimationen.
+ ... die Programmierung der Auto-Away- und der Auto-Logout Funktion.
+ ( www.anklepper.de ).
+
+ - Dave aka Truhe, für ...
+ ... die Erstellung der Farbtabelle unter Chatoptionen inkl.
+ Auswähl-JavaScript!
+ ... die Erstellung einiger CSS.
+ ... die Unterstützung der Umsetzung der Auto-Away- und Auto-Logout
+ Funktion.
+ ( maligree.yi.org )
+
+ - Florian Bütow aka Coke, für die Programmierung des Top 20 Ranking Skripts
+ in PHP4 !
+
+ - Larry Wall, für die Erfindung von Perl ! \ No newline at end of file
diff --git a/0.4.7a2/README.txt b/0.4.7a2/README.txt
new file mode 100644
index 0000000..b67f15e
--- /dev/null
+++ b/0.4.7a2/README.txt
@@ -0,0 +1,24 @@
+############################## yChat.de README ##############################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+Allgemeine Bedingungen bezgl. yChat:
+
+ - Das yChat-System darf ohne Erleubnis des Autors nicht auf irgendeiner Art
+ und Weise weitergegeben- oder eingesetzt werden.
+
+ - Wird das yChat-System eingesetzt, so darf es manipuliert werden, soweit
+ die Copyright-Hinweise des Autors, die Versionsbezeichnung und der Link
+ auf der Startseite nach www.home.yChat.de unverändert bleibt.
+ Ansonsten darf der gesamte Code manipuliert werden.
+
+ - Wird das yChat-System erlaubter Weise manipuliert, so muß das veränderte
+ Skript auf Anforderung an den Autor weitergegeben werden. Dieser darf
+ die Veränderungen in das Standard-yChat-System integrieren.
+
+ - Wird das yChat-System eingesetzt, su muß dem Autor die Location bzw. die
+ URL bekanntgegeben werden. Diese mit einer URL wwX.yChat.de verlinkt.
+ Wobei X für die Nummer des jew. Servers steht.
+
+ - Es ist verboten, Sourcecode aus dem yChat-System zu kopieren und
+ für andere, nicht von yChat abhängige Perl-Programme einzusetzen. \ No newline at end of file
diff --git a/0.4.7a2/SETUP.txt b/0.4.7a2/SETUP.txt
new file mode 100644
index 0000000..b1e17f8
--- /dev/null
+++ b/0.4.7a2/SETUP.txt
@@ -0,0 +1,136 @@
+############################## yChat.de SETUP ###############################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+yChat findest Du im Internet unter der Adresse www.yChat.de. Bei Kritik,
+Anregungen oder Fragen bitte in das dort vorhandene Board posten oder eine
+E-Mail an die oben stehende Adresse senden. Ich bemühe mich, yChat so gut wie
+möglich zu machen und bin über Ratschläge immer sehr erfreut :-) ...
+
+Die Installation kann auf Unix-Systemen voll automatisch duchgeführt werden.
+Allerdings ist dafür ein Telnet-Zugang notwendig. Kopiere alle vorhandenen
+Dateien in das Verzeichnis cgi-bin/yChat und führe dann das Shellskript
+setup.sh mit dem Befehl ./setup.sh aus. Alle Verzeichnisse werden
+automatisch erstellt. Dies wurde allerdings nur auf SuSE Linux Systemen
+mit root-Zugriff getestet. Solltest Du ein anderes System verwenden oder
+den Chat auf einen virtuellen Webserver installieren wollen, dann mußt Du
+unter Umständen das Verzeichnis "../../htdocs/yChat" nach "../../yChat"
+in der setup.sh umbenennen. Ansonsten werden die dazugehörigen Grafikdateien
+falsch oder garnicht kopiert.
+
+Wenn Du keinen Telnet-Zugang hast, kannst Du hier die Verzeichnisse manuell
+einrichten:
+
+Folgende Basis-Dateien sind im Chat enthalten und müssen in das cgi-bin
+Verzeichnis kopiert werden. Z.B. nach ./cgi-bin/yChat/:
+
+config.pm => Configurationsdatei ("Shared subs")
+htdocs.pl => Generiert dynamische HTML-Inhalte
+index.pl => Startskript (Registrierung, Login, Chatframeset)
+input.pl => Skript für das Chateingabeframe
+main.pl => Hauptskript (Alle Hauptfunktionen des Chats)
+main2.pl => Skript für editieren der Benutzerdaten etc
+online.pl => Anzeige und Überprüfung der eingelogten Benutzer
+push.pl => Server-Push-Routine
+setup.sh => Dient zur automatischen Einrichtung des Chats
+README.txt => Beinhaltet wichtige Informationen
+UPDATES.txt => Updateliste der verschiedenen Versionen
+CREDITS.txt => Personen, die geolfen haben yChat zu proggen
+SETUP.txt => Dieses Dokument
+colors.sno => Datei beinhaltet alle Farben in hex. für die Chatoptionen
+help.sno => Datei beinhaltet alle Chatbefehle
+
+Folgende Verzeichnisse müssen erstellt werden (chmod 777 sollte
+funktionieren):
+
+- Hier befinden sich alle für den Chat notwenidgen Daten:
+ ./cgi-bin/yChat/data/*
+
+- Hier befinden sich alle Logdateien, die vom Chat erstellt werden:
+ ./cgi-bin/yChat/data/logs/*
+
+- Hier befinden sich die Message-Dateien der eingelogten Benutzer:
+ ./cgi-bin/yChat/data/msgs/*
+
+- Hier befinden sich alle Daten der registrierten Benutzer:
+ ./cgi-bin/yChat/data/user/*
+
+- Hier wird abgespeichert, wie oft ein Benutzerprofil insgesant schon
+ aufgerufen wurde und wie lange die Chatter schon online waren:
+ ./cgi-bin/yChat/data/user/counts/*
+
+- Hier werden alle Memos abgespeichert.
+ ./cgi-bin/yChat/data/user/memos/*
+
+- Hier befinden sich alle Chat-Optionen und Passwörter der registrierten
+ Benutzer:
+ ./cgi-bin/yChat/data/user/options/*
+
+- Hier befinden sich alle Benutzerprofile der Benutzer:
+ ./cgi-bin/yChat/data/user/profiles/*
+
+- Hier befinden sich alle Gästebucheinträge der Benutzer:
+ ./cgi-bin/yChat/data/user/gbooks/*
+
+- Hier wird abgespeichert, wann der der jew. benutzer zum letzten mal das
+ System betreten hat.
+ ./cgi-bin/yChat/data/user/lastlogin/*
+
+- Hier befinden sich alle Daten zu den aktuellen Chaträumen und User die
+ online sind
+ ./cgi-bin/yChat/data/online/*
+
+- Hier befinden sich alle offnenen Räume
+ ./cgi-bin/yChat/data/online/rooms/*
+
+- Hier befinden sich die Chatter, die sich in den jew. Räumen befinden. Die
+ Verzeichnisse der Räume werden automatisch erstellt.
+ ./cgi-bin/yChat/data/online/rooms/RAUMNAME/*
+
+- Hier befinden sich alle PIDs (Process IDs) der Chatter in den jew. Räumen.
+ ./cgi-bin/yChat/data/online/pids/*
+
+- Hier befinden sich alle Chatter, die sich z.Z. im System befinden
+ ./cgi-bin/yChat/data/online/users/*
+
+- Hier befinden sich alle IP-Nummern und TempIDs der eingelogten Chatter
+ ./cgi-bin/yChat/data/online/ident/*
+
+Alle Grafikdateien (+.gif und *.jpg) sollten in ein nicht-CGI-BIN-Verzeichnis
+kopiert werden. Z.B. nach ./yChat/.
+
+Zum schluß sollte die config.pm-Datei nach wünschen editiert werden.
+Allerdings sollten die Copyright Hinweise und die Versionsnummern nicht
+manipuliert werden.
+
+Im Folgendem werde ich ein wenig auf die im yChat-Sourcecode oft verwendeten .
+Variablen eingehen:
+
+ $var => Sagt dem Skript, wie es gestartet werden soll.
+ $alias => Teilt dem Skript den Benutzername mit.
+ $tmpid => Beim einloggen in den Chat wird für den Benutzer eine
+ temporäre ID generiert. Diese wird so wohl in der Variable
+ $tmpid als auch in eine Datei geschrieben. Handelt der
+ Benutzer, so wird vom Skript die Variable $tmpid mit dem
+ Eintrag in der Datei verglichen. Sind beide Werte
+ identisch, dann wird die Handlung des Benutzers
+ ausgeführt. Stimmen die Werte nicht überein, dann wird
+ die Fehlermeldung, daß der Benutzer die falsche $tmpid hat
+ um mit $alias zu handeln,ausgegeben und das Skript beendet
+ sich. Dies ist eine Sicherheitsmaßnahme welche verbietet,
+ mit fremden Benutzernamen im System zu handeln.
+ $room => Sagt dem Skript, wie der aktuelle Raumname lautet.
+ $col => Sagt dem Skript, wie die aktuelle Chatfarbe des Nicks von
+ $alias lautet.
+ $seccol => Sagt dem Skript, wie die aktuelle Chatfarbe der Schrift von
+ $alias lautet.
+ $msg => Beinhaltet den von $alias zu postenden Text im Chat.
+ Hiervon wird auch in den Benutzergästebüchern und im
+ Benutzerboard Gebrauch gemacht.
+ $whisper => Beinhaltet den Benutzernamen, zu dem $alias zuletzt
+ geflüstert hat.
+ $id und $tmp => Temporäre Variablen zwecks Übermittlung diverser Daten.
+ $pw => Wird im Skript index.pl verwendet um das Zugangspassword
+ zu übermitteln.
+
+Viel Spaß beim Chatten ... \ No newline at end of file
diff --git a/0.4.7a2/TODO.txt b/0.4.7a2/TODO.txt
new file mode 100644
index 0000000..9c5ecb8
--- /dev/null
+++ b/0.4.7a2/TODO.txt
@@ -0,0 +1,36 @@
+############################## yChat.de TODO ################################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+Folgende Funktionen werden demnächst evtl. in yChat integriert:
+
+ - In den Chatoptionen sollen diverse Einstellungen des Nachrichtenverlaufes
+ vorgenommen werden können.
+
+ - Die Schlucht (Ein Raum wo Chatter hineingeworfen werden,
+ die sich nicht benehmen und noch nicht aus dem Chat
+ katapultiert werden sollen).
+
+ - Löschung aller Chatter, die sich seit 60 Tagen nicht mehr eingelogt haben.
+
+ - IP-Adressen ver-/entbannen.
+
+ - E-Mail zusendung bei verlorenem Passwort.
+
+ - Unter "Benutzer" sollen Chatter über eine Eingabemaske nach dem
+ Anfangsbuchstaben gesucht werden können (vergl. Kilahu).
+
+ - Linux- und Windows-yChat-Client soll programmiert werden. Mit diesem läßt
+ sich dann im yChat chatten, ohne sich über http://www.yChat.de eingelogt zu
+ haben. Der Client soll gleicheitig auch als Messenger (ICQ-Like) fungieren
+ können (yChat-Messenger bzw. yCM).
+
+ - Der Cybarkeeper (künstlich intilligenter Chatroboter, der
+ sich im Hauptraum Cyberbar aufhält, virtuelle Drinks verteilt
+ und von Real-Chattern übernommen werden kann. (Zukunftsmusik)
+
+Für weitere Vorschläge bitte in das yChat-Board unter www.yChat.de
+texten oder eine E-Mail an mail@paulbuetow.de :-)
+
+
+www.yCm.de \ No newline at end of file
diff --git a/0.4.7a2/UPDATES.txt b/0.4.7a2/UPDATES.txt
new file mode 100644
index 0000000..d165c93
--- /dev/null
+++ b/0.4.7a2/UPDATES.txt
@@ -0,0 +1,192 @@
+########################### yChat.de UPDATE LIST ###########################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+Hier sind alle Erneuerungen der Versionen dokumentiert:
+
+Update von 0.4.7 auf 0.4.7a2 (22.01.01)
+ - Top 20 Ranking Liste in PHP4.
+ - Überarbeitung des Flash-Intros.
+
+Update von 0.4.6 auf 0.4.7 (20.01.01)
+ - Auto-Away: Ist ein Chatter 5 Minuten inaktiv, dann erscheint im
+ aktuellen Raum die Nachricht "Alias wurde vom System
+ abgemeldet ..." . Bei Wiederaufnahme des Chats, meldet sich Alias
+ wieder zurück.
+ - Auto-Logout: Ist ein Chatter 20 Minuten inaktiv, dann wird dieser
+ aus dem System automatisch ausgelogt.
+ - Neue CSS für die Formulareingabefelder und dem Chat-Menü.
+ (Funktioniert allerdings nicht mit NN4.x, hier werden alle
+ Formulareingabefelder ohne CSS-Definitionen angezeigt.)
+
+Update von 0.4.5 auf 0.4.6 (18.01.01)
+ - Verbesserung: Beim Posten einer neuen Chatnachricht wird sogleich
+ ein Signal an alle laufenden Chatprozesse (PIDs) gesendet, so daß
+ diese aufgefordert werden, aus der Nachrichtendatei die neuen
+ Zeilen einzulesen. Das Push-Skript (push.pl) muß so nicht jede
+ Sekunde prüfen, ob neue Nachrichten da sind, da es diese
+ Information über das Signal erhält. Das Push-Skript verbraucht nun
+ weniger Prozessorleistung, da es jetzt 15 Sekunden lang
+ "dauerschläft" (sleep 15;), lediglich einen <!--PING--> versendet
+ und dann weiter schläft usw. Beendet sich push.pl, oder wird ein
+ Raum gewechselt, dann wird auch die PID aus der PID-Liste des
+ aktuellen Raums gelöscht und ggf. neu geschrieben.
+ Die Dateien "./data/online/pids/*" beinhalten alle aktuellen PIDs,
+ wobei * der jew. Raum ist.
+
+Update von 0.4.4 auf 0.4.5 (16.01.01)
+ - Jeder Chatraum hat nun eine globale Nachrichtendatei. Bisher
+ existierte für jeden Chatter enzelnd eine. Die Nachrichten werden
+ nun schneller gepostet.
+ - Neue Wächterbefehle:
+ "/st Raum Thema" ermöglicht das Ändern das Themas eines anderen
+ Raums.
+ "/sl Raum" ermöglicht das auf- und absperren eines anderen Raums.
+ - Nur noch Oberwächter können die Chatlogs lesen.
+ - Referenzierung der Variable $msg in main.pl.
+ - Flashanimationen.
+
+Update von 0.4.3 auf 0.4.4 (04.01.01)
+ - Optimiertung aller Chatbefehle.
+ - Neuer WÄ-Befehl: Mit "/ss Raum Nachricht" wird aus dem aktuellen
+ Raum heraus in den angegebenen Raum eine beliebige Nachricht
+ gerufen.
+ - Das Skript main.pl wurde in zwei verschiedene Skripts unterteilt:
+ main.pl => Beinhaltet hauptsächlich die Chatbefehle
+ input.pl => Beinhaltet das zu generierende Chateingabeframe.
+ - Das Chateingabeframe wird nun nie wieder reloadet. (Dies geschah
+ bisher noch nach Ausführung der Befehle /col /j /ju /msg und nach
+ Änderung der Chateinstellungen und erwies sich als recht nervige
+ Angelegenheit.) JavaScript macht es möglich.
+ - Überarbeitung und Erweiterung der Dokudateien.
+
+Update von 0.4.2 auf 0.4.3 (30.12.2k)
+ - Optimierung der Zuweisung der Variabeln im Programmcode:
+ Variablen werden nun wirklich nur deffiniert, wenn diese auch
+ erforderlich sind.
+ - Komplette Neuprogrammierung diverser Subs (nun leistungsfähiger)
+ - Bei Aufrug der Login-Seite wird der gesamte Chat auf leerstehende
+ Räume und "alte" Chatter überprüft und ggf. entfernt.
+ - Verbesserung diverser JavaScript-Codes.
+ - Editiert ein Benutzer sein Profil, so wird dies mit der Meldung
+ "Alias hat sein Profil geändert ..." bekanntgegeben.
+ - Mit "/t" ohne weiteren Text erscheint die Nachricht "Alias hat das
+ Thema des Raums gelöscht ..."
+ - Hinzufügung diverser Administratorbefehle: "/pw Alias" zeigt
+ Zugangspassword von Alias an. "/ow Alias" ernennt Alias zum OW.
+ "/row Alias" entzieht Alias die OW-Rechte.
+
+Update von 0.4.1 auf 0.4.2 (25.12.2k)
+ - Im Texteingabeformular werden nun per JavaScript die letzten 10
+ Postings zwischengespeichert und können per Drop-Down-Menü
+ wieder in das Submittextfeld geladen werden um erneuert getextet
+ zu werden.
+ - Neues Design.
+ - Diverse Dateien wurden umbenannt:
+ INSTALL.txt -> SETUP.txt
+ LIESMICH.txt -> README.txt
+ - Die Datei CREDITS.txt wurde angelegt und somit auch die URL
+ www.credits.yChat.de.
+
+Update von 0.4.0 auf 0.4.1 (22.12.2k)
+ - Design wurde geändert.
+ - Unter "Optionen" ist nun eine komplette Farbtabelle eingebaut.
+ - Folgende Oberwächterbefehle wurden nun auch für normale Wächter
+ freigegeben: /ip /ban /rban.
+
+Update von 0.2.6 auf 0.4.0 (19.12.2k)
+ - Der berüchtigte "IP-Bug" wurde beseitigt! Und zwar wurden TempIDs
+ eingeführt => Eine dauerhafte Überprüfung der Benutzer-IP-Nummer
+ ist also nicht mehr notwendig.
+ - Die totale Chat-Online-Zeit wird protokolliert und kann jew. mit
+ "/online Alias" aufgerufen werden. Die Onlinezeit wird alle 20 Sek.
+ aktualisiert.
+ - Neue Befehle: "/seen Alias" zeigt an, vor wieviel St. sich Alias
+ zuletzt in das System eingelogt hat. Der Befehle "/rmgb" entfernt
+ alle Einträge des eigenen Benutzergästebuchs im Profil.
+
+Update von 0.2.5 auf 0.2.6 (17.12.2k)
+ - Das Eingabeframe reloaded sich nicht mehr nach jedem Posting.
+ Vielen Dank an Truhe aka Dave und Klepper aka Andreas Buchwald!
+ Bei den Chatbefehlen /col /away /j und /ju muß sich das
+ Eingabeframe weiterhin reloaden.
+ - Der Befehl // wurde entfernt. Dieser war nicht mehr erforderlich.
+ weil Nachrichten werden nur noch sehr selten verschluckt. Dieser
+ Chatbefehl postete die letzte Nachricht nocheinmal.
+ - Neuer Befehl: mit "/memo Alias hier der Text" hinterläßt man
+ Alias eine Memo. Logt sich Alias in den Chat ein, dann erhält
+ er diese sofort. Dafür wurde das Verzeichnis ".data/user/memos/"
+ angelegt.
+ - Programmcode wurde ein wenig optimiert.
+ - Das Design wurde ein wenig geändert.
+ - Beseitigung diverser Bugs.
+
+Update von 0.2.4 auf 0.2.5 (15.12.2k)
+ - Derjenige, der einen Raum zuerst betritt, hat Raumbesetzerrechte.
+ - Raumbesetzer, Wächter und Oberwächte können weitere Raumbesetzer
+ bestimmen. Diese können Raumbeseter auch wieder degradieren.
+ - Raumbesetzer, Wächter und Oberwächter können dem aktuellen Raum
+ auf/absperren und Themen geben. Wächter und Oberwächter können
+ abgesperrte Räume betreten.
+ - Das Verzeichnis ".data/htdocs" wurde entfernt. Die Datei help_html
+ heist nun help.sno und befindet sich im yChat-Hauptverzeichnis.
+ - Das Verzeichnis ".data/user/lastlogin" wurde hinzugefügt. Hier
+ wird beim erfolgreichen Einloggen ein "Timestamp" gesetzt. Später
+ sollen Oberwächter "veraltete" Benutzer entfernen können.
+ - Neuer Oberwächterbefehl: "/kill Alias" entfernt Alias ganz und gar
+ vom System. Oberwächter und Wächter können nicht entfernt werden.
+ - Perl-Cache wurde im gesamten System komplett deaktiviert ( Weniger
+ Ladezeiten der HTML-Dokumente ).
+ - Nur Nachrichten aus dem Raum "Cyberbar" werden gelogt.
+ Selbsterstellte Räume werden nichtmehr gelogt. Viele Logfunktionen
+ wurden entfernt (weniger Serverbalast).
+ - Beseitigung einiger kleinen Bugs.
+ - Unter "Optionen" im Chat wir die Farbe nun mit einem Drop-Down-Menü
+ ausgewählt ( Vielen dank an Michi aka Snoopy ).
+ - Auf der Startseite wird nun angezeigt wieviele Benutzer eingelogt
+ sind. Ist keiner eingelogt, dann wird das System "aufgeräumt". D.h.
+ Dateien die nicht mehr gebraucht werden und noch nicht gelöscht
+ wurden werden entfernt ( z.B. Nachrichtendateien der einzelnen
+ Chatter und die Dateien die die IP-Nummern der eingelogten Benutzer
+ beinhalteten usw.).
+ - Hunzufügung einer TODO-Liste. Hier sind mehrere Funktionen
+ vermerkt, die in späteren yChat-Versionen eingebaut werden sollen.
+ (www.todo.yChat.de oder TODO.txt).
+
+Update von 0.2.3 auf 0.2.4 (30.11.2k)
+ - Optimierung bzw. Verbesserung der Push-Routine push.pl.
+ - Server-Ping wurde von 2-Pings-per-Minute auf 4 erhöht.
+ - yChat-Banner wurde erstellt und ist unter
+ documents.yChat.de/yBanner.jpg vorzufinden.
+ - Unter der URL servers.yChat.de wurde eine Serverliste angelegt,
+ welche anzeigt wo yChat-Systeme laufen.
+ - Des weiteren wurden die URLs updates.yChat.de, install.yChat.de
+ und liesmich.yChat.de eingerichtet.
+ - Die Menüpunkte wurden zusammengefaßt, damit sie unter einer
+ Auflösung von 800x600 nur eine Zeile belegen.
+ - Einige Bugs wurden entfernt.
+
+Update von 0.2.2 auf 0.2.3 (25.11.2k)
+ - Smooth scrolling JavaScript ( Vielen Dank an Andreas Buchwald ).
+ - "IP#-Fehler" wurde so gut wie beseitigt.
+ - Aufrufe der einzelnen Benutzerprofile wird gezählt und angezeigt.
+ Diese werden in data/user/counts/* gespeichert.
+ - Automatische Einrichtung des Chats mit setup.sh und Telnet.
+ - Menüpunkt "Dein Profil" wurde entfernt da eigenes Profil auch
+ stets über die Onlineliste aufgerufen werden kann.
+
+Update von 0.2.1 auf 0.2.2 (23.11.2k)
+ - Einige Bugs wurden entfernt.
+ - Geschwindigkeit des Chats wurde optimiert.
+ - Eine Liste aller eingelogten Benutzer erscheint am Rand. Hierfür
+ wurde die Datei online.pl eingeführt. Sie aktuallisiert sich alle
+ 20 Sekunden.
+ - Die UPDATES.txt wurde eingeführt.
+
+Update von 0.2.0 auf 0.2.1
+ - Einige Bugs wurden entfernt.
+ - Die IP# der eingelogten Benutzer werden nun anders verwaltet.
+
+Update von Alpha XVIII auf 0.2.0
+ - Die Handhabung der eingelogten Benutzer im System wurde komplett neu
+ überarbeitet.
+ - Neue Versionsnumern wurden eingeführt. \ No newline at end of file
diff --git a/0.4.7a2/colors.sno b/0.4.7a2/colors.sno
new file mode 100644
index 0000000..3640b9e
--- /dev/null
+++ b/0.4.7a2/colors.sno
@@ -0,0 +1,290 @@
+ <table cellspacing=0 cellpadding=5 border=0>
+ <tr>
+ <td bgcolor="000000"><span style="color:#FFFFFF; text-decoration:line-through;">000000</span></td>
+ <td bgcolor="000033"><span style="color:#FFFFFF; text-decoration:line-through;">000033</span></td>
+ <td bgcolor="000066"><span style="color:#FFFFFF; text-decoration:line-through;">000066</span></td>
+ <td bgcolor="000099"><span style="color:#FFFFFF; text-decoration:line-through;">000099</span></td>
+ <td bgcolor="0000CC"><span style="color:#FFFFFF; text-decoration:line-through;">0000CC</span></td>
+ <td bgcolor="0000FF"><a href="javascript:insertcode('0000FF');" style="color:#FFFFFF;">0000FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="003300"><span style="color:#FFFFFF; text-decoration:line-through;">003300</span></td>
+ <td bgcolor="003333"><span style="color:#FFFFFF; text-decoration:line-through;">003333</span></td>
+ <td bgcolor="003366"><span style="color:#FFFFFF; text-decoration:line-through;">003366</span></td>
+ <td bgcolor="003399"><a href="javascript:insertcode('003399');" style="color:#FFFFFF;">003399</a></td>
+ <td bgcolor="0033CC"><a href="javascript:insertcode('0033CC');" style="color:#FFFFFF;">0033CC</a></td>
+ <td bgcolor="0033FF"><a href="javascript:insertcode('0033FF');" style="color:#FFFFFF;">0033FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="006600"><span style="color:#FFFFFF; text-decoration:line-through;">006600</span></td>
+ <td bgcolor="006633"><span style="color:#FFFFFF; text-decoration:line-through;">006633</span></td>
+ <td bgcolor="006666"><a href="javascript:insertcode('006666');" style="color:#FFFFFF;">006666</a></td>
+ <td bgcolor="006699"><a href="javascript:insertcode('006699');" style="color:#FFFFFF;">006699</a></td>
+ <td bgcolor="0066CC"><a href="javascript:insertcode('0066CC');" style="color:#FFFFFF;">0066CC</a></td>
+ <td bgcolor="0066FF"><a href="javascript:insertcode('0066FF');" style="color:#FFFFFF;">0066FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="009900"><a href="javascript:insertcode('009900');" style="color:#FFFFFF;">009900</a></td>
+ <td bgcolor="009933"><a href="javascript:insertcode('009933');" style="color:#FFFFFF;">009933</a></td>
+ <td bgcolor="009966"><a href="javascript:insertcode('009966');" style="color:#FFFFFF;">009966</a></td>
+ <td bgcolor="009999"><a href="javascript:insertcode('009999');" style="color:#FFFFFF;">009999</a></td>
+ <td bgcolor="0099CC"><a href="javascript:insertcode('0099CC');" style="color:#FFFFFF;">0099CC</a></td>
+ <td bgcolor="0099FF"><a href="javascript:insertcode('0099FF');" style="color:#FFFFFF;">0099FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00CC00"><a href="javascript:insertcode('00CC00');" style="color:#000000;">00CC00</a></td>
+ <td bgcolor="00CC33"><a href="javascript:insertcode('00CC33');" style="color:#000000;">00CC33</a></td>
+ <td bgcolor="00CC66"><a href="javascript:insertcode('00CC66');" style="color:#000000;">00CC66</a></td>
+ <td bgcolor="00CC99"><a href="javascript:insertcode('00CC99');" style="color:#000000;">00CC99</a></td>
+ <td bgcolor="00CCCC"><a href="javascript:insertcode('00CCCC');" style="color:#000000;">00CCCC</a></td>
+ <td bgcolor="00CCFF"><a href="javascript:insertcode('00CCFF');" style="color:#000000;">00CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00FF00"><a href="javascript:insertcode('00FF00');" style="color:#000000;">00FF00</a></td>
+ <td bgcolor="00FF33"><a href="javascript:insertcode('00FF33');" style="color:#000000;">00FF33</a></td>
+ <td bgcolor="00FF66"><a href="javascript:insertcode('00FF66');" style="color:#000000;">00FF66</a></td>
+ <td bgcolor="00FF99"><a href="javascript:insertcode('00FF99');" style="color:#000000;">00FF99</a></td>
+ <td bgcolor="00FFCC"><a href="javascript:insertcode('00FFCC');" style="color:#000000;">00FFCC</a></td>
+ <td bgcolor="00FFFF"><a href="javascript:insertcode('00FFFF');" style="color:#000000;">00FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="330000"><span style="color:#FFFFFF; text-decoration:line-through;">330000</span></td>
+ <td bgcolor="330033"><span style="color:#FFFFFF; text-decoration:line-through;">330033</span></td>
+ <td bgcolor="330066"><span style="color:#FFFFFF; text-decoration:line-through;">330066</span></td>
+ <td bgcolor="330099"><a href="javascript:insertcode('330099');" style="color:#FFFFFF;">330099</a></td>
+ <td bgcolor="3300CC"><a href="javascript:insertcode('3300CC');" style="color:#FFFFFF;">3300CC</a></td>
+ <td bgcolor="3300FF"><a href="javascript:insertcode('3300FF');" style="color:#FFFFFF;">3300FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="333300"><span style="color:#FFFFFF; text-decoration:line-through;">333300</span></td>
+ <td bgcolor="333333"><span style="color:#FFFFFF; text-decoration:line-through;">333333</span></td>
+ <td bgcolor="333366"><a href="javascript:insertcode('333366');" style="color:#FFFFFF;">333366</a></td>
+ <td bgcolor="333399"><a href="javascript:insertcode('333399');" style="color:#FFFFFF;">333399</a></td>
+ <td bgcolor="3333CC"><a href="javascript:insertcode('3333CC');" style="color:#FFFFFF;">3333CC</a></td>
+ <td bgcolor="3333FF"><a href="javascript:insertcode('3333FF');" style="color:#FFFFFF;">3333FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="336600"><a href="javascript:insertcode('336600');" style="color:#FFFFFF;">336600</a></td>
+ <td bgcolor="336633"><a href="javascript:insertcode('336633');" style="color:#FFFFFF;">336633</a></td>
+ <td bgcolor="336666"><a href="javascript:insertcode('336666');" style="color:#FFFFFF;">336666</a></td>
+ <td bgcolor="336699"><a href="javascript:insertcode('336699');" style="color:#FFFFFF;">336699</a></td>
+ <td bgcolor="3366CC"><a href="javascript:insertcode('3366CC');" style="color:#FFFFFF;">3366CC</a></td>
+ <td bgcolor="3366FF"><a href="javascript:insertcode('3366FF');" style="color:#FFFFFF;">3366FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="339900"><a href="javascript:insertcode('339900');" style="color:#FFFFFF;">339900</a></td>
+ <td bgcolor="339933"><a href="javascript:insertcode('339933');" style="color:#FFFFFF;">339933</a></td>
+ <td bgcolor="339966"><a href="javascript:insertcode('339966');" style="color:#FFFFFF;">339966</a></td>
+ <td bgcolor="339999"><a href="javascript:insertcode('339999');" style="color:#FFFFFF;">339999</a></td>
+ <td bgcolor="3399CC"><a href="javascript:insertcode('3399CC');" style="color:#FFFFFF;">3399CC</a></td>
+ <td bgcolor="3399FF"><a href="javascript:insertcode('3399FF');" style="color:#FFFFFF;">3399FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33CC00"><a href="javascript:insertcode('33CC00');" style="color:#000000;">33CC00</a></td>
+ <td bgcolor="33CC33"><a href="javascript:insertcode('33CC33');" style="color:#000000;">33CC33</a></td>
+ <td bgcolor="33CC66"><a href="javascript:insertcode('33CC66');" style="color:#000000;">33CC66</a></td>
+ <td bgcolor="33CC99"><a href="javascript:insertcode('33CC99');" style="color:#000000;">33CC99</a></td>
+ <td bgcolor="33CCCC"><a href="javascript:insertcode('33CCCC');" style="color:#000000;">33CCCC</a></td>
+ <td bgcolor="33CCFF"><a href="javascript:insertcode('33CCFF');" style="color:#000000;">33CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33FF00"><a href="javascript:insertcode('33FF00');" style="color:#000000;">33FF00</a></td>
+ <td bgcolor="33FF33"><a href="javascript:insertcode('33FF33');" style="color:#000000;">33FF33</a></td>
+ <td bgcolor="33FF66"><a href="javascript:insertcode('33FF66');" style="color:#000000;">33FF66</a></td>
+ <td bgcolor="33FF99"><a href="javascript:insertcode('33FF99');" style="color:#000000;">33FF99</a></td>
+ <td bgcolor="33FFCC"><a href="javascript:insertcode('33FFCC');" style="color:#000000;">33FFCC</a></td>
+ <td bgcolor="33FFFF"><a href="javascript:insertcode('33FFFF');" style="color:#000000;">33FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="660000"><span style="color:#FFFFFF; text-decoration:line-through;">660000</span></td>
+ <td bgcolor="660033"><span style="color:#FFFFFF; text-decoration:line-through;">660033</span></td>
+ <td bgcolor="660066"><a href="javascript:insertcode('660066');" style="color:#FFFFFF;">660066</a></td>
+ <td bgcolor="660099"><a href="javascript:insertcode('660099');" style="color:#FFFFFF;">660099</a></td>
+ <td bgcolor="6600CC"><a href="javascript:insertcode('6600CC');" style="color:#FFFFFF;">6600CC</a></td>
+ <td bgcolor="6600FF"><a href="javascript:insertcode('6600FF');" style="color:#FFFFFF;">6600FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="663300"><a href="javascript:insertcode('663300');" style="color:#FFFFFF;">663300</a></td>
+ <td bgcolor="663333"><a href="javascript:insertcode('663333');" style="color:#FFFFFF;">663333</a></td>
+ <td bgcolor="663366"><a href="javascript:insertcode('663366');" style="color:#FFFFFF;">663366</a></td>
+ <td bgcolor="663399"><a href="javascript:insertcode('663399');" style="color:#FFFFFF;">663399</a></td>
+ <td bgcolor="6633CC"><a href="javascript:insertcode('6633CC');" style="color:#FFFFFF;">6633CC</a></td>
+ <td bgcolor="6633FF"><a href="javascript:insertcode('6633FF');" style="color:#FFFFFF;">6633FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="666600"><a href="javascript:insertcode('666600');" style="color:#FFFFFF;">666600</a></td>
+ <td bgcolor="666633"><a href="javascript:insertcode('666633');" style="color:#FFFFFF;">666633</a></td>
+ <td bgcolor="666666"><a href="javascript:insertcode('666666');" style="color:#FFFFFF;">666666</a></td>
+ <td bgcolor="666699"><a href="javascript:insertcode('666699');" style="color:#FFFFFF;">666699</a></td>
+ <td bgcolor="6666CC"><a href="javascript:insertcode('6666CC');" style="color:#FFFFFF;">6666CC</a></td>
+ <td bgcolor="6666FF"><a href="javascript:insertcode('6666FF');" style="color:#FFFFFF;">6666FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="669900"><a href="javascript:insertcode('669900');" style="color:#000000;">669900</a></td>
+ <td bgcolor="669933"><a href="javascript:insertcode('669933');" style="color:#000000;">669933</a></td>
+ <td bgcolor="669966"><a href="javascript:insertcode('669966');" style="color:#000000;">669966</a></td>
+ <td bgcolor="669999"><a href="javascript:insertcode('669999');" style="color:#000000;">669999</a></td>
+ <td bgcolor="6699CC"><a href="javascript:insertcode('6699CC');" style="color:#000000;">6699CC</a></td>
+ <td bgcolor="6699FF"><a href="javascript:insertcode('6699FF');" style="color:#000000;">6699FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66CC00"><a href="javascript:insertcode('66CC00');" style="color:#000000;">66CC00</a></td>
+ <td bgcolor="66CC33"><a href="javascript:insertcode('66CC33');" style="color:#000000;">66CC33</a></td>
+ <td bgcolor="66CC66"><a href="javascript:insertcode('66CC66');" style="color:#000000;">66CC66</a></td>
+ <td bgcolor="66CC99"><a href="javascript:insertcode('66CC99');" style="color:#000000;">66CC99</a></td>
+ <td bgcolor="66CCCC"><a href="javascript:insertcode('66CCCC');" style="color:#000000;">66CCCC</a></td>
+ <td bgcolor="66CCFF"><a href="javascript:insertcode('66CCFF');" style="color:#000000;">66CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66FF00"><a href="javascript:insertcode('66FF00');" style="color:#000000;">66FF00</a></td>
+ <td bgcolor="66FF33"><a href="javascript:insertcode('66FF33');" style="color:#000000;">66FF33</a></td>
+ <td bgcolor="66FF66"><a href="javascript:insertcode('66FF66');" style="color:#000000;">66FF66</a></td>
+ <td bgcolor="66FF99"><a href="javascript:insertcode('66FF99');" style="color:#000000;">66FF99</a></td>
+ <td bgcolor="66FFCC"><a href="javascript:insertcode('66FFCC');" style="color:#000000;">66FFCC</a></td>
+ <td bgcolor="66FFFF"><a href="javascript:insertcode('66FFFF');" style="color:#000000;">66FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="990000"><a href="javascript:insertcode('990000');" style="color:#FFFFFF;">990000</a></td>
+ <td bgcolor="990033"><a href="javascript:insertcode('990033');" style="color:#FFFFFF;">990033</a></td>
+ <td bgcolor="990066"><a href="javascript:insertcode('990066');" style="color:#FFFFFF;">990066</a></td>
+ <td bgcolor="990099"><a href="javascript:insertcode('990099');" style="color:#FFFFFF;">990099</a></td>
+ <td bgcolor="9900CC"><a href="javascript:insertcode('9900CC');" style="color:#FFFFFF;">9900CC</a></td>
+ <td bgcolor="9900FF"><a href="javascript:insertcode('9900FF');" style="color:#FFFFFF;">9900FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="993300"><a href="javascript:insertcode('993300');" style="color:#FFFFFF;">993300</a></td>
+ <td bgcolor="993333"><a href="javascript:insertcode('993333');" style="color:#FFFFFF;">993333</a></td>
+ <td bgcolor="993366"><a href="javascript:insertcode('993366');" style="color:#FFFFFF;">993366</a></td>
+ <td bgcolor="993399"><a href="javascript:insertcode('993399');" style="color:#FFFFFF;">993399</a></td>
+ <td bgcolor="9933CC"><a href="javascript:insertcode('9933CC');" style="color:#FFFFFF;">9933CC</a></td>
+ <td bgcolor="9933FF"><a href="javascript:insertcode('9933FF');" style="color:#FFFFFF;">9933FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="996600"><a href="javascript:insertcode('996600');" style="color:#FFFFFF;">996600</a></td>
+ <td bgcolor="996633"><a href="javascript:insertcode('996633');" style="color:#FFFFFF;">996633</a></td>
+ <td bgcolor="996666"><a href="javascript:insertcode('996666');" style="color:#FFFFFF;">996666</a></td>
+ <td bgcolor="996699"><a href="javascript:insertcode('996699');" style="color:#FFFFFF;">996699</a></td>
+ <td bgcolor="9966CC"><a href="javascript:insertcode('9966CC');" style="color:#FFFFFF;">9966CC</a></td>
+ <td bgcolor="9966FF"><a href="javascript:insertcode('9966FF');" style="color:#FFFFFF;">9966FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="999900"><a href="javascript:insertcode('999900');" style="color:#000000;">999900</a></td>
+ <td bgcolor="999933"><a href="javascript:insertcode('999933');" style="color:#000000;">999933</a></td>
+ <td bgcolor="999966"><a href="javascript:insertcode('999966');" style="color:#000000;">999966</a></td>
+ <td bgcolor="999999"><a href="javascript:insertcode('999999');" style="color:#000000;">999999</a></td>
+ <td bgcolor="9999CC"><a href="javascript:insertcode('9999CC');" style="color:#000000;">9999CC</a></td>
+ <td bgcolor="9999FF"><a href="javascript:insertcode('9999FF');" style="color:#000000;">9999FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99CC00"><a href="javascript:insertcode('99CC00');" style="color:#000000;">99CC00</a></td>
+ <td bgcolor="99CC33"><a href="javascript:insertcode('99CC33');" style="color:#000000;">99CC33</a></td>
+ <td bgcolor="99CC66"><a href="javascript:insertcode('99CC66');" style="color:#000000;">99CC66</a></td>
+ <td bgcolor="99CC99"><a href="javascript:insertcode('99CC99');" style="color:#000000;">99CC99</a></td>
+ <td bgcolor="99CCCC"><a href="javascript:insertcode('99CCCC');" style="color:#000000;">99CCCC</a></td>
+ <td bgcolor="99CCFF"><a href="javascript:insertcode('99CCFF');" style="color:#000000;">99CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99FF00"><a href="javascript:insertcode('99FF00');" style="color:#000000;">99FF00</a></td>
+ <td bgcolor="99FF33"><a href="javascript:insertcode('99FF33');" style="color:#000000;">99FF33</a></td>
+ <td bgcolor="99FF66"><a href="javascript:insertcode('99FF66');" style="color:#000000;">99FF66</a></td>
+ <td bgcolor="99FF99"><a href="javascript:insertcode('99FF99');" style="color:#000000;">99FF99</a></td>
+ <td bgcolor="99FFCC"><a href="javascript:insertcode('99FFCC');" style="color:#000000;">99FFCC</a></td>
+ <td bgcolor="99FFFF"><a href="javascript:insertcode('99FFFF');" style="color:#000000;">99FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC0000"><a href="javascript:insertcode('CC0000');" style="color:#FFFFFF;">CC0000</a></td>
+ <td bgcolor="CC0033"><a href="javascript:insertcode('CC0033');" style="color:#FFFFFF;">CC0033</a></td>
+ <td bgcolor="CC0066"><a href="javascript:insertcode('CC0066');" style="color:#FFFFFF;">CC0066</a></td>
+ <td bgcolor="CC0099"><a href="javascript:insertcode('CC0099');" style="color:#FFFFFF;">CC0099</a></td>
+ <td bgcolor="CC00CC"><a href="javascript:insertcode('CC00CC');" style="color:#FFFFFF;">CC00CC</a></td>
+ <td bgcolor="CC00FF"><a href="javascript:insertcode('CC00FF');" style="color:#FFFFFF;">CC00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC3300"><a href="javascript:insertcode('CC3300');" style="color:#FFFFFF;">CC3300</a></td>
+ <td bgcolor="CC3333"><a href="javascript:insertcode('CC3333');" style="color:#FFFFFF;">CC3333</a></td>
+ <td bgcolor="CC3366"><a href="javascript:insertcode('CC3366');" style="color:#FFFFFF;">CC3366</a></td>
+ <td bgcolor="CC3399"><a href="javascript:insertcode('CC3399');" style="color:#FFFFFF;">CC3399</a></td>
+ <td bgcolor="CC33CC"><a href="javascript:insertcode('CC33CC');" style="color:#FFFFFF;">CC33CC</a></td>
+ <td bgcolor="CC33FF"><a href="javascript:insertcode('CC33FF');" style="color:#FFFFFF;">CC33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC6600"><a href="javascript:insertcode('CC6600');" style="color:#000000;">CC6600</a></td>
+ <td bgcolor="CC6633"><a href="javascript:insertcode('CC6633');" style="color:#000000;">CC6633</a></td>
+ <td bgcolor="CC6666"><a href="javascript:insertcode('CC6666');" style="color:#000000;">CC6666</a></td>
+ <td bgcolor="CC6699"><a href="javascript:insertcode('CC6699');" style="color:#000000;">CC6699</a></td>
+ <td bgcolor="CC66CC"><a href="javascript:insertcode('CC66CC');" style="color:#000000;">CC66CC</a></td>
+ <td bgcolor="CC66FF"><a href="javascript:insertcode('CC66FF');" style="color:#000000;">CC66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC9900"><a href="javascript:insertcode('CC9900');" style="color:#000000;">CC9900</a></td>
+ <td bgcolor="CC9933"><a href="javascript:insertcode('CC9933');" style="color:#000000;">CC9933</a></td>
+ <td bgcolor="CC9966"><a href="javascript:insertcode('CC9966');" style="color:#000000;">CC9966</a></td>
+ <td bgcolor="CC9999"><a href="javascript:insertcode('CC9999');" style="color:#000000;">CC9999</a></td>
+ <td bgcolor="CC99CC"><a href="javascript:insertcode('CC99CC');" style="color:#000000;">CC99CC</a></td>
+ <td bgcolor="CC99FF"><a href="javascript:insertcode('CC99FF');" style="color:#000000;">CC99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCCC00"><a href="javascript:insertcode('CCCC00');" style="color:#000000;">CCCC00</a></td>
+ <td bgcolor="CCCC33"><a href="javascript:insertcode('CCCC33');" style="color:#000000;">CCCC33</a></td>
+ <td bgcolor="CCCC66"><a href="javascript:insertcode('CCCC66');" style="color:#000000;">CCCC66</a></td>
+ <td bgcolor="CCCC99"><a href="javascript:insertcode('CCCC99');" style="color:#000000;">CCCC99</a></td>
+ <td bgcolor="CCCCCC"><a href="javascript:insertcode('CCCCCC');" style="color:#000000;">CCCCCC</a></td>
+ <td bgcolor="CCCCFF"><a href="javascript:insertcode('CCCCFF');" style="color:#000000;">CCCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCFF00"><a href="javascript:insertcode('CCFF00');" style="color:#000000;">CCFF00</a></td>
+ <td bgcolor="CCFF33"><a href="javascript:insertcode('CCFF33');" style="color:#000000;">CCFF33</a></td>
+ <td bgcolor="CCFF66"><a href="javascript:insertcode('CCFF66');" style="color:#000000;">CCFF66</a></td>
+ <td bgcolor="CCFF99"><a href="javascript:insertcode('CCFF99');" style="color:#000000;">CCFF99</a></td>
+ <td bgcolor="CCFFCC"><a href="javascript:insertcode('CCFFCC');" style="color:#000000;">CCFFCC</a></td>
+ <td bgcolor="CCFFFF"><a href="javascript:insertcode('CCFFFF');" style="color:#000000;">CCFFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF0000"><a href="javascript:insertcode('FF0000');" style="color:#FFFFFF;">FF0000</a></td>
+ <td bgcolor="FF0033"><a href="javascript:insertcode('FF0033');" style="color:#FFFFFF;">FF0033</a></td>
+ <td bgcolor="FF0066"><a href="javascript:insertcode('FF0066');" style="color:#FFFFFF;">FF0066</a></td>
+ <td bgcolor="FF0099"><a href="javascript:insertcode('FF0099');" style="color:#FFFFFF;">FF0099</a></td>
+ <td bgcolor="FF00CC"><a href="javascript:insertcode('FF00CC');" style="color:#FFFFFF;">FF00CC</a></td>
+ <td bgcolor="FF00FF"><a href="javascript:insertcode('FF00FF');" style="color:#FFFFFF;">FF00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF3300"><a href="javascript:insertcode('FF3300');" style="color:#FFFFFF;">FF3300</a></td>
+ <td bgcolor="FF3333"><a href="javascript:insertcode('FF3333');" style="color:#FFFFFF;">FF3333</a></td>
+ <td bgcolor="FF3366"><a href="javascript:insertcode('FF3366');" style="color:#FFFFFF;">FF3366</a></td>
+ <td bgcolor="FF3399"><a href="javascript:insertcode('FF3399');" style="color:#FFFFFF;">FF3399</a></td>
+ <td bgcolor="FF33CC"><a href="javascript:insertcode('FF33CC');" style="color:#FFFFFF;">FF33CC</a></td>
+ <td bgcolor="FF33FF"><a href="javascript:insertcode('FF33FF');" style="color:#FFFFFF;">FF33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF6600"><a href="javascript:insertcode('FF6600');" style="color:#000000;">FF6600</a></td>
+ <td bgcolor="FF6633"><a href="javascript:insertcode('FF6633');" style="color:#000000;">FF6633</a></td>
+ <td bgcolor="FF6666"><a href="javascript:insertcode('FF6666');" style="color:#000000;">FF6666</a></td>
+ <td bgcolor="FF6699"><a href="javascript:insertcode('FF6699');" style="color:#000000;">FF6699</a></td>
+ <td bgcolor="FF66CC"><a href="javascript:insertcode('FF66CC');" style="color:#000000;">FF66CC</a></td>
+ <td bgcolor="FF66FF"><a href="javascript:insertcode('FF66FF');" style="color:#000000;">FF66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF9900"><a href="javascript:insertcode('FF9900');" style="color:#000000;">FF9900</a></td>
+ <td bgcolor="FF9933"><a href="javascript:insertcode('FF9933');" style="color:#000000;">FF9933</a></td>
+ <td bgcolor="FF9966"><a href="javascript:insertcode('FF9966');" style="color:#000000;">FF9966</a></td>
+ <td bgcolor="FF9999"><a href="javascript:insertcode('FF9999');" style="color:#000000;">FF9999</a></td>
+ <td bgcolor="FF99CC"><a href="javascript:insertcode('FF99CC');" style="color:#000000;">FF99CC</a></td>
+ <td bgcolor="FF99FF"><a href="javascript:insertcode('FF99FF');" style="color:#000000;">FF99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFCC00"><a href="javascript:insertcode('FFCC00');" style="color:#000000;">FFCC00</a></td>
+ <td bgcolor="FFCC33"><a href="javascript:insertcode('FFCC33');" style="color:#000000;">FFCC33</a></td>
+ <td bgcolor="FFCC66"><a href="javascript:insertcode('FFCC66');" style="color:#000000;">FFCC66</a></td>
+ <td bgcolor="FFCC99"><a href="javascript:insertcode('FFCC99');" style="color:#000000;">FFCC99</a></td>
+ <td bgcolor="FFCCCC"><a href="javascript:insertcode('FFCCCC');" style="color:#000000;">FFCCCC</a></td>
+ <td bgcolor="FFCCFF"><a href="javascript:insertcode('FFCCFF');" style="color:#000000;">FFCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFFF00"><a href="javascript:insertcode('FFFF00');" style="color:#000000;">FFFF00</a></td>
+ <td bgcolor="FFFF33"><a href="javascript:insertcode('FFFF33');" style="color:#000000;">FFFF33</a></td>
+ <td bgcolor="FFFF66"><a href="javascript:insertcode('FFFF66');" style="color:#000000;">FFFF66</a></td>
+ <td bgcolor="FFFF99"><a href="javascript:insertcode('FFFF99');" style="color:#000000;">FFFF99</a></td>
+ <td bgcolor="FFFFCC"><a href="javascript:insertcode('FFFFCC');" style="color:#000000;">FFFFCC</a></td>
+ <td bgcolor="FFFFFF"><a href="javascript:insertcode('FFFFFF');" style="color:#000000;">FFFFFF</a></td>
+ </tr>
+</table> \ No newline at end of file
diff --git a/0.4.7a2/config.pm b/0.4.7a2/config.pm
new file mode 100644
index 0000000..280f476
--- /dev/null
+++ b/0.4.7a2/config.pm
@@ -0,0 +1,247 @@
+# yChat - Copyright by Paul C. Bütow
+
+########################### Dieser Teil bestimmt die Standart-Variabeln.
+##STANDART-CONFIGURATION:## (CSS, Farben, Version etc.)
+###########################
+$datum = "22.01.01";
+$version = "0.4.7a2";
+$title = "yChat [$version]";
+$gfxpath = "../../yChat";
+$style = <<ENDCSS;
+<style type="text/css">
+ body { background-color: #005146 }
+ body.blank { background-color: #000000 }
+ body.online { background-color: #000000 }
+ div { font-family: arial, verdana, helvetiva; font-size: 9pt; color: #ffffff }
+ div.b { font-weight: bold; color: #ffa500 }
+ a { color: #ffffef; }
+ a:hover { color: #ffffff; }
+ p { font-family:verdana, arial, geneva, helvetica, sans-serif; color:#FFFFFF; font-size:12px; }
+</style>
+<style type="text/css" media="all">
+ a { text-decoration: none; }
+ a:hover { text-decoration:underline; }
+input { border:2px solid #000000; font-size:12px; color:#000000; height:23px; padding:2px;}
+select { border:2px solid #000000; font-family:arial, verdana, helvetica; font-size:11px; color:#000000; height:21px; padding:2px;}
+</style>
+ENDCSS
+
+############### Dieser TeFil enthält Programmcode, der an verschiedenen
+##SHARED-SUBS## Stellen ausgeführt werden muß und jedem Skript zur
+############### Verfügung steht.
+
+sub printfile { # Liest eine externe Datei ein und gibt sie mit print aus
+ my ($file2print,$pagetitle,$bodyclass) = @_;
+ if ($pagetitle ne "") {
+ &start_html($pagetitle,$bodyclass);
+ }
+ open(FILE2PRINT,"<$file2print");
+ @file2print = <FILE2PRINT>;
+ close FILE2PRINT;
+ print @file2print;
+}
+
+
+sub start_html { # Der HEADER einer HTML-Datei
+print "<html><head>";
+print "<meta http-equiv=\"refresh\" content=\"20\" URL=\"online.pl?room=$room\">" if ($_[1] eq "online");
+print <<END;
+ <title>
+ $title - $_[0]
+ </title>
+ $_[2]
+ $style
+ </head>
+END
+ if ($_[1] eq "start") {
+ print "<body onload=\"document.login.alias.focus();\">";
+ } elsif ($_[1] ne "") {
+ print "<body class=$_[1]>";
+ } else {
+ print "<body>";
+ }
+}
+
+sub post { # Öffentliche Nachricht posten.
+ my ($room,$msg2post,$secroom) = @_;
+ my @rooms,@pids = $room;
+ @rooms = ($room,$secroom) if ($room ne $secroom);
+ foreach(@rooms) {
+ open(MSGFILE,">>data/msgs/$_");
+ open(PID,"<data/online/pids/$_");
+ print MSGFILE "!<;".time."<;!<;!<;$msg2post<;\n";
+ @pids = <PID>;
+ close PID;
+ close MSGFILE;
+ kill INT => @pids;
+ }
+ &log($msg2post) if ($room eq "Cyberbar");
+}
+
+sub post_prv { # Private Nachricht posten (flüstern).
+ my ($alias2post,$msg2post) = @_;
+ opendir(DIR,"data/online/rooms");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach $raum (@dir) {
+ opendir(DIR,"data/online/rooms/$raum");
+ my @chatter = readdir(DIR);
+ closedir(DIR);
+ foreach $chatter (@chatter) {
+ if ($chatter eq $alias2post) {
+ open(MSGFILE,">>data/msgs/$raum");
+ print MSGFILE "$alias2post<;".time."<;!<;!<;$msg2post<;\n";
+ close MSGFILE;
+ open(PID,"<data/online/pids/$raum");
+ my @pids = <PID>;
+ close PID;
+ kill INT => @pids;
+ goto ENDPRV;
+ }
+ }
+ }
+ENDPRV:
+}
+
+sub log { # Protokollieren der Nachrichten etc.
+ local $msg2log = $_[0];
+ &zeit;
+ open(LOG,">>data/logs/$day.$month.$year");
+ print LOG "<br><font color=ffffef><i>($hours:$min:$sec)</i></font> $msg2log\n";
+ close LOG;
+}
+
+
+sub zeit { # Aktuelles Datum und Uhrzeit bestimmen.
+ ($sec, $min, $hours, $day, $month, $year) = (localtime)[0..5];
+ $month += 1;
+ $hours = "0".$hours if ($hours < 10);
+ $min = "0".$min if ($min < 10);
+ $sec = "0".$sec if ($sec < 10);
+ $day = "0".$day if ($day < 10);
+ $month = "0".$month if ($month < 10);
+ $year = $year - 100;
+ if ($year < 10) {
+ $year = "200".$year;
+ } else {
+ $year = "20".$year;
+ }
+}
+
+sub read_file { # Datei öffnen.
+ my $file2read = $_[0];
+ if (-e "$file2read") {
+ open (DATEI,"<$file2read") || &error("Konnte $file2read nicht öffnen");
+ }
+}
+
+sub error { # Error-Ausgabe.
+ my $error_msg = $_[0];
+ &start_html( "Error: ($error_msg)" );
+ print $q->div( "Error: ($error_msg)" ),
+ $q->end_html;
+ open(ERROR,">>data/error");
+ print ERROR $error_msg."\n";
+ close ERROR;
+ exit;
+}
+
+sub check_online { # Auf alte Räume und Chatter prüfen und ggf. entfernen.
+ open(PROVE,">data/online/prove");
+ print PROVE time;
+ close PROVE;
+ opendir(RAUMDIR, "data/online/rooms");
+ my @raumdir = readdir(RAUMDIR);
+ closedir(RAUMDIR);
+ foreach $raum (@raumdir) {
+ opendir(BENUTZERDIR, "data/online/rooms/$raum");
+ my @benutzerdir = readdir(BENUTZERDIR);
+ closedir(BENUTZERDIR);
+ my $raumleer= 1;
+ foreach $benutzer (@benutzerdir) {
+ if (-f "data/online/rooms/$raum/$benutzer") {
+ $raumleer = 0;
+ open (BENUTZER,"<data/online/rooms/$raum/$benutzer");
+ my $benutzerstamp = <BENUTZER>;
+ close BENUTZER;
+ if ($benutzerstamp < (time - 40)) {
+ unlink("data/online/$raum/$benutzer");
+ open (BENUTZER2,"<data/online/users/$benutzer");
+ my $benutzerstamp2 = <BENUTZER2>;
+ close BENUTZER2;
+ if ($benutzerstamp2 < (time - 40)) {
+ if ($benutzer ne $alias) {
+ &rm_alias($benutzer,$raum); # ohne $raum/benutzer entf.
+ } else {
+ unlink("data/online/rooms/$raum/$benutzer");
+ }
+ &zeit;
+ &post($raum,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$benutzer hat den Chat verlassen ... </font></i>");
+ }
+ }
+ }
+ }
+ if ($raumleer == 1) { # Falls Raum leer ist => entf.
+ rmdir("data/online/rooms/$raum");
+ unlink("data/online/rstat/$raum");
+ unlink("data/online/pids/$raum");
+ unlink("data/msgs/$raum");
+ }
+ }
+}
+
+sub rm_alias { # Falls Benutzer offline gegangen ist
+ my($benutzer,$raum) = @_;
+ unlink("data/online/rooms/$raum/$benutzer");
+ unlink("data/online/users/$benutzer");
+ unlink("data/online/ident/$benutzer");
+ &rm_rstat($benutzer,$raum);
+}
+
+sub rm_rstat { # Benutzer als Raumbesetzer austragen
+ my ($r_alias,$rstatroom) = @_;
+ open (RSTAT,"<data/online/rstat/$rstatroom");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ my @rstat2 = ($rstat[0],$rstat[1]);
+ for ($i=2;$i<=$#rstat;$i++) {
+ push(@rstat2,$rstat[$i]) if ($rstat[$i] ne $r_alias."\n");
+ }
+ open (RSTAT,">data/online/rstat/$rstatroom");
+ print RSTAT @rstat2;
+ close RSTAT;
+}
+
+
+sub secure_checkid { # TmpID überprüfen
+ my ($alias2check) = @_;
+ open(IDENT,"<data/online/ident/$alias2check");
+ my @ident = <IDENT>;
+ close IDENT;
+ if ($ident[1] ne $tmpid) {
+ &error("Falsche TempID ! Du bist nicht befugt zu handeln !");
+ }
+}
+
+sub hierachie { # Chatter nach Sonderrechte überprüfen.
+ my $alias2prove = $_[0];
+ $hierachie = undef;
+ open(WA,"<data/wa");
+ @was = <WA>;
+ close WA;
+ foreach $wa (@was) {
+ if ($wa eq $alias2prove || $wa eq "$alias2prove\n") {
+ $hierachie = "wa";
+ }
+ }
+ open(OW,"<data/ow");
+ @ows = <OW>;
+ close OW;
+ if ($hierachie ne "wa" || $_ eq "$alias2prove\n") {
+ foreach $ow (@ows) {
+ if ($ow eq $alias2prove || $ow eq "$alias2prove\n") {
+ $hierachie = "ow";
+ }
+ }
+ }
+}
diff --git a/0.4.7a2/help.sno b/0.4.7a2/help.sno
new file mode 100644
index 0000000..558d4fd
--- /dev/null
+++ b/0.4.7a2/help.sno
@@ -0,0 +1,57 @@
+<div>
+ Alle Chat-Befehle:
+</div>
+<hr>
+<table width=100% bgcolor=000000>
+<tr><th bgcolor=666666><div>SU</div></th><th bgcolor=666666><div>Befehl</div></th><th bgcolor=666666><div>Beschreibung</div></th></tr>
+<tr><td><div>NC</div></td><td><div>/about</div></td><td><div>Zeigt aktuelle Version und andere Infos der Community an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/away <font color=red>Nachricht</font></div></td><td><div>Abmelden mit einer<font color=red>Abmeldenachricht</font></div></td></tr>
+<tr><td><div>NC</div></td><td><div>/clear</div></td><td><div>Bildschirm wird gelöscht</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/col <font color=red>XXXXXX</font> <font color=ffa500>XXXXXX</font></div></td><td><div>Farbe/n (<font color=red>Namensfarbe</font> / <font color=ffa500>Textfarbe</font>) wechseln. Angabe in Hexadezimal.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/date</div></td><td><div>Zeigt aktuelles Datum und Urzeit an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/j <font color=red>Raumname</font></div></td><td><div>Raum wechseln/erstellen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ju <font color=red>Alias</font></div></td><td><div>In den Raum wechseln/folgen, wo sich <font color=red>Alias</font> befindet.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/m <font color=red>Aktion</font></div></td><td><div>Handeln mit 2 Farben</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/me <font color=red>Aktion</font></div></td><td><div>Handeln mit einer Farbe</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/memo <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine <font color=ffa500>Memonachricht</font> hinterlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/msg <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine private <font color=ffa500>Nachricht</font> flüstern</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ <font color=ffa500>Nachricht</font></div></td><td><div>Eine private <font color=ffa500>Nachricht</font> demjenigen flüstern, dem zuletzt eine geflüstert wurde</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/online <font color=red>Alias</font></div></td><td><div>Zeigt Onlineminuten von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/q</div></td><td><div>Cumunnity verlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/rmgb</div></td><td><div>Das eigene Gästebuch komplett weglöschen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/s <font color=red>Nachricht</font></div></td><td><div><font color=red>Nachricht</font> schreien</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/seen <font color=red>Alias</font></div></td><td><div>Zeigt an, vor wieviel Stunden sich <font color=red>Nachricht</font> zum letzten Mal in das System eingelogt hat</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/w</div></td><td><div>Zeigt an, wer sich im aktuellen Raum befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc <font color=red>Raum</font></div></td><td><div>Zeigt an, wer sich im <font color=red>Raum</font> befindet. Wird kein Raum angegeben, dann wird ledeglich angezeigt, wer sich im System befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc/</div></td><td><div>Zeigt alle offenen Räume und deren Chatter an</div></td></tr>
+<tr><td><div>NC</div></td><td> <div>/wj <font color=red>Alias</font></div></td><td><div>Zeigt an, in welchen Raum sich <font color=red>Alias</font> befindet</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/l</div></td><td><div>Der aktuelle Raum wird ab- bzw. aufgesperrt</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/rsu <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> die Raumbesetzerrechte entnehmen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/su <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Raumbesetzer ernennen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/t <font color=red>Thema</font></div></td><td><div>Dem aktuellen Raum wird ein <font color=red>Thema</font> gegeben</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban</div></td><td><div>Zeigt alle verbannten Benutzer an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> verbannen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/rban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> "entbannen"</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ip <font color=red>Alias</font></div></td><td><div>Zeigt die IP-Nummer von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/k <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird aus dem Chat katapultiert!</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ss <font color=red>Raum</font> <font color=ffa500>Nachricht</font></div></td><td><div>Eine <font color=ffa500>Nachricht</font> in <font color=red>Raum</font> hinüber rufen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/kill <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird ganz und gar aus dem System entfernt</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/wa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Wächter ernennen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/rwa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom Wächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/sys <font color=red>Nachricht</font></div></td><td><div>Systemnachricht schreiben. (Erscheint in allen existierenden Räumen)</div></td></tr>
+</table><hr>
+<div>
+ Zur Erklärung: NC steht für "Normale Chatter", RB für "Raumbesetzer", WÄ für "Wächter" und OW für "Oberwächter".
+ Obrige Befehle können nur von der/den jeweiligen Benutzergruppe/n werden.<br><br>
+ Allerdings gibt es folgendes zu beachten: Oberwächter verfügen über alle Chatbefehle. Normale Wächter über alle Chatbefehle, außer über die der Oberwächter.
+ Raumbesetzer können nur Raumbesetzerbefehle und die Befehle der normalen Chatter durchführen. Normale Chatter haben jedeglich die Standardbefehle zu verwenden.<br><br>
+ Weitere Besonderheiten der Wächter und Oberwächter:<br><br>
+ Wächter und Oberwächter können ....<br>
+ ... abgesperrte Chaträume problemlos betreten.<br>
+ ... nicht gekickt, verbannt oder gekillt werden.<br>
+ ... Logdateien der Cyberbar lesen.<br><br>
+
+ Des weiteren: Oberwächter ernennt nur der Systemadministrator!
+</div>
+</body>
+</html> \ No newline at end of file
diff --git a/0.4.7a2/htdocs.pl b/0.4.7a2/htdocs.pl
new file mode 100644
index 0000000..61fcd77
--- /dev/null
+++ b/0.4.7a2/htdocs.pl
@@ -0,0 +1,241 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header;
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+$var = $q->param("var");
+if ($var eq "help_html") {
+ &printfile("help.sno","Alle Chatbefehle");
+} elsif ($var eq "logo_html") {
+ &start_html("Logo");
+print<<END;
+<layer top=-3 left=0><div style="position:absolute; top:5; left:10">
+<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
+ codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0"
+ WIDTH=48 HEIGHT=48>
+ <PARAM NAME=movie VALUE="$gfxpath/ySymbol.swf">
+ <PARAM NAME=loop VALUE=false>
+ <PARAM NAME=menu VALUE=false>
+ <PARAM NAME=quality VALUE=high>
+ <PARAM NAME=scale VALUE=noborder>
+ <PARAM NAME=wmode VALUE=opaque>
+ <PARAM NAME=bgcolor VALUE=#005146>
+ <EMBED src="$gfxpath/ySymbol.swf" loop=false menu=false quality=high scale=noborder wmode=opaque bgcolor=#005146
+ WIDTH=48 HEIGHT=48 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED>
+</OBJECT>
+</div></layer>
+END
+print $q->end_html;
+} elsif ($var eq "menu_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ $tmp = $q->param("tmp");
+ &menu_html;
+} elsif ($var eq "werda_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &werda_html;
+} elsif ($var eq "logs_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ &logs_html;
+} elsif ($var eq "view_logs_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $tmp = $q->param("tmp");
+ &secure_checkid($alias);
+ &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ &printfile($tmp,"Logdatei","blank");
+ }
+} elsif ($var eq "superuser_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ &superuser_html;
+} else {
+ print
+ $q->start_html(-bgcolor=>"000000"),
+ $q->end_html;
+}
+
+sub menu_html {
+if ($tmp eq "quit") {
+ &start_html("Quit","blank","<script language=\"JavaScript\">open(\"index.pl?tmp=quit\",\"_top\");</script>");
+ print $q->end_html;
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias verläßt den Chat ... </font></i>");
+ sleep 2;
+ &rm_alias($alias,$room);
+ exit;
+}
+ENDJS
+ &start_html("Menü","blank");
+print <<END;
+<script language="JavaScript">
+function fenster(fenster,target) {
+ open(fenster,target,"width=500,height=500,screenX=100,screenY=100,scrollbars");
+}
+</script>
+<font size=2 face=verdana><p>
+ <a href='javascript:fenster("htdocs.pl?var=werda_html&alias=$alias&room=$room&col=$col&secol=$secol&&tmp=$tmp&tmpid=$tmpid","weristda")'>Wer ist da?</a>
+ <a href='javascript:fenster("main2.pl?var=edit_profile_html&alias=$alias&tmpid=$tmpid&room=$room","ProfilAendern")'>Profil ändern</a>
+ <a href='javascript:fenster("main2.pl?var=edit_options_html&alias=$alias&tmpid=$tmpid&room=$room","Optionen")'>Chatoptionen</a>
+ <a href='javascript:fenster("main2.pl?var=list_alias_html&alias=$alias&tmpid=$tmpid","Benutzerliste")'>Benutzerliste</a>
+ <a href='javascript:fenster("htdocs.pl?var=help_html&tmpid=$tmpid","Befehle")'>Chatbefehle</a><br>
+ <a href='javascript:fenster("main2.pl?var=gb_html&alias=$alias&tmpid=$tmpid","Board")'>Benutzerboard</a>
+ <a href='javascript:fenster("htdocs.pl?var=superuser_html&alias=$alias&tmpid=$tmpid","Superuser")'>Superuser</a>
+ <a href='javascript:fenster("htdocs.pl?var=logs_html&alias=$alias&tmpid=$tmpid","Logdateien")'>Logs</a>
+ <a href='javascript:fenster("ranking.php4?&alias=$alias&tmpid=$tmpid","Ranking")'>Top 20</a>
+ <a href="http://www.home.yChat.de" target="Home">Home</a>
+ <a href="http://www.credits.yChat.de" target="Credits">Credits</a>
+ <a href="htdocs.pl?alias=$alias&var=menu_html&room=$room&tmpid=$tmpid&tmp=quit">Verlassen</a>
+</p></font>
+</body>
+</html>
+END
+}
+
+sub werda_html { # Anzeige, wer eingelogt ist.
+ &start_html("Wer ist da?");
+ print <<END;
+<div>
+ $alias, schön daß Du hier bist :-)
+</div>
+<hr>
+<div>
+ Folgende Personen befinden sich im Chat:
+</div>
+<br>
+<div>
+END
+ opendir(ROOMDIRS,"data/online/rooms");
+ local @roomdirs = readdir(ROOMDIRS);
+ close(ROOMDIRS);
+ foreach(@roomdirs) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ my $room = $_;
+ open(RSTAT,"<data/online/rstat/$room");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ opendir(ROOMDIR,"data/online/rooms/$room");
+ my @roomdir = readdir(ROOMDIR);
+ close(ROOMDIR);
+ local $nr = $#roomdir-1;
+ print $q->b( $_ ),
+ " $door ($nr) Raumthema: $rstat[1]",
+ $q->br;
+ foreach(@roomdir) {
+ if ($_ ne ".." && $_ ne ".") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid" }, "$_"), " ";
+ }
+ }
+ print $q->br, $q->br;
+ }
+ }
+ print
+ "</div>",
+ $q->end_html;
+}
+
+sub logs_html {
+ &start_html("Logdateien");
+ print <<END;
+<div>
+ Hier befinden sich alle Logdateien
+</div>
+<hr>
+END
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ print $q->div( "Folgende Logdateien des Raumes \"Cyberbar\" können nur von Oberwächtern gelesen werden (Sortiert nach A-Z, a-z):" ),
+ $q->br;
+ opendir(LOGS,"data/logs");
+ local @logs = readdir(LOGS);
+ closedir(LOGS);
+ local @sortedir = sort(@logs);
+ foreach(@sortedir) {
+ if (-f "data/logs/$_") {
+ print $q->a( { -href=>"htdocs.pl?alias=$alias&var=view_logs_html&tmp=data/logs/$_&tmpid=$tmpid",
+ -target=>"_new" },
+ "$_" ),
+ " ";
+ }
+ }
+ } else {
+ print $q->div( "Logdateien können nur von Oberwächtern (OW) gelesen werden. Du bist jedoch ein Wächter (WÄ) oder ein",
+ "\"Normaler Chatter\". Oberwächter können alles nachlesen, was öffentlich im Raum \"Cyberbar\" gechattet wurde." ),
+ $q->hr;
+ &printfile("data/htdocs/logs_html");
+ }
+ print
+ $q->end_html;
+}
+
+sub superuser_html { # Zeigt an, wer Superuser ist
+ &start_html("Superuser");
+ print "<div>Hallo $alias. Du bist als ";
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ print
+ $q->b( "Oberwächter" ),
+ " (OW) eingetragen.</div>",
+ $q->hr;
+ } elsif ( $hierachie eq "wa") {
+ print
+ $q->b( "Wächter" ),
+ " (WÄ) eingetragen.</div>",
+ $q->hr;
+ } else {
+ print
+ $q->b( "normaler Chatter" ),
+ " (NC) eingetragen.</div>",
+ $q->hr;
+ }
+
+ my $nrow = $#ows+1;
+ print
+ "<div>",
+ $q->b( "OW" ),
+ "s ($nrow Stück)";
+ foreach(@ows) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+ my $nrwa = $#was+1;
+ print
+ "</div>",
+ $q->hr,
+ "<div>",
+ $q->b( "WÄ" ),
+ "s ($nrwa Stück)";
+ foreach(@was) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+print <<END;
+<hr>
+ Die jeweiligen Fähigkeiten der Oberwächter (OW) und der Wächter (WÄ) sind unter
+ "<a href="htdocs.pl?var=help_html">Chat-Befehle</a>"
+ dokumentiert.
+</div>
+</body>
+</html>
+END
+} \ No newline at end of file
diff --git a/0.4.7a2/index.pl b/0.4.7a2/index.pl
new file mode 100644
index 0000000..078a2fd
--- /dev/null
+++ b/0.4.7a2/index.pl
@@ -0,0 +1,421 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header;
+
+#####################################
+##WELCHE SUB MUß AUFGERUFEN WERDEN?##
+#####################################
+
+$var = $q->param("var");
+$alias = $q->param("alias");
+$pw = $q->param("pw");
+$tmp = $q->param("tmp");
+
+if ($var eq "create_alias_html") {
+ &create_alias_html;
+} elsif ($var eq "create_alias") {
+ &create_alias;
+} elsif ($var eq "login_html") {
+ $tmp = $q->param("tmp");
+ &login_html;
+} elsif ($alias eq "") {
+ &login_html;
+} else {
+ &checklogin;
+}
+
+sub login_html { # Erste Startseite
+&check_online;
+local $counter = undef;
+open(COUNT,"<data/count");
+ $counter = <COUNT>;
+close COUNT;
+$counter++;
+open(COUNT,">data/count");
+ print COUNT $counter;
+close COUNT;
+opendir(USERS,"data/online/users");
+ local @users = readdir(USERS);
+closedir(USERS);
+opendir(REGISTRED,"data/user/options");
+ local @registred = readdir(REGISTRED);
+closedir(REGISTRED);
+local ($logtin,$users) = ($#users-1,$#registred-1);
+&start_html("Created & Copyright by Paul C. Bütow","start");
+print <<END;
+ <center>
+ <table width=500>
+ <tr>
+ <td>
+ <center>
+ <table>
+ <tr>
+ <td>
+<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
+ codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0"
+ WIDTH=240 HEIGHT=240>
+ <PARAM NAME=movie VALUE="$gfxpath/yIntro.swf">
+ <PARAM NAME=loop VALUE=false>
+ <PARAM NAME=menu VALUE=false>
+ <PARAM NAME=quality VALUE=high>
+ <PARAM NAME=scale VALUE=noborder>
+ <PARAM NAME=wmode VALUE=opaque>
+ <PARAM NAME=bgcolor VALUE=#005146>
+ <EMBED src="$gfxpath/yIntro.swf" loop=false menu=false quality=high scale=noborder wmode=opaque bgcolor=#005146
+ WIDTH=240 HEIGHT=240 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED>
+</OBJECT>
+ </td>
+ <td>
+ <div>
+ yChat: Version $version
+ <br><br>
+ Letztes Update: $datum
+ <br><br>
+ Seitenaufrufe: $counter
+ <br><br>
+ Benutzer registriert: $users
+ <br><br>
+ Benutzer online: $logtin
+ <br><br>
+ Webmaster: <a href="mailto:mail\@paulbuetow.de">Paul C. Bütow</a>
+ <br><br>
+ yChat-HP: <a href="http://www.home.yChat.de">home.yChat.de</a>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </center>
+ </div>
+ <br>
+ <br>
+END
+ if ($tmp eq "true") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Wahrscheinlich existiert Dein Alias "$alias" nicht,
+ <br>
+ Du hast Dich verschrieben oder das Passwort ist falsch.
+ <br>
+ Versuch es erneuert !
+ </div>
+END
+ } elsif ($tmp eq "quit") {
+print <<END;
+ <div>
+ Du hast soeben den Chat verlassen.
+ <br>
+ Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ } elsif ($tmp eq "banned") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein Alias "$alias" wurde verbannt.
+ <br>
+ Z.z. kannst Du Dich leider nicht in den Chat einloggen.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($tmp eq "kick") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wurdest soeben aus dem Chat katapultiert!
+ <br>
+ Schlechtes Verhalten mag die Ursache hierfür sein.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($var eq "create_alias") {
+print "<div>Du hast sich soeben in die Datenbank eingetragen. Einfach auf \"Los Geht's\" klicken :-)</div>";
+ } else {
+print <<END;
+ <div>
+ Herzlich willkommen!
+ <br>
+ Einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <form name="login" action="index.pl" method="post">
+ <input type="hidden" name="tmp" value="true">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Alias:
+ <br>
+ <input name="alias" value="$alias">
+ </div>
+ </td>
+ <td>
+ <div>
+ Dein Passwort:
+ <br>
+ <input type="password" name="pw" value="$pw">
+ </div>
+ </td>
+ </tr>
+ </table>
+ <br>
+ <br>
+ <div>
+ Solltest Du noch keinen Nick besitzen, dann auf "Registrieren" klicken!
+ </div>
+ <br>
+ <table>
+ <tr>
+ <td>
+ <font color="ffffff">
+ <input type="submit" value="Los geht's!">
+ </font>
+ </form>
+ </td>
+ <td>
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias_html">
+ <font color="ffffff">
+ <input type="submit" value="Registrieren">
+ </font>
+ </form>
+ </td>
+ </tr>
+ </table>
+ <hr>
+ </td>
+ </tr>
+ </table>
+ </center>
+</body>
+</html>
+END
+# if ($logtin == 0) {
+# &list_dir("data/msgs");
+# &list_dir("data/online/rstat",2);
+# foreach(@dir) {
+# unlink("data/msgs/$_");
+# unlink("data/online/ident/$_");
+# }
+# foreach(@dir2) {
+# unlink("data/online/rstat/$_");
+# }
+# }
+# # Falls d. Skript das Raumverz. gelöscht hat, neu anlegen
+ if (-d "data/online/rooms") {
+ } else {
+ mkdir "data/online/rooms", 0777;
+ }
+}
+
+
+sub create_alias_html { # HTML-Form für Erstellung eines neuen Benutzers.
+local $reload = $_[0];
+&start_html("Registration");
+print <<END;
+ <center>
+ <table width=500>
+ <tr>
+ <td>
+END
+ if ($reload eq "alias_exists") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Der von Dir gewählte Benutzername "$alias" existiert in unserer Datenbank bereits. Bitte versuch es erneuert mit
+ einem anderen Benutzernamen !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "pw_wrong") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Deine beiden Passworteingaben stimmen nicht überein. Bitte geb das Passwort erneuert an um sicherzugehen, daß
+ kein falsches Passwort abgespeichert wird !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "alias_prohibited") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein gewählter Benutername "$alias" enthält illegale Zeichen. Bitte versuch einen anderen Benutzernamen!
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Hier kannst Du Dich registrieren. Bitte beachte, daß die Passworteingabefelder übereinstimmen!
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias">
+ <div>
+ Dein Alias:
+ <font color="ffa500">
+ (Muß angegeben werden)
+ </font>
+ <br>
+ <input name="alias" VALUE="$alias">
+ </div>
+ <br>
+ <div>
+ Dein gewünschtes Passwort:
+ <br>
+ <input type="password" name="pw" value="$pw">
+ </div>
+ <br>
+ <div>
+ Geb hier Dein Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp">
+ </div>
+ <br>
+ <font color=ffffff>
+ <input type="submit" value="Registrieren">
+ </font>
+ <br>
+ </form>
+ <hr>
+ <div>
+ Um den Chat zu betreten müssen die Daten nach der Registration auf der Startseite erneuert bestätigt werden !
+ </div>
+ </td>
+ </tr>
+ </table>
+</center>
+</body>
+</html>
+END
+}
+
+sub checklogin { # Überprüfen, ob die Login-Daten korrekt sind.
+ my $lognotexists = "true";
+ opendir(USERDIR,"data/user/options");
+ my @userdir = readdir(USERDIR);
+ closedir(USERDIR);
+ foreach $user (@userdir) {
+ if ($user eq $alias) {
+ open(OPTIONS,"<data/user/options/$alias");
+ my @options = <OPTIONS>;
+ close OPTIONS;
+ chomp($options[0]);
+ if ($options[0] eq $pw) {
+ open(BAN,"<data/ban");
+ my @ban = <BAN>;
+ close BAN;
+ foreach(@ban) {
+ if ($_ eq "$alias\n") {
+ $tmp = "banned";
+ &login_html;
+ exit;
+ }
+ }
+ if ($options[1] eq undef) {
+ $col = "ffffff";
+ } else {
+ chomp($options[1]);
+ $col = $options[1];
+ }
+ if ($options[2] eq undef) {
+ $secol = "ffffef";
+ } else {
+ $secol = $options[2];
+ }
+ $tmpid = time;
+ open(IDENT,">data/online/ident/$alias");
+ print IDENT $ENV{'REMOTE_ADDR'}."\n".$tmpid;
+ close IDENT;
+ open(LASTLOGIN,">data/user/lastlogin/$alias");
+ print LASTLOGIN time;
+ close LASTLOGIN;
+ &frameset_html;
+ exit;
+ } else {
+ $lognotexists = "false";
+ }
+ }
+ }
+ &login_html; # Falls Login-Daten inkorrekt sind, zurück zur Startseite.
+}
+
+sub create_alias { # Erstellung eines neuen Benutzers.
+ if ($alias =~ /[\W]/ || $alias eq "") {
+ &create_alias_html("alias_prohibited");;
+ exit;
+ } elsif ($pw ne $tmp) {
+ &create_alias_html("pw_wrong");
+ exit;
+ }
+ opendir(USERDIR,"data/user/options");
+ my @user = readdir(USERDIR);
+ close USERDIR;
+ foreach $user (@user) {
+ if ($user eq $alias) {
+ &create_alias_html("alias_exists");
+ exit;
+ }
+ }
+ open(OPTIONS,">data/user/options/$alias");
+ print OPTIONS $pw."\n";
+ close OPTIONS;
+ local $number = $#user;
+ &zeit;
+ &post("Cyberbar","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias [$number] hat sich soeben als neuer Benutzer registriert :-) ...</font></i>");
+ &login_html;
+}
+
+sub frameset_html {
+print <<END;
+<html>
+ <head>
+ <title>
+ $title - Created & Copyright by Paul C. Bütow
+ </title>
+ </head>
+<frameset border=0 frameborder=0 framespacing=0 cols="130,*">
+ <frameset border=0 frameborder=0 framespacing=0 rows="300,*,55">
+ <frame name="online" src="online.pl?room=Cyberbar&alias=$alias&tmpid=$tmpid">
+ <frame src="htdocs.pl">
+ <frameset border=0 frameborder=0 framespacing=0 cols="70,*">
+ <frame name="logo" src="htdocs.pl?var=logo_html" scrolling="no">
+ <frame name="reload" src="htdocs.pl" scrolling="no">
+ </frameset>
+ </frameset>
+ <frameset border=0 frameborder=0 framespacing=0 rows="60,*,55">
+ <frame name="menu" src="htdocs.pl?alias=$alias&var=menu_html&room=Cyberbar&col=$col&secol=$secol&tmpid=$tmpid" scrolling="no">
+ <frame name="main" src="push.pl?room=Cyberbar&alias=$alias&tmpid=$tmpid">
+ <frame name="input" src="input.pl?alias=$alias&room=Cyberbar&col=$col&secol=$secol&tmp=login&tmpid=$tmpid" scrolling="no">
+ </frameset>
+</frameset>
+</html>
+END
+}
diff --git a/0.4.7a2/input.pl b/0.4.7a2/input.pl
new file mode 100644
index 0000000..8561aba
--- /dev/null
+++ b/0.4.7a2/input.pl
@@ -0,0 +1,194 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header();
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+#&secure_checkid($alias);
+$room = $q->param("room");
+$col = $q->param("col");
+$secol = $q->param("secol");
+$tmp = $q->param("tmp");
+$whisper = $q->param('whisper');
+
+if ($tmp eq "login") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat den Chat betreten ...</font></i>");
+}
+
+print <<END;
+<html>
+<head>
+<script language="JavaScript"><!--
+
+// Einstellungsvariablen
+maxVerlauf = 10; // Anzahl der Einträge des Verlaufs
+maxPreview = 20; // Zeichenlänge der Verlaufsvorschau
+verlaufOrder = 1; // Neue Nachrichten von: 0=oben, 1=unten
+//autoAwayTimeout = 20; // Sekunden, nach denen der User 'Away' gesetzt wird
+//autoQuitTimeout = 40; // Sekunden, nach denen der User den Chat verlässt
+autoAwayTimeout = 300; // Sekunden, nach denen der User 'Away' gesetzt wird
+autoQuitTimeout = 1200; // Sekunden, nach denen der User den Chat verlässt
+
+// Interne Variablen
+userNotFocused = false; // Wenn User nicht schreibt
+userAway = false; // Wenn User automatisch auf 'Away' gesetzt ist
+userAwayTime = 0; // Sekunden, die User 'Away' ist
+fullVerlauf = new Array( maxVerlauf ); // Verlaufspuffer
+
+function delout()
+{
+ addVerlauf (document.inf.msg.value); // Dem Verlauf eine Nachricht anhängen
+ document.inf.submit(); // Formular absenden
+ document.inf.msg.focus(); // Fukus in das Eingabeform
+ document.inf.msg.select(); // Text im Eigabeform markieren
+ return false; // Abbrechen, damit das Frame nicht neu geladen wird
+}
+
+function CheckAuswahl()
+{
+ id=document.verlaufform.verlauf.selectedIndex; // ID des ausgewählten Feldes
+
+ if (fullVerlauf[id-1] != null) // Nur, wenn das Feld nicht leer ist
+ {
+ document.inf.msg.value = fullVerlauf[id-1]; // Eintrag ins Textfeld
+ }
+
+ document.verlaufform.verlauf.selectedIndex = 0; // Ersten Eintrag (Überschrift) auswählen
+ document.inf.msg.focus(); // Eingabefeld fokusieren
+
+ return true;
+}
+
+function addVerlauf (msg)
+{
+ if (msg == "") // Falls msg leer
+ return false; // Aufruf ignorieren
+
+ if (verlaufOrder) // neue Nachrichten von unten
+ {
+ for (i=0; i<(maxVerlauf-1); i++) // Alle Einträge einen aufrutschen
+ {
+ document.verlaufform.verlauf.options[i+1].text = document.verlaufform.verlauf.options[i+2].text;
+ fullVerlauf[i] = fullVerlauf[i+1];
+ }
+ }
+ else // neue Nachrichten von oben
+ {
+ for (i=(maxVerlauf-2); i>=0; i--) // Alle Einträge einen aufrutschen
+ {
+ document.verlaufform.verlauf.options[i+2].text = document.verlaufform.verlauf.options[i+1].text;
+ fullVerlauf[i+1] = fullVerlauf[i];
+ }
+ }
+
+ if (msg.length > maxPreview) // Vorschau zuschneiden
+ pre = msg.slice(0, maxPreview-3) + "...";
+ else
+ pre = msg;
+
+ if (verlaufOrder) // pos = Position des neuen Eintrags
+ pos = maxVerlauf-1;
+ else
+ pos = 0
+
+ document.verlaufform.verlauf.options[pos+1].text = pre; // Neue Vorschau anfügen
+ fullVerlauf[pos] = msg; // Neuen Eintrag an den Verlauf anfügen
+
+// document.verlaufform.verlauf.selectedIndex = maxVerlauf; // Fokus auf den letzten Eintrag
+ document.verlaufform.verlauf.selectedIndex = 0; // Fokus auf den ersten Eintrag (Überschrift)
+}
+
+function msgBlur()
+{
+ userNotFocused = true;
+ userAwayTime = 0;
+ userAway = false;
+}
+
+function msgFocus()
+{
+ userNotFocused = false;
+ if (userAway) // Wird ausgeführt, falls User 'Away' war
+ {
+ ; // nop
+ }
+ userAwayTime = 0;
+ userAway = false;
+}
+
+function checkInterval()
+{
+// status = "userNotFocused=" + userNotFocused + "; userAway=" + userAway + "; userAwayTime=" + userAwayTime + ""; // Debug
+ if (userNotFocused)
+ {
+ userAwayTime += 5; // Addiere 5, da nur alle 5Sek ausgeführt
+ if (!userAway)
+ {
+ if (autoAwayTimeout < userAwayTime) // Falls Zeit abgelaufen
+ {
+ if (document.inf.tmp.value != "away")
+ open ("mail.pl?alias=$alias&tmpid=$tmpid&msg=/away&col=$col&room=$room&tmp=autoaway","reload"); // 'Away' setzen
+ userAway = true;
+ }
+ }
+ else
+ {
+ if (autoQuitTimeout < userAwayTime) // Falls Zeit abgelaufen
+ {
+ open ("mail.pl?alias=$alias&tmpid=$tmpid&msg=/q&room=$room&tmp=autologout","reload"); // Chat beenden
+ }
+ }
+ }
+
+ window.setTimeout("checkInterval()",5000); // In 5 Sekunden wieder aufrufen
+}
+
+function initFrame()
+{
+ window.setTimeout("checkInterval()",5000); // In 5 Sekunden aufrufen
+ document.inf.msg.focus(); // Eingabefeld fokusieren
+}
+//-->
+</script>
+$style
+</head>
+<body class="blank" onload="initFrame();">
+ <div align="left">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td>
+ <form name="inf" target="reload" action="main.pl" onsubmit="return delout();">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="room" value="$room">
+ <input type="hidden" name="col" value="$col">
+ <input type="hidden" name="secol" value="$secol">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="whisper" value="$whisper">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input size="50" name="msg" onBlur="msgBlur();" onFocus="msgFocus();">
+ </form>
+ </td>
+ <td><form name="verlaufform">
+ <script language="JavaScript"><!--
+ document.write("<select size='1' name='verlauf' size='40' onChange='CheckAuswahl();'>");
+ document.write("<option value>- Nachrichten-Verlauf -</option>");
+ for(i=0; i<maxVerlauf; i++) // Leere Verlaufsfelder generieren
+ document.write("<option value>(leer)</option>");
+ document.write("</select>");
+ //-->
+ </script>
+ </form>
+ </td>
+ </tr>
+ </table>
+ </div>
+</body>
+</html>
+END
diff --git a/0.4.7a2/main.pl b/0.4.7a2/main.pl
new file mode 100644
index 0000000..9df9619
--- /dev/null
+++ b/0.4.7a2/main.pl
@@ -0,0 +1,912 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header();
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+&secure_checkid($alias);
+$room = $q->param("room");
+$col = $q->param("col");
+$secol = $q->param("secol");
+$tmp = $q->param("tmp");
+$rmsg = \$q->param("msg");
+$whisper = $q->param("whisper");
+
+&reload_html("","change_colors") if ($q->param('var') eq "change_colors");
+
+if ($tmp eq "away") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat sich zurück gemeldet ... </font></i>");
+}
+
+$$rmsg =~ s#<#&lt\;#g;
+if (substr($$rmsg,0,1) ne "/") {
+ open(MSGFILE,">>data/msgs/$room");
+ open(PID,"<data/online/pids/$room");
+ print MSGFILE "!<;".time."<;!<;!<;<b><font color=$col>$alias: <font color=$secol>$$rmsg</font></font></b><;\n";
+ my @pids = <PID>;
+ close MSGFILE;
+ close PID;
+ kill INT => @pids;
+ &log("<b><font color=$col>$alias: <font color=$secol>$$rmsg</font></font></b>") if ($room eq "Cyberbar");
+ &reload_html($whisper,$tmp);
+} else {
+ &cmd($$rmsg);
+}
+
+sub reload_html { # Wird neugeladen, wenn eine Nachricht getextet wird!
+ my ($whisper,$action) = @_;
+ print "<html><head><script language=\"JavaScript\">";
+ if ($action eq "change_room") {
+ print "open(\"online.pl?alias=$alias&room=$room&tmpid=$tmpid\",\"online\");";
+ print "parent.input.document.inf.room.value = \"$room\";";
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol&tmpid=$tmpid\",\"menu\");";
+ } elsif ($action eq "change_colors") {
+ print "parent.input.document.inf.col.value = \"$col\";";
+ print "parent.input.document.inf.secol.value = \"$secol\";";
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol&tmpid=$tmpid\",\"menu\");";
+ } elsif ($action eq "whisper") {
+ print "parent.input.document.inf.whisper.value = \"$whisper\";";
+ } elsif ($action eq "away") {
+ print "parent.input.document.inf.tmp.value = \"away\";";
+ } elsif ($action eq "quit") {
+ print "open(\"index.pl?tmp=quit\",\"_top\");";
+ }
+ print "parent.input.document.inf.tmp.value = \"notaway\";" if ($tmp eq "away");
+ print "</script></head><body bgcolor=$col>";
+ print
+ $q->end_html;
+}
+
+sub change_room { # Den Chat-Raum wechseln
+ my ($method,$newroom,$oldroom,$alias2follow) = @_;
+ open(RSTAT, "<data/online/rstat/$newroom"); #Überprüfen, ob Alias Raum betreten darf
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ if ($rstat[0] eq "1\n") {
+ &hierachie($alias);
+ if ($hierachie eq "wa" || $hierachie eq "ow") { } else {
+ &post_prv($alias,"<font size=2 color=ffffff>Der Raum \"<font color=ffa500>$newroom</font>\" ist leider abgesperrt!</font>");
+ &reload_html($whisper,$action);
+ exit;
+ }
+ }
+ open(MSGFILE,">>data/msgs/$room");
+ print MSGFILE "$alias<;".time."<;cr<;$newroom<;!<;\n";
+ close MSGFILE;
+ $room = $oldroom;
+ my $tmpstamp = time+5;
+ &zeit;
+ if ($method eq "j") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias wechselt in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias kommt aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ open(MSGFILE,">>data/msgs/$room");
+ print MSGFILE "$alias<;$tmpstamp<;!<;!<;<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>Du wechselst aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i><;\n";
+ close MSGFILE;
+ } elsif ($method eq "ju") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias folgt \"$alias2follow\" in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias kommt aus dem Raum \"$oldroom\" und folgt \"$alias2follow\" herein nach \"$newroom\" ...</font></i>");
+ open(MSGFILE,">>data/msgs/$room");
+ print MSGFILE "$alias<;$tmpstamp<;!<;!<;<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>Du folgst \"$alias2follow\" aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i><;\n";
+ close MSGFILE;
+ }
+ open(PID,"<data/online/pids/$room");
+ my @pids = <PID>;
+ close PID;
+ kill INT => @pids;
+ unlink("data/online/rooms/$oldroom/$alias");
+ &rm_rstat($alias,$oldroom);
+ &check_online;
+}
+
+sub prove_besetzer { # Prüfen, ob Benutzer Raumbesetzerrechte hat
+ my ($r_alias,$r_room) = @_;
+ $r_besetzer = "false";
+ open(DATEI,"<data/online/rstat/$r_room");
+ @r_stat = <DATEI>;
+ close DATEI;
+ for($i=2;$i<=$#r_stat;$i++) {
+ $r_besetzer = "true" if ($r_stat[$i] eq $r_alias || $r_stat[$i] eq $r_alias."\n");
+ }
+}
+
+sub cmd { # Alle Chatbefehle, die über input_html eingegeben werden können.
+ $_[0] = $_[0]." ";
+ $_[0] = substr($_[0], 1, length($_[0])-1);
+ my @cmd = split(/ /, $_[0]);
+ my $cmd = substr($_[0],0 , index($_[0], " "));
+#############>- NORMALE CHATBEFEHLE ( Alphabetisch sortiert ) -<
+#############>- INFORMATIONEN ÜBER DAS SYSTEM AUSGEBEN -<
+ if ($cmd eq "about") {
+ &post_prv("$alias","<font size=2 color=ffffff>Aktuelle Version ist $title und wurde am $datum aktuallisiert. Erstellt von Paul C. Bütow (2000 - 2001).</font>");
+ &reload_html;
+ exit;
+#############>- ABMELDEN MIT 'AWAY-NACHRICHT' -<
+ } elsif ($cmd eq "away") {
+ if ($tmp eq "away") { # Falls 2 mal hintereinander /away eingegeben wurde
+ my $away_msg = undef;
+ }
+ for ($i=1; $i <= $#cmd; $i++) {
+ $away_msg = $away_msg." ".$cmd[$i];
+ }
+ &zeit;
+ if ($tmp ne "autoaway") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias meldet sich ab (<font color=red>$away_msg</font> ) ...</i></font>");
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias wurde vom System abgemeldet ...</i></font>");
+ }
+ &reload_html($whisper,"away");
+ exit;
+#############>- EIGENEN CHATBILDSCHIRM LÖSCHEN -<
+ } elsif ($cmd eq "clear") {
+ &post_prv($alias,"<script language=\"JavaScript\">window.open(\"push.pl?alias=$alias&room=$room&var=clear_screen&tmpid=$tmpid\",\"main\");</script>");
+ &reload_html;
+ exit;
+#############>- FARBEN WECHSELN -<
+ } elsif ($cmd eq "col") {
+ $col = $cmd[1];
+ my $tmpsecol = $cmd[2];
+ if ($tmpsecol eq "") {
+ $secol = $col
+ } else {
+ $secol = $tmpsecol;
+ }
+ open(OPTIONS,"<data/user/options/$alias");
+ my @options = <OPTIONS>;
+ close OPTIONS;
+ open(OPTIONS,">data/user/options/$alias");
+ print OPTIONS $options[0]."".$col."\n".$secol;
+ close OPTIONS;
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat die Farbe gewechselt ...</font></i>");
+ &reload_html($whisper,"change_colors");
+ exit;
+#############>- AKTUELLES DATUM UND URZEIT AUSGEBEN -<
+ } elsif ($cmd eq "date") {
+ &zeit;
+ &post_prv("$alias","<font size=2 color=ffffff>Heute ist der $day.$month. Jahr $year. Es ist genau $hours:$min Uhr und $sec Sekunden.</font>");
+ &reload_html;
+ exit;
+#############>- EINEN NEUEN RAUM ERSTELLEN BZW. IN EINEN BESTEHENDEN RAUM WECHSELN -<
+ } elsif ($cmd eq "j") {
+ &change_room("j",$cmd[1],$room);
+ &reload_html($whisper,"change_room");
+ exit;
+#############>- HANDELN -<
+ } elsif ($cmd eq "me" || $cmd eq "m") {
+ my $me_msg;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $me_msg = $me_msg." ".$cmd[$i];
+ }
+ if ($cmd eq "m") {
+ &post($room,"<i><font color=$col>$alias <font color=$secol>$me_msg</font></font></i>");
+ } else {
+ &post($room,"<i><font color=$col>$alias $me_msg</font></i>");
+ }
+ &reload_html;
+ exit;
+#############>- MEMO SCHREIBEN -<
+ } elsif ($cmd eq "memo") {
+ my $alias2memo = $cmd[1];
+ if(-f "data/user/options/$alias2memo") {
+ my $memo_msg;
+ for ($i=2; $i <= $#cmd; $i++) {
+ $memo_msg = $memo_msg." ".$cmd[$i];
+ }
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2memo <font color=ffffff>wurde folgende memo erfolgreich hinterlassen: $memo_msg</font></font>");
+ &zeit;
+ open(MEMO,">>data/user/memos/$alias2memo") || &error("Konnte >>data/user/memos/$alias2memo nicht öffnen");
+ print MEMO "<font size=2 color=ffffff>($day.$month. - $hours:$min:$sec) <font color=ffa500>$alias</font> hat Dir eine Memo hinterlassen: <font color=ffa500>$memo_msg</font></font><br>\n";
+ close MEMO;
+ &reload_html;
+ exit;
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2memo <font color=ffffff>existiert in der Datenbank nicht !</font></font>");
+ &reload_html;
+ exit;
+#############>- FLÜSTERN ( Auch mit '/' ) -<
+ } elsif ($cmd eq "msg" || $cmd eq "") {
+ my ($alias2post,$msg2post,$action) = ($cmd[1]);
+ if ($cmd eq "msg") {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ $action = "whisper";
+ } else {
+ $alias2post = $whisper;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ }
+ if (-f "data/online/users/$alias2post") {
+ &post_prv($alias2post,"<i><font color=$col>$alias flüstert <font color=ffffff>=></font><font color=$secol>$msg2post</font></font></i>");
+ &post_prv($alias,"<i><font color=$col>Zu $alias2post geflüstert <font color=ffffff>=></font><font color=$secol>$msg2post</font></font></i>");
+ &reload_html($alias2post,$action);
+ exit;
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2post <font color=ffffff>ist momentan nicht anwesend !</font></font>");
+ &reload_html;
+ exit;
+#############>- TOTALONLINEZEIT VON ALIAS ANZEIGEN -<
+ } elsif ($cmd eq "online") {
+ my $alias2prove= $cmd[1];
+ if (-f "data/user/options/$alias2prove") {
+ open(ONLINE,"<data/user/counts/$alias2prove.online");
+ my $online = <ONLINE>;
+ close ONLINE;
+ my $totaltime = sprintf("%.2f",($online / 60));
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff> war insgesamt schon $totaltime Minuten online!</font></font>");
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff>existiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+ &reload_html;
+ exit;
+#############>- DAS SYSTEM VERLASSEN -<
+ } elsif ($cmd eq "q") {
+ &reload_html($whisper,"quit");
+ &zeit;
+ if ($tmp ne "autologout") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias verläßt den Chat ... </font></i>");
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias wurde vom System automatisch ausgeloggt ... </font></i>");
+ }
+ sleep 1;
+ &rm_alias($alias,$room);
+ exit;
+#############>- DAS EIGENE GÄSTEBUCH LÖSCHEN -<
+ } elsif ($cmd eq "rmgb") {
+ unlink("data/user/gbooks/$alias");
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias löscht sein gesamtes Gästebuch ...</font></i>");
+ &reload_html;
+ exit;
+#############>- SCHREIEN -<
+ } elsif ($cmd eq "s") {
+ my $msg2scream;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2scream = $msg2scream." ".$cmd[$i];
+ }
+ my $msg2post = "\U$msg2scream";
+ &post($room,"<font color=$col><i>$alias schreit:</i> <b><font color=$secol>".$msg2post."</font></font></b>");
+ &reload_html;
+ exit;
+#############>- SEHEN, WANN SICH ALIAS ZUM LETZTEN MAL EINGELOGT HAT -<
+ } elsif ($cmd eq "seen") {
+ my $alias2prove = $cmd[1];
+ if (-f "data/user/options/$alias2prove") {
+ if (-f "data/user/lastlogin/$alias2prove") {
+ open(LASTLOGIN,"<data/user/lastlogin/$alias2prove");
+ local $lastlogin = <LASTLOGIN>;
+ close LASTLOGIN;
+ local $timestamp = sprintf("%.2f",((time() - $lastlogin) / 3600));
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff> hat sich vor $timestamp Stunden zuletzt in das System eingelogt!</font></font>");
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff> hat sich seit der Einführung dieses Befehls noch nie eingelogt!</font></font>");
+ }
+ } else {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2prove <font color=ffffff> exsistiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+ &reload_html;
+ exit;
+#############>- ANZEIGEN WER SICH IM AKTUELLEN RAUM BEFINDET -<
+ } elsif ($cmd eq "w") {
+ open(RSTAT,"data/online/rstat/$room");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ chomp($rstat[1]);
+ my $theme = "Raumthema:".$rstat[1] if ($rstat[1] ne undef);
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ my ($is,$nr) = ("t",0);
+ opendir(DIR,"data/online/rooms/$room");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ my $personen;
+ foreach(@dir) {
+ if (-f "data/online/rooms/$room/$_") {
+ $personen = $personen." ".$_;
+ $nr++;
+ }
+ }
+ &post_prv($alias,"<font size=2 color=ffffff>Der aktuelle Raum: $room $theme $door ($nr) : <font color=ffa500>$personen</font></font>");
+ &reload_html;
+ exit;
+#############>- ANZEIGEN WER SICH IM SYSTEM BEFINDET -<
+ } elsif ($cmd eq "wc" || $cmd eq "wc/") {
+ my $raum = $cmd[1];
+ my $personen;
+ if ($raum eq "" && $cmd eq "wc") {
+ opendir(USERS,"data/online/users");
+ my @users = readdir(USERS);
+ close USERS;
+ foreach(@users) {
+ $personen = $personen." ".$_ if (-f "data/online/users/$_");
+ }
+ my $nr = ($#users-1);
+ my ($nrs,$is) = ("","ist");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "sind";
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>$nr Person$nrs $is insgesamt eingelogt: <font color=ffa500>$personen</font></font>");
+ } elsif ($raum eq "" && $cmd eq "wc/") {
+ my $msg2post;
+ opendir(DIR,"data/online/rooms");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ opendir(DIR,"data/online/rooms/$_");
+ my @dir2 = readdir(DIR);
+ closedir(DIR);
+ open(RSTAT,"<data/online/rstat/$_");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ chomp($rstat[1]);
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ my $nr = $#dir2-1;
+ $msg2post = $msg2post."<tr><td><b><font size=2 color=ffffff>$_ $door ($nr) [".$rstat[1]."]: </font></b></td></tr><tr><td><font size=2 color=ffa500>";
+ foreach $chatter (@dir2) {
+ if (-f "data/online/rooms/$_/$chatter") {
+ $msg2post = $msg2post."$chatter ";
+ }
+ }
+ print "</font></td>";
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>Folgende Räume sind offen:</font><table>$msg2post</table>");
+ } elsif ($raum ne "") {
+ my $personen;
+ opendir(DIR,"data/online/rooms/$raum");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/rooms/$raum/$_");
+ }
+ my ($nr,$is) = (($#dir-1),"t");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "n";
+ }
+ &post_prv($alias,"<font size=2 color=ffffff> $nr Person$nrs befinde$is sich im Raum \"$raum\": <font color=ffa500>$personen</font></font>");
+ }
+ &reload_html;
+ exit;
+#############>- ANZEIGEN IN WELCHEN RAUM SICH JMD. BEFINDET BZW. JMD IN EINEN RAUM FOLGEN -<
+ } elsif ($cmd eq "wj" || $cmd eq "ju") {
+ my $alias2search = $cmd[1];
+ opendir(ROOMS,"data/online/rooms");
+ my @dir = readdir(ROOMS);
+ closedir(ROOMS);
+ foreach $raum (@dir) {
+ opendir(DIR2,"data/online/rooms/$raum");
+ my @dir2 = readdir(DIR2);
+ closedir(DIR2);
+ foreach $user (@dir2) {
+ if (-f "data/online/rooms/$raum/$user") {
+ if ($user eq $alias2search) {
+ if ($cmd eq "wj") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2search <font color=ffffff>befindet sich im Raum \"$raum\" !</font></font>");
+ } else {
+ &change_room("ju",$raum,$room,$alias2search);
+ }
+ &reload_html($whisper,"change_room");
+ exit;
+ }
+ }
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2search <font color=ffffff> ist nicht eingelogt !</font></font>");
+ &reload_html;
+ exit;
+#############>- RAUMNESETZER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- RAUM ABSCHLIESSEN/AUFSCHLIESSEN -<
+ } elsif ($cmd eq "l") {
+ &prove_besetzer($alias,$room);
+ &hierachie($alias);
+ if ($r_besetzer eq "true" || $hierachie eq "wa" || $hierachie eq "ow") {
+ my $lock = "0\n";
+ &zeit;
+ if ($room eq "Cyberbar") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum ohne Erfolg ab ...</font></i>");
+ } else {
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum ab ...</font></i>");
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum auf ...</font></i>");
+ }
+ for ($i=1;$i<=$#r_stat;$i++) {
+ $lock = $lock.$r_stat[$i];
+ }
+ open(RSTAT,">data/online/rstat/$room");
+ print RSTAT $lock;
+ close RSTAT;
+ }
+ }
+ &reload_html;
+ exit;
+#############>- RAUMBESETZER ERNENNEN -<
+ } elsif ($cmd eq "su") {
+ &prove_besetzer($alias,$room);
+ &hierachie($alias);
+ if ($r_besetzer eq "true" || $hierachie eq "wa" || $hierachie eq "ow") {
+ my $alias2su = $cmd[1];
+ opendir(DIR,"data/online/rooms/$room");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ if ($_ eq $alias2su) {
+ open(DATEI,"<data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ &hierachie($alias2su);
+ &prove_besetzer($alias2su,$room);
+ if ($r_besetzer eq "true" || $hierachie eq "wa" || $hierachie eq "ow") {
+ &reload_html;
+ &post_prv($alias,"<font color=ffa500>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist bereits RB, WÄ oder OW)</font>");
+ exit;
+ }
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias ernennt \"$alias2su\" zum Raumbesetzer ...</font></i>");
+ open(DATEI,">>data/online/rstat/$room");
+ print DATEI $alias2su."\n";
+ close DATEI;
+ &reload_html;
+ exit;
+ }
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist nicht anwesend)</font>");
+ }
+ &reload_html;
+ exit;
+#############>- RAUMBESETZER ENTNENNEN -<
+ } elsif ($cmd eq "rsu") {
+ &prove_besetzer($alias,$room);
+ &hierachie($alias);
+ if ($r_besetzer eq "true" || $hierachie eq "wa" || $hierachie eq "ow") {
+ my $alias2rsu = $cmd[1];
+ open(DATEI,"<data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ &prove_besetzer($alias2rsu,$room);
+ if ($r_besetzer eq "true") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias entzieht \"$alias2rsu\" die Raumbesetzerrechte ...</font></i>");
+ my $newrstat = $rstat[0].$rstat[1];
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $newrstat = $newrstat.$r_stat[$i] if ($r_stat[$i] ne $alias2rsu."\n");
+ }
+ open(DATEI,">data/online/rstat/$room");
+ print DATEI $newrstat;
+ close DATEI;
+ } else {
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2rsu <font color=ffffff>ist kein Raumbesetzer und kann dieser Status auch nicht aberkannt werden !</font></font>");
+ }
+ }
+ &reload_html;
+ exit;
+#############>- RAUM EIN THEMA GEBEN -<
+ } elsif ($cmd eq "t") {
+ &prove_besetzer($alias,$room);
+ &hierachie($alias);
+ if ($r_besetzer eq "true" || $hierachie eq "wa" || $hierachie eq "ow") {
+ my $theme;
+ &zeit;
+ if ($cmd[1] ne undef) {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $theme = $theme." ".$cmd[$i];
+ }
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias gibt dem Raum das Thema (<font color=red> $theme </font>) ...</font></i>");
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias löscht das Thema des Raums ...</font></i>");
+ }
+ $theme = $r_stat[0].$theme."\n";
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $theme = $theme.$r_stat[$i];
+ }
+ open(RSTAT,">data/online/rstat/$room");
+ print RSTAT $theme;
+ close RSTAT;
+ }
+ &reload_html;
+ exit;
+#############>- SUPERUSER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- ALIAS VERBANNEN -<
+ } elsif ($cmd eq "ban") {
+ &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $alias2ban = $cmd[1];
+ open(BAN,"<data/ban");
+ my @ban = <BAN>;
+ close BAN;
+ if ($cmd[1] eq undef) {
+ my $banned;
+ local $nr = @ban;
+ for ($i=0;$i<=$#ban;$i++) {
+ $banned .= $ban[$i];
+ }
+ &post_prv("$alias","<font size=2 color=ffffff>Folgende Benutzer sind verbannt [$nr]: <font color=ffa500>$banned</font></font>");
+ &reload_html;
+ exit;
+ } elsif (-f "data/user/options/$alias2ban") {
+ &hierachie($alias2ban);
+ if ($hierachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2ban <font color=ffffff>ist Wächter und kann nicht verbannt werden!</font></font>");
+ &reload_html;
+ exit;
+ } elsif ($hierachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2ban <font color=ffffff>ist Oberwächter und kann nicht verbannt werden!</font></font>");
+ &reload_html;
+ exit;
+ }
+ foreach $ban (@ban) {
+ if ($ban eq $alias2ban."\n") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2ban <font color=ffffff>ist bereits verbannt!</font></font>");
+ &reload_html;
+ exit;
+ }
+ }
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias verbannt \"$alias2ban\" aus dem Chat ...</font></i>");
+ open(BAN,">>data/ban");
+ print BAN $alias2ban."\n";
+ close BAN;
+ &reload_html;
+ exit;
+ }
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2ban <font color=ffffff>kann nicht verbannt werden da Benutzername nicht existiert!</font></font>");
+ &reload_html;
+ exit;
+ }
+#############>- ALIAS ENTBANNEN -<
+ } elsif ($cmd eq "rban") {
+ &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $alias2rban = $cmd[1];
+ open(BAN,"<data/ban");
+ @ban = <BAN>;
+ close BAN;
+ foreach $ban (@ban) {
+ if ($ban eq $alias2rban."\n") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias entbannt \"$alias2rban\" ...</font></i>");
+ my @ban2;
+ foreach $ban (@ban) {
+ push(@wa2,$wa) if ($ban ne $alias2rban."\n");
+ }
+ open(BAN,">data/ban");
+ print BAN @ban2;
+ close BAN;
+ &reload_html;
+ exit;
+ }
+ }
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2rban <font color=ffffff>ist nicht verbannt!</font></font>");
+ &reload_html;
+ exit;
+ }
+#############>- IP # VON ALIAS ANZEIGEN LASSEN -<
+} elsif ($cmd eq "ip") {
+ &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $alias2prove = $cmd[1];
+ opendir(DIR,"data/online/ident");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ if ($_ eq $alias2prove) {
+ open(DATEI,"<data/online/ident/$alias2prove");
+ local $ipnr = <DATEI>;
+ close DATEI;
+ chomp($ipnr);
+ &post_prv("$alias","<font size=2 color=ffa500>$_ <font color=ffffff>hat die IP-Nummer $ipnr !</font></font>");
+ }
+ }
+ }
+ &reload_html;
+ exit;
+#############>- ALIAS AUS DEM CHAT KATAPULTIEREN -<
+ } elsif ($cmd eq "k") {
+ &hierachie($alias);
+ if ($hierachie eq "wa" || $hierachie eq "ow") {
+ my $alias2kick = $cmd[1];
+ opendir(DIR,"data/online/rooms");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach $raum (@dir) {
+ opendir(DIR,"data/online/rooms/$raum");
+ my @dir2 = readdir(DIR);
+ closedir(DIR);
+ foreach $chatter (@dir2) {
+ if ($chatter eq $alias2kick) {
+ &hierachie($alias2kick);
+ if ($hierachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist Oberwächter und kann nicht \"gekickt\" werden !</font></font>");
+ } elsif ($hierachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist Wächter und kann nicht \"gekickt\" werden !</font></font>");
+ } else {
+ &post_prv("$alias2kick","<script language=\"JavaScript\">window.open(\"index.pl?tmp=kick\",\"_top\");</script>");
+ &zeit;
+ $_ = undef if ($room eq $raum);
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias katapultiert \"$alias2kick\" aus dem Chat ...</font></i>",$raum);
+ &rm_alias($alias2kick,$raum);
+ &check_online;
+ }
+ &reload_html;
+ exit;
+ }
+ }
+ }
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2kick <font color=ffffff> ist nicht anwesend und kann nicht \"gekickt\" werden !</font></font>");
+ }
+ &reload_html;
+ exit;
+#############>- EINEN BENUTZER AUS DEM SYSTEM LÖSCHEN -<
+ } elsif ($cmd eq "kill") {
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ my $alias2kill = $cmd[1];
+ &hierachie($alias2kill);
+ if ($hierachie eq "ow") {
+ &post_prv($alias,"<font size color=ffa500>$alias2kill</font> <font color=ffffff>ist Oberwächter und kann nicht aus dem System entfernt werden !</font>");
+ } elsif ($hierachie eq "wa") {
+ &post_prv($alias,"<font size color=ffa500>$alias2kill</font> <font color=ffffff>ist Wächter und kann nicht aus dem System entfernt werden !</font>");
+ } else {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias killt \"$alias2kill\" ganz und gar aus dem System ...</font></i>");
+ unlink("data/user/options/$alias2kill");
+ unlink("data/user/profiles/$alias2kill");
+ unlink("data/user/gbooks/$alias2kill");
+ unlink("data/user/counts/$alias2kill");
+ unlink("data/user/counts/$alias2kill.online");
+ unlink("data/user/lastlogin/$alias2kill");
+ unlink("data/user/memos/$alias2kill");
+ }
+ }
+ &reload_html;
+ exit;
+#############>- EINEN ANDEREN RAUM AUF-/ABSPERREN -<
+ } elsif ($cmd eq "sl") {
+ &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $sl_room = $cmd[1];
+ if (-e "data/online/rooms/$sl_room") {
+ my $lock = "0\n";
+ &zeit;
+ open(RSTAT,"<data/online/rstat/$sl_room");
+ my @r_stat = <RSTAT>;
+ close RSTAT;
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum \"$sl_room\" von aussen ab ...</font></i>",$sl_room);
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias sperrt den Raum \"$sl_room\" von aussen auf ...</font></i>",$sl_room);
+ }
+ for ($i=1;$i<=$#r_stat;$i++) {
+ $lock = $lock.$r_stat[$i];
+ }
+ open(RSTAT,">data/online/rstat/$sl_room");
+ print RSTAT $lock;
+ close RSTAT;
+ } else {
+ &post_prv($alias,"<font size=2 color=ffffff>Der Raum <font color=ffa500>$sl_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ exit;
+ }
+#############>- IN EINEN ANDEREN RAUM HINEINRUFEN -<
+ } elsif ($cmd eq "ss") {
+ &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $ss_room = $cmd[1];
+ if (-e "data/online/rooms/$ss_room") {
+ my $ss_msg;
+ for ($i=2; $i <= $#cmd; $i++) {
+ $ss_msg = $ss_msg." ".$cmd[$i];
+ }
+ my $msg2scream = "\U$ss_msg";
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias ruft aus dem Raum \"$room\" hinein in den Raum \"$ss_room\": <font color=$col>$msg2scream</font> ...</font></i>",$ss_room);
+ &reload_html;
+ exit;
+ } else {
+ &post_prv($alias,"<font size=2 color=ffffff>Der Raum <font color=ffa500>$ss_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ exit;
+ }
+#############>- EINEN ANDEREN RAUM EIN THEMA GEBEN -<
+ } elsif ($cmd eq "st") {
+ &hierachie($alias);
+ if ($hierachie eq "wa" || $hierachie eq "ow") {
+ my $st_room = $cmd[1];
+ if (-e "data/online/rooms/$st_room") {
+ my $theme;
+ &zeit;
+ if ($cmd[2] ne undef) {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $theme = $theme." ".$cmd[$i];
+ }
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias gibt dem Raum \"$st_room\" das Thema (<font color=red> $theme </font>) ...</font></i>",$st_room);
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias löscht das Thema des Raums \"$st_room\" ...</font></i>",$st_room);
+ }
+ open(RSTAT,"<data/online/rstat/$st_room");
+ my @r_stat = <RSTAT>;
+ close RSTAT;
+ $theme = $r_stat[0].$theme."\n";
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $theme = $theme.$r_stat[$i];
+ }
+ open(RSTAT,">data/online/rstat/$st_room");
+ print RSTAT $theme;
+ close RSTAT;
+ } else {
+ &post_prv($alias,"<font size=2 color=ffffff>Der Raum <font color=ffa500>$st_room</font> existiert nicht!</font></font>");
+ }
+ }
+ &reload_html;
+ exit;
+#############>- SYSTEMNACHRICHT IN ALLE BESTEHENDEN RÄUME POSTEN -<
+ } elsif ($cmd eq "sys") {
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ my $sys_msg;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $sys_msg = $sys_msg." ".$cmd[$i];
+ }
+ &zeit;
+ $sys_msg = "<i><font color=ffffff>($hours:$min:$sec)</font></i> <b><font size=2 color=red>SYSTEMNACHRICHT</font></b><i><font color=ffffff>: $sys_msg ...</font></i>";
+ opendir(ROOMS,"data/msgs");
+ my @rooms = readdir(ROOMS);
+ close(ROOMS);
+ foreach(@rooms) {
+ &post($_,$sys_msg);
+ }
+ &log($sys_msg);
+ }
+ &reload_html;
+ exit;
+#############>- ALIAS ZUM WÄCHTER ERNNENNEN -<
+ } elsif ($cmd eq "wa") {
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ my $alias2wa = $cmd[1];
+ &hierachie($alias2wa);
+ if ($hierachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2wa <font color=ffffff>ist bereits als Wächter eingetragen. Eine erneuerte Eintragung ist nicht möglich!</font></font>");
+ &reload_html;
+ exit;
+ } elsif ($hierachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2wa <font color=ffffff>ist bereits als Oberwächter eingetragen. Oberwächter können nicht gleichzeitig Wächter sein!</font></font>");
+ &reload_html;
+ exit;
+ }
+ if (-f "data/user/options/$alias2wa") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font><font color=ffa500> $alias ernennt \"$alias2wa\" zum Wächter ...</font></i>");
+ open(WA,">>data/wa");
+ print WA $alias2wa."\n";
+ close WA;
+ &reload_html;
+ exit;
+ }
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2wa <font color=ffffff>kann nicht zum Wächter ernannt werden da Benutzername nicht existiert!</font></font>");
+ &reload_html;
+ exit;
+ }
+#############>- ALIAS DIE WÄCHTERRECHTE ENTZIEHEN -<
+ } elsif ($cmd eq "rwa") {
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ my $alias2rwa = $cmd[1];
+ &hierachie($alias2rwa);
+ if ($hierachie eq "wa") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat \"$alias2rwa\" vom Wächter zum normalen Chatter degradiert ...</font></i>");
+ open(WA,"<data/wa");
+ @wa = <WA>;
+ close WA;
+ my @wa2;
+ foreach $wa (@wa) {
+ push(@wa2,$wa) if ($wa ne $alias2rwa."\n");
+ }
+ open(WA,">data/wa");
+ print WA @wa2;
+ close WA;
+ } else {
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2rwa <font color=ffffff>ist kein Wächter und können die Wächterrechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ exit;
+ }
+#############>- ADMINISTRATORBEFEHLE -<
+#############>- ALIAS ZUM OBERWÄCHTER ERNENNEN -<
+ } elsif ($cmd eq "ow" && $alias eq "Snooper") {
+ my $alias2ow = $cmd[1];
+ &hierachie($alias2ow);
+ if ($hierachie eq "wa") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2ow <font color=ffffff>ist bereits als Wächter eingetragen. Wächter können nicht gleichzeitig Oberwächter sein!</font></font>");
+ &reload_html;
+ exit;
+ } elsif ($hierachie eq "ow") {
+ &post_prv("$alias","<font size=2 color=ffa500>$alias2ow <font color=ffffff>ist bereits als Oberwächter eingetragen!</font></font>");
+ &reload_html;
+ exit;
+ }
+ if (-f "data/user/options/$alias2ow") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font><font color=ffa500> $alias ernennt \"$alias2ow\" zum Oberwächter ...</font></i>");
+ open(OW,">>data/ow");
+ print OW $alias2ow."\n";
+ close OW;
+ &reload_html;
+ exit;
+ }
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2ow <font color=ffffff>kann nicht zum Oberwächter ernannt werden da Benutzername nicht existiert!</font></font>");
+ &reload_html;
+ exit;
+#############>- ALIAS DIE OBERWÄCHTERRECHTE ENTZIEHEN -<
+ } elsif ($cmd eq "row" && $alias eq "Snooper") {
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ my $alias2row = $cmd[1];
+ &hierachie($alias2row);
+ if ($hierachie eq "ow") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat \"$alias2row\" vom Oberwächter zum normalen Chatter degradiert ...</font></i>");
+ open(OW,"<data/ow");
+ @ow = <OW>;
+ close OW;
+ my @ow2;
+ foreach $ow (@ow) {
+ push(@ow2,$ow) if ($ow ne $alias2row."\n");
+ }
+ open(OW,">data/ow");
+ print OW @ow2;
+ close OW;
+ } else {
+ &post_prv($alias,"<font size=2 color=ffa500>$alias2row <font color=ffffff>ist kein Oberwächter und können die Wächterrechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ exit;
+ }
+#############>- PASSWORD EINES BENUTZERS ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "pw" && $alias eq "Snooper") {
+ my $pw2show = $cmd[1];
+ if (-f "data/user/options/$pw2show") {
+ open(PW,"<data/user/options/$pw2show");
+ @pw = <PW>;
+ close PW;
+ &post_prv($alias,"<font size=2 color=ffa500>$pw2show <font color=ffffff> hat das Passwort \"".$pw[0]."\" !</font></font>");
+ &reload_html;
+ exit;
+ }
+ &post_prv($alias,"<font size=2 color=ffa500>$pw2show <font color=ffffff> existiert nicht in der Benutzerdatenbank !</font></font>");
+ &reload_html;
+ exit;
+#############>- SYSTEMMELDUNG POSTEN -<
+ } elsif ($cmd eq "cool" && $alias eq "Snooper" || $alias eq "Peacemaker") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$msg2post</font></i>");
+ &reload_html;
+ exit;
+#############>- ENDE DER CHATBEFEHLE -<
+ }
+&post_prv($alias,"<font size=2 color=ffffff>Der Chatbefehl <font color=ffa500>/$cmd</font> existiert nicht oder Du hast keine Berechtigung diesen Befehl auszuführen!</font></font>");
+&reload_html;
+} \ No newline at end of file
diff --git a/0.4.7a2/main2.pl b/0.4.7a2/main2.pl
new file mode 100644
index 0000000..36a0012
--- /dev/null
+++ b/0.4.7a2/main2.pl
@@ -0,0 +1,594 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header();
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+
+$var = $q->param("var");
+if ($var eq "list_alias_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &list_alias_html;
+} elsif ($var eq "alias_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $tmp = $q->param("tmp");
+ &alias_html;
+} elsif ($var eq "edit_profile_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ &edit_html("edit_profile_html");
+} elsif ($var eq "edit_options_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ &edit_html("edit_options_html");
+} elsif ($var eq "gb_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &gb_html;
+} elsif ($var eq "post_gb") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $msg = $q->param("msg");
+ $tmp = $q->param("tmp");
+ $id = $q->param("id");
+ &post_gb;
+} elsif ($var eq "edit_profile") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ &secure_checkid($alias);
+ &edit("edit_profile");
+} elsif ($var eq "edit_options") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $tmp = $q->param("tmp");
+ $id = $q->param("id");
+ $room = $q->param("room");
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ &edit("edit_options");
+} elsif ($var eq "rm_gb_alias") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $tmp = $q->param("tmp");
+ $id = $q->param("id");
+ &rm_gb;
+} else {
+ &error("Parameter fehlt");
+}
+
+###########################
+##HAUPTTEIL DIESER DATEI:##
+###########################
+
+sub gb_html { # Das Benutzerboard/Gästebuch.
+ my $message = $_[0];
+ &start_html("Benutzerboard");
+if ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </i>
+ einen Text und poste
+ <u>dann</u>
+ !
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Vielen Dank für Deinen Beitrag. Wenn Du willst, kannst Du jetzt gleich noch einen Eintrag posten ...
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Falls Du Anregungen oder Verbesserungsvorschläge für die Community hast, dann poste doch einen kleinen Eintrag :-)
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="guestbook">
+ <input type="hidden" name="id" value="y">
+ <input size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+ if (-e "data/guestbook") {
+ open (DATEI,"<data/guestbook") || &error("Konnte dat/guestbook nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ print
+ $q->div(@datei);
+ }
+ print
+ $q->end_html;
+}
+
+
+sub post_gb { # Wenn etwas in ein Gästebuch eingetragen wird
+ &zeit;
+ if ($msg eq "") {
+ if ($id eq "y") { # Überprüfen, ob Benutzerboard- oder Privatgästebuch
+ &gb_html("post_empty");
+ } else {
+ &alias_html("post_empty");
+ }
+ exit;
+ }
+ $msg =~ s#<#&lt\;#g;
+ my $tmpath = "";
+ if ($id eq "y") {
+ $tmpath = "data/guestbook";
+ } else {
+ $tmpath = "data/user/gbooks/$tmp";
+ }
+ open(GB,"$tmpath");
+ my @gb = <GB>;
+ close GB;
+ pop(@gb) if ($#gb > 99);
+ my @newdatei = "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ push(@newdatei,@gb);
+ open(GB,">$tmpath");
+ print GB @newdatei;
+ close GB;
+ if ($id eq "y") {
+ &gb_html("post_ok");
+ exit;
+ } else {
+ post_prv("$tmp","<font size=2 color=ffffff><a href=\"main2.pl?alias=$alias&var=alias_html&tmp=$tmp&tmpid=$tmpid\" target=\"_new\">$alias</a> hat soeben einen Pin in <a href=\"main2.pl?alias=$alias&var=alias_html&tmp=$tmp&tmpid=$tmpid\" target=\"_new\">Dein Profil</a> gehängt ... </font>");
+ &alias_html;
+ exit;
+ }
+}
+
+sub rm_gb { # Gästebucheintrag entfernen
+ open(GB,"<data/user/gbooks/$alias");
+ my @gbfile = <GB>;
+ close GB;
+ my @newgbfile = ();
+ for ($i=0; $i <= $#gbfile; $i++) {
+ push(@newgbfile,$gbfile[$i]) if ($i != $id);
+ }
+ open(GB,">data/user/gbooks/$alias");
+ print GB @newgbfile;
+ close GB;
+ &alias_html("rm_ok");
+}
+
+sub list_alias_html { # Liste aller Benutzer
+ &start_html("Alle Benutzer");
+ opendir(REGISTERED,"data/user/options");
+ my @users = readdir(REGISTERED);
+ closedir(REGISTERED);
+ my @liste = sort(@users);
+ my $nr = $#users-1;
+print <<END;
+ <div>
+ Es sind z.Z. genau $nr Benutzernamen in der Datenbank vorhanden! (Sortiert nach #, A-Z, a-z)
+ </div>
+ <hr>
+ <div>
+END
+ foreach(@liste) {
+ if (-f "data/user/options/$_") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid" },
+ "$_"),
+ " ";
+ }
+ }
+print <<END;
+ </div>
+</body>
+</html>
+END
+}
+
+sub alias_html { # Anzeigen eines Benutzerprofils
+ my $message = $_[0];
+ open(COUNTS,"<data/user/counts/$tmp");
+ local $counter = <COUNTS>;
+ close COUNTS;
+ $counter++;
+ open(COUNTS,">data/user/counts/$tmp");
+ print COUNTS $counter;
+ close COUNTS;
+ &start_html($tmp);
+print <<END;
+<div>
+ <a href="htdocs.pl?var=werda_html&alias=$alias&tmpid=$tmpid">Hier</a>
+ gehts zur Gesamtübersicht !
+</div>
+<hr>
+END
+if ($message eq "rm_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Der von Dir gewählte Eintrag wurde erfolgreich gelöscht.
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </u>
+ einen Text und poste
+ <u>dann</u>
+ !
+ <hr>
+END
+}
+ open(PROFILE,"<data/user/profiles/$tmp");
+ @data = <PROFILE>;
+ close PROFILE;
+print <<END;
+ <div>
+ Dieses Profil wurde insgesamt schon $counter mal aufgerufen !
+ <br>
+ <br>
+ Alias: $tmp
+ <br>
+ <br>
+ Nachname: $data[0]
+ <br>
+ <br>
+ Vorname: $data[1]
+ <br>
+ <br>
+ Alter: $data[2]
+ <br>
+ <br>
+ Wohnort: $data[3]
+ <br>
+ <br>
+ E-Mail:
+ <a href="mailto:$data[4]">$data[4]</a>
+ <br>
+ <br>
+ ICQ-Nummer: $data[5]
+ <br>
+ <br>
+ Homepage:
+ <a href="$data[6]" target="_new">$data[6]</a>
+ <br>
+ <br>
+ Weiteres:
+ <br>
+ $data[7]
+ <hr>
+ Hier kannst Du $tmp eine Nachricht hinterlassen!
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input type="text" size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+if (-e "data/user/gbooks/$tmp") {
+ open (DATEI,"<data/user/gbooks/$tmp") || &error("Konnte data/user/gbooks/$tmp nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ if ($alias ne $tmp) {
+ print @datei;
+ } else {
+print <<END;
+ <table>
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="rm_gb_alias">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="$tmp">
+END
+for($i=0; $i <= $#datei; $i++) {
+print <<END;
+ <tr>
+ <td>
+ <input type="radio" name="id" value="$i">
+ </td>
+ <td>
+ <div class=q>
+ $datei[$i]
+ </div>
+ </td>
+ </tr>
+END
+}
+print <<END;
+ </table>
+ <table>
+ <tr>
+ <td>
+ <font color=ffffff>
+ <input type="submit" value="Makierten Eintrag löschen">
+ </font>
+ </td>
+ <td>
+ <font color=ffffff>
+ <input type="reset" value="Makierung rückgängig machen">
+ </font>
+ </td>
+ </tr>
+ </table>
+ </form>
+END
+}
+}
+ print
+ $q->end_html;
+}
+
+sub edit_html { # Chat-Optionen / Benutzerprofil editieren
+ my ($method,$message) = @_;
+ &start_html("Benutzerprofil ändern");
+ if ($method eq "edit_options_html") {
+ open(DATEI,"<data/user/options/$alias");
+ } elsif ($method eq "edit_profile_html") {
+ open(DATEI,"<data/user/profiles/$alias");
+ }
+ @data = <DATEI>;
+ close DATEI;
+ if ($method eq "edit_options_html") {
+ chomp($data[0]);
+ if ($message eq "edit_options_ok") {
+print <<END;
+<script language="JavaScript">
+ open("main.pl?var=change_colors&alias=$alias&col=$col&secol=$secol&tmpid=$tmpid","reload");
+ open("htdocs.pl?var=menu_html&alias=$alias&room=$room&col=$col&secol=$secol&tmpid=$tmpid","menu");
+</script>
+<div class=b>
+ Hinweis:
+</div>
+<div>
+ Du hast soeben Deine Chat-Optionen erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren. Um
+ weiterzuchatten einfach Fenster schliessen!
+</div>
+<hr>
+END
+ } elsif ($message eq "edit_pw_wrong") {
+print <<END;
+<div class=b>
+ ACHTUNG!
+</div>
+<div>
+ Du hast soeben versucht, dein Passwort zu ändern. Jedoch stimmte die Erste Eingabe nicht mit der Zweiten überein.
+ Bitte versuch es erneuert ...
+</div>
+<hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Deine Chat-Optionen editieren!" ),
+ $q->hr;
+ }
+print <<END;
+<script lang="javascript" type="text/javascript">
+<!--
+
+function radioWert(rObj) {
+ for (var i=0; i<rObj.length; i++) if (rObj[i].checked) return rObj[i].value;
+ return false;
+}
+
+function insertcode( code ) {
+ document.optionen.elements[radioWert(document.optionen.eingabe)].value = code;
+}
+
+//-->
+</script>
+
+<form name="optionen" action="main2.pl">
+ <input type="hidden" name="var" value="edit_options">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Passwort
+ <font color=ffa500>
+ (Gut merken !!)
+ </font>
+ <br>
+ <input type="password" name="id" value="$data[0]">
+ </div>
+ </td>
+ <td width=20>
+ </td>
+ <td>
+ <div>
+ Geb hier das Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp" value="$data[0]">
+ </div>
+ </td>
+ </tr>
+ </table>
+<br>
+<br>
+ <table>
+ <tr>
+ <td>
+ <div>
+ <input type="radio" name="eingabe" value="col" checked>
+ Auswahl von Farbe 1
+ <br>
+ (Farbe Deines Nicks):
+ <br>
+ <input name="col" size="6" maxlength="6" value="$data[1]">
+ </div>
+ </td>
+ <td width=20>
+ </td>
+ <td>
+ <div>
+ <input type="radio" name="eingabe" value="secol">
+ Auswahl von Farbe 2
+ <br>
+ (Farbe Deiner Nachrichten):
+ <br>
+ <input name="secol" size="6" maxlength="6" value="$data[2]">
+ </div>
+ </td>
+ </tr>
+ </table>
+<br>
+ <div>
+ Beliebige Auswahl makieren und Farbe wählen. Um Deine Optionen abzuspeichern,
+ auf "Daten ändern" klicken!
+ </div>
+ <br>
+END
+ open(COLORS,"<colors.sno");
+ @colors = <COLORS>;
+ close COLORS;
+ print @colors;
+ } elsif ($method eq "edit_profile_html") {
+ if ($message eq "edit_profile_ok") {
+print <<END;
+ <div class=b>
+ Hinweis:
+ </div>
+ <div>
+ Du hast soeben Dein Profil erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren:
+ <hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Dein Profil editieren!" ),
+ $q->hr;
+ }
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="edit_profile">
+ <div>
+ Dein Nachname:
+ <br>
+ <input name="nachname" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ Dein Vorname:
+ <br>
+ <input name="vorname" value="$data[1]">
+ </div>
+ <br>
+ <div>
+ Dein Alter:
+ <br>
+ <input name="alter" value="$data[2]">
+ </div>
+ <br>
+ <div>
+ Dein Wohnort:
+ <br>
+ <input name="wohnort" value="$data[3]">
+ </div>
+ <br>
+ <div>
+ Deine E-Mail Adresse:
+ <br>
+ <input name="email" value="$data[4]">
+ </div>
+ <br>
+ <div>
+ Deine ICQ-Nummer:
+ <br>
+ <input name="icq" value="$data[5]">
+ </div>
+ <br>
+ <div>
+ Deine Homepage:
+ <br>
+ <input name="homepage" value="$data[6]">
+ </div>
+ <br>
+ <div>
+ Weiteres:
+ <br>
+ <textarea rows="5" cols="40"name="weiteres" wrap="virtual">$data[7]</textarea>
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <font color=ffffff>
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="room" value="$room">
+ <input type="submit" value="Daten ändern ...">
+ </font>
+ </form>
+</body>
+</html>
+END
+}
+
+
+sub edit { # Benutzerprofil od. Chat-Optionen abspeichern
+ my $method = $_[0];
+ &zeit;
+ if ($method eq "edit_profile") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffa500>$alias hat sein Profil geändert ...</font></i>");
+ open(PROFILE,">data/user/profiles/$alias");
+ print PROFILE $q->param('nachname')."\n".$q->param('vorname')."\n".$q->param('alter')."\n".$q->param('wohnort')."\n".$q->param('email')."\n".$q->param('icq')."\n".$q->param('homepage')."\n".$q->param('weiteres');
+ close PROFILE;
+ &edit_html("edit_profile_html","edit_profile_ok");
+ } elsif ($method eq "edit_options") {
+ if ($id ne $tmp) {
+ &edit_html("edit_options_html","edit_pw_wrong");
+ exit;
+ }
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat seine Chateinstellungen geändert ...</font></i>");
+ open(OPTIONS,">data/user/options/$alias");
+ print OPTIONS $id."\n".$col."\n".$secol;
+ close OPTIONS;
+ &edit_html("edit_options_html","edit_options_ok");
+ }
+}
diff --git a/0.4.7a2/online.pl b/0.4.7a2/online.pl
new file mode 100644
index 0000000..b6346c5
--- /dev/null
+++ b/0.4.7a2/online.pl
@@ -0,0 +1,71 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header();
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+$room = $q->param("room");
+
+&secure_checkid($alias);
+
+# Onlinezeit zählen !
+open(DATEI,"<data/online/users/$alias");
+ my $oldstamp = <DATEI>;
+close DATEI;
+ if ($oldstamp > (time - 60)) {
+ open(DATEI,"<data/user/counts/$alias.online");
+ my $online = <DATEI>;
+ close DATEI;
+ my $total = (time-$oldstamp+$online);
+ open(DATEI,">data/user/counts/$alias.online");
+ print DATEI $total;
+ close DATEI;
+ }
+##### ENDE
+
+&start_html("Online","online");
+&online($alias,$room);
+opendir(ROOMS,"data/online/rooms/".$room);
+ my @rooms = readdir(ROOMS);
+closedir(ROOMS);
+print
+ $q->div( "$room:" ),
+ "<font size=1 color=ffffef face=arial>";
+ foreach $online (@rooms) {
+ if (-f "data/online/rooms/$room/$online") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$online&tmpid=$tmpid",
+ -target=>"$online" }, "$online"), $q->br;
+ }
+ }
+print
+ "</font>",
+ $q->end_html;
+
+sub online { # Benutzer in die Onlineliste hinzufügen bzw. erneuern
+ my ($alias,$room) = @_;
+ open(DATEI,">data/online/users/$alias");
+ print DATEI time;
+ close DATEI;
+ if (-f "data/online/rooms/$room") { } else { mkdir "data/online/rooms/$room", 0777; }
+ if (-f "data/online/rstat/$room") { } else {
+ open(DATEI,">data/online/rstat/$room"); # Raumbesetzerstatus setzen
+ print DATEI "0\n\n$alias\n";
+ close DATEI;
+ }
+ open(DATEI,">data/online/rooms/$room/$alias");
+ print DATEI time;
+ close DATEI;
+ open(DATEI,"<data/online/prove"); # Räume und Chatter auf Existenz überprüfen
+ my $provetime = <DATEI>;
+ close DATEI;
+ if ($provetime < (time - 30)) {
+ &check_online;
+ }
+} \ No newline at end of file
diff --git a/0.4.7a2/push.pl b/0.4.7a2/push.pl
new file mode 100644
index 0000000..f8b8a78
--- /dev/null
+++ b/0.4.7a2/push.pl
@@ -0,0 +1,112 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+CGI->compile(':all');
+$q = new CGI;
+print
+ $q->header;
+require config;
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+&secure_checkid($alias);
+$room = $q->param("room");
+my $pid = $$;
+$| = 1;
+
+print <<END;
+<html>
+ <head>
+<script language="JavaScript">
+<!--
+// Scroll-Routine von Anklepper (http://www.anklepper.de)
+// speziell für yChat (http://www.yChat.de), Copyright 2000
+scrolling = true;
+moves_steps = 4; // Schrittgröße
+moves_interval = 4; // Schrittgeschwindigkeit
+
+function moves()
+{
+ if( scrolling != false )
+ window.scrollBy( 0, moves_steps );
+ window.setTimeout( "moves()", moves_interval );
+}
+
+moves();
+//-->
+</script>
+ </head>
+<body bgcolor=000000 link=FFFFFF alink=FFFFEF vlink=FFFFEF>
+<font size=1 color=ffffff face=arial>$title - Created & Copyright by Paul C. Bütow [PID: $pid]</font><br>
+END
+
+my $msgfile;
+
+
+if (-f "data/user/memos/$alias") {
+ open(MEMOS,"<data/user/memos/$alias");
+ my $memos = <MEMOS>;
+ close MEMOS;
+ print $memos;
+ unlink("data/user/memos/$alias");
+}
+
+my $startime,$change_room,@pids;
+$SIG{INT} = \&sendmsgs;
+OPENMSGFILE:
+$change_room = 0;
+$startime = time;
+
+if (-e "data/msgs/$room") {
+ open(MSGFILE,"<data/msgs/$room");
+ open(PID,">>data/online/pids/$room");
+ print PID $pid."\n";
+ close PID;
+} else {
+ sleep 1;
+ goto OPENMSGFILE;
+}
+
+&sendmsgs;
+
+while (-e "data/online/users/$alias") {
+ goto OPENMSGFILE if ($change_room == 1);
+ sleep 15;
+ print "<!--PING//-->\n";
+}
+
+sub sendmsgs {
+ for ($curpos = tell(MSGFILE); <MSGFILE>; $curpos = tell(MSGFILE)) {
+ my ($address, $stamp, $command, $action, $message) = split(/<;/, $_);
+ if ($address eq "!" || $address eq $alias) {
+ if ($stamp > $startime) {
+ if ($command eq "cr") {
+ &closepid;
+ $room = $action;
+ close MSGFILE;
+ $change_room = 1;
+ }
+ print "$message<br>\n" if ($change_room != 1);
+ }
+ }
+ }
+ seek(MSGFILE, $curpos, 0);
+}
+
+sub closepid {
+ @pids = undef;
+ open(PID,"<data/online/pids/$room");
+ @pids = <PID>;
+ close PID;
+ my @newpids = undef;
+ foreach(@pids) {
+ push @newpids,$_ if ($pid ne $_."\n");
+ }
+open(PID,">data/online/pids/$room");
+ print PID @newpids;
+ close PID;
+}
+
+&closepid; \ No newline at end of file
diff --git a/0.4.7a2/setup.sh b/0.4.7a2/setup.sh
new file mode 100644
index 0000000..6b3ef8a
--- /dev/null
+++ b/0.4.7a2/setup.sh
@@ -0,0 +1,50 @@
+#!/bin/sh
+echo
+echo yChat wird konfiguriert!
+echo
+mkdir data
+chmod 777 data
+mkdir data/logs
+chmod 777 data/logs
+mkdir data/msgs
+chmod 777 data/msgs
+mkdir data/user
+chmod 777 data/user
+mkdir data/user/counts
+chmod 777 data/user/counts
+mkdir data/user/memos
+chmod 777 data/user/memos
+mkdir data/user/options
+chmod 777 data/user/options
+mkdir data/user/profiles
+chmod 777 data/user/profiles
+mkdir data/user/gbooks
+chmod 777 data/user/gbooks
+mkdir data/user/lastlogin
+chmod 777 data/user/lastlogin
+mkdir data/online
+chmod 777 data/online
+mkdir data/online/rooms
+chmod 777 data/online/rooms
+mkdir data/online/pids
+chmod 777 data/online/pids
+mkdir data/online/rstat
+chmod 777 data/online/rstat
+mkdir data/online/users
+chmod 777 data/online/users
+mkdir data/online/ident
+chmod 777 data/online/ident
+chmod 777 data/htdocs/*
+chmod 777 *.pl
+chmod 777 config.pm
+mkdir dokus/
+mv *.txt dokus/
+mkdir ../../htdocs/yChat/
+mv *.gif ../../htdocs/yChat/
+mv *.swf ../../htdocs/yChat/
+
+echo
+echo yChat Setup beendet ...
+echo Created and Copyright by Paul C. Bütow
+echo
+
diff --git a/0.4.7a2/y.gif b/0.4.7a2/y.gif
new file mode 100644
index 0000000..356175d
--- /dev/null
+++ b/0.4.7a2/y.gif
Binary files differ
diff --git a/0.4.7a2/yIntro.swf b/0.4.7a2/yIntro.swf
new file mode 100644
index 0000000..81d9015
--- /dev/null
+++ b/0.4.7a2/yIntro.swf
Binary files differ
diff --git a/0.4.7a2/ySymbol.swf b/0.4.7a2/ySymbol.swf
new file mode 100644
index 0000000..2b899bb
--- /dev/null
+++ b/0.4.7a2/ySymbol.swf
Binary files differ
diff --git a/0.4.7a2/y_.gif b/0.4.7a2/y_.gif
new file mode 100644
index 0000000..f8b6ee5
--- /dev/null
+++ b/0.4.7a2/y_.gif
Binary files differ
diff --git a/0.4.8a2/CREDITS.txt b/0.4.8a2/CREDITS.txt
new file mode 100644
index 0000000..6f2a6cc
--- /dev/null
+++ b/0.4.8a2/CREDITS.txt
@@ -0,0 +1,30 @@
+########################### yChat.de CREDITS ################################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+Vielen Dank an alle Personen, dir mit geholfen haben ( und immernoch helfen )
+yChat besser zu machen:
+
+ - Andreas Buchwald aka Anklepper, für ...
+ ... die Programmierung des "Nach-UntenScroll-JavaScripts", des
+ "Nachrichten-Verlauf-JavaScripts" im Texteingabeframe.
+ ... die technische Umsetzung, daß sich das Inputframe bei jedem
+ Textposting nicht wieder reloadet.
+ ... ein nettes JavaScript, welches erlaubt, Formularwerte
+ frameübergreifend zu ändern.
+ ... die Erstellung der Flashanimationen.
+ ... die Programmierung der Auto-Away- und der Auto-Logout Funktion.
+ ( www.anklepper.de ).
+
+ - Dave aka Truhe, für ...
+ ... die Erstellung der Farbtabelle unter Chatoptionen inkl.
+ Auswähl-JavaScript!
+ ... die Erstellung einiger CSS.
+ ... die Unterstützung der Umsetzung der Auto-Away- und Auto-Logout
+ Funktion.
+ ( maligree.yi.org )
+
+ - Florian Bütow aka Coke, für die Programmierung des Top 20 Ranking Skripts
+ in PHP4 !
+
+ - Larry Wall, für die Erfindung von Perl ! \ No newline at end of file
diff --git a/0.4.8a2/README.txt b/0.4.8a2/README.txt
new file mode 100644
index 0000000..b67f15e
--- /dev/null
+++ b/0.4.8a2/README.txt
@@ -0,0 +1,24 @@
+############################## yChat.de README ##############################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+Allgemeine Bedingungen bezgl. yChat:
+
+ - Das yChat-System darf ohne Erleubnis des Autors nicht auf irgendeiner Art
+ und Weise weitergegeben- oder eingesetzt werden.
+
+ - Wird das yChat-System eingesetzt, so darf es manipuliert werden, soweit
+ die Copyright-Hinweise des Autors, die Versionsbezeichnung und der Link
+ auf der Startseite nach www.home.yChat.de unverändert bleibt.
+ Ansonsten darf der gesamte Code manipuliert werden.
+
+ - Wird das yChat-System erlaubter Weise manipuliert, so muß das veränderte
+ Skript auf Anforderung an den Autor weitergegeben werden. Dieser darf
+ die Veränderungen in das Standard-yChat-System integrieren.
+
+ - Wird das yChat-System eingesetzt, su muß dem Autor die Location bzw. die
+ URL bekanntgegeben werden. Diese mit einer URL wwX.yChat.de verlinkt.
+ Wobei X für die Nummer des jew. Servers steht.
+
+ - Es ist verboten, Sourcecode aus dem yChat-System zu kopieren und
+ für andere, nicht von yChat abhängige Perl-Programme einzusetzen. \ No newline at end of file
diff --git a/0.4.8a2/SETUP.txt b/0.4.8a2/SETUP.txt
new file mode 100644
index 0000000..19a6fbe
--- /dev/null
+++ b/0.4.8a2/SETUP.txt
@@ -0,0 +1,137 @@
+############################## yChat.de SETUP ###############################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+yChat findest Du im Internet unter der Adresse www.yChat.de. Bei Kritik,
+Anregungen oder Fragen bitte in das dort vorhandene Board posten oder eine
+E-Mail an die oben stehende Adresse senden. Ich bemühe mich, yChat so gut wie
+möglich zu machen und bin über Ratschläge immer sehr erfreut :-) ...
+
+Die Installation kann auf Unix-Systemen voll automatisch duchgeführt werden.
+Allerdings ist dafür ein Telnet-Zugang notwendig. Kopiere alle vorhandenen
+Dateien in das Verzeichnis cgi-bin/yChat und führe dann das Shellskript
+setup.sh mit dem Befehl ./setup.sh aus. Alle Verzeichnisse werden
+automatisch erstellt. Dies wurde allerdings nur auf SuSE Linux Systemen
+mit root-Zugriff getestet. Solltest Du ein anderes System verwenden oder
+den Chat auf einen virtuellen Webserver installieren wollen, dann mußt Du
+unter Umständen das Verzeichnis "../../htdocs/yChat" nach "../../yChat"
+in der setup.sh umbenennen. Ansonsten werden die dazugehörigen Grafikdateien
+falsch oder garnicht kopiert.
+
+Wenn Du keinen Telnet-Zugang hast, kannst Du hier die Verzeichnisse manuell
+einrichten:
+
+Folgende Basis-Dateien sind im Chat enthalten und müssen in das cgi-bin
+Verzeichnis kopiert werden. Z.B. nach ./cgi-bin/yChat/:
+
+config.pm => Configurationsdatei ("Shared subs")
+htdocs.pl => Generiert dynamische HTML-Inhalte
+index.pl => Startskript (Registrierung, Login, Chatframeset)
+input.pl => Skript für das Chateingabeframe
+main.pl => Hauptskript (Alle Hauptfunktionen des Chats)
+main2.pl => Skript für editieren der Benutzerdaten etc
+online.pl => Anzeige und Überprüfung der eingelogten Benutzer
+push.pl => Server-Push-Routine
+ranking.php4 => Dieses Skript erstellt die Top 20 Ranking-List
+setup.sh => Dient zur automatischen Einrichtung des Chats
+README.txt => Beinhaltet wichtige Informationen
+UPDATES.txt => Updateliste der verschiedenen Versionen
+CREDITS.txt => Personen, die geolfen haben yChat zu proggen
+SETUP.txt => Dieses Dokument
+colors.sno => Datei beinhaltet alle Farben in hex. für die Chatoptionen
+help.sno => Datei beinhaltet alle Chatbefehle
+
+Folgende Verzeichnisse müssen erstellt werden (chmod 777 sollte
+funktionieren):
+
+- Hier befinden sich alle für den Chat notwenidgen Daten:
+ ./cgi-bin/yChat/data/*
+
+- Hier befinden sich alle Logdateien, die vom Chat erstellt werden:
+ ./cgi-bin/yChat/data/logs/*
+
+- Hier befinden sich die Message-Dateien der eingelogten Benutzer:
+ ./cgi-bin/yChat/data/msgs/*
+
+- Hier befinden sich alle Daten der registrierten Benutzer:
+ ./cgi-bin/yChat/data/user/*
+
+- Hier wird abgespeichert, wie oft ein Benutzerprofil insgesant schon
+ aufgerufen wurde und wie lange die Chatter schon online waren:
+ ./cgi-bin/yChat/data/user/counts/*
+
+- Hier werden alle Memos abgespeichert.
+ ./cgi-bin/yChat/data/user/memos/*
+
+- Hier befinden sich alle Chat-Optionen und Passwörter der registrierten
+ Benutzer:
+ ./cgi-bin/yChat/data/user/options/*
+
+- Hier befinden sich alle Benutzerprofile der Benutzer:
+ ./cgi-bin/yChat/data/user/profiles/*
+
+- Hier befinden sich alle Gästebucheinträge der Benutzer:
+ ./cgi-bin/yChat/data/user/gbooks/*
+
+- Hier wird abgespeichert, wann der der jew. benutzer zum letzten mal das
+ System betreten hat.
+ ./cgi-bin/yChat/data/user/lastlogin/*
+
+- Hier befinden sich alle Daten zu den aktuellen Chaträumen und User die
+ online sind
+ ./cgi-bin/yChat/data/online/*
+
+- Hier befinden sich alle offnenen Räume
+ ./cgi-bin/yChat/data/online/rooms/*
+
+- Hier befinden sich die Chatter, die sich in den jew. Räumen befinden. Die
+ Verzeichnisse der Räume werden automatisch erstellt.
+ ./cgi-bin/yChat/data/online/rooms/RAUMNAME/*
+
+- Hier befinden sich alle PIDs (Process IDs) der Chatter in den jew. Räumen.
+ ./cgi-bin/yChat/data/online/pids/RAUMNAME/*
+
+- Hier befinden sich alle Chatter, die sich z.Z. im System befinden
+ ./cgi-bin/yChat/data/online/users/*
+
+- Hier befinden sich alle IP-Nummern und TempIDs der eingelogten Chatter
+ ./cgi-bin/yChat/data/online/ident/*
+
+Alle Grafik- und Multimediadateien (*.gif, *.jpg, *.swf) sollten in ein
+nicht-CGI-BIN-Verzeichnis kopiert werden. Z.B. nach ./yChat/.
+
+Zum schluß sollte die config.pm-Datei nach wünschen editiert werden.
+Allerdings sollten die Copyright Hinweise und die Versionsnummern nicht
+manipuliert werden.
+
+Im Folgendem werde ich ein wenig auf die im yChat-Sourcecode oft verwendeten .
+Variablen eingehen:
+
+ $var => Sagt dem Skript, wie es gestartet werden soll.
+ $alias => Teilt dem Skript den Benutzername mit.
+ $tmpid => Beim einloggen in den Chat wird für den Benutzer eine
+ temporäre ID generiert. Diese wird so wohl in der Variable
+ $tmpid als auch in eine Datei geschrieben. Handelt der
+ Benutzer, so wird vom Skript die Variable $tmpid mit dem
+ Eintrag in der Datei verglichen. Sind beide Werte
+ identisch, dann wird die Handlung des Benutzers
+ ausgeführt. Stimmen die Werte nicht überein, dann wird
+ die Fehlermeldung, daß der Benutzer die falsche $tmpid hat
+ um mit $alias zu handeln,ausgegeben und das Skript beendet
+ sich. Dies ist eine Sicherheitsmaßnahme welche verbietet,
+ mit fremden Benutzernamen im System zu handeln.
+ $room => Sagt dem Skript, wie der aktuelle Raumname lautet.
+ $col => Sagt dem Skript, wie die aktuelle Chatfarbe des Nicks von
+ $alias lautet.
+ $seccol => Sagt dem Skript, wie die aktuelle Chatfarbe der Schrift von
+ $alias lautet.
+ $msg => Beinhaltet den von $alias zu postenden Text im Chat.
+ Hiervon wird auch in den Benutzergästebüchern und im
+ Benutzerboard Gebrauch gemacht.
+ $whisper => Beinhaltet den Benutzernamen, zu dem $alias zuletzt
+ geflüstert hat.
+ $id und $tmp => Temporäre Variablen zwecks Übermittlung diverser Daten.
+ $pw => Wird im Skript index.pl verwendet um das Zugangspassword
+ zu übermitteln.
+
+Viel Spaß beim Chatten ... \ No newline at end of file
diff --git a/0.4.8a2/TODO.txt b/0.4.8a2/TODO.txt
new file mode 100644
index 0000000..5dca7c1
--- /dev/null
+++ b/0.4.8a2/TODO.txt
@@ -0,0 +1,33 @@
+############################## yChat.de TODO ################################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+Folgende Funktionen werden demnächst evtl. in yChat integriert:
+
+ - In den Chatoptionen sollen diverse Einstellungen des Nachrichtenverlaufes
+ vorgenommen werden können.
+
+ - Die Schlucht (Ein Raum wo Chatter hineingeworfen werden,
+ die sich nicht benehmen und noch nicht aus dem Chat
+ katapultiert werden sollen).
+
+ - Löschung aller Chatter, die sich seit 60 Tagen nicht mehr eingelogt haben.
+
+ - IP-Adressen ver-/entbannen.
+
+ - E-Mail zusendung bei verlorenem Passwort.
+
+ - Unter "Benutzer" sollen Chatter über eine Eingabemaske nach dem
+ Anfangsbuchstaben gesucht werden können (vergl. Kilahu).
+
+ - Linux- und Windows-yChat-Client soll programmiert werden. Mit diesem läßt
+ sich dann im yChat chatten, ohne sich über http://www.yChat.de eingelogt zu
+ haben. Der Client soll gleicheitig auch als Messenger (ICQ-Like) fungieren
+ können (yChat-Messenger bzw. yCM).
+
+ - Der Cybarkeeper (künstlich intilligenter Chatroboter, der
+ sich im Hauptraum Cyberbar aufhält, virtuelle Drinks verteilt
+ und von Real-Chattern übernommen werden kann. (Zukunftsmusik)
+
+Für weitere Vorschläge bitte in das yChat-Board unter www.yChat.de
+texten oder eine E-Mail an mail@paulbuetow.de :-) \ No newline at end of file
diff --git a/0.4.8a2/UPDATES.txt b/0.4.8a2/UPDATES.txt
new file mode 100644
index 0000000..0de557c
--- /dev/null
+++ b/0.4.8a2/UPDATES.txt
@@ -0,0 +1,215 @@
+########################### yChat.de UPDATE LIST ###########################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+Hier sind alle Erneuerungen der Versionen dokumentiert:
+
+Update von 0.4.8 auf 0.4.8a (29.01.01)
+ - Neue Befehle: /me/ und /m/ (Müssen inmitten des Textes eingegeben
+ werden.)
+ - Beim posten einer Nachricht wird die zu beschreibende
+ Nachrichtendatei mit flock(MSGFIL, 2); geschützt. Dies verhindert,
+ daß 2 Skripte gleichzeitig versuchen, die Nachrichtendatei zu
+ beschreiben.
+
+Update von 0.4.7 auf 0.4.8 (26.01.01)
+ - Top 20 Ranking Liste in PHP4.
+ - Überarbeitung des Flash-Intros.
+ - PIDs für die Signalhandler werden zuverlässiger abgespeichert und
+ ggf. wieder gelöscht.
+ - Das push.pl-Skript (endlosschleife) benötigt nun nurnoch halb so
+ viel Speicher beim Ausführen. Die Datei config.pm wird nicht mehr
+ mit "require config;" eingebunden.
+ - Benutzernamen dürfen maximal nurnoch 15 Zeichen lang sein.
+ - Chatnachrichten dürfen maximal nurnoch 300 Zeichen lang sein.
+ - Wenn ein Benutzer eine Nachricht textet, überprüft das System, ob
+ derjenige sich auch wirklich im jew. Raum befindet.
+ - In den Chatoptionen kann man zusätzliche Einstellungen vornehmen:
+ 1.) Anzahl der Nachrichten im Nachrichten-Verlauf
+ 2.) Anordnung der Nachrichten im Nachrichten-Verlauf.
+ Neueinstellungen dieser Optionen werden erst nach einem
+ Neueinloggen aktiv.
+ - Die Error-Logdatei "data/error" wurde erweitert.
+
+Update von 0.4.6 auf 0.4.7 (20.01.01)
+ - Auto-Away: Ist ein Chatter 5 Minuten inaktiv, dann erscheint im
+ aktuellen Raum die Nachricht "Alias wurde vom System
+ abgemeldet ..." . Bei Wiederaufnahme des Chats, meldet sich Alias
+ wieder zurück.
+ - Auto-Logout: Ist ein Chatter 20 Minuten inaktiv, dann wird dieser
+ aus dem System automatisch ausgelogt.
+ - Neue CSS für die Formulareingabefelder und dem Chat-Menü.
+ (Funktioniert allerdings nicht mit NN4.x, hier werden alle
+ Formulareingabefelder ohne CSS-Definitionen angezeigt.)
+
+Update von 0.4.5 auf 0.4.6 (18.01.01)
+ - Verbesserung: Beim Posten einer neuen Chatnachricht wird sogleich
+ ein Signal an alle laufenden Chatprozesse (PIDs) gesendet, so daß
+ diese aufgefordert werden, aus der Nachrichtendatei die neuen
+ Zeilen einzulesen. Das Push-Skript (push.pl) muß so nicht jede
+ Sekunde prüfen, ob neue Nachrichten da sind, da es diese
+ Information über das Signal erhält. Das Push-Skript verbraucht nun
+ weniger Prozessorleistung, da es jetzt 15 Sekunden lang
+ "dauerschläft" (sleep 15;), lediglich einen <!--PING--> versendet
+ und dann weiter schläft usw. Beendet sich push.pl, oder wird ein
+ Raum gewechselt, dann wird auch die PID aus der PID-Liste des
+ aktuellen Raums gelöscht und ggf. neu geschrieben.
+ Die Dateien "./data/online/pids/*" beinhalten alle aktuellen PIDs,
+ wobei * der jew. Raum ist.
+
+Update von 0.4.4 auf 0.4.5 (16.01.01)
+ - Jeder Chatraum hat nun eine globale Nachrichtendatei. Bisher
+ existierte für jeden Chatter enzelnd eine. Die Nachrichten werden
+ nun schneller gepostet.
+ - Neue Wächterbefehle:
+ "/st Raum Thema" ermöglicht das Ändern das Themas eines anderen
+ Raums.
+ "/sl Raum" ermöglicht das auf- und absperren eines anderen Raums.
+ - Nur noch Oberwächter können die Chatlogs lesen.
+ - Referenzierung der Variable $msg in main.pl.
+ - Flashanimationen.
+
+Update von 0.4.3 auf 0.4.4 (04.01.01)
+ - Optimiertung aller Chatbefehle.
+ - Neuer WÄ-Befehl: Mit "/ss Raum Nachricht" wird aus dem aktuellen
+ Raum heraus in den angegebenen Raum eine beliebige Nachricht
+ gerufen.
+ - Das Skript main.pl wurde in zwei verschiedene Skripts unterteilt:
+ main.pl => Beinhaltet hauptsächlich die Chatbefehle
+ input.pl => Beinhaltet das zu generierende Chateingabeframe.
+ - Das Chateingabeframe wird nun nie wieder reloadet. (Dies geschah
+ bisher noch nach Ausführung der Befehle /col /j /ju /msg und nach
+ Änderung der Chateinstellungen und erwies sich als recht nervige
+ Angelegenheit.) JavaScript macht es möglich.
+ - Überarbeitung und Erweiterung der Dokudateien.
+
+Update von 0.4.2 auf 0.4.3 (30.12.2k)
+ - Optimierung der Zuweisung der Variabeln im Programmcode:
+ Variablen werden nun wirklich nur deffiniert, wenn diese auch
+ erforderlich sind.
+ - Komplette Neuprogrammierung diverser Subs (nun leistungsfähiger)
+ - Bei Aufrug der Login-Seite wird der gesamte Chat auf leerstehende
+ Räume und "alte" Chatter überprüft und ggf. entfernt.
+ - Verbesserung diverser JavaScript-Codes.
+ - Editiert ein Benutzer sein Profil, so wird dies mit der Meldung
+ "Alias hat sein Profil geändert ..." bekanntgegeben.
+ - Mit "/t" ohne weiteren Text erscheint die Nachricht "Alias hat das
+ Thema des Raums gelöscht ..."
+ - Hinzufügung diverser Administratorbefehle: "/pw Alias" zeigt
+ Zugangspassword von Alias an. "/ow Alias" ernennt Alias zum OW.
+ "/row Alias" entzieht Alias die OW-Rechte.
+
+Update von 0.4.1 auf 0.4.2 (25.12.2k)
+ - Im Texteingabeformular werden nun per JavaScript die letzten 10
+ Postings zwischengespeichert und können per Drop-Down-Menü
+ wieder in das Submittextfeld geladen werden um erneuert getextet
+ zu werden.
+ - Neues Design.
+ - Diverse Dateien wurden umbenannt:
+ INSTALL.txt -> SETUP.txt
+ LIESMICH.txt -> README.txt
+ - Die Datei CREDITS.txt wurde angelegt und somit auch die URL
+ www.credits.yChat.de.
+
+Update von 0.4.0 auf 0.4.1 (22.12.2k)
+ - Design wurde geändert.
+ - Unter "Optionen" ist nun eine komplette Farbtabelle eingebaut.
+ - Folgende Oberwächterbefehle wurden nun auch für normale Wächter
+ freigegeben: /ip /ban /rban.
+
+Update von 0.2.6 auf 0.4.0 (19.12.2k)
+ - Der berüchtigte "IP-Bug" wurde beseitigt! Und zwar wurden TempIDs
+ eingeführt => Eine dauerhafte Überprüfung der Benutzer-IP-Nummer
+ ist also nicht mehr notwendig.
+ - Die totale Chat-Online-Zeit wird protokolliert und kann jew. mit
+ "/online Alias" aufgerufen werden. Die Onlinezeit wird alle 20 Sek.
+ aktualisiert.
+ - Neue Befehle: "/seen Alias" zeigt an, vor wieviel St. sich Alias
+ zuletzt in das System eingelogt hat. Der Befehle "/rmgb" entfernt
+ alle Einträge des eigenen Benutzergästebuchs im Profil.
+
+Update von 0.2.5 auf 0.2.6 (17.12.2k)
+ - Das Eingabeframe reloaded sich nicht mehr nach jedem Posting.
+ Vielen Dank an Truhe aka Dave und Klepper aka Andreas Buchwald!
+ Bei den Chatbefehlen /col /away /j und /ju muß sich das
+ Eingabeframe weiterhin reloaden.
+ - Der Befehl // wurde entfernt. Dieser war nicht mehr erforderlich.
+ weil Nachrichten werden nur noch sehr selten verschluckt. Dieser
+ Chatbefehl postete die letzte Nachricht nocheinmal.
+ - Neuer Befehl: mit "/memo Alias hier der Text" hinterläßt man
+ Alias eine Memo. Logt sich Alias in den Chat ein, dann erhält
+ er diese sofort. Dafür wurde das Verzeichnis ".data/user/memos/"
+ angelegt.
+ - Programmcode wurde ein wenig optimiert.
+ - Das Design wurde ein wenig geändert.
+ - Beseitigung diverser Bugs.
+
+Update von 0.2.4 auf 0.2.5 (15.12.2k)
+ - Derjenige, der einen Raum zuerst betritt, hat Raumbesetzerrechte.
+ - Raumbesetzer, Wächter und Oberwächte können weitere Raumbesetzer
+ bestimmen. Diese können Raumbeseter auch wieder degradieren.
+ - Raumbesetzer, Wächter und Oberwächter können dem aktuellen Raum
+ auf/absperren und Themen geben. Wächter und Oberwächter können
+ abgesperrte Räume betreten.
+ - Das Verzeichnis ".data/htdocs" wurde entfernt. Die Datei help_html
+ heist nun help.sno und befindet sich im yChat-Hauptverzeichnis.
+ - Das Verzeichnis ".data/user/lastlogin" wurde hinzugefügt. Hier
+ wird beim erfolgreichen Einloggen ein "Timestamp" gesetzt. Später
+ sollen Oberwächter "veraltete" Benutzer entfernen können.
+ - Neuer Oberwächterbefehl: "/kill Alias" entfernt Alias ganz und gar
+ vom System. Oberwächter und Wächter können nicht entfernt werden.
+ - Perl-Cache wurde im gesamten System komplett deaktiviert ( Weniger
+ Ladezeiten der HTML-Dokumente ).
+ - Nur Nachrichten aus dem Raum "Cyberbar" werden gelogt.
+ Selbsterstellte Räume werden nichtmehr gelogt. Viele Logfunktionen
+ wurden entfernt (weniger Serverbalast).
+ - Beseitigung einiger kleinen Bugs.
+ - Unter "Optionen" im Chat wir die Farbe nun mit einem Drop-Down-Menü
+ ausgewählt ( Vielen dank an Michi aka Snoopy ).
+ - Auf der Startseite wird nun angezeigt wieviele Benutzer eingelogt
+ sind. Ist keiner eingelogt, dann wird das System "aufgeräumt". D.h.
+ Dateien die nicht mehr gebraucht werden und noch nicht gelöscht
+ wurden werden entfernt ( z.B. Nachrichtendateien der einzelnen
+ Chatter und die Dateien die die IP-Nummern der eingelogten Benutzer
+ beinhalteten usw.).
+ - Hunzufügung einer TODO-Liste. Hier sind mehrere Funktionen
+ vermerkt, die in späteren yChat-Versionen eingebaut werden sollen.
+ (www.todo.yChat.de oder TODO.txt).
+
+Update von 0.2.3 auf 0.2.4 (30.11.2k)
+ - Optimierung bzw. Verbesserung der Push-Routine push.pl.
+ - Server-Ping wurde von 2-Pings-per-Minute auf 4 erhöht.
+ - yChat-Banner wurde erstellt und ist unter
+ documents.yChat.de/yBanner.jpg vorzufinden.
+ - Unter der URL servers.yChat.de wurde eine Serverliste angelegt,
+ welche anzeigt wo yChat-Systeme laufen.
+ - Des weiteren wurden die URLs updates.yChat.de, install.yChat.de
+ und liesmich.yChat.de eingerichtet.
+ - Die Menüpunkte wurden zusammengefaßt, damit sie unter einer
+ Auflösung von 800x600 nur eine Zeile belegen.
+ - Einige Bugs wurden entfernt.
+
+Update von 0.2.2 auf 0.2.3 (25.11.2k)
+ - Smooth scrolling JavaScript ( Vielen Dank an Andreas Buchwald ).
+ - "IP#-Fehler" wurde so gut wie beseitigt.
+ - Aufrufe der einzelnen Benutzerprofile wird gezählt und angezeigt.
+ Diese werden in data/user/counts/* gespeichert.
+ - Automatische Einrichtung des Chats mit setup.sh und Telnet.
+ - Menüpunkt "Dein Profil" wurde entfernt da eigenes Profil auch
+ stets über die Onlineliste aufgerufen werden kann.
+
+Update von 0.2.1 auf 0.2.2 (23.11.2k)
+ - Einige Bugs wurden entfernt.
+ - Geschwindigkeit des Chats wurde optimiert.
+ - Eine Liste aller eingelogten Benutzer erscheint am Rand. Hierfür
+ wurde die Datei online.pl eingeführt. Sie aktuallisiert sich alle
+ 20 Sekunden.
+ - Die UPDATES.txt wurde eingeführt.
+
+Update von 0.2.0 auf 0.2.1
+ - Einige Bugs wurden entfernt.
+ - Die IP# der eingelogten Benutzer werden nun anders verwaltet.
+
+Update von Alpha XVIII auf 0.2.0
+ - Die Handhabung der eingelogten Benutzer im System wurde komplett neu
+ überarbeitet.
+ - Neue Versionsnumern wurden eingeführt. \ No newline at end of file
diff --git a/0.4.8a2/colors.sno b/0.4.8a2/colors.sno
new file mode 100644
index 0000000..3640b9e
--- /dev/null
+++ b/0.4.8a2/colors.sno
@@ -0,0 +1,290 @@
+ <table cellspacing=0 cellpadding=5 border=0>
+ <tr>
+ <td bgcolor="000000"><span style="color:#FFFFFF; text-decoration:line-through;">000000</span></td>
+ <td bgcolor="000033"><span style="color:#FFFFFF; text-decoration:line-through;">000033</span></td>
+ <td bgcolor="000066"><span style="color:#FFFFFF; text-decoration:line-through;">000066</span></td>
+ <td bgcolor="000099"><span style="color:#FFFFFF; text-decoration:line-through;">000099</span></td>
+ <td bgcolor="0000CC"><span style="color:#FFFFFF; text-decoration:line-through;">0000CC</span></td>
+ <td bgcolor="0000FF"><a href="javascript:insertcode('0000FF');" style="color:#FFFFFF;">0000FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="003300"><span style="color:#FFFFFF; text-decoration:line-through;">003300</span></td>
+ <td bgcolor="003333"><span style="color:#FFFFFF; text-decoration:line-through;">003333</span></td>
+ <td bgcolor="003366"><span style="color:#FFFFFF; text-decoration:line-through;">003366</span></td>
+ <td bgcolor="003399"><a href="javascript:insertcode('003399');" style="color:#FFFFFF;">003399</a></td>
+ <td bgcolor="0033CC"><a href="javascript:insertcode('0033CC');" style="color:#FFFFFF;">0033CC</a></td>
+ <td bgcolor="0033FF"><a href="javascript:insertcode('0033FF');" style="color:#FFFFFF;">0033FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="006600"><span style="color:#FFFFFF; text-decoration:line-through;">006600</span></td>
+ <td bgcolor="006633"><span style="color:#FFFFFF; text-decoration:line-through;">006633</span></td>
+ <td bgcolor="006666"><a href="javascript:insertcode('006666');" style="color:#FFFFFF;">006666</a></td>
+ <td bgcolor="006699"><a href="javascript:insertcode('006699');" style="color:#FFFFFF;">006699</a></td>
+ <td bgcolor="0066CC"><a href="javascript:insertcode('0066CC');" style="color:#FFFFFF;">0066CC</a></td>
+ <td bgcolor="0066FF"><a href="javascript:insertcode('0066FF');" style="color:#FFFFFF;">0066FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="009900"><a href="javascript:insertcode('009900');" style="color:#FFFFFF;">009900</a></td>
+ <td bgcolor="009933"><a href="javascript:insertcode('009933');" style="color:#FFFFFF;">009933</a></td>
+ <td bgcolor="009966"><a href="javascript:insertcode('009966');" style="color:#FFFFFF;">009966</a></td>
+ <td bgcolor="009999"><a href="javascript:insertcode('009999');" style="color:#FFFFFF;">009999</a></td>
+ <td bgcolor="0099CC"><a href="javascript:insertcode('0099CC');" style="color:#FFFFFF;">0099CC</a></td>
+ <td bgcolor="0099FF"><a href="javascript:insertcode('0099FF');" style="color:#FFFFFF;">0099FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00CC00"><a href="javascript:insertcode('00CC00');" style="color:#000000;">00CC00</a></td>
+ <td bgcolor="00CC33"><a href="javascript:insertcode('00CC33');" style="color:#000000;">00CC33</a></td>
+ <td bgcolor="00CC66"><a href="javascript:insertcode('00CC66');" style="color:#000000;">00CC66</a></td>
+ <td bgcolor="00CC99"><a href="javascript:insertcode('00CC99');" style="color:#000000;">00CC99</a></td>
+ <td bgcolor="00CCCC"><a href="javascript:insertcode('00CCCC');" style="color:#000000;">00CCCC</a></td>
+ <td bgcolor="00CCFF"><a href="javascript:insertcode('00CCFF');" style="color:#000000;">00CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00FF00"><a href="javascript:insertcode('00FF00');" style="color:#000000;">00FF00</a></td>
+ <td bgcolor="00FF33"><a href="javascript:insertcode('00FF33');" style="color:#000000;">00FF33</a></td>
+ <td bgcolor="00FF66"><a href="javascript:insertcode('00FF66');" style="color:#000000;">00FF66</a></td>
+ <td bgcolor="00FF99"><a href="javascript:insertcode('00FF99');" style="color:#000000;">00FF99</a></td>
+ <td bgcolor="00FFCC"><a href="javascript:insertcode('00FFCC');" style="color:#000000;">00FFCC</a></td>
+ <td bgcolor="00FFFF"><a href="javascript:insertcode('00FFFF');" style="color:#000000;">00FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="330000"><span style="color:#FFFFFF; text-decoration:line-through;">330000</span></td>
+ <td bgcolor="330033"><span style="color:#FFFFFF; text-decoration:line-through;">330033</span></td>
+ <td bgcolor="330066"><span style="color:#FFFFFF; text-decoration:line-through;">330066</span></td>
+ <td bgcolor="330099"><a href="javascript:insertcode('330099');" style="color:#FFFFFF;">330099</a></td>
+ <td bgcolor="3300CC"><a href="javascript:insertcode('3300CC');" style="color:#FFFFFF;">3300CC</a></td>
+ <td bgcolor="3300FF"><a href="javascript:insertcode('3300FF');" style="color:#FFFFFF;">3300FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="333300"><span style="color:#FFFFFF; text-decoration:line-through;">333300</span></td>
+ <td bgcolor="333333"><span style="color:#FFFFFF; text-decoration:line-through;">333333</span></td>
+ <td bgcolor="333366"><a href="javascript:insertcode('333366');" style="color:#FFFFFF;">333366</a></td>
+ <td bgcolor="333399"><a href="javascript:insertcode('333399');" style="color:#FFFFFF;">333399</a></td>
+ <td bgcolor="3333CC"><a href="javascript:insertcode('3333CC');" style="color:#FFFFFF;">3333CC</a></td>
+ <td bgcolor="3333FF"><a href="javascript:insertcode('3333FF');" style="color:#FFFFFF;">3333FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="336600"><a href="javascript:insertcode('336600');" style="color:#FFFFFF;">336600</a></td>
+ <td bgcolor="336633"><a href="javascript:insertcode('336633');" style="color:#FFFFFF;">336633</a></td>
+ <td bgcolor="336666"><a href="javascript:insertcode('336666');" style="color:#FFFFFF;">336666</a></td>
+ <td bgcolor="336699"><a href="javascript:insertcode('336699');" style="color:#FFFFFF;">336699</a></td>
+ <td bgcolor="3366CC"><a href="javascript:insertcode('3366CC');" style="color:#FFFFFF;">3366CC</a></td>
+ <td bgcolor="3366FF"><a href="javascript:insertcode('3366FF');" style="color:#FFFFFF;">3366FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="339900"><a href="javascript:insertcode('339900');" style="color:#FFFFFF;">339900</a></td>
+ <td bgcolor="339933"><a href="javascript:insertcode('339933');" style="color:#FFFFFF;">339933</a></td>
+ <td bgcolor="339966"><a href="javascript:insertcode('339966');" style="color:#FFFFFF;">339966</a></td>
+ <td bgcolor="339999"><a href="javascript:insertcode('339999');" style="color:#FFFFFF;">339999</a></td>
+ <td bgcolor="3399CC"><a href="javascript:insertcode('3399CC');" style="color:#FFFFFF;">3399CC</a></td>
+ <td bgcolor="3399FF"><a href="javascript:insertcode('3399FF');" style="color:#FFFFFF;">3399FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33CC00"><a href="javascript:insertcode('33CC00');" style="color:#000000;">33CC00</a></td>
+ <td bgcolor="33CC33"><a href="javascript:insertcode('33CC33');" style="color:#000000;">33CC33</a></td>
+ <td bgcolor="33CC66"><a href="javascript:insertcode('33CC66');" style="color:#000000;">33CC66</a></td>
+ <td bgcolor="33CC99"><a href="javascript:insertcode('33CC99');" style="color:#000000;">33CC99</a></td>
+ <td bgcolor="33CCCC"><a href="javascript:insertcode('33CCCC');" style="color:#000000;">33CCCC</a></td>
+ <td bgcolor="33CCFF"><a href="javascript:insertcode('33CCFF');" style="color:#000000;">33CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33FF00"><a href="javascript:insertcode('33FF00');" style="color:#000000;">33FF00</a></td>
+ <td bgcolor="33FF33"><a href="javascript:insertcode('33FF33');" style="color:#000000;">33FF33</a></td>
+ <td bgcolor="33FF66"><a href="javascript:insertcode('33FF66');" style="color:#000000;">33FF66</a></td>
+ <td bgcolor="33FF99"><a href="javascript:insertcode('33FF99');" style="color:#000000;">33FF99</a></td>
+ <td bgcolor="33FFCC"><a href="javascript:insertcode('33FFCC');" style="color:#000000;">33FFCC</a></td>
+ <td bgcolor="33FFFF"><a href="javascript:insertcode('33FFFF');" style="color:#000000;">33FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="660000"><span style="color:#FFFFFF; text-decoration:line-through;">660000</span></td>
+ <td bgcolor="660033"><span style="color:#FFFFFF; text-decoration:line-through;">660033</span></td>
+ <td bgcolor="660066"><a href="javascript:insertcode('660066');" style="color:#FFFFFF;">660066</a></td>
+ <td bgcolor="660099"><a href="javascript:insertcode('660099');" style="color:#FFFFFF;">660099</a></td>
+ <td bgcolor="6600CC"><a href="javascript:insertcode('6600CC');" style="color:#FFFFFF;">6600CC</a></td>
+ <td bgcolor="6600FF"><a href="javascript:insertcode('6600FF');" style="color:#FFFFFF;">6600FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="663300"><a href="javascript:insertcode('663300');" style="color:#FFFFFF;">663300</a></td>
+ <td bgcolor="663333"><a href="javascript:insertcode('663333');" style="color:#FFFFFF;">663333</a></td>
+ <td bgcolor="663366"><a href="javascript:insertcode('663366');" style="color:#FFFFFF;">663366</a></td>
+ <td bgcolor="663399"><a href="javascript:insertcode('663399');" style="color:#FFFFFF;">663399</a></td>
+ <td bgcolor="6633CC"><a href="javascript:insertcode('6633CC');" style="color:#FFFFFF;">6633CC</a></td>
+ <td bgcolor="6633FF"><a href="javascript:insertcode('6633FF');" style="color:#FFFFFF;">6633FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="666600"><a href="javascript:insertcode('666600');" style="color:#FFFFFF;">666600</a></td>
+ <td bgcolor="666633"><a href="javascript:insertcode('666633');" style="color:#FFFFFF;">666633</a></td>
+ <td bgcolor="666666"><a href="javascript:insertcode('666666');" style="color:#FFFFFF;">666666</a></td>
+ <td bgcolor="666699"><a href="javascript:insertcode('666699');" style="color:#FFFFFF;">666699</a></td>
+ <td bgcolor="6666CC"><a href="javascript:insertcode('6666CC');" style="color:#FFFFFF;">6666CC</a></td>
+ <td bgcolor="6666FF"><a href="javascript:insertcode('6666FF');" style="color:#FFFFFF;">6666FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="669900"><a href="javascript:insertcode('669900');" style="color:#000000;">669900</a></td>
+ <td bgcolor="669933"><a href="javascript:insertcode('669933');" style="color:#000000;">669933</a></td>
+ <td bgcolor="669966"><a href="javascript:insertcode('669966');" style="color:#000000;">669966</a></td>
+ <td bgcolor="669999"><a href="javascript:insertcode('669999');" style="color:#000000;">669999</a></td>
+ <td bgcolor="6699CC"><a href="javascript:insertcode('6699CC');" style="color:#000000;">6699CC</a></td>
+ <td bgcolor="6699FF"><a href="javascript:insertcode('6699FF');" style="color:#000000;">6699FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66CC00"><a href="javascript:insertcode('66CC00');" style="color:#000000;">66CC00</a></td>
+ <td bgcolor="66CC33"><a href="javascript:insertcode('66CC33');" style="color:#000000;">66CC33</a></td>
+ <td bgcolor="66CC66"><a href="javascript:insertcode('66CC66');" style="color:#000000;">66CC66</a></td>
+ <td bgcolor="66CC99"><a href="javascript:insertcode('66CC99');" style="color:#000000;">66CC99</a></td>
+ <td bgcolor="66CCCC"><a href="javascript:insertcode('66CCCC');" style="color:#000000;">66CCCC</a></td>
+ <td bgcolor="66CCFF"><a href="javascript:insertcode('66CCFF');" style="color:#000000;">66CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66FF00"><a href="javascript:insertcode('66FF00');" style="color:#000000;">66FF00</a></td>
+ <td bgcolor="66FF33"><a href="javascript:insertcode('66FF33');" style="color:#000000;">66FF33</a></td>
+ <td bgcolor="66FF66"><a href="javascript:insertcode('66FF66');" style="color:#000000;">66FF66</a></td>
+ <td bgcolor="66FF99"><a href="javascript:insertcode('66FF99');" style="color:#000000;">66FF99</a></td>
+ <td bgcolor="66FFCC"><a href="javascript:insertcode('66FFCC');" style="color:#000000;">66FFCC</a></td>
+ <td bgcolor="66FFFF"><a href="javascript:insertcode('66FFFF');" style="color:#000000;">66FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="990000"><a href="javascript:insertcode('990000');" style="color:#FFFFFF;">990000</a></td>
+ <td bgcolor="990033"><a href="javascript:insertcode('990033');" style="color:#FFFFFF;">990033</a></td>
+ <td bgcolor="990066"><a href="javascript:insertcode('990066');" style="color:#FFFFFF;">990066</a></td>
+ <td bgcolor="990099"><a href="javascript:insertcode('990099');" style="color:#FFFFFF;">990099</a></td>
+ <td bgcolor="9900CC"><a href="javascript:insertcode('9900CC');" style="color:#FFFFFF;">9900CC</a></td>
+ <td bgcolor="9900FF"><a href="javascript:insertcode('9900FF');" style="color:#FFFFFF;">9900FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="993300"><a href="javascript:insertcode('993300');" style="color:#FFFFFF;">993300</a></td>
+ <td bgcolor="993333"><a href="javascript:insertcode('993333');" style="color:#FFFFFF;">993333</a></td>
+ <td bgcolor="993366"><a href="javascript:insertcode('993366');" style="color:#FFFFFF;">993366</a></td>
+ <td bgcolor="993399"><a href="javascript:insertcode('993399');" style="color:#FFFFFF;">993399</a></td>
+ <td bgcolor="9933CC"><a href="javascript:insertcode('9933CC');" style="color:#FFFFFF;">9933CC</a></td>
+ <td bgcolor="9933FF"><a href="javascript:insertcode('9933FF');" style="color:#FFFFFF;">9933FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="996600"><a href="javascript:insertcode('996600');" style="color:#FFFFFF;">996600</a></td>
+ <td bgcolor="996633"><a href="javascript:insertcode('996633');" style="color:#FFFFFF;">996633</a></td>
+ <td bgcolor="996666"><a href="javascript:insertcode('996666');" style="color:#FFFFFF;">996666</a></td>
+ <td bgcolor="996699"><a href="javascript:insertcode('996699');" style="color:#FFFFFF;">996699</a></td>
+ <td bgcolor="9966CC"><a href="javascript:insertcode('9966CC');" style="color:#FFFFFF;">9966CC</a></td>
+ <td bgcolor="9966FF"><a href="javascript:insertcode('9966FF');" style="color:#FFFFFF;">9966FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="999900"><a href="javascript:insertcode('999900');" style="color:#000000;">999900</a></td>
+ <td bgcolor="999933"><a href="javascript:insertcode('999933');" style="color:#000000;">999933</a></td>
+ <td bgcolor="999966"><a href="javascript:insertcode('999966');" style="color:#000000;">999966</a></td>
+ <td bgcolor="999999"><a href="javascript:insertcode('999999');" style="color:#000000;">999999</a></td>
+ <td bgcolor="9999CC"><a href="javascript:insertcode('9999CC');" style="color:#000000;">9999CC</a></td>
+ <td bgcolor="9999FF"><a href="javascript:insertcode('9999FF');" style="color:#000000;">9999FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99CC00"><a href="javascript:insertcode('99CC00');" style="color:#000000;">99CC00</a></td>
+ <td bgcolor="99CC33"><a href="javascript:insertcode('99CC33');" style="color:#000000;">99CC33</a></td>
+ <td bgcolor="99CC66"><a href="javascript:insertcode('99CC66');" style="color:#000000;">99CC66</a></td>
+ <td bgcolor="99CC99"><a href="javascript:insertcode('99CC99');" style="color:#000000;">99CC99</a></td>
+ <td bgcolor="99CCCC"><a href="javascript:insertcode('99CCCC');" style="color:#000000;">99CCCC</a></td>
+ <td bgcolor="99CCFF"><a href="javascript:insertcode('99CCFF');" style="color:#000000;">99CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99FF00"><a href="javascript:insertcode('99FF00');" style="color:#000000;">99FF00</a></td>
+ <td bgcolor="99FF33"><a href="javascript:insertcode('99FF33');" style="color:#000000;">99FF33</a></td>
+ <td bgcolor="99FF66"><a href="javascript:insertcode('99FF66');" style="color:#000000;">99FF66</a></td>
+ <td bgcolor="99FF99"><a href="javascript:insertcode('99FF99');" style="color:#000000;">99FF99</a></td>
+ <td bgcolor="99FFCC"><a href="javascript:insertcode('99FFCC');" style="color:#000000;">99FFCC</a></td>
+ <td bgcolor="99FFFF"><a href="javascript:insertcode('99FFFF');" style="color:#000000;">99FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC0000"><a href="javascript:insertcode('CC0000');" style="color:#FFFFFF;">CC0000</a></td>
+ <td bgcolor="CC0033"><a href="javascript:insertcode('CC0033');" style="color:#FFFFFF;">CC0033</a></td>
+ <td bgcolor="CC0066"><a href="javascript:insertcode('CC0066');" style="color:#FFFFFF;">CC0066</a></td>
+ <td bgcolor="CC0099"><a href="javascript:insertcode('CC0099');" style="color:#FFFFFF;">CC0099</a></td>
+ <td bgcolor="CC00CC"><a href="javascript:insertcode('CC00CC');" style="color:#FFFFFF;">CC00CC</a></td>
+ <td bgcolor="CC00FF"><a href="javascript:insertcode('CC00FF');" style="color:#FFFFFF;">CC00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC3300"><a href="javascript:insertcode('CC3300');" style="color:#FFFFFF;">CC3300</a></td>
+ <td bgcolor="CC3333"><a href="javascript:insertcode('CC3333');" style="color:#FFFFFF;">CC3333</a></td>
+ <td bgcolor="CC3366"><a href="javascript:insertcode('CC3366');" style="color:#FFFFFF;">CC3366</a></td>
+ <td bgcolor="CC3399"><a href="javascript:insertcode('CC3399');" style="color:#FFFFFF;">CC3399</a></td>
+ <td bgcolor="CC33CC"><a href="javascript:insertcode('CC33CC');" style="color:#FFFFFF;">CC33CC</a></td>
+ <td bgcolor="CC33FF"><a href="javascript:insertcode('CC33FF');" style="color:#FFFFFF;">CC33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC6600"><a href="javascript:insertcode('CC6600');" style="color:#000000;">CC6600</a></td>
+ <td bgcolor="CC6633"><a href="javascript:insertcode('CC6633');" style="color:#000000;">CC6633</a></td>
+ <td bgcolor="CC6666"><a href="javascript:insertcode('CC6666');" style="color:#000000;">CC6666</a></td>
+ <td bgcolor="CC6699"><a href="javascript:insertcode('CC6699');" style="color:#000000;">CC6699</a></td>
+ <td bgcolor="CC66CC"><a href="javascript:insertcode('CC66CC');" style="color:#000000;">CC66CC</a></td>
+ <td bgcolor="CC66FF"><a href="javascript:insertcode('CC66FF');" style="color:#000000;">CC66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC9900"><a href="javascript:insertcode('CC9900');" style="color:#000000;">CC9900</a></td>
+ <td bgcolor="CC9933"><a href="javascript:insertcode('CC9933');" style="color:#000000;">CC9933</a></td>
+ <td bgcolor="CC9966"><a href="javascript:insertcode('CC9966');" style="color:#000000;">CC9966</a></td>
+ <td bgcolor="CC9999"><a href="javascript:insertcode('CC9999');" style="color:#000000;">CC9999</a></td>
+ <td bgcolor="CC99CC"><a href="javascript:insertcode('CC99CC');" style="color:#000000;">CC99CC</a></td>
+ <td bgcolor="CC99FF"><a href="javascript:insertcode('CC99FF');" style="color:#000000;">CC99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCCC00"><a href="javascript:insertcode('CCCC00');" style="color:#000000;">CCCC00</a></td>
+ <td bgcolor="CCCC33"><a href="javascript:insertcode('CCCC33');" style="color:#000000;">CCCC33</a></td>
+ <td bgcolor="CCCC66"><a href="javascript:insertcode('CCCC66');" style="color:#000000;">CCCC66</a></td>
+ <td bgcolor="CCCC99"><a href="javascript:insertcode('CCCC99');" style="color:#000000;">CCCC99</a></td>
+ <td bgcolor="CCCCCC"><a href="javascript:insertcode('CCCCCC');" style="color:#000000;">CCCCCC</a></td>
+ <td bgcolor="CCCCFF"><a href="javascript:insertcode('CCCCFF');" style="color:#000000;">CCCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCFF00"><a href="javascript:insertcode('CCFF00');" style="color:#000000;">CCFF00</a></td>
+ <td bgcolor="CCFF33"><a href="javascript:insertcode('CCFF33');" style="color:#000000;">CCFF33</a></td>
+ <td bgcolor="CCFF66"><a href="javascript:insertcode('CCFF66');" style="color:#000000;">CCFF66</a></td>
+ <td bgcolor="CCFF99"><a href="javascript:insertcode('CCFF99');" style="color:#000000;">CCFF99</a></td>
+ <td bgcolor="CCFFCC"><a href="javascript:insertcode('CCFFCC');" style="color:#000000;">CCFFCC</a></td>
+ <td bgcolor="CCFFFF"><a href="javascript:insertcode('CCFFFF');" style="color:#000000;">CCFFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF0000"><a href="javascript:insertcode('FF0000');" style="color:#FFFFFF;">FF0000</a></td>
+ <td bgcolor="FF0033"><a href="javascript:insertcode('FF0033');" style="color:#FFFFFF;">FF0033</a></td>
+ <td bgcolor="FF0066"><a href="javascript:insertcode('FF0066');" style="color:#FFFFFF;">FF0066</a></td>
+ <td bgcolor="FF0099"><a href="javascript:insertcode('FF0099');" style="color:#FFFFFF;">FF0099</a></td>
+ <td bgcolor="FF00CC"><a href="javascript:insertcode('FF00CC');" style="color:#FFFFFF;">FF00CC</a></td>
+ <td bgcolor="FF00FF"><a href="javascript:insertcode('FF00FF');" style="color:#FFFFFF;">FF00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF3300"><a href="javascript:insertcode('FF3300');" style="color:#FFFFFF;">FF3300</a></td>
+ <td bgcolor="FF3333"><a href="javascript:insertcode('FF3333');" style="color:#FFFFFF;">FF3333</a></td>
+ <td bgcolor="FF3366"><a href="javascript:insertcode('FF3366');" style="color:#FFFFFF;">FF3366</a></td>
+ <td bgcolor="FF3399"><a href="javascript:insertcode('FF3399');" style="color:#FFFFFF;">FF3399</a></td>
+ <td bgcolor="FF33CC"><a href="javascript:insertcode('FF33CC');" style="color:#FFFFFF;">FF33CC</a></td>
+ <td bgcolor="FF33FF"><a href="javascript:insertcode('FF33FF');" style="color:#FFFFFF;">FF33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF6600"><a href="javascript:insertcode('FF6600');" style="color:#000000;">FF6600</a></td>
+ <td bgcolor="FF6633"><a href="javascript:insertcode('FF6633');" style="color:#000000;">FF6633</a></td>
+ <td bgcolor="FF6666"><a href="javascript:insertcode('FF6666');" style="color:#000000;">FF6666</a></td>
+ <td bgcolor="FF6699"><a href="javascript:insertcode('FF6699');" style="color:#000000;">FF6699</a></td>
+ <td bgcolor="FF66CC"><a href="javascript:insertcode('FF66CC');" style="color:#000000;">FF66CC</a></td>
+ <td bgcolor="FF66FF"><a href="javascript:insertcode('FF66FF');" style="color:#000000;">FF66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF9900"><a href="javascript:insertcode('FF9900');" style="color:#000000;">FF9900</a></td>
+ <td bgcolor="FF9933"><a href="javascript:insertcode('FF9933');" style="color:#000000;">FF9933</a></td>
+ <td bgcolor="FF9966"><a href="javascript:insertcode('FF9966');" style="color:#000000;">FF9966</a></td>
+ <td bgcolor="FF9999"><a href="javascript:insertcode('FF9999');" style="color:#000000;">FF9999</a></td>
+ <td bgcolor="FF99CC"><a href="javascript:insertcode('FF99CC');" style="color:#000000;">FF99CC</a></td>
+ <td bgcolor="FF99FF"><a href="javascript:insertcode('FF99FF');" style="color:#000000;">FF99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFCC00"><a href="javascript:insertcode('FFCC00');" style="color:#000000;">FFCC00</a></td>
+ <td bgcolor="FFCC33"><a href="javascript:insertcode('FFCC33');" style="color:#000000;">FFCC33</a></td>
+ <td bgcolor="FFCC66"><a href="javascript:insertcode('FFCC66');" style="color:#000000;">FFCC66</a></td>
+ <td bgcolor="FFCC99"><a href="javascript:insertcode('FFCC99');" style="color:#000000;">FFCC99</a></td>
+ <td bgcolor="FFCCCC"><a href="javascript:insertcode('FFCCCC');" style="color:#000000;">FFCCCC</a></td>
+ <td bgcolor="FFCCFF"><a href="javascript:insertcode('FFCCFF');" style="color:#000000;">FFCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFFF00"><a href="javascript:insertcode('FFFF00');" style="color:#000000;">FFFF00</a></td>
+ <td bgcolor="FFFF33"><a href="javascript:insertcode('FFFF33');" style="color:#000000;">FFFF33</a></td>
+ <td bgcolor="FFFF66"><a href="javascript:insertcode('FFFF66');" style="color:#000000;">FFFF66</a></td>
+ <td bgcolor="FFFF99"><a href="javascript:insertcode('FFFF99');" style="color:#000000;">FFFF99</a></td>
+ <td bgcolor="FFFFCC"><a href="javascript:insertcode('FFFFCC');" style="color:#000000;">FFFFCC</a></td>
+ <td bgcolor="FFFFFF"><a href="javascript:insertcode('FFFFFF');" style="color:#000000;">FFFFFF</a></td>
+ </tr>
+</table> \ No newline at end of file
diff --git a/0.4.8a2/config.pm b/0.4.8a2/config.pm
new file mode 100644
index 0000000..0cebeb9
--- /dev/null
+++ b/0.4.8a2/config.pm
@@ -0,0 +1,269 @@
+# yChat - Copyright by Paul C. Bütow
+
+########################### Dieser Teil bestimmt die Standart-Variabeln.
+##STANDART-CONFIGURATION:## (CSS, Farben, Version etc.)
+###########################
+$datum = "30.01.01";
+$version = "0.4.8a2";
+$title = "yChat [$version]";
+$gfxpath = "../../yChat";
+$style = <<ENDCSS;
+<style type="text/css">
+ body { background-color: #005146 }
+ body.blank { background-color: #000000 }
+ body.online { background-color: #000000 }
+ div { font-family: arial, verdana, helvetiva; font-size: 9pt; color: #ffffff }
+ div.b { font-weight: bold; color: #ffa500 }
+ a { color: #ffffef; }
+ a:hover { color: #ffffff; }
+ p { font-family:verdana, arial, geneva, helvetica, sans-serif; color:#FFFFFF; font-size:12px; }
+</style>
+<style type="text/css" media="all">
+ a { text-decoration: none; }
+ a:hover { text-decoration:underline; }
+input { border:2px solid #000000; font-size:12px; color:#000000; height:23px; padding:2px;}
+select { border:2px solid #000000; font-family:arial, verdana, helvetica; font-size:11px; color:#000000; height:21px; padding:2px;}
+</style>
+ENDCSS
+
+############### Dieser TeFil enthält Programmcode, der an verschiedenen
+##SHARED-SUBS## Stellen ausgeführt werden muß und jedem Skript zur
+############### Verfügung steht.
+
+sub printfile { # Liest eine externe Datei ein und gibt sie mit print aus
+ my ($file2print,$pagetitle,$bodyclass) = @_;
+ if ($pagetitle ne "") {
+ &start_html($pagetitle,$bodyclass);
+ }
+ open(FILE2PRINT,"<$file2print");
+ @file2print = <FILE2PRINT>;
+ close FILE2PRINT;
+ print @file2print;
+}
+
+
+sub start_html { # Der HEADER einer HTML-Datei
+print "<html><head>";
+print "<meta http-equiv=\"refresh\" content=\"20\" URL=\"online.pl?room=$room\">" if ($_[1] eq "online");
+print <<END;
+ <title>
+ $title - $_[0]
+ </title>
+ $_[2]
+ $style
+ </head>
+END
+ if ($_[1] eq "start") {
+ print "<body onload=\"document.login.alias.focus();\">";
+ } elsif ($_[1] ne "") {
+ print "<body class=$_[1]>";
+ } else {
+ print "<body>";
+ }
+}
+
+sub post { # Öffentliche Nachricht posten.
+ my ($room,$msg2post,$secroom) = @_;
+ my @rooms = $room;
+ @rooms = ($room,$secroom) if ($room ne $secroom);
+ foreach $raum (@rooms) {
+ open(MSGFILE,">>data/msgs/$raum");
+ flock(MSGFILE, 2);
+ print MSGFILE "!<;".time."<;!<;!<;$msg2post<;\n";
+ close MSGFILE;
+ opendir(PID,"data/online/pids/$raum");
+ my @pids = readdir(PID);
+ closedir(PID);
+ foreach(@pids) {
+ if (-f "data/online/pids/$raum/$_") {
+ kill USR1 => $_;
+ }
+ }
+ }
+ &log($msg2post) if ($room eq "Cyberbar");
+}
+
+sub post_prv { # Private Nachricht posten (flüstern).
+ my ($alias2post,$msg2post) = @_;
+ opendir(DIR,"data/online/rooms");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach $raum (@dir) {
+ opendir(DIR,"data/online/rooms/$raum");
+ my @chatter = readdir(DIR);
+ closedir(DIR);
+ foreach $chatter (@chatter) {
+ if ($chatter eq $alias2post) {
+ open(MSGFILE,">>data/msgs/$raum");
+ flock(MSGFILE, 2);
+ print MSGFILE "$alias2post<;".time."<;!<;!<;$msg2post<;\n";
+ close MSGFILE;
+ opendir(PID,"data/online/pids/$raum");
+ my @pids = readdir(PID);
+ closedir(PID);
+ foreach(@pids) {
+ if (-f "data/online/pids/$raum/$_") {
+ kill USR1 => $_;
+ }
+ }
+ goto ENDPRV;
+ }
+ }
+ }
+ENDPRV:
+}
+
+sub log { # Protokollieren der Nachrichten etc.
+ local $msg2log = $_[0];
+ &zeit;
+ open(LOG,">>data/logs/$day.$month.$year");
+ print LOG "<br><font color=ffffef><i>($hours:$min:$sec)</i></font> $msg2log\n";
+ close LOG;
+}
+
+
+sub zeit { # Aktuelles Datum und Uhrzeit bestimmen.
+ ($sec, $min, $hours, $day, $month, $year) = (localtime)[0..5];
+ $month += 1;
+ $hours = "0".$hours if ($hours < 10);
+ $min = "0".$min if ($min < 10);
+ $sec = "0".$sec if ($sec < 10);
+ $day = "0".$day if ($day < 10);
+ $month = "0".$month if ($month < 10);
+ $year = $year - 100;
+ if ($year < 10) {
+ $year = "200".$year;
+ } else {
+ $year = "20".$year;
+ }
+}
+
+sub error { # Error-Ausgabe.
+ my $error_msg = $_[0];
+ &start_html( "Error: ($error_msg)" );
+ print $q->div( "Error: ($error_msg)" ),
+ $q->end_html;
+ open(ERROR,">>data/error");
+ print ERROR "$alias $tmpid $$ ".time." $error_msg \n";
+ close ERROR;
+ exit 0;
+}
+
+sub check_online { # Auf alte Räume und Chatter prüfen und ggf. entfernen.
+ open(PROVE,">data/online/prove");
+ print PROVE time;
+ close PROVE;
+ opendir(RAUMDIR, "data/online/rooms");
+ my @raumdir = readdir(RAUMDIR);
+ closedir(RAUMDIR);
+ foreach $raum (@raumdir) {
+ opendir(BENUTZERDIR, "data/online/rooms/$raum");
+ my @benutzerdir = readdir(BENUTZERDIR);
+ closedir(BENUTZERDIR);
+ my $raumleer= 1;
+ foreach $benutzer (@benutzerdir) {
+ if (-f "data/online/rooms/$raum/$benutzer") {
+ $raumleer = 0;
+ open (BENUTZER,"<data/online/rooms/$raum/$benutzer");
+ my $benutzerstamp = <BENUTZER>;
+ close BENUTZER;
+ if ($benutzerstamp < (time - 40)) {
+ unlink("data/online/$raum/$benutzer");
+ open (BENUTZER2,"<data/online/users/$benutzer");
+ my $benutzerstamp2 = <BENUTZER2>;
+ close BENUTZER2;
+ if ($benutzerstamp2 < (time - 40)) {
+ if ($benutzer ne $alias) {
+ &rm_alias($benutzer,$raum); # ohne $raum/benutzer entf.
+ } else {
+ unlink("data/online/rooms/$raum/$benutzer");
+ }
+ &zeit;
+ &post($raum,"<i><font color=ffffff>($hours:$min:$sec) $benutzer hat den Chat verlassen ... </font></i>");
+ }
+ }
+ }
+ }
+ opendir(PIDS,"data/online/pids/$raum");
+ my @pids = readdir(PIDS);
+ closedir(PIDS);
+ if ($raumleer == 1) { # Falls Raum leer ist => entf.
+ rmdir("data/online/rooms/$raum");
+ unlink("data/online/rstat/$raum");
+ unlink("data/msgs/$raum");
+ foreach(@pids) {
+ if (-f "data/online/pids/$raum/$_") {
+ unlink("data/online/pids/$raum/$_");
+ }
+ }
+ rmdir("data/online/pids/$raum");
+ } else {
+ foreach(@pids) {
+ unless (kill 0 => $_) {
+ unlink("data/online/pids/$room/$_");
+ }
+ }
+ }
+ }
+}
+
+sub rm_alias { # Falls Benutzer offline gegangen ist
+ my($benutzer,$raum) = @_;
+ unlink("data/online/rooms/$raum/$benutzer");
+ unlink("data/online/users/$benutzer");
+ unlink("data/online/ident/$benutzer");
+ &rm_rstat($benutzer,$raum);
+}
+
+sub rm_rstat { # Benutzer als Raumbesetzer austragen
+ my ($r_alias,$rstatroom) = @_;
+ open (RSTAT,"<data/online/rstat/$rstatroom");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ my @rstat2 = ($rstat[0],$rstat[1]);
+ for ($i=2;$i<=$#rstat;$i++) {
+ push(@rstat2,$rstat[$i]) if ($rstat[$i] ne $r_alias."\n");
+ }
+ open (RSTAT,">data/online/rstat/$rstatroom");
+ print RSTAT @rstat2;
+ close RSTAT;
+}
+
+sub secure_checkid { # TmpID überprüfen
+ my ($alias2check) = @_;
+ open(IDENT,"<data/online/ident/$alias2check");
+ my @ident = <IDENT>;
+ close IDENT;
+ if ($ident[1] ne $tmpid) {
+ &error("Falsche TempID ! Du bist nicht befugt zu handeln !");
+ }
+}
+
+sub hierachie { # Chatter nach Sonderrechte überprüfen.
+ my $alias2prove = $_[0];
+ $hierachie = undef;
+ open(WA,"<data/wa");
+ @was = <WA>;
+ close WA;
+ foreach $wa (@was) {
+ if ($wa eq $alias2prove || $wa eq "$alias2prove\n") {
+ $hierachie = "wa";
+ }
+ }
+ open(OW,"<data/ow");
+ @ows = <OW>;
+ close OW;
+ if ($hierachie ne "wa" || $_ eq "$alias2prove\n") {
+ foreach $ow (@ows) {
+ if ($ow eq $alias2prove || $ow eq "$alias2prove\n") {
+ $hierachie = "ow";
+ }
+ }
+ }
+}
+
+sub debug {
+ open(DEBUG,">data/debug");
+ print DEBUG @_;
+ close DEBUG;
+} \ No newline at end of file
diff --git a/0.4.8a2/help.sno b/0.4.8a2/help.sno
new file mode 100644
index 0000000..4074cc0
--- /dev/null
+++ b/0.4.8a2/help.sno
@@ -0,0 +1,58 @@
+<div>
+ Alle Chat-Befehle:
+</div>
+<hr>
+<table width=100% bgcolor=000000>
+<tr><th bgcolor=666666><div>SU</div></th><th bgcolor=666666><div>Befehl</div></th><th bgcolor=666666><div>Beschreibung</div></th></tr>
+<tr><td><div>NC</div></td><td><div>/about</div></td><td><div>Zeigt aktuelle Version und andere Infos der Community an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/away <font color=red>Nachricht</font></div></td><td><div>Abmelden mit einer<font color=red>Abmeldenachricht</font></div></td></tr>
+<tr><td><div>NC</div></td><td><div>/clear</div></td><td><div>Bildschirm wird gelöscht</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/col <font color=red>XXXXXX</font> <font color=ffa500>XXXXXX</font></div></td><td><div>Farbe/n (<font color=red>Namensfarbe</font> / <font color=ffa500>Textfarbe</font>) wechseln. Angabe in Hexadezimal.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/date</div></td><td><div>Zeigt aktuelles Datum und Urzeit an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/j <font color=red>Raumname</font></div></td><td><div>Raum wechseln/erstellen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ju <font color=red>Alias</font></div></td><td><div>In den Raum wechseln/folgen, wo sich <font color=red>Alias</font> befindet.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/m <font color=red>Aktion</font></div></td><td><div>Handeln mit 2 Farben</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/me <font color=red>Aktion</font></div></td><td><div>Handeln mit einer Farbe</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/memo <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine <font color=ffa500>Memonachricht</font> hinterlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/msg <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine private <font color=ffa500>Nachricht</font> flüstern</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ <font color=ffa500>Nachricht</font></div></td><td><div>Eine private <font color=ffa500>Nachricht</font> demjenigen flüstern, dem zuletzt eine geflüstert wurde</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/online <font color=red>Alias</font></div></td><td><div>Zeigt Onlineminuten von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/q</div></td><td><div>Chat verlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/rmgb</div></td><td><div>Das eigene Gästebuch komplett weglöschen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/s <font color=red>Nachricht</font></div></td><td><div><font color=red>Nachricht</font> schreien</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/seen <font color=red>Alias</font></div></td><td><div>Zeigt an, vor wieviel Stunden sich <font color=red>Nachricht</font> zum letzten Mal in das System eingelogt hat</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/w</div></td><td><div>Zeigt an, wer sich im aktuellen Raum befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc <font color=red>Raum</font></div></td><td><div>Zeigt an, wer sich im <font color=red>Raum</font> befindet. Wird kein Raum angegeben, dann wird ledeglich angezeigt, wer sich im System befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc/</div></td><td><div>Zeigt alle offenen Räume und deren Chatter an</div></td></tr>
+<tr><td><div>NC</div></td><td> <div>/wj <font color=red>Alias</font></div></td><td><div>Zeigt an, in welchen Raum sich <font color=red>Alias</font> befindet</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/l</div></td><td><div>Der aktuelle Raum wird ab- bzw. aufgesperrt</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/rsu <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> die Raumbesetzerrechte entnehmen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/su <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Raumbesetzer ernennen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/t <font color=red>Thema</font></div></td><td><div>Dem aktuellen Raum wird ein <font color=red>Thema</font> gegeben</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban</div></td><td><div>Zeigt alle verbannten Benutzer an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> verbannen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/rban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> "entbannen"</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ip <font color=red>Alias</font></div></td><td><div>Zeigt die IP-Nummer von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/k <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird aus dem Chat katapultiert!</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ss <font color=red>Raum</font> <font color=ffa500>Nachricht</font></div></td><td><div>Eine <font color=ffa500>Nachricht</font> in <font color=red>Raum</font> hinüber rufen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/st <font color=red>Raum</font> <font color=ffa500>Thema</font></div></td><td><div>Einem anderen <font color=red>Raum</font> ein <font color=ffa500>Thema</font > geben</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/kill <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird ganz und gar aus dem System entfernt</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/wa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Wächter ernennen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/rwa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom Wächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/sys <font color=red>Nachricht</font></div></td><td><div>Systemnachricht schreiben. (Erscheint in allen existierenden Räumen)</div></td></tr>
+</table><hr>
+<div>
+ Zur Erklärung: NC steht für "Normale Chatter", RB für "Raumbesetzer", WÄ für "Wächter" und OW für "Oberwächter".
+ Obrige Befehle können nur von der/den jeweiligen Benutzergruppe/n werden.<br><br>
+ Allerdings gibt es folgendes zu beachten: Oberwächter verfügen über alle Chatbefehle. Normale Wächter über alle Chatbefehle, außer über die der Oberwächter.
+ Raumbesetzer können nur Raumbesetzerbefehle und die Befehle der normalen Chatter durchführen. Normale Chatter haben jedeglich die Standardbefehle zu verwenden.<br><br>
+ Weitere Besonderheiten der Wächter und Oberwächter:<br><br>
+ Wächter und Oberwächter können ....<br>
+ ... abgesperrte Chaträume problemlos betreten.<br>
+ ... nicht gekickt, verbannt oder gekillt werden.<br>
+ ... Logdateien der Cyberbar lesen.<br><br>
+
+ Des weiteren: Oberwächter ernennt nur der Systemadministrator!
+</div>
+</body>
+</html> \ No newline at end of file
diff --git a/0.4.8a2/htdocs.pl b/0.4.8a2/htdocs.pl
new file mode 100644
index 0000000..361fcb2
--- /dev/null
+++ b/0.4.8a2/htdocs.pl
@@ -0,0 +1,241 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header;
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+$var = $q->param("var");
+if ($var eq "help_html") {
+ &printfile("help.sno","Alle Chatbefehle");
+} elsif ($var eq "logo_html") {
+ &start_html("Logo");
+print<<END;
+<layer top=-3 left=0><div style="position:absolute; top:5; left:10">
+<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
+ codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0"
+ WIDTH=48 HEIGHT=48>
+ <PARAM NAME=movie VALUE="$gfxpath/ySymbol.swf">
+ <PARAM NAME=loop VALUE=false>
+ <PARAM NAME=menu VALUE=false>
+ <PARAM NAME=quality VALUE=high>
+ <PARAM NAME=scale VALUE=noborder>
+ <PARAM NAME=wmode VALUE=opaque>
+ <PARAM NAME=bgcolor VALUE=#005146>
+ <EMBED src="$gfxpath/ySymbol.swf" loop=false menu=false quality=high scale=noborder wmode=opaque bgcolor=#005146
+ WIDTH=48 HEIGHT=48 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED>
+</OBJECT>
+</div></layer>
+END
+print $q->end_html;
+} elsif ($var eq "menu_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ $tmp = $q->param("tmp");
+ &menu_html;
+} elsif ($var eq "werda_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &werda_html;
+} elsif ($var eq "logs_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ &logs_html;
+} elsif ($var eq "view_logs_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $tmp = $q->param("tmp");
+ &secure_checkid($alias);
+ &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ &printfile($tmp,"Logdatei","blank");
+ }
+} elsif ($var eq "superuser_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ &superuser_html;
+} else {
+ print
+ $q->start_html(-bgcolor=>"000000"),
+ $q->end_html;
+}
+
+sub menu_html {
+if ($tmp eq "quit") {
+ &start_html("Quit","blank","<script language=\"JavaScript\">open(\"index.pl?tmp=quit\",\"_top\");</script>");
+ print $q->end_html;
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffffff>$alias verläßt den Chat ... </font></i>");
+ sleep 2;
+ &rm_alias($alias,$room);
+ exit;
+}
+ENDJS
+ &start_html("Menü","blank");
+print <<END;
+<script language="JavaScript">
+function fenster(fenster,target) {
+ open(fenster,target,"width=500,height=500,screenX=100,screenY=100,scrollbars");
+}
+</script>
+<font size=2 face=verdana><p>
+ <a href='javascript:fenster("htdocs.pl?var=werda_html&alias=$alias&room=$room&col=$col&secol=$secol&tmp=$tmp&tmpid=$tmpid","weristda")'>Wer ist da?</a>
+ <a href='javascript:fenster("main2.pl?var=edit_profile_html&alias=$alias&tmpid=$tmpid&room=$room","ProfilAendern")'>Profil ändern</a>
+ <a href='javascript:fenster("main2.pl?var=edit_options_html&alias=$alias&tmpid=$tmpid&room=$room","Optionen")'>Chatoptionen</a>
+ <a href='javascript:fenster("main2.pl?var=list_alias_html&alias=$alias&tmpid=$tmpid","Benutzerliste")'>Benutzerliste</a>
+ <a href='javascript:fenster("htdocs.pl?var=help_html&tmpid=$tmpid","Befehle")'>Chatbefehle</a><br>
+ <a href='javascript:fenster("main2.pl?var=gb_html&alias=$alias&tmpid=$tmpid","Board")'>Benutzerboard</a>
+ <a href='javascript:fenster("htdocs.pl?var=superuser_html&alias=$alias&tmpid=$tmpid","Superuser")'>Superuser</a>
+ <a href='javascript:fenster("htdocs.pl?var=logs_html&alias=$alias&tmpid=$tmpid","Logdateien")'>Logs</a>
+ <a href='javascript:fenster("ranking.php4?&alias=$alias&tmpid=$tmpid","Ranking")'>Top 40</a>
+ <a href="http://www.home.yChat.de" target="Home">Home</a>
+ <a href="http://www.credits.yChat.de" target="Credits">Credits</a>
+ <a href="htdocs.pl?alias=$alias&var=menu_html&room=$room&tmpid=$tmpid&tmp=quit">Verlassen</a>
+</p></font>
+</body>
+</html>
+END
+}
+
+sub werda_html { # Anzeige, wer eingelogt ist.
+ &start_html("Wer ist da?");
+ print <<END;
+<div>
+ $alias, schön daß Du hier bist :-)
+</div>
+<hr>
+<div>
+ Folgende Personen befinden sich im Chat:
+</div>
+<br>
+<div>
+END
+ opendir(ROOMDIRS,"data/online/rooms");
+ local @roomdirs = readdir(ROOMDIRS);
+ close(ROOMDIRS);
+ foreach(@roomdirs) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ my $room = $_;
+ open(RSTAT,"<data/online/rstat/$room");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ opendir(ROOMDIR,"data/online/rooms/$room");
+ my @roomdir = readdir(ROOMDIR);
+ close(ROOMDIR);
+ local $nr = $#roomdir-1;
+ print $q->b( $_ ),
+ " $door ($nr) Raumthema: $rstat[1]",
+ $q->br;
+ foreach(@roomdir) {
+ if ($_ ne ".." && $_ ne ".") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid" }, "$_"), " ";
+ }
+ }
+ print $q->br, $q->br;
+ }
+ }
+ print
+ "</div>",
+ $q->end_html;
+}
+
+sub logs_html {
+ &start_html("Logdateien");
+ print <<END;
+<div>
+ Hier befinden sich alle Logdateien
+</div>
+<hr>
+END
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ print $q->div( "Folgende Logdateien des Raumes \"Cyberbar\" können nur von Oberwächtern gelesen werden (Sortiert nach A-Z, a-z):" ),
+ $q->br;
+ opendir(LOGS,"data/logs");
+ local @logs = readdir(LOGS);
+ closedir(LOGS);
+ local @sortedir = sort(@logs);
+ foreach(@sortedir) {
+ if (-f "data/logs/$_") {
+ print $q->a( { -href=>"htdocs.pl?alias=$alias&var=view_logs_html&tmp=data/logs/$_&tmpid=$tmpid",
+ -target=>"_new" },
+ "$_" ),
+ " ";
+ }
+ }
+ } else {
+ print $q->div( "Logdateien können nur von Oberwächtern (OW) gelesen werden. Du bist jedoch ein Wächter (WÄ) oder ein",
+ "\"Normaler Chatter\". Oberwächter können alles nachlesen, was öffentlich im Raum \"Cyberbar\" gechattet wurde." ),
+ $q->hr;
+ &printfile("data/htdocs/logs_html");
+ }
+ print
+ $q->end_html;
+}
+
+sub superuser_html { # Zeigt an, wer Superuser ist
+ &start_html("Superuser");
+ print "<div>Hallo $alias. Du bist als ";
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ print
+ $q->b( "Oberwächter" ),
+ " (OW) eingetragen.</div>",
+ $q->hr;
+ } elsif ( $hierachie eq "wa") {
+ print
+ $q->b( "Wächter" ),
+ " (WÄ) eingetragen.</div>",
+ $q->hr;
+ } else {
+ print
+ $q->b( "normaler Chatter" ),
+ " (NC) eingetragen.</div>",
+ $q->hr;
+ }
+
+ my $nrow = $#ows+1;
+ print
+ "<div>",
+ $q->b( "OW" ),
+ "s ($nrow Stück)";
+ foreach(@ows) {
+ print
+ $q->font( { -color=>"ffa500" },
+ " ".$_);
+ }
+ my $nrwa = $#was+1;
+ print
+ "</div>",
+ $q->hr,
+ "<div>",
+ $q->b( "WÄ" ),
+ "s ($nrwa Stück)";
+ foreach(@was) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+print <<END;
+<hr>
+ Die jeweiligen Fähigkeiten der Oberwächter (OW) und der Wächter (WÄ) sind unter
+ "<a href="htdocs.pl?var=help_html">Chat-Befehle</a>"
+ dokumentiert.
+</div>
+</body>
+</html>
+END
+} \ No newline at end of file
diff --git a/0.4.8a2/index.pl b/0.4.8a2/index.pl
new file mode 100644
index 0000000..2b9cee2
--- /dev/null
+++ b/0.4.8a2/index.pl
@@ -0,0 +1,426 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header;
+
+#####################################
+##WELCHE SUB MUß AUFGERUFEN WERDEN?##
+#####################################
+
+$var = $q->param("var");
+$alias = $q->param("alias");
+$pw = $q->param("pw");
+$tmp = $q->param("tmp");
+
+if ($var eq "create_alias_html") {
+ &create_alias_html;
+} elsif ($var eq "create_alias") {
+ &create_alias;
+} elsif ($var eq "login_html") {
+ $tmp = $q->param("tmp");
+ &login_html;
+} elsif ($alias eq "") {
+ &login_html;
+} else {
+ &checklogin;
+}
+
+sub login_html { # Erste Startseite
+&check_online;
+local $counter = undef;
+open(COUNT,"<data/count");
+ $counter = <COUNT>;
+close COUNT;
+$counter++;
+open(COUNT,">data/count");
+ print COUNT $counter;
+close COUNT;
+opendir(USERS,"data/online/users");
+ local @users = readdir(USERS);
+closedir(USERS);
+opendir(REGISTRED,"data/user/options");
+ local @registred = readdir(REGISTRED);
+closedir(REGISTRED);
+local ($logtin,$users) = ($#users-1,$#registred-1);
+&start_html("Created & Copyright by Paul C. Bütow","start");
+print <<END;
+ <center>
+ <table width=500>
+ <tr>
+ <td>
+ <center>
+ <table>
+ <tr>
+ <td>
+ <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0" WIDTH=240 HEIGHT=240>
+ <PARAM NAME=movie VALUE="$gfxpath/yIntro.swf">
+ <PARAM NAME=loop VALUE=false>
+ <PARAM NAME=menu VALUE=false>
+ <PARAM NAME=quality VALUE=high>
+ <PARAM NAME=scale VALUE=noborder>
+ <PARAM NAME=wmode VALUE=opaque>
+ <PARAM NAME=bgcolor VALUE=#005146>
+ <EMBED src="$gfxpath/yIntro.swf" loop=false menu=false quality=high scale=noborder wmode=opaque bgcolor=#005146 WIDTH=240 HEIGHT=240 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED>
+ </object>
+ </td>
+ <td>
+ <div>
+ yChat: Version $version
+ <br><br>
+ Letztes Update: $datum
+ <br><br>
+ Seitenaufrufe: $counter
+ <br><br>
+ Benutzer registriert: $users
+ <br><br>
+ Benutzer online: $logtin
+ <br><br>
+ Webmaster: <a href="mailto:mail\@paulbuetow.de">Paul C. Bütow</a>
+ <br><br>
+ yChat-HP: <a href="http://www.home.yChat.de">home.yChat.de</a>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </center>
+ </div>
+ <br>
+ <br>
+END
+ if ($tmp eq "true") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Wahrscheinlich existiert Dein Alias "$alias" nicht,
+ <br>
+ Du hast Dich verschrieben oder das Passwort ist falsch.
+ <br>
+ Versuch es erneuert !
+ </div>
+END
+ } elsif ($tmp eq "quit") {
+print <<END;
+ <div>
+ Du hast soeben den Chat verlassen.
+ <br>
+ Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ } elsif ($tmp eq "autologout") {
+print <<END;
+ <div>
+ Du wurdest automatisch aus dem Chat ausgeloggt. Grund: Du warst 20 Minuten inaktiv.
+ <br>
+ Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ } elsif ($tmp eq "banned") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein Alias "$alias" wurde verbannt.
+ <br>
+ Z.z. kannst Du Dich leider nicht in den Chat einloggen.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($tmp eq "kick") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wurdest soeben aus dem Chat katapultiert!
+ <br>
+ Schlechtes Verhalten mag die Ursache hierfür sein.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($var eq "create_alias") {
+print "<div>Du hast sich soeben in die Datenbank eingetragen. Einfach auf \"Los Geht's\" klicken :-)</div>";
+ } else {
+print <<END;
+ <div>
+ Herzlich willkommen!
+ <br>
+ Einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <form name="login" action="index.pl" method="post">
+ <input type="hidden" name="tmp" value="true">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Alias:
+ <br>
+ <input name="alias" value="$alias">
+ </div>
+ </td>
+ <td>
+ <div>
+ Dein Passwort:
+ <br>
+ <input type="password" name="pw" value="$pw">
+ </div>
+ </td>
+ </tr>
+ </table>
+ <br>
+ <br>
+ <div>
+ Solltest Du noch keinen Nick besitzen, dann auf "Registrieren" klicken!
+ </div>
+ <br>
+ <table>
+ <tr>
+ <td>
+ <font color="ffffff">
+ <input type="submit" value="Los geht's!">
+ </font>
+ </form>
+ </td>
+ <td>
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias_html">
+ <font color="ffffff">
+ <input type="submit" value="Registrieren">
+ </font>
+ </form>
+ </td>
+ </tr>
+ </table>
+ <hr>
+ </td>
+ </tr>
+ </table>
+ </center>
+</body>
+</html>
+END
+ if (-d "data/online/rooms") {
+ } else {
+ mkdir "data/online/rooms", 0777;
+ }
+}
+
+
+sub create_alias_html { # HTML-Form für Erstellung eines neuen Benutzers.
+my $reload = $_[0];
+&start_html("Registration");
+print <<END;
+ <center>
+ <table width=500>
+ <tr>
+ <td>
+END
+ if ($reload eq "alias_exists") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Der von Dir gewählte Benutzername "$alias" existiert in unserer Datenbank bereits. Bitte versuch es erneuert mit
+ einem anderen Benutzernamen !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "pw_wrong") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Deine beiden Passworteingaben stimmen nicht überein. Bitte geb das Passwort erneuert an um sicherzugehen, daß
+ kein falsches Passwort abgespeichert wird !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "alias_prohibited") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein gewählter Benutername "$alias" enthält illegale Zeichen. Bitte versuch einen anderen Benutzernamen!
+ </div>
+ <hr>
+END
+} elsif ($reload eq "alias_length") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein gewählter Benutername "$alias" enthält zu viele Zeichen. Es sind maximal 15 Zeichen erlaubt!!
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Hier kannst Du Dich registrieren. Bitte beachte, daß die Passworteingabefelder übereinstimmen!
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias">
+ <div>
+ Dein Alias:
+ <font color="ffa500">
+ (Muß angegeben werden)
+ </font>
+ <br>
+ <input name="alias" VALUE="$alias">
+ </div>
+ <br>
+ <div>
+ Dein gewünschtes Passwort:
+ <br>
+ <input type="password" name="pw" value="$pw">
+ </div>
+ <br>
+ <div>
+ Geb hier Dein Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp">
+ </div>
+ <br>
+ <font color=ffffff>
+ <input type="submit" value="Registrieren">
+ </font>
+ <br>
+ </form>
+ <hr>
+ <div>
+ Um den Chat zu betreten müssen die Daten nach der Registration auf der Startseite erneuert bestätigt werden !
+ </div>
+ </td>
+ </tr>
+ </table>
+</center>
+</body>
+</html>
+END
+}
+
+sub checklogin { # Überprüfen, ob die Login-Daten korrekt sind.
+ my $lognotexists = "true";
+ opendir(USERDIR,"data/user/options");
+ my @userdir = readdir(USERDIR);
+ closedir(USERDIR);
+ foreach $user (@userdir) {
+ if ($user eq $alias) {
+ open(OPTIONS,"<data/user/options/$alias");
+ my @options = <OPTIONS>;
+ close OPTIONS;
+ foreach(@options) {
+ chomp $_;
+ }
+ if ($options[0] eq $pw) {
+ open(BAN,"<data/ban");
+ my @ban = <BAN>;
+ close BAN;
+ foreach(@ban) {
+ if ($_ eq "$alias\n") {
+ $tmp = "banned";
+ &login_html;
+ exit;
+ }
+ }
+ if ($options[1] eq undef) { $col = "ffffff";}
+ else { $col = $options[1]; }
+ if ($options[2] eq undef) { $secol = "ffffef";}
+ else { $secol = $options[2];}
+ if ($options[3] eq undef) { $maxVerlauf = "10";}
+ else { $maxVerlauf = $options[3];}
+ if ($options[4] eq undef) { $verlaufOrder = "1";}
+ else {$verlaufOrder = $options[4];}
+ $tmpid = time;
+ open(IDENT,">data/online/ident/$alias");
+ print IDENT $ENV{'REMOTE_ADDR'}."\n".$tmpid;
+ close IDENT;
+ open(LASTLOGIN,">data/user/lastlogin/$alias");
+ print LASTLOGIN time;
+ close LASTLOGIN;
+ &frameset_html;
+ exit;
+ } else {
+ $lognotexists = "false";
+ }
+ }
+ }
+ &login_html; # Falls Login-Daten inkorrekt sind, zurück zur Startseite.
+}
+
+sub create_alias { # Erstellung eines neuen Benutzers.
+ if ($alias =~ /[\W]/ || $alias eq "") {
+ &create_alias_html("alias_prohibited");;
+ exit 0;
+ } elsif ($pw ne $tmp) {
+ &create_alias_html("pw_wrong");
+ exit 0;
+ } elsif (length($alias) >= 15) {
+ &create_alias_html("alias_length");
+ exit 0;
+ }
+ opendir(USERDIR,"data/user/options");
+ my @user = readdir(USERDIR);
+ close USERDIR;
+ foreach $user (@user) {
+ if ($user eq $alias) {
+ &create_alias_html("alias_exists");
+ exit;
+ }
+ }
+ open(OPTIONS,">data/user/options/$alias");
+ print OPTIONS $pw."\n";
+ close OPTIONS;
+ local $number = $#user;
+ &zeit;
+ &post("Cyberbar","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffffff>$alias [$number] hat sich soeben als neuer Benutzer registriert :-) ...</font></i>");
+ &login_html;
+}
+
+sub frameset_html {
+print <<END;
+<html>
+ <head>
+ <title>
+ $title - Powered by CXG - Chatters of the next generation
+ </title>
+ </head>
+<frameset border=0 frameborder=0 framespacing=0 cols="130,*">
+ <frameset border=0 frameborder=0 framespacing=0 rows="300,*,55">
+ <frame name="online" src="online.pl?room=Cyberbar&alias=$alias&tmpid=$tmpid">
+ <frame src="htdocs.pl">
+ <frameset border=0 frameborder=0 framespacing=0 cols="70,*">
+ <frame name="logo" src="htdocs.pl?var=logo_html" scrolling="no">
+ <frame name="reload" src="htdocs.pl" scrolling="no">
+ </frameset>
+ </frameset>
+ <frameset border=0 frameborder=0 framespacing=0 rows="60,*,55">
+ <frame name="menu" src="htdocs.pl?alias=$alias&var=menu_html&room=Cyberbar&col=$col&secol=$secol&tmpid=$tmpid" scrolling="no">
+ <frame name="main" src="push.pl?room=Cyberbar&alias=$alias&tmpid=$tmpid">
+ <frame name="input" src="input.pl?alias=$alias&room=Cyberbar&col=$col&secol=$secol&tmp=login&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder" scrolling="no">
+ </frameset>
+</frameset>
+</html>
+END
+} \ No newline at end of file
diff --git a/0.4.8a2/input.pl b/0.4.8a2/input.pl
new file mode 100644
index 0000000..1be7ed0
--- /dev/null
+++ b/0.4.8a2/input.pl
@@ -0,0 +1,197 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header();
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+#&secure_checkid($alias);
+$room = $q->param("room");
+$col = $q->param("col");
+$secol = $q->param("secol");
+$tmp = $q->param("tmp");
+$whisper = $q->param("whisper");
+$maxVerlauf = $q->param("maxVerlauf");
+$verlaufOrder = $q->param("verlaufOrder");
+
+if ($maxVerlauf eq undef) { $maxVerlauf = "10";}
+if ($verlaufOrder eq undef) { $verlaufOrder = "1";}
+
+if ($tmp eq "login") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias hat den Chat betreten ...</font></i>");
+}
+
+print <<END;
+<html>
+<head>
+<script language="JavaScript"><!--
+
+// Einstellungsvariablen
+maxVerlauf = $maxVerlauf; // Anzahl der Einträge des Verlaufs
+maxPreview = 20; // Zeichenlänge der Verlaufsvorschau
+verlaufOrder = $verlaufOrder; // Neue Nachrichten von: 0=oben, 1=unten
+autoAwayTimeout = 300; // Sekunden, nach denen der User 'Away' gesetzt wird
+autoQuitTimeout = 1200; // Sekunden, nach denen der User den Chat verlässt
+
+// Interne Variablen
+userNotFocused = false; // Wenn User nicht schreibt
+userAway = false; // Wenn User automatisch auf 'Away' gesetzt ist
+userAwayTime = 0; // Sekunden, die User 'Away' ist
+fullVerlauf = new Array( maxVerlauf ); // Verlaufspuffer
+
+function delout()
+{
+ addVerlauf (document.inf.msg.value); // Dem Verlauf eine Nachricht anhängen
+ document.inf.submit(); // Formular absenden
+ document.inf.msg.focus(); // Fukus in das Eingabeform
+ document.inf.msg.select(); // Text im Eigabeform markieren
+ return false; // Abbrechen, damit das Frame nicht neu geladen wird
+}
+
+function CheckAuswahl()
+{
+ id=document.verlaufform.verlauf.selectedIndex; // ID des ausgewählten Feldes
+
+ if (fullVerlauf[id-1] != null) // Nur, wenn das Feld nicht leer ist
+ {
+ document.inf.msg.value = fullVerlauf[id-1]; // Eintrag ins Textfeld
+ }
+
+ document.verlaufform.verlauf.selectedIndex = 0; // Ersten Eintrag (Überschrift) auswählen
+ document.inf.msg.focus(); // Eingabefeld fokusieren
+
+ return true;
+}
+
+function addVerlauf (msg)
+{
+ if (msg == "") // Falls msg leer
+ return false; // Aufruf ignorieren
+
+ if (verlaufOrder) // neue Nachrichten von unten
+ {
+ for (i=0; i<(maxVerlauf-1); i++) // Alle Einträge einen aufrutschen
+ {
+ document.verlaufform.verlauf.options[i+1].text = document.verlaufform.verlauf.options[i+2].text;
+ fullVerlauf[i] = fullVerlauf[i+1];
+ }
+ }
+ else // neue Nachrichten von oben
+ {
+ for (i=(maxVerlauf-2); i>=0; i--) // Alle Einträge einen aufrutschen
+ {
+ document.verlaufform.verlauf.options[i+2].text = document.verlaufform.verlauf.options[i+1].text;
+ fullVerlauf[i+1] = fullVerlauf[i];
+ }
+ }
+
+ if (msg.length > maxPreview) // Vorschau zuschneiden
+ pre = msg.slice(0, maxPreview-3) + "...";
+ else
+ pre = msg;
+
+ if (verlaufOrder) // pos = Position des neuen Eintrags
+ pos = maxVerlauf-1;
+ else
+ pos = 0
+
+ document.verlaufform.verlauf.options[pos+1].text = pre; // Neue Vorschau anfügen
+ fullVerlauf[pos] = msg; // Neuen Eintrag an den Verlauf anfügen
+
+// document.verlaufform.verlauf.selectedIndex = maxVerlauf; // Fokus auf den letzten Eintrag
+ document.verlaufform.verlauf.selectedIndex = 0; // Fokus auf den ersten Eintrag (Überschrift)
+}
+
+function msgBlur()
+{
+ userNotFocused = true;
+ userAwayTime = 0;
+ userAway = false;
+}
+
+function msgFocus()
+{
+ userNotFocused = false;
+ if (userAway) // Wird ausgeführt, falls User 'Away' war
+ {
+ ; // nop
+ }
+ userAwayTime = 0;
+ userAway = false;
+}
+
+function checkInterval()
+{
+// status = "userNotFocused=" + userNotFocused + "; userAway=" + userAway + "; userAwayTime=" + userAwayTime + ""; // Debug
+ if (userNotFocused)
+ {
+ userAwayTime += 5; // Addiere 5, da nur alle 5Sek ausgeführt
+ if (!userAway)
+ {
+ if (autoAwayTimeout < userAwayTime) // Falls Zeit abgelaufen
+ {
+ if (document.inf.tmp.value != "away")
+ open ("mail.pl?alias=$alias&tmpid=$tmpid&msg=/away&col=$col&room=$room&tmp=autoaway","reload"); // 'Away' setzen
+ userAway = true;
+ }
+ }
+ else
+ {
+ if (autoQuitTimeout < userAwayTime) // Falls Zeit abgelaufen
+ {
+ open ("mail.pl?alias=$alias&tmpid=$tmpid&msg=/q&room=$room&tmp=autologout","reload"); // Chat beenden
+ }
+ }
+ }
+
+ window.setTimeout("checkInterval()",5000); // In 5 Sekunden wieder aufrufen
+}
+
+function initFrame()
+{
+ window.setTimeout("checkInterval()",5000); // In 5 Sekunden aufrufen
+ document.inf.msg.focus(); // Eingabefeld fokusieren
+}
+//-->
+</script>
+$style
+</head>
+<body class="blank" onload="initFrame();">
+ <div align="left">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td>
+ <form name="inf" target="reload" action="main.pl" onsubmit="return delout();">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="room" value="$room">
+ <input type="hidden" name="col" value="$col">
+ <input type="hidden" name="secol" value="$secol">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="whisper" value="$whisper">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input size="50" maxlength="300" name="msg" onBlur="msgBlur();" onFocus="msgFocus();">
+ </form>
+ </td>
+ <td><form name="verlaufform">
+ <script language="JavaScript"><!--
+ document.write("<select size='1' name='verlauf' size='40' onChange='CheckAuswahl();'>");
+ document.write("<option value>- Nachrichten-Verlauf -</option>");
+ for(i=0; i<maxVerlauf; i++) // Leere Verlaufsfelder generieren
+ document.write("<option value>(leer)</option>");
+ document.write("</select>");
+ //-->
+ </script>
+ </form>
+ </td>
+ </tr>
+ </table>
+ </div>
+</body>
+</html>
+END
diff --git a/0.4.8a2/main.pl b/0.4.8a2/main.pl
new file mode 100644
index 0000000..b849216
--- /dev/null
+++ b/0.4.8a2/main.pl
@@ -0,0 +1,945 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header();
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+&secure_checkid($alias);
+$room = $q->param("room");
+$col = $q->param("col");
+$secol = $q->param("secol");
+$tmp = $q->param("tmp");
+$rmsg = \$q->param("msg");
+$whisper = $q->param("whisper");
+
+if ($tmp eq "away") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias hat sich zurück gemeldet ... </font></i>");
+}
+
+if ($q->param('var') eq "change_colors") {
+ &reload_html("","change_colors")
+}
+unless (-e "data/online/rooms/$room/$alias") {
+ &post_prv($alias,"<font color=ffffff>Du befindest Dich nicht im Raum \"<font color=ffa500>$room</font>\" und kannst dort auch keine Nachrichten posten!</font>");
+ &reload_html;
+} elsif (length($$rmsg) > 300) {
+ &post_prv($alias,"<font color=ffffff>Deine Nachricht enthält zu viele Zeichen. Maximal sind 300 Zeichen erlaubt.</font>");
+ &reload_html;
+}
+
+
+$$rmsg =~ s#<#&lt\;#g;
+if (substr($$rmsg,0,1) ne "/") {
+ open(MSGFILE,">>data/msgs/$room");
+ unless ($$rmsg =~ s#/me/#<i>$alias</i>#g || $$rmsg =~ s#/m/#<i><font color=$col>$alias</font></i>#g) {
+ print MSGFILE "!<;".time."<;!<;!<;<b><font color=$col>$alias: <font color=$secol>$$rmsg</font></font></b><;\n";
+ } else {
+ $$rmsg =~ s#/me/#<i>$alias</i>#g;
+ $$rmsg =~ s#/m/#<i><font color=$col>$alias</font></i>#g;
+ print MSGFILE "!<;".time."<;!<;!<;<b><font color=$secol>$$rmsg</font></font></b><;\n";
+ }
+ close MSGFILE;
+ opendir(PID,"data/online/pids/$room");
+ my @pids = readdir(PID);
+ closedir(PID);
+ foreach(@pids) {
+ if (-f "data/online/pids/$room/$_") {
+ kill USR1 => $_;
+ }
+ }
+ &log("<b><font color=$col>$alias: <font color=$secol>$$rmsg</font></font></b>") if ($room eq "Cyberbar");
+ &reload_html($whisper,$tmp);
+} else {
+ &cmd($$rmsg);
+}
+
+sub reload_html { # Wird neugeladen, wenn eine Nachricht getextet wird!
+ my ($whisper,$action) = @_;
+ print "<html><head><script language=\"JavaScript\">";
+ if ($action eq "change_room") {
+ print "open(\"online.pl?alias=$alias&room=$room&tmpid=$tmpid\",\"online\");";
+ print "parent.input.document.inf.room.value = \"$room\";";
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol&tmpid=$tmpid\",\"menu\");";
+ } elsif ($action eq "change_colors") {
+ print "parent.input.document.inf.col.value = \"$col\";";
+ print "parent.input.document.inf.secol.value = \"$secol\";";
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol&tmpid=$tmpid\",\"menu\");";
+ } elsif ($action eq "whisper") {
+ print "parent.input.document.inf.whisper.value = \"$whisper\";";
+ } elsif ($action eq "away") {
+ print "parent.input.document.inf.tmp.value = \"away\";";
+ } elsif ($action eq "quit" && $tmp eq "autologout") {
+ print "open(\"index.pl?tmp=autologout\",\"_top\");";
+ &rm_alias($alias,$room);
+ } elsif ($action eq "quit") {
+ print "open(\"index.pl?tmp=quit\",\"_top\");";
+ &rm_alias($alias,$room);
+ }
+ print "parent.input.document.inf.tmp.value = \"notaway\";" if ($tmp eq "away");
+ print "</script></head><body bgcolor=$col>";
+ print $q->end_html;
+ exit 0;
+}
+
+sub change_room { # Den Chat-Raum wechseln
+ my ($method,$newroom,$oldroom,$alias2follow) = @_;
+ open(RSTAT, "<data/online/rstat/$newroom"); #Überprüfen, ob Alias Raum betreten darf
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ if ($rstat[0] eq "1\n") {
+ &hierachie($alias);
+ if ($hierachie eq "wa" || $hierachie eq "ow") { } else {
+ &post_prv($alias,"<font size=2 color=ffffff>Der Raum \"<font color=ffa500>$newroom</font>\" ist leider abgesperrt!</font>");
+ &reload_html($whisper,$action);
+ exit;
+ }
+ }
+ open(MSGFILE,">>data/msgs/$room");
+ flock(MSGFILE, 2);
+ print MSGFILE "$alias<;".time."<;cr<;$newroom<;!<;\n";
+ close MSGFILE;
+ $room = $oldroom;
+ my $tmpstamp = time+5;
+ &zeit;
+ if ($method eq "j") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias wechselt in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias kommt aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ open(MSGFILE,">>data/msgs/$room");
+ flock(MSGFILE, 2);
+ print MSGFILE "$alias<;$tmpstamp<;!<;!<;<i><font color=ffffff>($hours:$min:$sec) Du wechselst aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i><;\n";
+ close MSGFILE;
+ } elsif ($method eq "ju") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias folgt \"$alias2follow\" in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias kommt aus dem Raum \"$oldroom\" und folgt \"$alias2follow\" herein nach \"$newroom\" ...</font></i>");
+ open(MSGFILE,">>data/msgs/$room");
+ flock(MSGFILE, 2);
+ print MSGFILE "$alias<;$tmpstamp<;!<;!<;<i><font color=ffffff>($hours:$min:$sec) Du folgst \"$alias2follow\" aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i><;\n";
+ close MSGFILE;
+ }
+ opendir(PID,"data/online/pids/$raum");
+ my @pids = readdir(PID);
+ closedir(PID);
+ foreach(@pids) {
+ if (-f "data/online/pids/$raum/$_") {
+ kill USR1 => $_;
+ }
+ }
+ unlink("data/online/rooms/$oldroom/$alias");
+ &rm_rstat($alias,$oldroom);
+ &check_online;
+}
+
+sub prove_besetzer { # Prüfen, ob Benutzer Raumbesetzerrechte hat
+ my ($r_alias,$r_room) = @_;
+ $r_besetzer = "false";
+ open(DATEI,"<data/online/rstat/$r_room");
+ @r_stat = <DATEI>;
+ close DATEI;
+ for($i=2;$i<=$#r_stat;$i++) {
+ $r_besetzer = "true" if ($r_stat[$i] eq $r_alias || $r_stat[$i] eq $r_alias."\n");
+ }
+}
+
+sub cmd { # Alle Chatbefehle, die über input_html eingegeben werden können.
+ $_[0] = $_[0]." ";
+ $_[0] = substr($_[0], 1, length($_[0])-1);
+ my @cmd = split(/ /, $_[0]);
+ my $cmd = substr($_[0],0 , index($_[0], " "));
+#############>- NORMALE CHATBEFEHLE ( Alphabetisch sortiert ) -<
+#############>- INFORMATIONEN ÜBER DAS SYSTEM AUSGEBEN -<
+ if ($cmd eq "about") {
+ &post_prv("$alias","<font color=ffffff>Aktuelle Version ist $title und wurde am $datum aktuallisiert. Erstellt von Paul C. Bütow (2000 - 2001).</font>");
+ &reload_html;
+ exit;
+#############>- ABMELDEN MIT 'AWAY-NACHRICHT' -<
+ } elsif ($cmd eq "away") {
+ if ($tmp eq "away") { # Falls 2 mal hintereinander /away eingegeben wurde
+ my $away_msg = undef;
+ }
+ for ($i=1; $i <= $#cmd; $i++) {
+ $away_msg = $away_msg." ".$cmd[$i];
+ }
+ &zeit;
+ if ($tmp ne "autoaway") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias meldet sich ab (<font color=ffa500>$away_msg</font> ) ...</i></font>");
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias wurde vom System abgemeldet ...</i></font>");
+ }
+ &reload_html($whisper,"away");
+ exit;
+#############>- EIGENEN CHATBILDSCHIRM LÖSCHEN -<
+ } elsif ($cmd eq "clear") {
+ &post_prv($alias,"<script language=\"JavaScript\">window.open(\"push.pl?alias=$alias&room=$room&var=clear_screen&tmpid=$tmpid\",\"main\");</script>");
+ &reload_html;
+ exit;
+#############>- FARBEN WECHSELN -<
+ } elsif ($cmd eq "col") {
+ $col = $cmd[1];
+ my $tmpsecol = $cmd[2];
+ if ($tmpsecol eq "") {
+ $secol = $col
+ } else {
+ $secol = $tmpsecol;
+ }
+ open(OPTIONS,"<data/user/options/$alias");
+ my @options = <OPTIONS>;
+ close OPTIONS;
+ open(OPTIONS,">data/user/options/$alias");
+ print OPTIONS $options[0]."".$col."\n".$secol;
+ close OPTIONS;
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat die Farbe gewechselt ...</font></i>");
+ &reload_html($whisper,"change_colors");
+ exit;
+#############>- AKTUELLES DATUM UND URZEIT AUSGEBEN -<
+ } elsif ($cmd eq "date") {
+ &zeit;
+ &post_prv("$alias","<font color=ffffff>Heute ist der $day.$month. Jahr $year. Es ist genau $hours:$min Uhr und $sec Sekunden.</font>");
+ &reload_html;
+ exit;
+#############>- EINEN NEUEN RAUM ERSTELLEN BZW. IN EINEN BESTEHENDEN RAUM WECHSELN -<
+ } elsif ($cmd eq "j") {
+ &change_room("j",$cmd[1],$room);
+ &reload_html($whisper,"change_room");
+ exit;
+#############>- HANDELN -<
+ } elsif ($cmd eq "me" || $cmd eq "m") {
+ my $me_msg;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $me_msg = $me_msg." ".$cmd[$i];
+ }
+ $me_msg =~ s#/me/#<i>$alias</i>#g;
+ $me_msg =~ s#/m/#<i><font color=$col>$alias</font></i>#g;
+ if ($cmd eq "m") {
+ &post($room,"<b><font color=$col><i>$alias</i> <font color=$secol>$me_msg</font></font></b>");
+ } else {
+ &post($room,"<b><font color=$col><i>$alias</i> $me_msg</font></b>");
+ }
+ &reload_html;
+ exit;
+#############>- MEMO SCHREIBEN -<
+ } elsif ($cmd eq "memo") {
+ my $alias2memo = $cmd[1];
+ if(-f "data/user/options/$alias2memo") {
+ my $memo_msg;
+ for ($i=2; $i <= $#cmd; $i++) {
+ $memo_msg = $memo_msg." ".$cmd[$i];
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2memo <font color=ffffff>wurde folgende memo erfolgreich hinterlassen: $memo_msg</font></font>");
+ &zeit;
+ open(MEMO,">>data/user/memos/$alias2memo");
+ print MEMO "<font color=ffffff>($day.$month. - $hours:$min:$sec) <font color=ffa500>$alias</font> hat Dir eine Memo hinterlassen: <font color=ffa500>$memo_msg</font></font><br>\n";
+ close MEMO;
+ &reload_html;
+ exit;
+ }
+ &post_prv("$alias","<font color=ffa500>$alias2memo <font color=ffffff>existiert in der Datenbank nicht !</font></font>");
+ &reload_html;
+ exit;
+#############>- FLÜSTERN ( Auch mit '/' ) -<
+ } elsif ($cmd eq "msg" || $cmd eq "") {
+ my ($alias2post,$msg2post,$action) = ($cmd[1]);
+ if ($cmd eq "msg") {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ $action = "whisper";
+ } else {
+ $alias2post = $whisper;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ }
+ $msg2post =~ s#/me/#<i>$alias</i>#g;
+ $msg2post =~ s#/m/#<i><font color=$col>$alias</font></i>#g;
+ if (-f "data/online/users/$alias2post") {
+ &post_prv($alias2post,"<b><font color=$col><i>$alias flüstert:</i> <font color=$secol>$msg2post</font></font></i></b>");
+ &post_prv($alias,"<b><font color=$col><i>Zu $alias2post geflüstert:</i> <font color=$secol>$msg2post</font></font></i></b>");
+ &reload_html($alias2post,$action);
+ exit;
+ }
+ &post_prv("$alias","<font color=ffa500>$alias2post <font color=ffffff>ist nicht anwesend !</font></font>");
+ &reload_html;
+ exit;
+#############>- TOTALONLINEZEIT VON ALIAS ANZEIGEN -<
+ } elsif ($cmd eq "online") {
+ my $alias2prove= $cmd[1];
+ if (-f "data/user/options/$alias2prove") {
+ open(ONLINE,"<data/user/counts/$alias2prove.online");
+ my $online = <ONLINE>;
+ close ONLINE;
+ my $totaltime = sprintf("%.2f",($online / 60));
+ &post_prv("$alias","<font color=ffa500>$alias2prove <font color=ffffff> war insgesamt schon $totaltime Minuten online!</font></font>");
+ } else {
+ &post_prv("$alias","<font color=ffa500>$alias2prove <font color=ffffff>existiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+ &reload_html;
+ exit;
+#############>- DAS SYSTEM VERLASSEN -<
+ } elsif ($cmd eq "q") {
+ &zeit;
+ if ($tmp ne "autologout") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias loggt sich aus dem Chat aus ... </font></i>");
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias wurde vom System automatisch ausgeloggt ... </font></i>");
+ }
+ &reload_html($whisper,"quit");
+ exit;
+#############>- DAS EIGENE GÄSTEBUCH LÖSCHEN -<
+ } elsif ($cmd eq "rmgb") {
+ unlink("data/user/gbooks/$alias");
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias löscht das eigene Gästebuch ...</font></i>");
+ &reload_html;
+ exit;
+#############>- SCHREIEN -<
+ } elsif ($cmd eq "s") {
+ my $msg2scream;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2scream = $msg2scream." ".$cmd[$i];
+ }
+ my $msg2post = "\U$msg2scream";
+ &post($room,"<b><font color=$col><i>$alias schreit:</i> <font color=$secol>$msg2post</font></font></b>");
+ &reload_html;
+ exit;
+#############>- SEHEN, WANN SICH ALIAS ZUM LETZTEN MAL EINGELOGT HAT -<
+ } elsif ($cmd eq "seen") {
+ my $alias2prove = $cmd[1];
+ if (-f "data/user/options/$alias2prove") {
+ if (-f "data/user/lastlogin/$alias2prove") {
+ open(LASTLOGIN,"<data/user/lastlogin/$alias2prove");
+ local $lastlogin = <LASTLOGIN>;
+ close LASTLOGIN;
+ local $timestamp = sprintf("%.2f",((time() - $lastlogin) / 3600));
+ &post_prv("$alias","<font color=ffa500>$alias2prove <font color=ffffff> hat sich vor $timestamp Stunden zuletzt in das System eingelogt!</font></font>");
+ } else {
+ &post_prv("$alias","<font color=ffa500>$alias2prove <font color=ffffff> hat sich seit der Einführung dieses Befehls noch nie eingelogt!</font></font>");
+ }
+ } else {
+ &post_prv("$alias","<font color=ffa500>$alias2prove <font color=ffffff> exsistiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+ &reload_html;
+ exit;
+#############>- ANZEIGEN WER SICH IM AKTUELLEN RAUM BEFINDET -<
+ } elsif ($cmd eq "w") {
+ open(RSTAT,"data/online/rstat/$room");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ chomp($rstat[1]);
+ my $theme = "Raumthema:".$rstat[1] if ($rstat[1] ne undef);
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ my ($is,$nr) = ("t",0);
+ opendir(DIR,"data/online/rooms/$room");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ my $personen;
+ foreach(@dir) {
+ if (-f "data/online/rooms/$room/$_") {
+ $personen = $personen." ".$_;
+ $nr++;
+ }
+ }
+ &post_prv($alias,"<font color=ffffff>Der aktuelle Raum: $room $theme $door ($nr) : <font color=ffa500>$personen</font></font>");
+ &reload_html;
+ exit;
+#############>- ANZEIGEN WER SICH IM SYSTEM BEFINDET -<
+ } elsif ($cmd eq "wc" || $cmd eq "wc/") {
+ my $raum = $cmd[1];
+ my $personen;
+ if ($raum eq "" && $cmd eq "wc") {
+ opendir(USERS,"data/online/users");
+ my @users = readdir(USERS);
+ close USERS;
+ foreach(@users) {
+ $personen = $personen." ".$_ if (-f "data/online/users/$_");
+ }
+ my $nr = ($#users-1);
+ my ($nrs,$is) = ("","ist");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "sind";
+ }
+ &post_prv("$alias","<font color=ffffff>$nr Person$nrs $is insgesamt eingelogt: <font color=ffa500>$personen</font></font>");
+ } elsif ($raum eq "" && $cmd eq "wc/") {
+ my $msg2post;
+ opendir(DIR,"data/online/rooms");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ opendir(DIR,"data/online/rooms/$_");
+ my @dir2 = readdir(DIR);
+ closedir(DIR);
+ open(RSTAT,"<data/online/rstat/$_");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ chomp($rstat[1]);
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ my $nr = $#dir2-1;
+ $msg2post = $msg2post."<tr><td><b><font size=2 color=ffffff>$_ $door ($nr) [".$rstat[1]."]: </font></b></td></tr><tr><td><font size=2 color=ffa500>";
+ foreach $chatter (@dir2) {
+ if (-f "data/online/rooms/$_/$chatter") {
+ $msg2post = $msg2post."$chatter ";
+ }
+ }
+ print "</font></td>";
+ }
+ }
+ &post_prv("$alias","<font color=ffffff>Folgende Räume sind offen:</font><table>$msg2post</table>");
+ } elsif ($raum ne "") {
+ my $personen;
+ opendir(DIR,"data/online/rooms/$raum");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/rooms/$raum/$_");
+ }
+ my ($nr,$is) = (($#dir-1),"t");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "n";
+ }
+ &post_prv($alias,"<font color=ffffff> $nr Person$nrs befinde$is sich im Raum \"$raum\": <font color=ffa500>$personen</font></font>");
+ }
+ &reload_html;
+ exit;
+#############>- ANZEIGEN IN WELCHEN RAUM SICH JMD. BEFINDET BZW. JMD IN EINEN RAUM FOLGEN -<
+ } elsif ($cmd eq "wj" || $cmd eq "ju") {
+ my $alias2search = $cmd[1];
+ opendir(ROOMS,"data/online/rooms");
+ my @dir = readdir(ROOMS);
+ closedir(ROOMS);
+ foreach $raum (@dir) {
+ opendir(DIR2,"data/online/rooms/$raum");
+ my @dir2 = readdir(DIR2);
+ closedir(DIR2);
+ foreach $user (@dir2) {
+ if (-f "data/online/rooms/$raum/$user") {
+ if ($user eq $alias2search) {
+ if ($cmd eq "wj") {
+ &post_prv("$alias","<font color=ffa500>$alias2search <font color=ffffff>befindet sich im Raum \"$raum\" !</font></font>");
+ } else {
+ &change_room("ju",$raum,$room,$alias2search);
+ }
+ &reload_html($whisper,"change_room");
+ exit;
+ }
+ }
+ }
+ }
+ &post_prv("$alias","<font color=ffa500>$alias2search <font color=ffffff> ist nicht eingelogt !</font></font>");
+ &reload_html;
+ exit;
+#############>- RAUMNESETZER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- RAUM ABSCHLIESSEN/AUFSCHLIESSEN -<
+ } elsif ($cmd eq "l") {
+ &prove_besetzer($alias,$room);
+ &hierachie($alias);
+ if ($r_besetzer eq "true" || $hierachie eq "wa" || $hierachie eq "ow") {
+ my $lock = "0\n";
+ &zeit;
+ if ($room eq "Cyberbar") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias sperrt den Raum ohne Erfolg ab ...</font></i>");
+ } else {
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias sperrt den Raum ab ...</font></i>");
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias sperrt den Raum auf ...</font></i>");
+ }
+ for ($i=1;$i<=$#r_stat;$i++) {
+ $lock = $lock.$r_stat[$i];
+ }
+ open(RSTAT,">data/online/rstat/$room");
+ print RSTAT $lock;
+ close RSTAT;
+ }
+ }
+ &reload_html;
+ exit;
+#############>- RAUMBESETZER ERNENNEN -<
+ } elsif ($cmd eq "su") {
+ &prove_besetzer($alias,$room);
+ &hierachie($alias);
+ if ($r_besetzer eq "true" || $hierachie eq "wa" || $hierachie eq "ow") {
+ my $alias2su = $cmd[1];
+ opendir(DIR,"data/online/rooms/$room");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ if ($_ eq $alias2su) {
+ open(DATEI,"<data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ &hierachie($alias2su);
+ &prove_besetzer($alias2su,$room);
+ if ($r_besetzer eq "true" || $hierachie eq "wa" || $hierachie eq "ow") {
+ &reload_html;
+ &post_prv($alias,"<font color=ffa500>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist bereits RB, WÄ oder OW)</font>");
+ exit;
+ }
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias verleiht \"$alias2su\" Raumbesetzerrechte ...</font></i>");
+ open(DATEI,">>data/online/rstat/$room");
+ print DATEI $alias2su."\n";
+ close DATEI;
+ &reload_html;
+ exit;
+ }
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist nicht anwesend)</font>");
+ }
+ &reload_html;
+ exit;
+#############>- RAUMBESETZER ENTNENNEN -<
+ } elsif ($cmd eq "rsu") {
+ &prove_besetzer($alias,$room);
+ &hierachie($alias);
+ if ($r_besetzer eq "true" || $hierachie eq "wa" || $hierachie eq "ow") {
+ my $alias2rsu = $cmd[1];
+ open(DATEI,"<data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ &prove_besetzer($alias2rsu,$room);
+ if ($r_besetzer eq "true") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias entzieht \"$alias2rsu\" die Raumbesetzerrechte ...</font></i>");
+ my $newrstat = $rstat[0].$rstat[1];
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $newrstat = $newrstat.$r_stat[$i] if ($r_stat[$i] ne $alias2rsu."\n");
+ }
+ open(DATEI,">data/online/rstat/$room");
+ print DATEI $newrstat;
+ close DATEI;
+ } else {
+ &post_prv($alias,"<font color=ffa500>$alias2rsu <font color=ffffff>ist kein Raumbesetzer und kann dieser Status auch nicht aberkannt werden !</font></font>");
+ }
+ }
+ &reload_html;
+ exit;
+#############>- RAUM EIN THEMA GEBEN -<
+ } elsif ($cmd eq "t") {
+ &prove_besetzer($alias,$room);
+ &hierachie($alias);
+ if ($r_besetzer eq "true" || $hierachie eq "wa" || $hierachie eq "ow") {
+ my $theme;
+ &zeit;
+ if ($cmd[1] ne undef) {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $theme = $theme." ".$cmd[$i];
+ }
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias gibt dem Raum das Thema (<font color=ffa500> $theme </font>) ...</font></i>");
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias löscht das Thema des Raums ...</font></i>");
+ }
+ $theme = $r_stat[0].$theme."\n";
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $theme = $theme.$r_stat[$i];
+ }
+ open(RSTAT,">data/online/rstat/$room");
+ print RSTAT $theme;
+ close RSTAT;
+ }
+ &reload_html;
+ exit;
+#############>- SUPERUSER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- ALIAS VERBANNEN -<
+ } elsif ($cmd eq "ban") {
+ &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $alias2ban = $cmd[1];
+ open(BAN,"<data/ban");
+ my @ban = <BAN>;
+ close BAN;
+ if ($cmd[1] eq undef) {
+ my $banned;
+ local $nr = @ban;
+ for ($i=0;$i<=$#ban;$i++) {
+ $banned .= $ban[$i];
+ }
+ &post_prv("$alias","<font color=ffffff>Folgende Benutzer sind verbannt [$nr]: <font color=ffa500>$banned</font></font>");
+ &reload_html;
+ exit;
+ } elsif (-f "data/user/options/$alias2ban") {
+ &hierachie($alias2ban);
+ if ($hierachie eq "wa") {
+ &post_prv("$alias","<font color=ffa500>$alias2ban <font color=ffffff>ist Wächter und kann nicht verbannt werden!</font></font>");
+ &reload_html;
+ exit;
+ } elsif ($hierachie eq "ow") {
+ &post_prv("$alias","<font color=ffa500>$alias2ban <font color=ffffff>ist Oberwächter und kann nicht verbannt werden!</font></font>");
+ &reload_html;
+ exit;
+ }
+ foreach $ban (@ban) {
+ if ($ban eq $alias2ban."\n") {
+ &post_prv("$alias","<font color=ffa500>$alias2ban <font color=ffffff>ist bereits verbannt!</font></font>");
+ &reload_html;
+ exit;
+ }
+ }
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias verbannt \"$alias2ban\" aus dem Chat ...</font></i>");
+ open(BAN,">>data/ban");
+ print BAN $alias2ban."\n";
+ close BAN;
+ &reload_html;
+ exit;
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2ban <font color=ffffff>kann nicht verbannt werden da Benutzername nicht existiert!</font></font>");
+ &reload_html;
+ exit;
+ }
+#############>- ALIAS ENTBANNEN -<
+ } elsif ($cmd eq "rban") {
+ &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $alias2rban = $cmd[1];
+ open(BAN,"<data/ban");
+ @ban = <BAN>;
+ close BAN;
+ foreach $ban (@ban) {
+ if ($ban eq $alias2rban."\n") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias entbannt \"$alias2rban\" ...</font></i>");
+ my @ban2;
+ foreach $ban (@ban) {
+ push(@wa2,$wa) if ($ban ne $alias2rban."\n");
+ }
+ open(BAN,">data/ban");
+ print BAN @ban2;
+ close BAN;
+ &reload_html;
+ exit;
+ }
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2rban <font color=ffffff>ist nicht verbannt!</font></font>");
+ &reload_html;
+ exit;
+ }
+#############>- IP # VON ALIAS ANZEIGEN LASSEN -<
+} elsif ($cmd eq "ip") {
+ &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $alias2prove = $cmd[1];
+ opendir(DIR,"data/online/ident");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ if ($_ eq $alias2prove) {
+ open(DATEI,"<data/online/ident/$alias2prove");
+ local $ipnr = <DATEI>;
+ close DATEI;
+ chomp($ipnr);
+ &post_prv("$alias","<font color=ffa500>$_<font color=ffffff> hat die IP-Nummer $ipnr !</font></font>");
+ }
+ }
+ }
+ &reload_html;
+ exit;
+#############>- ALIAS AUS DEM CHAT KATAPULTIEREN -<
+ } elsif ($cmd eq "k") {
+ &hierachie($alias);
+ if ($hierachie eq "wa" || $hierachie eq "ow") {
+ my $alias2kick = $cmd[1];
+ opendir(DIR,"data/online/rooms");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach $raum (@dir) {
+ opendir(DIR,"data/online/rooms/$raum");
+ my @dir2 = readdir(DIR);
+ closedir(DIR);
+ foreach $chatter (@dir2) {
+ if ($chatter eq $alias2kick) {
+ &hierachie($alias2kick);
+ if ($hierachie eq "ow") {
+ &post_prv("$alias","<font color=ffa500>$alias2kick <font color=ffffff> ist Oberwächter und kann nicht \"gekickt\" werden !</font></font>");
+ } elsif ($hierachie eq "wa") {
+ &post_prv("$alias","<font color=ffa500>$alias2kick <font color=ffffff> ist Wächter und kann nicht \"gekickt\" werden !</font></font>");
+ } else {
+ &post_prv("$alias2kick","<script language=\"JavaScript\">window.open(\"index.pl?tmp=kick\",\"_top\");</script>");
+ &zeit;
+ $_ = undef if ($room eq $raum);
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias katapultiert \"$alias2kick\" aus dem Chat ...</font></i>",$raum);
+ &rm_alias($alias2kick,$raum);
+ &check_online;
+ }
+ &reload_html;
+ exit;
+ }
+ }
+ }
+ &post_prv("$alias","<font color=ffa500>$alias2kick <font color=ffffff> ist nicht anwesend und kann nicht \"gekickt\" werden !</font></font>");
+ }
+ &reload_html;
+ exit;
+#############>- EINEN BENUTZER AUS DEM SYSTEM LÖSCHEN -<
+ } elsif ($cmd eq "kill") {
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ my $alias2kill = $cmd[1];
+ &hierachie($alias2kill);
+ if ($hierachie eq "ow") {
+ &post_prv($alias,"<font color=ffa500>$alias2kill</font> <font color=ffffff>ist Oberwächter und kann nicht aus dem System entfernt werden !</font>");
+ } elsif ($hierachie eq "wa") {
+ &post_prv($alias,"<font color=ffa500>$alias2kill</font> <font color=ffffff>ist Wächter und kann nicht aus dem System entfernt werden !</font>");
+ } else {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias killt \"$alias2kill\" ganz und gar aus dem System ...</font></i>");
+ unlink("data/user/options/$alias2kill");
+ unlink("data/user/profiles/$alias2kill");
+ unlink("data/user/gbooks/$alias2kill");
+ unlink("data/user/counts/$alias2kill");
+ unlink("data/user/counts/$alias2kill.online");
+ unlink("data/user/lastlogin/$alias2kill");
+ unlink("data/user/memos/$alias2kill");
+ }
+ }
+ &reload_html;
+ exit;
+#############>- EINEN ANDEREN RAUM AUF-/ABSPERREN -<
+ } elsif ($cmd eq "sl") {
+ &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $sl_room = $cmd[1];
+ if (-e "data/online/rooms/$sl_room") {
+ my $lock = "0\n";
+ &zeit;
+ open(RSTAT,"<data/online/rstat/$sl_room");
+ my @r_stat = <RSTAT>;
+ close RSTAT;
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias sperrt den Raum \"$sl_room\" von aussen ab ...</font></i>",$sl_room);
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias sperrt den Raum \"$sl_room\" von aussen auf ...</font></i>",$sl_room);
+ }
+ for ($i=1;$i<=$#r_stat;$i++) {
+ $lock = $lock.$r_stat[$i];
+ }
+ open(RSTAT,">data/online/rstat/$sl_room");
+ print RSTAT $lock;
+ close RSTAT;
+ } else {
+ &post_prv($alias,"<font color=ffffff>Der Raum <font color=ffa500>$sl_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ exit;
+ }
+#############>- IN EINEN ANDEREN RAUM HINEINRUFEN -<
+ } elsif ($cmd eq "ss") {
+ &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $ss_room = $cmd[1];
+ if (-e "data/online/rooms/$ss_room") {
+ my $ss_msg;
+ for ($i=2; $i <= $#cmd; $i++) {
+ $ss_msg = $ss_msg." ".$cmd[$i];
+ }
+ my $msg2scream = "\U$ss_msg";
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias ruft in den Raum \"$ss_room\" hinein: <b><font color=$col>$msg2scream</font></b> ...</font></i>",$ss_room);
+ &reload_html;
+ exit;
+ } else {
+ &post_prv($alias,"<font color=ffffff>Der Raum <font color=ffa500>$ss_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ exit;
+ }
+#############>- EINEN ANDEREN RAUM EIN THEMA GEBEN -<
+ } elsif ($cmd eq "st") {
+ &hierachie($alias);
+ if ($hierachie eq "wa" || $hierachie eq "ow") {
+ my $st_room = $cmd[1];
+ if (-e "data/online/rooms/$st_room") {
+ my $theme;
+ &zeit;
+ if ($cmd[2] ne undef) {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $theme = $theme." ".$cmd[$i];
+ }
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias gibt dem Raum \"$st_room\" das Thema (<font color=ffa500> $theme </font>) ...</font></i>",$st_room);
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias löscht das Thema des Raums \"$st_room\" ...</font></i>",$st_room);
+ }
+ open(RSTAT,"<data/online/rstat/$st_room");
+ my @r_stat = <RSTAT>;
+ close RSTAT;
+ $theme = $r_stat[0].$theme."\n";
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $theme = $theme.$r_stat[$i];
+ }
+ open(RSTAT,">data/online/rstat/$st_room");
+ print RSTAT $theme;
+ close RSTAT;
+ } else {
+ &post_prv($alias,"<font color=ffffff>Der Raum <font color=ffa500>$st_room</font> existiert nicht!</font></font>");
+ }
+ }
+ &reload_html;
+ exit;
+#############>- SYSTEMNACHRICHT IN ALLE BESTEHENDEN RÄUME POSTEN -<
+ } elsif ($cmd eq "sys") {
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ my $sys_msg;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $sys_msg = $sys_msg." ".$cmd[$i];
+ }
+ &zeit;
+ $sys_msg = "<i><font color=ffffff>($hours:$min:$sec)</font></i> <b><font size=2 color=red>SYSTEMNACHRICHT</font></b><i><font color=ffffff>: $sys_msg ...</font></i>";
+ opendir(ROOMS,"data/msgs");
+ my @rooms = readdir(ROOMS);
+ close(ROOMS);
+ foreach(@rooms) {
+ &post($_,$sys_msg);
+ }
+ &log($sys_msg);
+ }
+ &reload_html;
+ exit;
+#############>- ALIAS ZUM WÄCHTER ERNNENNEN -<
+ } elsif ($cmd eq "wa") {
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ my $alias2wa = $cmd[1];
+ &hierachie($alias2wa);
+ if ($hierachie eq "wa") {
+ &post_prv("$alias","<font color=ffa500>$alias2wa <font color=ffffff>ist bereits als Wächter eingetragen. Eine erneuerte Eintragung ist nicht möglich!</font></font>");
+ &reload_html;
+ exit;
+ } elsif ($hierachie eq "ow") {
+ &post_prv("$alias","<font color=ffa500>$alias2wa <font color=ffffff>ist bereits als Oberwächter eingetragen. Oberwächter können nicht gleichzeitig Wächter sein!</font></font>");
+ &reload_html;
+ exit;
+ }
+ if (-f "data/user/options/$alias2wa") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias ernennt \"$alias2wa\" zum Wächter ...</font></i>");
+ open(WA,">>data/wa");
+ print WA $alias2wa."\n";
+ close WA;
+ &reload_html;
+ exit;
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2wa <font color=ffffff>kann nicht zum Wächter ernannt werden da Benutzername nicht existiert!</font></font>");
+ &reload_html;
+ exit;
+ }
+#############>- ALIAS DIE WÄCHTERRECHTE ENTZIEHEN -<
+ } elsif ($cmd eq "rwa") {
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ my $alias2rwa = $cmd[1];
+ &hierachie($alias2rwa);
+ if ($hierachie eq "wa") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias hat \"$alias2rwa\" vom Wächter zum normalen Chatter degradiert ...</font></i>");
+ open(WA,"<data/wa");
+ @wa = <WA>;
+ close WA;
+ my @wa2;
+ foreach $wa (@wa) {
+ push(@wa2,$wa) if ($wa ne $alias2rwa."\n");
+ }
+ open(WA,">data/wa");
+ print WA @wa2;
+ close WA;
+ } else {
+ &post_prv($alias,"<font color=ffa500>$alias2rwa <font color=ffffff>ist kein Wächter und können die Wächterrechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ exit;
+ }
+#############>- ADMINISTRATORBEFEHLE -<
+#############>- ALIAS ZUM OBERWÄCHTER ERNENNEN -<
+ } elsif ($cmd eq "ow" && $alias eq "Snooper") {
+ my $alias2ow = $cmd[1];
+ &hierachie($alias2ow);
+ if ($hierachie eq "wa") {
+ &post_prv("$alias","<font color=ffa500>$alias2ow <font color=ffffff>ist bereits als Wächter eingetragen. Wächter können nicht gleichzeitig Oberwächter sein!</font></font>");
+ &reload_html;
+ exit;
+ } elsif ($hierachie eq "ow") {
+ &post_prv("$alias","<font color=ffa500>$alias2ow <font color=ffffff>ist bereits als Oberwächter eingetragen!</font></font>");
+ &reload_html;
+ exit;
+ }
+ if (-f "data/user/options/$alias2ow") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias ernennt \"$alias2ow\" zum Oberwächter ...</font></i>");
+ open(OW,">>data/ow");
+ print OW $alias2ow."\n";
+ close OW;
+ &reload_html;
+ exit;
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2ow <font color=ffffff>kann nicht zum Oberwächter ernannt werden da Benutzername nicht existiert!</font></font>");
+ &reload_html;
+ exit;
+#############>- ALIAS DIE OBERWÄCHTERRECHTE ENTZIEHEN -<
+ } elsif ($cmd eq "row" && $alias eq "Snooper") {
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ my $alias2row = $cmd[1];
+ &hierachie($alias2row);
+ if ($hierachie eq "ow") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias hat \"$alias2row\" vom Oberwächter zum normalen Chatter degradiert ...</font></i>");
+ open(OW,"<data/ow");
+ @ow = <OW>;
+ close OW;
+ my @ow2;
+ foreach $ow (@ow) {
+ push(@ow2,$ow) if ($ow ne $alias2row."\n");
+ }
+ open(OW,">data/ow");
+ print OW @ow2;
+ close OW;
+ } else {
+ &post_prv($alias,"<font color=ffa500>$alias2row <font color=ffffff>ist kein Oberwächter und können die Wächterrechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ exit;
+ }
+#############>- PASSWORD EINES BENUTZERS ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "pw" && $alias eq "Snooper") {
+ my $pw2show = $cmd[1];
+ if (-f "data/user/options/$pw2show") {
+ open(PW,"<data/user/options/$pw2show");
+ @pw = <PW>;
+ close PW;
+ &post_prv($alias,"<font color=ffa500>$pw2show <font color=ffffff> hat das Passwort \"".$pw[0]."\" !</font></font>");
+ &reload_html;
+ exit;
+ }
+ &post_prv($alias,"<font color=ffa500>$pw2show <font color=ffffff> existiert nicht in der Benutzerdatenbank !</font></font>");
+ &reload_html;
+ exit;
+#############>- SYSTEMMELDUNG POSTEN -<
+ } elsif ($cmd eq "cool" && $alias eq "Snooper" || $alias eq "Peacemaker") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $msg2post</font></i>");
+ &reload_html;
+ exit;
+#############>- ENDE DER CHATBEFEHLE -<
+ }
+&post_prv($alias,"<font color=ffffff>Der Chatbefehl <font color=ffa500>/$cmd</font> existiert nicht oder Du hast keine Berechtigung diesen Befehl auszuführen!</font></font>");
+&reload_html;
+}
diff --git a/0.4.8a2/main2.pl b/0.4.8a2/main2.pl
new file mode 100644
index 0000000..d98380d
--- /dev/null
+++ b/0.4.8a2/main2.pl
@@ -0,0 +1,638 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header();
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+
+$var = $q->param("var");
+if ($var eq "list_alias_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &list_alias_html;
+} elsif ($var eq "alias_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $tmp = $q->param("tmp");
+ &alias_html;
+} elsif ($var eq "edit_profile_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ &edit_html("edit_profile_html");
+} elsif ($var eq "edit_options_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ &edit_html("edit_options_html");
+} elsif ($var eq "gb_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &gb_html;
+} elsif ($var eq "post_gb") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $msg = $q->param("msg");
+ $tmp = $q->param("tmp");
+ $id = $q->param("id");
+ &post_gb;
+} elsif ($var eq "edit_profile") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ &secure_checkid($alias);
+ &edit("edit_profile");
+} elsif ($var eq "edit_options") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $tmp = $q->param("tmp");
+ $id = $q->param("id");
+ $room = $q->param("room");
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ &edit("edit_options");
+} elsif ($var eq "rm_gb_alias") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $tmp = $q->param("tmp");
+ $id = $q->param("id");
+ &rm_gb;
+} else {
+ &error("Parameter fehlt");
+}
+
+###########################
+##HAUPTTEIL DIESER DATEI:##
+###########################
+
+sub gb_html { # Das Benutzerboard/Gästebuch.
+ my $message = $_[0];
+ &start_html("Benutzerboard");
+if ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </i>
+ einen Text und poste
+ <u>dann</u>
+ !
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Vielen Dank für Deinen Beitrag. Wenn Du willst, kannst Du jetzt gleich noch einen Eintrag posten ...
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Falls Du Anregungen oder Verbesserungsvorschläge für die Community hast, dann poste doch einen kleinen Eintrag :-)
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="guestbook">
+ <input type="hidden" name="id" value="y">
+ <input size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+ if (-e "data/guestbook") {
+ open (DATEI,"<data/guestbook") || &error("Konnte dat/guestbook nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ print
+ $q->div(@datei);
+ }
+ print
+ $q->end_html;
+}
+
+
+sub post_gb { # Wenn etwas in ein Gästebuch eingetragen wird
+ &zeit;
+ if ($msg eq "") {
+ if ($id eq "y") { # Überprüfen, ob Benutzerboard- oder Privatgästebuch
+ &gb_html("post_empty");
+ } else {
+ &alias_html("post_empty");
+ }
+ exit;
+ }
+ $msg =~ s#<#&lt\;#g;
+ my $tmpath = "";
+ if ($id eq "y") {
+ $tmpath = "data/guestbook";
+ } else {
+ $tmpath = "data/user/gbooks/$tmp";
+ }
+ open(GB,"$tmpath");
+ my @gb = <GB>;
+ close GB;
+ pop(@gb) if ($#gb > 99);
+ my @newdatei = "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ push(@newdatei,@gb);
+ open(GB,">$tmpath");
+ print GB @newdatei;
+ close GB;
+ if ($id eq "y") {
+ &gb_html("post_ok");
+ exit;
+ } else {
+ post_prv("$tmp","<font color=ffffff><a href=\"main2.pl?alias=$tmp&var=alias_html&tmp=$alias&tmpid=$tmpid\" target=\"_new\">$alias</a> hat soeben einen Pin in <a href=\"main2.pl?alias=$tmp&var=alias_html&tmp=$tmp&tmpid=$tmpid\" target=\"_new\">Dein Profil</a> gehängt ... </font>");
+ &alias_html;
+ exit;
+ }
+}
+
+sub rm_gb { # Gästebucheintrag entfernen
+ open(GB,"<data/user/gbooks/$alias");
+ my @gbfile = <GB>;
+ close GB;
+ my @newgbfile = ();
+ for ($i=0; $i <= $#gbfile; $i++) {
+ push(@newgbfile,$gbfile[$i]) if ($i != $id);
+ }
+ open(GB,">data/user/gbooks/$alias");
+ print GB @newgbfile;
+ close GB;
+ &alias_html("rm_ok");
+}
+
+sub list_alias_html { # Liste aller Benutzer
+ &start_html("Alle Benutzer");
+ opendir(REGISTERED,"data/user/options");
+ my @users = readdir(REGISTERED);
+ closedir(REGISTERED);
+ my @liste = sort(@users);
+ my $nr = $#users-1;
+print <<END;
+ <div>
+ Es sind z.Z. genau $nr Benutzernamen in der Datenbank vorhanden! (Sortiert nach #, A-Z, a-z)
+ </div>
+ <hr>
+ <div>
+END
+ foreach(@liste) {
+ if (-f "data/user/options/$_") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid" },
+ "$_"),
+ " ";
+ }
+ }
+print <<END;
+ </div>
+</body>
+</html>
+END
+}
+
+sub alias_html { # Anzeigen eines Benutzerprofils
+ my $message = $_[0];
+ open(COUNTS,"<data/user/counts/$tmp");
+ local $counter = <COUNTS>;
+ close COUNTS;
+ $counter++;
+ open(COUNTS,">data/user/counts/$tmp");
+ print COUNTS $counter;
+ close COUNTS;
+ &start_html($tmp);
+print <<END;
+<div>
+ <a href="htdocs.pl?var=werda_html&alias=$alias&tmpid=$tmpid">Hier</a>
+ gehts zur Gesamtübersicht !
+</div>
+<hr>
+END
+if ($message eq "rm_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Der von Dir gewählte Eintrag wurde erfolgreich gelöscht.
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </u>
+ einen Text und poste
+ <u>dann</u>
+ !
+ <hr>
+END
+}
+ open(PROFILE,"<data/user/profiles/$tmp");
+ @data = <PROFILE>;
+ close PROFILE;
+print <<END;
+ <div>
+ Dieses Profil wurde insgesamt schon $counter mal aufgerufen !
+ <br>
+ <br>
+ Alias: $tmp
+ <br>
+ <br>
+ Nachname: $data[0]
+ <br>
+ <br>
+ Vorname: $data[1]
+ <br>
+ <br>
+ Alter: $data[2]
+ <br>
+ <br>
+ Wohnort: $data[3]
+ <br>
+ <br>
+ E-Mail:
+ <a href="mailto:$data[4]">$data[4]</a>
+ <br>
+ <br>
+ ICQ-Nummer: $data[5]
+ <br>
+ <br>
+ Homepage:
+ <a href="$data[6]" target="_new">$data[6]</a>
+ <br>
+ <br>
+ Weiteres:
+ <br>
+ $data[7]
+ <hr>
+ Hier kannst Du $tmp eine Nachricht hinterlassen!
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input type="text" size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+if (-e "data/user/gbooks/$tmp") {
+ open (DATEI,"<data/user/gbooks/$tmp") || &error("Konnte data/user/gbooks/$tmp nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ my $nr = 1;
+ if ($alias ne $tmp) {
+ foreach(@datei) {
+ print "<br>Eintrag # $nr: $_";
+ $nr++;
+ }
+ } else {
+print <<END;
+ <table>
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="rm_gb_alias">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="$tmp">
+END
+for($i=0; $i <= $#datei; $i++) {
+print <<END;
+ <tr>
+ <td>
+ <input type="radio" name="id" value="$i">
+ </td>
+ <td>
+ <div class=q>
+ <br>
+ Eintrag # $nr:
+ $datei[$i]
+ </div>
+ </td>
+ </tr>
+END
+$nr++;
+}
+print <<END;
+ </table>
+ <table>
+ <tr>
+ <td>
+ <font color=ffffff>
+ <input type="submit" value="Markierten Eintrag löschen">
+ </font>
+ </td>
+ <td>
+ <font color=ffffff>
+ <input type="reset" value="Markierung rückgängig machen">
+ </font>
+ </td>
+ </tr>
+ </table>
+ </form>
+END
+}
+}
+ print
+ $q->end_html;
+}
+
+sub edit_html { # Chat-Optionen / Benutzerprofil editieren
+ my ($method,$message) = @_;
+ &start_html("Benutzerprofil ändern");
+ if ($method eq "edit_options_html") {
+ open(DATEI,"<data/user/options/$alias");
+ } elsif ($method eq "edit_profile_html") {
+ open(DATEI,"<data/user/profiles/$alias");
+ }
+ @data = <DATEI>;
+ close DATEI;
+ foreach(@data) {
+ chomp $_;
+ }
+ if ($method eq "edit_options_html") {
+ if ($message eq "edit_options_ok") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat die Chateinstellungen geändert ...</font></i>");
+print <<END;
+<script language="JavaScript">
+ open("main.pl?var=change_colors&alias=$alias&room=$room&col=$col&secol=$secol&tmpid=$tmpid","reload");
+</script>
+<div class=b>
+ Hinweis:
+</div>
+<div>
+ Du hast soeben Deine Chat-Optionen erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren. Um
+ weiterzuchatten einfach Fenster schliessen!
+</div>
+<hr>
+END
+ } elsif ($message eq "edit_pw_wrong") {
+print <<END;
+<div class=b>
+ ACHTUNG!
+</div>
+<div>
+ Du hast soeben versucht, dein Passwort zu ändern. Jedoch stimmte die Erste Eingabe nicht mit der Zweiten überein.
+ Bitte versuch es erneuert ...
+</div>
+<hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Deine Chat-Optionen editieren!" ),
+ $q->hr;
+ }
+print <<END;
+<script lang="javascript" type="text/javascript">
+<!--
+
+function radioWert(rObj) {
+ for (var i=0; i<rObj.length; i++) if (rObj[i].checked) return rObj[i].value;
+ return false;
+}
+
+function insertcode( code ) {
+ document.optionen.elements[radioWert(document.optionen.eingabe)].value = code;
+}
+
+//-->
+</script>
+
+<form name="optionen" action="main2.pl">
+ <input type="hidden" name="var" value="edit_options">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Passwort
+ <font color=ffa500>
+ (Gut merken !!)
+ </font>
+ <br>
+ <input type="password" name="id" value="$data[0]">
+ </div>
+ </td>
+ <td width=20>
+ </td>
+ <td>
+ <div>
+ Geb hier das Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp" value="$data[0]">
+ </div>
+ </td>
+ </tr>
+ </table>
+ <hr>
+ <div>Einstellungen für den Nachrichten-Verlauf</div>
+ <table>
+ <tr>
+ <td>
+ <br>
+ <div>Anzahl der Nachrichten im Verlauf (Standart = 10)</div>
+ <font color=ffffff>
+ <select name="maxVerlauf" size="1">
+ <option value="$data[3]">$data[3]
+END
+for($i=1;$i<=50;$i++) {
+ print "<option value=\"$i\">$i";
+}
+print<<END;
+ </select>
+ </font>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <br>
+<div>Wie sollen die Nachrichten im Verlauf angeordnet sein?</div>
+ <font color=ffffff>
+ <select name="verlaufOrder" size="1">
+ <option value="$data[4]">Bisherige Einstellung ($data[4])
+ <option value="0">Neue Verlaufnachrichten oben (0)
+ <option value="1">Neue Verlaufnachrichten unten (1)
+ </select>
+ </font>
+ </td>
+ </tr>
+ </table>
+<br>
+ <div>PS: Einstellungen des Nachrichten-Verlaufs werden erst nach einem Neueinloggen aktualisiert.</div>
+ <hr>
+ <table>
+ <tr>
+ <td>
+ <div>
+ <input type="radio" name="eingabe" value="col" checked>
+ Auswahl von Farbe 1
+ <br>
+ (Farbe Deines Nicks):
+ <br>
+ <input name="col" size="6" maxlength="6" value="$data[1]">
+ </div>
+ </td>
+ <td width=20>
+ </td>
+ <td>
+ <div>
+ <input type="radio" name="eingabe" value="secol">
+ Auswahl von Farbe 2
+ <br>
+ (Farbe Deiner Nachrichten):
+ <br>
+ <input name="secol" size="6" maxlength="6" value="$data[2]">
+ </div>
+ </td>
+ </tr>
+ </table>
+<br>
+ <div>
+ Beliebige Auswahl markieren und Farbe wählen. Um Deine Optionen abzuspeichern,
+ auf "Daten ändern" klicken!
+ </div>
+ <br>
+END
+ open(COLORS,"<colors.sno");
+ @colors = <COLORS>;
+ close COLORS;
+ print @colors;
+ } elsif ($method eq "edit_profile_html") {
+ if ($message eq "edit_profile_ok") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias hat das Profil geändert ...</font></i>");
+print <<END;
+ <div class=b>
+ Hinweis:
+ </div>
+ <div>
+ Du hast soeben Dein Profil erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren:
+ <hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Dein Profil editieren!" ),
+ $q->hr;
+ }
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="edit_profile">
+ <div>
+ Dein Nachname:
+ <br>
+ <input name="nachname" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ Dein Vorname:
+ <br>
+ <input name="vorname" value="$data[1]">
+ </div>
+ <br>
+ <div>
+ Dein Alter:
+ <br>
+ <input name="alter" value="$data[2]">
+ </div>
+ <br>
+ <div>
+ Dein Wohnort:
+ <br>
+ <input name="wohnort" value="$data[3]">
+ </div>
+ <br>
+ <div>
+ Deine E-Mail Adresse:
+ <br>
+ <input name="email" value="$data[4]">
+ </div>
+ <br>
+ <div>
+ Deine ICQ-Nummer:
+ <br>
+ <input name="icq" value="$data[5]">
+ </div>
+ <br>
+ <div>
+ Deine Homepage:
+ <br>
+ <input name="homepage" value="$data[6]">
+ </div>
+ <br>
+ <div>
+ Weiteres:
+ <br>
+ <textarea rows="5" cols="40"name="weiteres" wrap="virtual">$data[7]</textarea>
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <font color=ffffff>
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="room" value="$room">
+ <input type="submit" value="Daten ändern ...">
+ </font>
+ </form>
+</body>
+</html>
+END
+}
+
+
+sub edit { # Benutzerprofil od. Chat-Optionen abspeichern
+ my $method = $_[0];
+ &zeit;
+ if ($method eq "edit_profile") {
+ open(PROFILE,">data/user/profiles/$alias");
+ print PROFILE $q->param('nachname')."\n".$q->param('vorname')."\n".$q->param('alter')."\n".$q->param('wohnort')."\n".$q->param('email')."\n".$q->param('icq')."\n".$q->param('homepage')."\n".$q->param('weiteres');
+ close PROFILE;
+ &edit_html("edit_profile_html","edit_profile_ok");
+ } elsif ($method eq "edit_options") {
+ if ($id ne $tmp) {
+ &edit_html("edit_options_html","edit_pw_wrong");
+ exit;
+ }
+ open(OPTIONS,">data/user/options/$alias");
+ print OPTIONS $id."\n".$col."\n".$secol."\n".$q->param("maxVerlauf")."\n".$q->param("verlaufOrder");
+ close OPTIONS;
+ &edit_html("edit_options_html","edit_options_ok");
+ }
+} \ No newline at end of file
diff --git a/0.4.8a2/online.pl b/0.4.8a2/online.pl
new file mode 100644
index 0000000..b6346c5
--- /dev/null
+++ b/0.4.8a2/online.pl
@@ -0,0 +1,71 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header();
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+$room = $q->param("room");
+
+&secure_checkid($alias);
+
+# Onlinezeit zählen !
+open(DATEI,"<data/online/users/$alias");
+ my $oldstamp = <DATEI>;
+close DATEI;
+ if ($oldstamp > (time - 60)) {
+ open(DATEI,"<data/user/counts/$alias.online");
+ my $online = <DATEI>;
+ close DATEI;
+ my $total = (time-$oldstamp+$online);
+ open(DATEI,">data/user/counts/$alias.online");
+ print DATEI $total;
+ close DATEI;
+ }
+##### ENDE
+
+&start_html("Online","online");
+&online($alias,$room);
+opendir(ROOMS,"data/online/rooms/".$room);
+ my @rooms = readdir(ROOMS);
+closedir(ROOMS);
+print
+ $q->div( "$room:" ),
+ "<font size=1 color=ffffef face=arial>";
+ foreach $online (@rooms) {
+ if (-f "data/online/rooms/$room/$online") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$online&tmpid=$tmpid",
+ -target=>"$online" }, "$online"), $q->br;
+ }
+ }
+print
+ "</font>",
+ $q->end_html;
+
+sub online { # Benutzer in die Onlineliste hinzufügen bzw. erneuern
+ my ($alias,$room) = @_;
+ open(DATEI,">data/online/users/$alias");
+ print DATEI time;
+ close DATEI;
+ if (-f "data/online/rooms/$room") { } else { mkdir "data/online/rooms/$room", 0777; }
+ if (-f "data/online/rstat/$room") { } else {
+ open(DATEI,">data/online/rstat/$room"); # Raumbesetzerstatus setzen
+ print DATEI "0\n\n$alias\n";
+ close DATEI;
+ }
+ open(DATEI,">data/online/rooms/$room/$alias");
+ print DATEI time;
+ close DATEI;
+ open(DATEI,"<data/online/prove"); # Räume und Chatter auf Existenz überprüfen
+ my $provetime = <DATEI>;
+ close DATEI;
+ if ($provetime < (time - 30)) {
+ &check_online;
+ }
+} \ No newline at end of file
diff --git a/0.4.8a2/push.pl b/0.4.8a2/push.pl
new file mode 100644
index 0000000..da19357
--- /dev/null
+++ b/0.4.8a2/push.pl
@@ -0,0 +1,117 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+CGI->compile(':all');
+$q = new CGI;
+print
+ $q->header;
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+
+{
+ open(IDENT,"<data/online/ident/$alias");
+ my @ident = <IDENT>;
+ close IDENT;
+ if ($ident[1] ne $tmpid) {
+ print $q->div( "Error: ($error_msg)" ),
+ $q->end_html;
+ open(ERROR,">>data/error");
+ print ERROR "$alias $tmpid $$ ".time." $error_msg \n";
+ close ERROR;
+ exit 0;
+ }
+}
+
+$room = $q->param("room");
+my $pid = $$;
+$| = 1;
+
+print <<END;
+<html>
+ <head>
+<script language="JavaScript">
+<!--
+// Scroll-Routine von Anklepper (http://www.anklepper.de)
+// speziell für yChat (http://www.yChat.de), Copyright 2000
+scrolling = true;
+moves_steps = 4; // Schrittgröße
+moves_interval = 4; // Schrittgeschwindigkeit
+
+function moves()
+{
+ if( scrolling != false )
+ window.scrollBy( 0, moves_steps );
+ window.setTimeout( "moves()", moves_interval );
+}
+
+moves();
+//-->
+</script>
+ </head>
+<body bgcolor=000000 link=FFFFFF alink=FFFFEF vlink=FFFFEF>
+<font size=1 color=ffffff face=arial>Willkommen im yChat [PID: $pid]</font><br>
+END
+
+if (-f "data/user/memos/$alias") {
+ open(MEMOS,"<data/user/memos/$alias");
+ my $memos = <MEMOS>;
+ close MEMOS;
+ print $memos;
+ unlink("data/user/memos/$alias");
+}
+
+my $startime,$change_room,@flood;
+OPENMSGFILE:
+$change_room = 0;
+$startime = time;
+
+if (-e "data/msgs/$room") {
+ open(MSGFILE,"<data/msgs/$room");
+ unless (-d "data/online/pids") {
+ mkdir "data/online/pids", 0777;
+ } unless (-d "data/online/pids/$room") {
+ mkdir "data/online/pids/$room", 0777;
+ }
+ open(PID,">data/online/pids/$room/$pid");
+ print PID time;
+ close PID;
+} else {
+ sleep 1;
+ goto OPENMSGFILE;
+}
+
+&sendmsgs;
+while (-e "data/online/users/$alias") {
+ local $SIG{USR1} = \&sendmsgs;
+ goto OPENMSGFILE if ($change_room == 1);
+ sleep 15;
+ print "\n";
+}
+
+sub sendmsgs {
+ for ($curpos = tell(MSGFILE); <MSGFILE>; $curpos = tell(MSGFILE)) {
+ my ($address, $stamp, $command, $action, $message) = split(/<;/, $_);
+ if ($address eq "!" || $address eq $alias) {
+ if ($stamp > $startime) {
+ if ($command eq "cr") {
+ unlink("data/online/pids/$room/$pid");
+ $room = $action;
+ close MSGFILE;
+ $change_room = 1;
+ }
+ print "$message<br>\n" if ($change_room != 1);
+ push(@flood,$message);
+ if ($flood[0] eq $flood[1] && $flood[0] eq $flood[2] && $flood[0] eq $flood[3]) {
+ print "<i><font color=red> Jemand floodet den Chat !</font></i><br>\n";
+ }
+ shift(@flood) if ($#flood > 2);
+ }
+ }
+ }
+ seek(MSGFILE, $curpos, 0);
+}
+
+unlink("data/online/pids/$room/$pid"); \ No newline at end of file
diff --git a/0.4.8a2/ranking.php4 b/0.4.8a2/ranking.php4
new file mode 100644
index 0000000..54104fb
--- /dev/null
+++ b/0.4.8a2/ranking.php4
@@ -0,0 +1,80 @@
+<!doctype html public "-//W3C//DTD HTML 4.0 //EN">
+<html>
+<head>
+ <title>Top 20 Ranking</title>
+ <style rel="stylesheet" type="text/css">
+ body { background-color: #005146 }
+ body.blank { background-color: #000000 }
+ body.online { background-color: #000000 }
+ div { font-family: arial, verdana, helvetiva; font-size: 9pt; color: #ffffff }
+ div.b { font-weight: bold; color: #ffa500 }
+ a { font-family: arial, verdana, helvetiva; font-size: 8pt; color: #FF0000 }
+ a:hover { color: #000000; text-decoration: none }
+ </style>
+</head>
+<body>
+<?
+
+$pfad = "data/user/counts";
+$handle = opendir($pfad);
+$counter = 0;
+$datei=readdir($handle);
+$datei=readdir($handle);
+while($datei=readdir($handle))
+{
+
+ $ganzername = $pfad . "/" . $datei;
+ $groesse = filesize($ganzername);
+ $dateihandle = fopen($ganzername,"r");
+ $onlinezeit = fgets($dateihandle, $groesse+1);
+ $counter++;
+ $user = substr($datei, 0, strlen($datei) - 7);
+ $array[$user] = (int) ($onlinezeit / 60);
+
+}
+echo "<div>Es wurden " . sizeof($array) . " Eintr&auml;ge gefunden und ausgewertertet.<p> Top-40 Ranking:<br></div><HR>";
+arsort($array);
+
+
+echo "<table border=0 bgcolor=#000000 cellspacing=1 cellpadding=2>";
+
+echo "<tr><td bgcolor=#DD0000 align=center>";
+echo "<div> &nbsp;Rank&nbsp; </div>";
+echo "<td bgcolor=#DD0000 align=center>";
+echo "<div> &nbsp;Chatter&nbsp; </div>";
+echo "<td bgcolor=#DD0000 align=center>";
+echo "<div> &nbsp;Onlinezeit&nbsp;<br>&nbsp;[DD:HH:MM]&nbsp; </div>";
+echo "</tr>";
+$mykeys = array_keys($array);
+$counter = 0;
+$platz=0;
+foreach ($mykeys as $keyname) {
+ $counter++;
+ if ($counter <= 40) {
+ $namedesprofils=$keyname;
+ $min = (int) ($array[$keyname] % 60);
+ $tmphrs = (int) ($array[$keyname] / 60);
+ $hrs = (int) ($tmphrs % 24);
+ $tmpdays = (int) ($tmphrs / 24);
+ $days = (int) ($tmphrs / 24);
+
+ $onlinezeit = sprintf("%02d:%02d:%02d", $days, $hrs, $min);
+ echo "<tr><td bgcolor=#EEEEEE align=center>";
+ echo "<font face=\"arial,verdana,helvetiva\" size=1 color=#000000>$counter</font>";
+ echo "<td bgcolor=#EEEEEE align=center>";
+ echo "<a href=\"main2.pl?var=alias_html&tmp=$namedesprofils&alias=$alias&tmpid=$tmpid\" target=\"_self\">";
+ echo "<font face=\"arial,verdana,helvetiva\" size=1 color=#FF0000>";
+ echo "$keyname";
+ echo "</font>";
+ echo "</a>";
+ echo "<td bgcolor=#999999 align=center>";
+ echo "<font face=\"arial,verdana,helvetiva\" size=1 color=#FFFFFF>$onlinezeit</font>";
+ echo "</tr>";
+ }
+ if ($keyname == $alias) { $platz=$counter; }
+}
+echo "</table> <HR>";
+echo "<div> $alias, Du befindest Dich momentan auf Platz Nr.: $platz</div>";
+?>
+</body>
+</html>
diff --git a/0.4.8a2/setup.sh b/0.4.8a2/setup.sh
new file mode 100644
index 0000000..6b3ef8a
--- /dev/null
+++ b/0.4.8a2/setup.sh
@@ -0,0 +1,50 @@
+#!/bin/sh
+echo
+echo yChat wird konfiguriert!
+echo
+mkdir data
+chmod 777 data
+mkdir data/logs
+chmod 777 data/logs
+mkdir data/msgs
+chmod 777 data/msgs
+mkdir data/user
+chmod 777 data/user
+mkdir data/user/counts
+chmod 777 data/user/counts
+mkdir data/user/memos
+chmod 777 data/user/memos
+mkdir data/user/options
+chmod 777 data/user/options
+mkdir data/user/profiles
+chmod 777 data/user/profiles
+mkdir data/user/gbooks
+chmod 777 data/user/gbooks
+mkdir data/user/lastlogin
+chmod 777 data/user/lastlogin
+mkdir data/online
+chmod 777 data/online
+mkdir data/online/rooms
+chmod 777 data/online/rooms
+mkdir data/online/pids
+chmod 777 data/online/pids
+mkdir data/online/rstat
+chmod 777 data/online/rstat
+mkdir data/online/users
+chmod 777 data/online/users
+mkdir data/online/ident
+chmod 777 data/online/ident
+chmod 777 data/htdocs/*
+chmod 777 *.pl
+chmod 777 config.pm
+mkdir dokus/
+mv *.txt dokus/
+mkdir ../../htdocs/yChat/
+mv *.gif ../../htdocs/yChat/
+mv *.swf ../../htdocs/yChat/
+
+echo
+echo yChat Setup beendet ...
+echo Created and Copyright by Paul C. Bütow
+echo
+
diff --git a/0.4.8a2/y.gif b/0.4.8a2/y.gif
new file mode 100644
index 0000000..356175d
--- /dev/null
+++ b/0.4.8a2/y.gif
Binary files differ
diff --git a/0.4.8a2/yIntro.swf b/0.4.8a2/yIntro.swf
new file mode 100644
index 0000000..d592826
--- /dev/null
+++ b/0.4.8a2/yIntro.swf
Binary files differ
diff --git a/0.4.8a2/ySymbol.swf b/0.4.8a2/ySymbol.swf
new file mode 100644
index 0000000..2b899bb
--- /dev/null
+++ b/0.4.8a2/ySymbol.swf
Binary files differ
diff --git a/0.4.8a2/y_.gif b/0.4.8a2/y_.gif
new file mode 100644
index 0000000..f8b6ee5
--- /dev/null
+++ b/0.4.8a2/y_.gif
Binary files differ
diff --git a/0.4.9/CREDITS.txt b/0.4.9/CREDITS.txt
new file mode 100644
index 0000000..3f34ba9
--- /dev/null
+++ b/0.4.9/CREDITS.txt
@@ -0,0 +1,30 @@
+########################### yChat.de CREDITS ################################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+Vielen Dank an alle Personen, dir mit geholfen haben ( und immernoch helfen )
+yChat besser zu machen:
+
+ - Andreas Buchwald aka Anklepper, für ...
+ ... die Programmierung des "Nach-UntenScroll-JavaScripts", des
+ "Nachrichten-Verlauf-JavaScripts" im Texteingabeframe.
+ ... die technische Umsetzung, daß sich das Inputframe bei jedem
+ Textposting nicht wieder reloadet.
+ ... ein nettes JavaScript, welches erlaubt, Formularwerte
+ frameübergreifend zu ändern.
+ ... die Erstellung der Flashanimationen.
+ ... die Programmierung der Auto-Away- und der Auto-Logout Funktion.
+ ... die Optimierung der Statusgrafiken in der Onlineliste.
+ ( www.anklepper.de ).
+
+ - Dave aka Truhe, für ...
+ ... die Erstellung der Farbtabelle unter Chatoptionen inkl.
+ Auswähl-JavaScript!
+ ... die Erstellung einiger CSS.
+ ... die Unterstützung der Umsetzung der Auto-Away- und Auto-Logout
+ Funktion.
+ ( maligree.yi.org )
+
+ - Dommi für die Erstellung der Away-Grafik.
+
+ - Larry Wall, für die Erfindung von Perl ! \ No newline at end of file
diff --git a/0.4.9/README.txt b/0.4.9/README.txt
new file mode 100644
index 0000000..b67f15e
--- /dev/null
+++ b/0.4.9/README.txt
@@ -0,0 +1,24 @@
+############################## yChat.de README ##############################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+Allgemeine Bedingungen bezgl. yChat:
+
+ - Das yChat-System darf ohne Erleubnis des Autors nicht auf irgendeiner Art
+ und Weise weitergegeben- oder eingesetzt werden.
+
+ - Wird das yChat-System eingesetzt, so darf es manipuliert werden, soweit
+ die Copyright-Hinweise des Autors, die Versionsbezeichnung und der Link
+ auf der Startseite nach www.home.yChat.de unverändert bleibt.
+ Ansonsten darf der gesamte Code manipuliert werden.
+
+ - Wird das yChat-System erlaubter Weise manipuliert, so muß das veränderte
+ Skript auf Anforderung an den Autor weitergegeben werden. Dieser darf
+ die Veränderungen in das Standard-yChat-System integrieren.
+
+ - Wird das yChat-System eingesetzt, su muß dem Autor die Location bzw. die
+ URL bekanntgegeben werden. Diese mit einer URL wwX.yChat.de verlinkt.
+ Wobei X für die Nummer des jew. Servers steht.
+
+ - Es ist verboten, Sourcecode aus dem yChat-System zu kopieren und
+ für andere, nicht von yChat abhängige Perl-Programme einzusetzen. \ No newline at end of file
diff --git a/0.4.9/SETUP.txt b/0.4.9/SETUP.txt
new file mode 100644
index 0000000..cd02a6b
--- /dev/null
+++ b/0.4.9/SETUP.txt
@@ -0,0 +1,139 @@
+############################## yChat.de SETUP ###############################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+yChat findest Du im Internet unter der Adresse www.yChat.de. Bei Kritik,
+Anregungen oder Fragen bitte in das dort vorhandene Board posten oder eine
+E-Mail an die oben stehende Adresse senden. Ich bemühe mich, yChat so gut wie
+möglich zu machen und bin über Ratschläge immer sehr erfreut :-) ...
+
+Die Installation kann auf Unix-Systemen voll automatisch duchgeführt werden.
+Allerdings ist dafür ein Telnet-Zugang notwendig. Kopiere alle vorhandenen
+Dateien in das Verzeichnis cgi-bin/yChat und führe dann das Shellskript
+setup.sh mit dem Befehl ./setup.sh aus. Alle Verzeichnisse werden
+automatisch erstellt. Dies wurde allerdings nur auf SuSE Linux Systemen
+mit root-Zugriff getestet. Solltest Du ein anderes System verwenden oder
+den Chat auf einen virtuellen Webserver installieren wollen, dann mußt Du
+unter Umständen das Verzeichnis "../../htdocs/yChat" nach "../../yChat"
+in der setup.sh umbenennen. Ansonsten werden die dazugehörigen Grafikdateien
+falsch oder garnicht kopiert.
+
+Wenn Du keinen Telnet-Zugang hast, kannst Du hier die Verzeichnisse manuell
+einrichten:
+
+Folgende Basis-Dateien sind im Chat enthalten und müssen in das cgi-bin
+Verzeichnis kopiert werden. Z.B. nach ./cgi-bin/yChat/:
+
+config.pm => Configurationsdatei ("Shared subs")
+htdocs.pl => Generiert dynamische HTML-Inhalte
+index.pl => Startskript (Registrierung, Login, Chatframeset)
+input.pl => Skript für das Chateingabeframe
+main.pl => Hauptskript (Alle Hauptfunktionen des Chats)
+main2.pl => Skript für editieren der Benutzerdaten etc
+online.pl => Anzeige und Überprüfung der eingelogten Benutzer
+push.pl => Server-Push-Routine
+setup.sh => Dient zur automatischen Einrichtung des Chats
+stat.pl => Erstellt diverse Statistiken
+README.txt => Beinhaltet wichtige Informationen
+UPDATES.txt => Updateliste der verschiedenen Versionen
+CREDITS.txt => Personen, die geolfen haben yChat zu proggen
+SETUP.txt => Dieses Dokument
+colors.sno => Datei beinhaltet alle Farben in hex. für die Chatoptionen
+help.sno => Datei beinhaltet alle Chatbefehle
+
+Folgende Verzeichnisse müssen erstellt werden (chmod 777 sollte
+funktionieren):
+
+- Hier befinden sich alle für den Chat notwenidgen Daten:
+ ./cgi-bin/yChat/data/*
+
+- Hier befinden sich alle Logdateien, die vom Chat erstellt werden:
+ ./cgi-bin/yChat/data/logs/*
+
+- Hier befinden sich die Message-Dateien der eingelogten Benutzer:
+ ./cgi-bin/yChat/data/msgs/*
+
+- Hier befinden sich alle Daten der registrierten Benutzer:
+ ./cgi-bin/yChat/data/user/*
+
+- Hier wird abgespeichert, wie oft ein Benutzerprofil insgesant schon
+ aufgerufen wurde und wie lange die Chatter schon online waren:
+ ./cgi-bin/yChat/data/user/counts/*
+
+- Hier werden alle Memos abgespeichert.
+ ./cgi-bin/yChat/data/user/memos/*
+
+- Hier befinden sich alle Chat-Optionen und Passwörter der registrierten
+ Benutzer:
+ ./cgi-bin/yChat/data/user/options/*
+
+- Hier befinden sich alle Benutzerprofile der Benutzer:
+ ./cgi-bin/yChat/data/user/profiles/*
+
+- Hier befinden sich alle Gästebucheinträge der Benutzer:
+ ./cgi-bin/yChat/data/user/gbooks/*
+
+- Hier wird abgespeichert, wann der der jew. benutzer zum letzten mal das
+ System betreten hat.
+ ./cgi-bin/yChat/data/user/lastlogin/*
+
+- Hier befinden sich alle Daten zu den aktuellen Chaträumen und User die
+ online sind
+ ./cgi-bin/yChat/data/online/*
+
+- Verzeichnis für die Raumstatusdateien. Hier wird abgespeichert:
+ Raumbesetzer, Away (inkl. Away-Nachricht)und das Raumthema.
+ ./cgi-bin/yChat/data/online/rstat/*
+
+ - Hier befinden sich die Chatter, die sich in den jew. Räumen befinden. Die
+ Verzeichnisse der Räume werden automatisch erstellt.
+ ./cgi-bin/yChat/data/online/rooms/*
+
+- Hier befinden sich alle PIDs (Process IDs) der Chatter in den jew. Räumen.
+ ./cgi-bin/yChat/data/online/pids/*
+
+- Hier befinden sich alle Chatter, die sich z.Z. im System befinden
+ ./cgi-bin/yChat/data/online/users/*
+
+- Hier befinden sich alle IP-Nummern und TempIDs der eingelogten Chatter
+ ./cgi-bin/yChat/data/online/ident/*
+
+Alle Grafik- und Multimediadateien (*.gif, *.jpg, *.swf) sollten in ein
+nicht-CGI-BIN-Verzeichnis
+ kopiert werden. Z.B. nach ./yChat/.
+
+Zum schluß sollte die config.pm-Datei nach wünschen editiert werden.
+Allerdings sollten die Copyright Hinweise und die Versionsnummern nicht
+manipuliert werden.
+
+Im Folgendem werde ich ein wenig auf die im yChat-Sourcecode oft verwendeten .
+Variablen eingehen:
+
+ $var => Sagt dem Skript, wie es gestartet werden soll.
+ $alias => Teilt dem Skript den Benutzername mit.
+ $tmpid => Beim einloggen in den Chat wird für den Benutzer eine
+ temporäre ID generiert. Diese wird so wohl in der Variable
+ $tmpid als auch in eine Datei geschrieben. Handelt der
+ Benutzer, so wird vom Skript die Variable $tmpid mit dem
+ Eintrag in der Datei verglichen. Sind beide Werte
+ identisch, dann wird die Handlung des Benutzers
+ ausgeführt. Stimmen die Werte nicht überein, dann wird
+ die Fehlermeldung, daß der Benutzer die falsche $tmpid hat
+ um mit $alias zu handeln,ausgegeben und das Skript beendet
+ sich. Dies ist eine Sicherheitsmaßnahme welche verbietet,
+ mit fremden Benutzernamen im System zu handeln.
+ $room => Sagt dem Skript, wie der aktuelle Raumname lautet.
+ $col => Sagt dem Skript, wie die aktuelle Chatfarbe des Nicks von
+ $alias lautet.
+ $seccol => Sagt dem Skript, wie die aktuelle Chatfarbe der Schrift von
+ $alias lautet.
+ $msg => Beinhaltet den von $alias zu postenden Text im Chat.
+ Hiervon wird auch in den Benutzergästebüchern und im
+ Benutzerboard Gebrauch gemacht.
+ $whisper => Beinhaltet den Benutzernamen, zu dem $alias zuletzt
+ geflüstert hat.
+ $id und $tmp => Temporäre Variablen zwecks Übermittlung diverser Daten.
+ $pw => Wird im Skript index.pl verwendet um das Zugangspassword
+ zu übermitteln.
+
+Viel Spaß beim Chatten ... \ No newline at end of file
diff --git a/0.4.9/TODO.txt b/0.4.9/TODO.txt
new file mode 100644
index 0000000..4538bea
--- /dev/null
+++ b/0.4.9/TODO.txt
@@ -0,0 +1,32 @@
+############################## yChat.de TODO ################################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+Folgende Funktionen werden demnächst evtl. in yChat integriert:
+
+ - OOP bei den HTML-Eingabeformularen und dem Menü.
+
+ - Kein CGI.pm im main.pl und config.pm.
+
+ - Die Schlucht (Ein Raum wo Chatter hineingeworfen werden,
+ die sich nicht benehmen und noch nicht aus dem Chat
+ katapultiert werden sollen).
+
+ - IP-Adressen ver-/entbannen.
+
+ - E-Mail zusendung bei verlorenem Passwort.
+
+ - Unter "Benutzer" sollen Chatter über eine Eingabemaske nach dem
+ Anfangsbuchstaben gesucht werden können (vergl. Kilahu).
+
+ - Linux- und Windows-yChat-Client soll programmiert werden. Mit diesem läßt
+ sich dann im yChat chatten, ohne sich über http://www.yChat.de eingelogt zu
+ haben. Der Client soll gleicheitig auch als Messenger (ICQ-Like) fungieren
+ können (yChat-Messenger bzw. yCM).
+
+ - Der Cybarkeeper (künstlich intilligenter Chatroboter, der
+ sich im Hauptraum Cyberbar aufhält, virtuelle Drinks verteilt
+ und von Real-Chattern übernommen werden kann. (Zukunftsmusik)
+
+Für weitere Vorschläge bitte in das yChat-Board unter www.yChat.de
+texten oder eine E-Mail an mail@paulbuetow.de :-) \ No newline at end of file
diff --git a/0.4.9/UPDATES.txt b/0.4.9/UPDATES.txt
new file mode 100644
index 0000000..7fc17d9
--- /dev/null
+++ b/0.4.9/UPDATES.txt
@@ -0,0 +1,227 @@
+########################### yChat.de UPDATE LIST ###########################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+Hier sind alle Erneuerungen der Versionen dokumentiert:
+
+Update von 0.4.8 auf 0.4.9
+ - "/online Alias" zeigt die Onlinezeit in Stunden, nicht mehr in
+ Minuten an.
+ - Hinzufügung des Statistikskripts "stat.pl" unter dem Menüpunkt
+ "Statistik". Das Top 40 - PHP Skript wurde nicht mehr benötigt und
+ gelöscht.
+ - Neue Befehle: /me/ und /m/ (Müssen inmitten des Textes eingegeben
+ werden.)
+ - Wird ein Benutzer aus dem Chat gekillt, so wird dies in der Datei
+ "data/kill" protokolloert.
+ - In der main.pl wird die Datei "config.pm" per "require" nur noch
+ in das Dokument eingefügt, wenn es notwendig ist.
+ - In der Onlineliste neben dem Raumnamen steht nun, wieviele Benutzer
+ sich im aktuellen Raum befinden. Ausserdem wird in der Onlineliste
+ angezeigt, ob ein Benutzer abgemeldet ist oder nicht und welche
+ Rechte er hat. Die Onlineliste ist nun Alphabetisch sortiert.
+ - Wird das Profil geändert und das http:// bei der Homepage-Adresse
+ vergessen, so wird dies automatisch hinzugefügt.
+ - Viele Bugfixes.
+
+Update von 0.4.7 auf 0.4.8 (26.01.01)
+ - Top 20 Ranking Liste in PHP4.
+ - Überarbeitung des Flash-Intros.
+ - PIDs für die Signalhandler werden zuverlässiger abgespeichert und
+ ggf. wieder gelöscht.
+ - Das push.pl-Skript (endlosschleife) benötigt nun nurnoch halb so
+ viel Speicher beim Ausführen. Die Datei config.pm wird nicht mehr
+ mit "require config;" eingebunden.
+ - Benutzernamen dürfen maximal nurnoch 15 Zeichen lang sein.
+ - Chatnachrichten dürfen maximal nurnoch 300 Zeichen lang sein.
+ - Wenn ein Benutzer eine Nachricht textet, überprüft das System, ob
+ derjenige sich auch wirklich im jew. Raum befindet.
+ - In den Chatoptionen kann man zusätzliche Einstellungen vornehmen:
+ 1.) Anzahl der Nachrichten im Nachrichten-Verlauf
+ 2.) Anordnung der Nachrichten im Nachrichten-Verlauf.
+ Neueinstellungen dieser Optionen werden erst nach einem
+ Neueinloggen aktiv.
+ - Die Error-Logdatei "data/error" wurde erweitert.
+
+Update von 0.4.6 auf 0.4.7 (20.01.01)
+ - Auto-Away: Ist ein Chatter 5 Minuten inaktiv, dann erscheint im
+ aktuellen Raum die Nachricht "Alias wurde vom System
+ abgemeldet ..." . Bei Wiederaufnahme des Chats, meldet sich Alias
+ wieder zurück.
+ - Auto-Logout: Ist ein Chatter 20 Minuten inaktiv, dann wird dieser
+ aus dem System automatisch ausgelogt.
+ - Neue CSS für die Formulareingabefelder und dem Chat-Menü.
+ (Funktioniert allerdings nicht mit NN4.x, hier werden alle
+ Formulareingabefelder ohne CSS-Definitionen angezeigt.)
+
+Update von 0.4.5 auf 0.4.6 (18.01.01)
+ - Verbesserung: Beim Posten einer neuen Chatnachricht wird sogleich
+ ein Signal an alle laufenden Chatprozesse (PIDs) gesendet, so daß
+ diese aufgefordert werden, aus der Nachrichtendatei die neuen
+ Zeilen einzulesen. Das Push-Skript (push.pl) muß so nicht jede
+ Sekunde prüfen, ob neue Nachrichten da sind, da es diese
+ Information über das Signal erhält. Das Push-Skript verbraucht nun
+ weniger Prozessorleistung, da es jetzt 15 Sekunden lang
+ "dauerschläft" (sleep 15;), lediglich einen <!--PING--> versendet
+ und dann weiter schläft usw. Beendet sich push.pl, oder wird ein
+ Raum gewechselt, dann wird auch die PID aus der PID-Liste des
+ aktuellen Raums gelöscht und ggf. neu geschrieben.
+ Die Dateien "./data/online/pids/*" beinhalten alle aktuellen PIDs,
+ wobei * der jew. Raum ist.
+
+Update von 0.4.4 auf 0.4.5 (16.01.01)
+ - Jeder Chatraum hat nun eine globale Nachrichtendatei. Bisher
+ existierte für jeden Chatter enzelnd eine. Die Nachrichten werden
+ nun schneller gepostet.
+ - Neue Wächterbefehle:
+ "/st Raum Thema" ermöglicht das Ändern das Themas eines anderen
+ Raums.
+ "/sl Raum" ermöglicht das auf- und absperren eines anderen Raums.
+ - Nur noch Oberwächter können die Chatlogs lesen.
+ - Referenzierung der Variable $msg in main.pl.
+ - Flashanimationen.
+
+Update von 0.4.3 auf 0.4.4 (04.01.01)
+ - Optimiertung aller Chatbefehle.
+ - Neuer WÄ-Befehl: Mit "/ss Raum Nachricht" wird aus dem aktuellen
+ Raum heraus in den angegebenen Raum eine beliebige Nachricht
+ gerufen.
+ - Das Skript main.pl wurde in zwei verschiedene Skripts unterteilt:
+ main.pl => Beinhaltet hauptsächlich die Chatbefehle
+ input.pl => Beinhaltet das zu generierende Chateingabeframe.
+ - Das Chateingabeframe wird nun nie wieder reloadet. (Dies geschah
+ bisher noch nach Ausführung der Befehle /col /j /ju /msg und nach
+ Änderung der Chateinstellungen und erwies sich als recht nervige
+ Angelegenheit.) JavaScript macht es möglich.
+ - Überarbeitung und Erweiterung der Dokudateien.
+
+Update von 0.4.2 auf 0.4.3 (30.12.2k)
+ - Optimierung der Zuweisung der Variabeln im Programmcode:
+ Variablen werden nun wirklich nur deffiniert, wenn diese auch
+ erforderlich sind.
+ - Komplette Neuprogrammierung diverser Subs (nun leistungsfähiger)
+ - Bei Aufrug der Login-Seite wird der gesamte Chat auf leerstehende
+ Räume und "alte" Chatter überprüft und ggf. entfernt.
+ - Verbesserung diverser JavaScript-Codes.
+ - Editiert ein Benutzer sein Profil, so wird dies mit der Meldung
+ "Alias hat sein Profil geändert ..." bekanntgegeben.
+ - Mit "/t" ohne weiteren Text erscheint die Nachricht "Alias hat das
+ Thema des Raums gelöscht ..."
+ - Hinzufügung diverser Administratorbefehle: "/pw Alias" zeigt
+ Zugangspassword von Alias an. "/ow Alias" ernennt Alias zum OW.
+ "/row Alias" entzieht Alias die OW-Rechte.
+
+Update von 0.4.1 auf 0.4.2 (25.12.2k)
+ - Im Texteingabeformular werden nun per JavaScript die letzten 10
+ Postings zwischengespeichert und können per Drop-Down-Menü
+ wieder in das Submittextfeld geladen werden um erneuert getextet
+ zu werden.
+ - Neues Design.
+ - Diverse Dateien wurden umbenannt:
+ INSTALL.txt -> SETUP.txt
+ LIESMICH.txt -> README.txt
+ - Die Datei CREDITS.txt wurde angelegt und somit auch die URL
+ www.credits.yChat.de.
+
+Update von 0.4.0 auf 0.4.1 (22.12.2k)
+ - Design wurde geändert.
+ - Unter "Optionen" ist nun eine komplette Farbtabelle eingebaut.
+ - Folgende Oberwächterbefehle wurden nun auch für normale Wächter
+ freigegeben: /ip /ban /rban.
+
+Update von 0.2.6 auf 0.4.0 (19.12.2k)
+ - Der berüchtigte "IP-Bug" wurde beseitigt! Und zwar wurden TempIDs
+ eingeführt => Eine dauerhafte Überprüfung der Benutzer-IP-Nummer
+ ist also nicht mehr notwendig.
+ - Die totale Chat-Online-Zeit wird protokolliert und kann jew. mit
+ "/online Alias" aufgerufen werden. Die Onlinezeit wird alle 20 Sek.
+ aktualisiert.
+ - Neue Befehle: "/seen Alias" zeigt an, vor wieviel St. sich Alias
+ zuletzt in das System eingelogt hat. Der Befehle "/rmgb" entfernt
+ alle Einträge des eigenen Benutzergästebuchs im Profil.
+
+Update von 0.2.5 auf 0.2.6 (17.12.2k)
+ - Das Eingabeframe reloaded sich nicht mehr nach jedem Posting.
+ Vielen Dank an Truhe aka Dave und Klepper aka Andreas Buchwald!
+ Bei den Chatbefehlen /col /away /j und /ju muß sich das
+ Eingabeframe weiterhin reloaden.
+ - Der Befehl // wurde entfernt. Dieser war nicht mehr erforderlich.
+ weil Nachrichten werden nur noch sehr selten verschluckt. Dieser
+ Chatbefehl postete die letzte Nachricht nocheinmal.
+ - Neuer Befehl: mit "/memo Alias hier der Text" hinterläßt man
+ Alias eine Memo. Logt sich Alias in den Chat ein, dann erhält
+ er diese sofort. Dafür wurde das Verzeichnis ".data/user/memos/"
+ angelegt.
+ - Programmcode wurde ein wenig optimiert.
+ - Das Design wurde ein wenig geändert.
+ - Beseitigung diverser Bugs.
+
+Update von 0.2.4 auf 0.2.5 (15.12.2k)
+ - Derjenige, der einen Raum zuerst betritt, hat Raumbesetzerrechte.
+ - Raumbesetzer, Wächter und Oberwächte können weitere Raumbesetzer
+ bestimmen. Diese können Raumbeseter auch wieder degradieren.
+ - Raumbesetzer, Wächter und Oberwächter können dem aktuellen Raum
+ auf/absperren und Themen geben. Wächter und Oberwächter können
+ abgesperrte Räume betreten.
+ - Das Verzeichnis ".data/htdocs" wurde entfernt. Die Datei help_html
+ heist nun help.sno und befindet sich im yChat-Hauptverzeichnis.
+ - Das Verzeichnis ".data/user/lastlogin" wurde hinzugefügt. Hier
+ wird beim erfolgreichen Einloggen ein "Timestamp" gesetzt. Später
+ sollen Oberwächter "veraltete" Benutzer entfernen können.
+ - Neuer Oberwächterbefehl: "/kill Alias" entfernt Alias ganz und gar
+ vom System. Oberwächter und Wächter können nicht entfernt werden.
+ - Perl-Cache wurde im gesamten System komplett deaktiviert ( Weniger
+ Ladezeiten der HTML-Dokumente ).
+ - Nur Nachrichten aus dem Raum "Cyberbar" werden gelogt.
+ Selbsterstellte Räume werden nichtmehr gelogt. Viele Logfunktionen
+ wurden entfernt (weniger Serverbalast).
+ - Beseitigung einiger kleinen Bugs.
+ - Unter "Optionen" im Chat wir die Farbe nun mit einem Drop-Down-Menü
+ ausgewählt ( Vielen dank an Michi aka Snoopy ).
+ - Auf der Startseite wird nun angezeigt wieviele Benutzer eingelogt
+ sind. Ist keiner eingelogt, dann wird das System "aufgeräumt". D.h.
+ Dateien die nicht mehr gebraucht werden und noch nicht gelöscht
+ wurden werden entfernt ( z.B. Nachrichtendateien der einzelnen
+ Chatter und die Dateien die die IP-Nummern der eingelogten Benutzer
+ beinhalteten usw.).
+ - Hunzufügung einer TODO-Liste. Hier sind mehrere Funktionen
+ vermerkt, die in späteren yChat-Versionen eingebaut werden sollen.
+ (www.todo.yChat.de oder TODO.txt).
+
+Update von 0.2.3 auf 0.2.4 (30.11.2k)
+ - Optimierung bzw. Verbesserung der Push-Routine push.pl.
+ - Server-Ping wurde von 2-Pings-per-Minute auf 4 erhöht.
+ - yChat-Banner wurde erstellt und ist unter
+ documents.yChat.de/yBanner.jpg vorzufinden.
+ - Unter der URL servers.yChat.de wurde eine Serverliste angelegt,
+ welche anzeigt wo yChat-Systeme laufen.
+ - Des weiteren wurden die URLs updates.yChat.de, install.yChat.de
+ und liesmich.yChat.de eingerichtet.
+ - Die Menüpunkte wurden zusammengefaßt, damit sie unter einer
+ Auflösung von 800x600 nur eine Zeile belegen.
+ - Einige Bugs wurden entfernt.
+
+Update von 0.2.2 auf 0.2.3 (25.11.2k)
+ - Smooth scrolling JavaScript ( Vielen Dank an Andreas Buchwald ).
+ - "IP#-Fehler" wurde so gut wie beseitigt.
+ - Aufrufe der einzelnen Benutzerprofile wird gezählt und angezeigt.
+ Diese werden in data/user/counts/* gespeichert.
+ - Automatische Einrichtung des Chats mit setup.sh und Telnet.
+ - Menüpunkt "Dein Profil" wurde entfernt da eigenes Profil auch
+ stets über die Onlineliste aufgerufen werden kann.
+
+Update von 0.2.1 auf 0.2.2 (23.11.2k)
+ - Einige Bugs wurden entfernt.
+ - Geschwindigkeit des Chats wurde optimiert.
+ - Eine Liste aller eingelogten Benutzer erscheint am Rand. Hierfür
+ wurde die Datei online.pl eingeführt. Sie aktuallisiert sich alle
+ 20 Sekunden.
+ - Die UPDATES.txt wurde eingeführt.
+
+Update von 0.2.0 auf 0.2.1
+ - Einige Bugs wurden entfernt.
+ - Die IP# der eingelogten Benutzer werden nun anders verwaltet.
+
+Update von Alpha XVIII auf 0.2.0
+ - Die Handhabung der eingelogten Benutzer im System wurde komplett neu
+ überarbeitet.
+ - Neue Versionsnumern wurden eingeführt. \ No newline at end of file
diff --git a/0.4.9/away.gif b/0.4.9/away.gif
new file mode 100644
index 0000000..10d460b
--- /dev/null
+++ b/0.4.9/away.gif
Binary files differ
diff --git a/0.4.9/colors.sno b/0.4.9/colors.sno
new file mode 100644
index 0000000..3640b9e
--- /dev/null
+++ b/0.4.9/colors.sno
@@ -0,0 +1,290 @@
+ <table cellspacing=0 cellpadding=5 border=0>
+ <tr>
+ <td bgcolor="000000"><span style="color:#FFFFFF; text-decoration:line-through;">000000</span></td>
+ <td bgcolor="000033"><span style="color:#FFFFFF; text-decoration:line-through;">000033</span></td>
+ <td bgcolor="000066"><span style="color:#FFFFFF; text-decoration:line-through;">000066</span></td>
+ <td bgcolor="000099"><span style="color:#FFFFFF; text-decoration:line-through;">000099</span></td>
+ <td bgcolor="0000CC"><span style="color:#FFFFFF; text-decoration:line-through;">0000CC</span></td>
+ <td bgcolor="0000FF"><a href="javascript:insertcode('0000FF');" style="color:#FFFFFF;">0000FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="003300"><span style="color:#FFFFFF; text-decoration:line-through;">003300</span></td>
+ <td bgcolor="003333"><span style="color:#FFFFFF; text-decoration:line-through;">003333</span></td>
+ <td bgcolor="003366"><span style="color:#FFFFFF; text-decoration:line-through;">003366</span></td>
+ <td bgcolor="003399"><a href="javascript:insertcode('003399');" style="color:#FFFFFF;">003399</a></td>
+ <td bgcolor="0033CC"><a href="javascript:insertcode('0033CC');" style="color:#FFFFFF;">0033CC</a></td>
+ <td bgcolor="0033FF"><a href="javascript:insertcode('0033FF');" style="color:#FFFFFF;">0033FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="006600"><span style="color:#FFFFFF; text-decoration:line-through;">006600</span></td>
+ <td bgcolor="006633"><span style="color:#FFFFFF; text-decoration:line-through;">006633</span></td>
+ <td bgcolor="006666"><a href="javascript:insertcode('006666');" style="color:#FFFFFF;">006666</a></td>
+ <td bgcolor="006699"><a href="javascript:insertcode('006699');" style="color:#FFFFFF;">006699</a></td>
+ <td bgcolor="0066CC"><a href="javascript:insertcode('0066CC');" style="color:#FFFFFF;">0066CC</a></td>
+ <td bgcolor="0066FF"><a href="javascript:insertcode('0066FF');" style="color:#FFFFFF;">0066FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="009900"><a href="javascript:insertcode('009900');" style="color:#FFFFFF;">009900</a></td>
+ <td bgcolor="009933"><a href="javascript:insertcode('009933');" style="color:#FFFFFF;">009933</a></td>
+ <td bgcolor="009966"><a href="javascript:insertcode('009966');" style="color:#FFFFFF;">009966</a></td>
+ <td bgcolor="009999"><a href="javascript:insertcode('009999');" style="color:#FFFFFF;">009999</a></td>
+ <td bgcolor="0099CC"><a href="javascript:insertcode('0099CC');" style="color:#FFFFFF;">0099CC</a></td>
+ <td bgcolor="0099FF"><a href="javascript:insertcode('0099FF');" style="color:#FFFFFF;">0099FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00CC00"><a href="javascript:insertcode('00CC00');" style="color:#000000;">00CC00</a></td>
+ <td bgcolor="00CC33"><a href="javascript:insertcode('00CC33');" style="color:#000000;">00CC33</a></td>
+ <td bgcolor="00CC66"><a href="javascript:insertcode('00CC66');" style="color:#000000;">00CC66</a></td>
+ <td bgcolor="00CC99"><a href="javascript:insertcode('00CC99');" style="color:#000000;">00CC99</a></td>
+ <td bgcolor="00CCCC"><a href="javascript:insertcode('00CCCC');" style="color:#000000;">00CCCC</a></td>
+ <td bgcolor="00CCFF"><a href="javascript:insertcode('00CCFF');" style="color:#000000;">00CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00FF00"><a href="javascript:insertcode('00FF00');" style="color:#000000;">00FF00</a></td>
+ <td bgcolor="00FF33"><a href="javascript:insertcode('00FF33');" style="color:#000000;">00FF33</a></td>
+ <td bgcolor="00FF66"><a href="javascript:insertcode('00FF66');" style="color:#000000;">00FF66</a></td>
+ <td bgcolor="00FF99"><a href="javascript:insertcode('00FF99');" style="color:#000000;">00FF99</a></td>
+ <td bgcolor="00FFCC"><a href="javascript:insertcode('00FFCC');" style="color:#000000;">00FFCC</a></td>
+ <td bgcolor="00FFFF"><a href="javascript:insertcode('00FFFF');" style="color:#000000;">00FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="330000"><span style="color:#FFFFFF; text-decoration:line-through;">330000</span></td>
+ <td bgcolor="330033"><span style="color:#FFFFFF; text-decoration:line-through;">330033</span></td>
+ <td bgcolor="330066"><span style="color:#FFFFFF; text-decoration:line-through;">330066</span></td>
+ <td bgcolor="330099"><a href="javascript:insertcode('330099');" style="color:#FFFFFF;">330099</a></td>
+ <td bgcolor="3300CC"><a href="javascript:insertcode('3300CC');" style="color:#FFFFFF;">3300CC</a></td>
+ <td bgcolor="3300FF"><a href="javascript:insertcode('3300FF');" style="color:#FFFFFF;">3300FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="333300"><span style="color:#FFFFFF; text-decoration:line-through;">333300</span></td>
+ <td bgcolor="333333"><span style="color:#FFFFFF; text-decoration:line-through;">333333</span></td>
+ <td bgcolor="333366"><a href="javascript:insertcode('333366');" style="color:#FFFFFF;">333366</a></td>
+ <td bgcolor="333399"><a href="javascript:insertcode('333399');" style="color:#FFFFFF;">333399</a></td>
+ <td bgcolor="3333CC"><a href="javascript:insertcode('3333CC');" style="color:#FFFFFF;">3333CC</a></td>
+ <td bgcolor="3333FF"><a href="javascript:insertcode('3333FF');" style="color:#FFFFFF;">3333FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="336600"><a href="javascript:insertcode('336600');" style="color:#FFFFFF;">336600</a></td>
+ <td bgcolor="336633"><a href="javascript:insertcode('336633');" style="color:#FFFFFF;">336633</a></td>
+ <td bgcolor="336666"><a href="javascript:insertcode('336666');" style="color:#FFFFFF;">336666</a></td>
+ <td bgcolor="336699"><a href="javascript:insertcode('336699');" style="color:#FFFFFF;">336699</a></td>
+ <td bgcolor="3366CC"><a href="javascript:insertcode('3366CC');" style="color:#FFFFFF;">3366CC</a></td>
+ <td bgcolor="3366FF"><a href="javascript:insertcode('3366FF');" style="color:#FFFFFF;">3366FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="339900"><a href="javascript:insertcode('339900');" style="color:#FFFFFF;">339900</a></td>
+ <td bgcolor="339933"><a href="javascript:insertcode('339933');" style="color:#FFFFFF;">339933</a></td>
+ <td bgcolor="339966"><a href="javascript:insertcode('339966');" style="color:#FFFFFF;">339966</a></td>
+ <td bgcolor="339999"><a href="javascript:insertcode('339999');" style="color:#FFFFFF;">339999</a></td>
+ <td bgcolor="3399CC"><a href="javascript:insertcode('3399CC');" style="color:#FFFFFF;">3399CC</a></td>
+ <td bgcolor="3399FF"><a href="javascript:insertcode('3399FF');" style="color:#FFFFFF;">3399FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33CC00"><a href="javascript:insertcode('33CC00');" style="color:#000000;">33CC00</a></td>
+ <td bgcolor="33CC33"><a href="javascript:insertcode('33CC33');" style="color:#000000;">33CC33</a></td>
+ <td bgcolor="33CC66"><a href="javascript:insertcode('33CC66');" style="color:#000000;">33CC66</a></td>
+ <td bgcolor="33CC99"><a href="javascript:insertcode('33CC99');" style="color:#000000;">33CC99</a></td>
+ <td bgcolor="33CCCC"><a href="javascript:insertcode('33CCCC');" style="color:#000000;">33CCCC</a></td>
+ <td bgcolor="33CCFF"><a href="javascript:insertcode('33CCFF');" style="color:#000000;">33CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33FF00"><a href="javascript:insertcode('33FF00');" style="color:#000000;">33FF00</a></td>
+ <td bgcolor="33FF33"><a href="javascript:insertcode('33FF33');" style="color:#000000;">33FF33</a></td>
+ <td bgcolor="33FF66"><a href="javascript:insertcode('33FF66');" style="color:#000000;">33FF66</a></td>
+ <td bgcolor="33FF99"><a href="javascript:insertcode('33FF99');" style="color:#000000;">33FF99</a></td>
+ <td bgcolor="33FFCC"><a href="javascript:insertcode('33FFCC');" style="color:#000000;">33FFCC</a></td>
+ <td bgcolor="33FFFF"><a href="javascript:insertcode('33FFFF');" style="color:#000000;">33FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="660000"><span style="color:#FFFFFF; text-decoration:line-through;">660000</span></td>
+ <td bgcolor="660033"><span style="color:#FFFFFF; text-decoration:line-through;">660033</span></td>
+ <td bgcolor="660066"><a href="javascript:insertcode('660066');" style="color:#FFFFFF;">660066</a></td>
+ <td bgcolor="660099"><a href="javascript:insertcode('660099');" style="color:#FFFFFF;">660099</a></td>
+ <td bgcolor="6600CC"><a href="javascript:insertcode('6600CC');" style="color:#FFFFFF;">6600CC</a></td>
+ <td bgcolor="6600FF"><a href="javascript:insertcode('6600FF');" style="color:#FFFFFF;">6600FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="663300"><a href="javascript:insertcode('663300');" style="color:#FFFFFF;">663300</a></td>
+ <td bgcolor="663333"><a href="javascript:insertcode('663333');" style="color:#FFFFFF;">663333</a></td>
+ <td bgcolor="663366"><a href="javascript:insertcode('663366');" style="color:#FFFFFF;">663366</a></td>
+ <td bgcolor="663399"><a href="javascript:insertcode('663399');" style="color:#FFFFFF;">663399</a></td>
+ <td bgcolor="6633CC"><a href="javascript:insertcode('6633CC');" style="color:#FFFFFF;">6633CC</a></td>
+ <td bgcolor="6633FF"><a href="javascript:insertcode('6633FF');" style="color:#FFFFFF;">6633FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="666600"><a href="javascript:insertcode('666600');" style="color:#FFFFFF;">666600</a></td>
+ <td bgcolor="666633"><a href="javascript:insertcode('666633');" style="color:#FFFFFF;">666633</a></td>
+ <td bgcolor="666666"><a href="javascript:insertcode('666666');" style="color:#FFFFFF;">666666</a></td>
+ <td bgcolor="666699"><a href="javascript:insertcode('666699');" style="color:#FFFFFF;">666699</a></td>
+ <td bgcolor="6666CC"><a href="javascript:insertcode('6666CC');" style="color:#FFFFFF;">6666CC</a></td>
+ <td bgcolor="6666FF"><a href="javascript:insertcode('6666FF');" style="color:#FFFFFF;">6666FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="669900"><a href="javascript:insertcode('669900');" style="color:#000000;">669900</a></td>
+ <td bgcolor="669933"><a href="javascript:insertcode('669933');" style="color:#000000;">669933</a></td>
+ <td bgcolor="669966"><a href="javascript:insertcode('669966');" style="color:#000000;">669966</a></td>
+ <td bgcolor="669999"><a href="javascript:insertcode('669999');" style="color:#000000;">669999</a></td>
+ <td bgcolor="6699CC"><a href="javascript:insertcode('6699CC');" style="color:#000000;">6699CC</a></td>
+ <td bgcolor="6699FF"><a href="javascript:insertcode('6699FF');" style="color:#000000;">6699FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66CC00"><a href="javascript:insertcode('66CC00');" style="color:#000000;">66CC00</a></td>
+ <td bgcolor="66CC33"><a href="javascript:insertcode('66CC33');" style="color:#000000;">66CC33</a></td>
+ <td bgcolor="66CC66"><a href="javascript:insertcode('66CC66');" style="color:#000000;">66CC66</a></td>
+ <td bgcolor="66CC99"><a href="javascript:insertcode('66CC99');" style="color:#000000;">66CC99</a></td>
+ <td bgcolor="66CCCC"><a href="javascript:insertcode('66CCCC');" style="color:#000000;">66CCCC</a></td>
+ <td bgcolor="66CCFF"><a href="javascript:insertcode('66CCFF');" style="color:#000000;">66CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66FF00"><a href="javascript:insertcode('66FF00');" style="color:#000000;">66FF00</a></td>
+ <td bgcolor="66FF33"><a href="javascript:insertcode('66FF33');" style="color:#000000;">66FF33</a></td>
+ <td bgcolor="66FF66"><a href="javascript:insertcode('66FF66');" style="color:#000000;">66FF66</a></td>
+ <td bgcolor="66FF99"><a href="javascript:insertcode('66FF99');" style="color:#000000;">66FF99</a></td>
+ <td bgcolor="66FFCC"><a href="javascript:insertcode('66FFCC');" style="color:#000000;">66FFCC</a></td>
+ <td bgcolor="66FFFF"><a href="javascript:insertcode('66FFFF');" style="color:#000000;">66FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="990000"><a href="javascript:insertcode('990000');" style="color:#FFFFFF;">990000</a></td>
+ <td bgcolor="990033"><a href="javascript:insertcode('990033');" style="color:#FFFFFF;">990033</a></td>
+ <td bgcolor="990066"><a href="javascript:insertcode('990066');" style="color:#FFFFFF;">990066</a></td>
+ <td bgcolor="990099"><a href="javascript:insertcode('990099');" style="color:#FFFFFF;">990099</a></td>
+ <td bgcolor="9900CC"><a href="javascript:insertcode('9900CC');" style="color:#FFFFFF;">9900CC</a></td>
+ <td bgcolor="9900FF"><a href="javascript:insertcode('9900FF');" style="color:#FFFFFF;">9900FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="993300"><a href="javascript:insertcode('993300');" style="color:#FFFFFF;">993300</a></td>
+ <td bgcolor="993333"><a href="javascript:insertcode('993333');" style="color:#FFFFFF;">993333</a></td>
+ <td bgcolor="993366"><a href="javascript:insertcode('993366');" style="color:#FFFFFF;">993366</a></td>
+ <td bgcolor="993399"><a href="javascript:insertcode('993399');" style="color:#FFFFFF;">993399</a></td>
+ <td bgcolor="9933CC"><a href="javascript:insertcode('9933CC');" style="color:#FFFFFF;">9933CC</a></td>
+ <td bgcolor="9933FF"><a href="javascript:insertcode('9933FF');" style="color:#FFFFFF;">9933FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="996600"><a href="javascript:insertcode('996600');" style="color:#FFFFFF;">996600</a></td>
+ <td bgcolor="996633"><a href="javascript:insertcode('996633');" style="color:#FFFFFF;">996633</a></td>
+ <td bgcolor="996666"><a href="javascript:insertcode('996666');" style="color:#FFFFFF;">996666</a></td>
+ <td bgcolor="996699"><a href="javascript:insertcode('996699');" style="color:#FFFFFF;">996699</a></td>
+ <td bgcolor="9966CC"><a href="javascript:insertcode('9966CC');" style="color:#FFFFFF;">9966CC</a></td>
+ <td bgcolor="9966FF"><a href="javascript:insertcode('9966FF');" style="color:#FFFFFF;">9966FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="999900"><a href="javascript:insertcode('999900');" style="color:#000000;">999900</a></td>
+ <td bgcolor="999933"><a href="javascript:insertcode('999933');" style="color:#000000;">999933</a></td>
+ <td bgcolor="999966"><a href="javascript:insertcode('999966');" style="color:#000000;">999966</a></td>
+ <td bgcolor="999999"><a href="javascript:insertcode('999999');" style="color:#000000;">999999</a></td>
+ <td bgcolor="9999CC"><a href="javascript:insertcode('9999CC');" style="color:#000000;">9999CC</a></td>
+ <td bgcolor="9999FF"><a href="javascript:insertcode('9999FF');" style="color:#000000;">9999FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99CC00"><a href="javascript:insertcode('99CC00');" style="color:#000000;">99CC00</a></td>
+ <td bgcolor="99CC33"><a href="javascript:insertcode('99CC33');" style="color:#000000;">99CC33</a></td>
+ <td bgcolor="99CC66"><a href="javascript:insertcode('99CC66');" style="color:#000000;">99CC66</a></td>
+ <td bgcolor="99CC99"><a href="javascript:insertcode('99CC99');" style="color:#000000;">99CC99</a></td>
+ <td bgcolor="99CCCC"><a href="javascript:insertcode('99CCCC');" style="color:#000000;">99CCCC</a></td>
+ <td bgcolor="99CCFF"><a href="javascript:insertcode('99CCFF');" style="color:#000000;">99CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99FF00"><a href="javascript:insertcode('99FF00');" style="color:#000000;">99FF00</a></td>
+ <td bgcolor="99FF33"><a href="javascript:insertcode('99FF33');" style="color:#000000;">99FF33</a></td>
+ <td bgcolor="99FF66"><a href="javascript:insertcode('99FF66');" style="color:#000000;">99FF66</a></td>
+ <td bgcolor="99FF99"><a href="javascript:insertcode('99FF99');" style="color:#000000;">99FF99</a></td>
+ <td bgcolor="99FFCC"><a href="javascript:insertcode('99FFCC');" style="color:#000000;">99FFCC</a></td>
+ <td bgcolor="99FFFF"><a href="javascript:insertcode('99FFFF');" style="color:#000000;">99FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC0000"><a href="javascript:insertcode('CC0000');" style="color:#FFFFFF;">CC0000</a></td>
+ <td bgcolor="CC0033"><a href="javascript:insertcode('CC0033');" style="color:#FFFFFF;">CC0033</a></td>
+ <td bgcolor="CC0066"><a href="javascript:insertcode('CC0066');" style="color:#FFFFFF;">CC0066</a></td>
+ <td bgcolor="CC0099"><a href="javascript:insertcode('CC0099');" style="color:#FFFFFF;">CC0099</a></td>
+ <td bgcolor="CC00CC"><a href="javascript:insertcode('CC00CC');" style="color:#FFFFFF;">CC00CC</a></td>
+ <td bgcolor="CC00FF"><a href="javascript:insertcode('CC00FF');" style="color:#FFFFFF;">CC00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC3300"><a href="javascript:insertcode('CC3300');" style="color:#FFFFFF;">CC3300</a></td>
+ <td bgcolor="CC3333"><a href="javascript:insertcode('CC3333');" style="color:#FFFFFF;">CC3333</a></td>
+ <td bgcolor="CC3366"><a href="javascript:insertcode('CC3366');" style="color:#FFFFFF;">CC3366</a></td>
+ <td bgcolor="CC3399"><a href="javascript:insertcode('CC3399');" style="color:#FFFFFF;">CC3399</a></td>
+ <td bgcolor="CC33CC"><a href="javascript:insertcode('CC33CC');" style="color:#FFFFFF;">CC33CC</a></td>
+ <td bgcolor="CC33FF"><a href="javascript:insertcode('CC33FF');" style="color:#FFFFFF;">CC33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC6600"><a href="javascript:insertcode('CC6600');" style="color:#000000;">CC6600</a></td>
+ <td bgcolor="CC6633"><a href="javascript:insertcode('CC6633');" style="color:#000000;">CC6633</a></td>
+ <td bgcolor="CC6666"><a href="javascript:insertcode('CC6666');" style="color:#000000;">CC6666</a></td>
+ <td bgcolor="CC6699"><a href="javascript:insertcode('CC6699');" style="color:#000000;">CC6699</a></td>
+ <td bgcolor="CC66CC"><a href="javascript:insertcode('CC66CC');" style="color:#000000;">CC66CC</a></td>
+ <td bgcolor="CC66FF"><a href="javascript:insertcode('CC66FF');" style="color:#000000;">CC66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC9900"><a href="javascript:insertcode('CC9900');" style="color:#000000;">CC9900</a></td>
+ <td bgcolor="CC9933"><a href="javascript:insertcode('CC9933');" style="color:#000000;">CC9933</a></td>
+ <td bgcolor="CC9966"><a href="javascript:insertcode('CC9966');" style="color:#000000;">CC9966</a></td>
+ <td bgcolor="CC9999"><a href="javascript:insertcode('CC9999');" style="color:#000000;">CC9999</a></td>
+ <td bgcolor="CC99CC"><a href="javascript:insertcode('CC99CC');" style="color:#000000;">CC99CC</a></td>
+ <td bgcolor="CC99FF"><a href="javascript:insertcode('CC99FF');" style="color:#000000;">CC99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCCC00"><a href="javascript:insertcode('CCCC00');" style="color:#000000;">CCCC00</a></td>
+ <td bgcolor="CCCC33"><a href="javascript:insertcode('CCCC33');" style="color:#000000;">CCCC33</a></td>
+ <td bgcolor="CCCC66"><a href="javascript:insertcode('CCCC66');" style="color:#000000;">CCCC66</a></td>
+ <td bgcolor="CCCC99"><a href="javascript:insertcode('CCCC99');" style="color:#000000;">CCCC99</a></td>
+ <td bgcolor="CCCCCC"><a href="javascript:insertcode('CCCCCC');" style="color:#000000;">CCCCCC</a></td>
+ <td bgcolor="CCCCFF"><a href="javascript:insertcode('CCCCFF');" style="color:#000000;">CCCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCFF00"><a href="javascript:insertcode('CCFF00');" style="color:#000000;">CCFF00</a></td>
+ <td bgcolor="CCFF33"><a href="javascript:insertcode('CCFF33');" style="color:#000000;">CCFF33</a></td>
+ <td bgcolor="CCFF66"><a href="javascript:insertcode('CCFF66');" style="color:#000000;">CCFF66</a></td>
+ <td bgcolor="CCFF99"><a href="javascript:insertcode('CCFF99');" style="color:#000000;">CCFF99</a></td>
+ <td bgcolor="CCFFCC"><a href="javascript:insertcode('CCFFCC');" style="color:#000000;">CCFFCC</a></td>
+ <td bgcolor="CCFFFF"><a href="javascript:insertcode('CCFFFF');" style="color:#000000;">CCFFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF0000"><a href="javascript:insertcode('FF0000');" style="color:#FFFFFF;">FF0000</a></td>
+ <td bgcolor="FF0033"><a href="javascript:insertcode('FF0033');" style="color:#FFFFFF;">FF0033</a></td>
+ <td bgcolor="FF0066"><a href="javascript:insertcode('FF0066');" style="color:#FFFFFF;">FF0066</a></td>
+ <td bgcolor="FF0099"><a href="javascript:insertcode('FF0099');" style="color:#FFFFFF;">FF0099</a></td>
+ <td bgcolor="FF00CC"><a href="javascript:insertcode('FF00CC');" style="color:#FFFFFF;">FF00CC</a></td>
+ <td bgcolor="FF00FF"><a href="javascript:insertcode('FF00FF');" style="color:#FFFFFF;">FF00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF3300"><a href="javascript:insertcode('FF3300');" style="color:#FFFFFF;">FF3300</a></td>
+ <td bgcolor="FF3333"><a href="javascript:insertcode('FF3333');" style="color:#FFFFFF;">FF3333</a></td>
+ <td bgcolor="FF3366"><a href="javascript:insertcode('FF3366');" style="color:#FFFFFF;">FF3366</a></td>
+ <td bgcolor="FF3399"><a href="javascript:insertcode('FF3399');" style="color:#FFFFFF;">FF3399</a></td>
+ <td bgcolor="FF33CC"><a href="javascript:insertcode('FF33CC');" style="color:#FFFFFF;">FF33CC</a></td>
+ <td bgcolor="FF33FF"><a href="javascript:insertcode('FF33FF');" style="color:#FFFFFF;">FF33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF6600"><a href="javascript:insertcode('FF6600');" style="color:#000000;">FF6600</a></td>
+ <td bgcolor="FF6633"><a href="javascript:insertcode('FF6633');" style="color:#000000;">FF6633</a></td>
+ <td bgcolor="FF6666"><a href="javascript:insertcode('FF6666');" style="color:#000000;">FF6666</a></td>
+ <td bgcolor="FF6699"><a href="javascript:insertcode('FF6699');" style="color:#000000;">FF6699</a></td>
+ <td bgcolor="FF66CC"><a href="javascript:insertcode('FF66CC');" style="color:#000000;">FF66CC</a></td>
+ <td bgcolor="FF66FF"><a href="javascript:insertcode('FF66FF');" style="color:#000000;">FF66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF9900"><a href="javascript:insertcode('FF9900');" style="color:#000000;">FF9900</a></td>
+ <td bgcolor="FF9933"><a href="javascript:insertcode('FF9933');" style="color:#000000;">FF9933</a></td>
+ <td bgcolor="FF9966"><a href="javascript:insertcode('FF9966');" style="color:#000000;">FF9966</a></td>
+ <td bgcolor="FF9999"><a href="javascript:insertcode('FF9999');" style="color:#000000;">FF9999</a></td>
+ <td bgcolor="FF99CC"><a href="javascript:insertcode('FF99CC');" style="color:#000000;">FF99CC</a></td>
+ <td bgcolor="FF99FF"><a href="javascript:insertcode('FF99FF');" style="color:#000000;">FF99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFCC00"><a href="javascript:insertcode('FFCC00');" style="color:#000000;">FFCC00</a></td>
+ <td bgcolor="FFCC33"><a href="javascript:insertcode('FFCC33');" style="color:#000000;">FFCC33</a></td>
+ <td bgcolor="FFCC66"><a href="javascript:insertcode('FFCC66');" style="color:#000000;">FFCC66</a></td>
+ <td bgcolor="FFCC99"><a href="javascript:insertcode('FFCC99');" style="color:#000000;">FFCC99</a></td>
+ <td bgcolor="FFCCCC"><a href="javascript:insertcode('FFCCCC');" style="color:#000000;">FFCCCC</a></td>
+ <td bgcolor="FFCCFF"><a href="javascript:insertcode('FFCCFF');" style="color:#000000;">FFCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFFF00"><a href="javascript:insertcode('FFFF00');" style="color:#000000;">FFFF00</a></td>
+ <td bgcolor="FFFF33"><a href="javascript:insertcode('FFFF33');" style="color:#000000;">FFFF33</a></td>
+ <td bgcolor="FFFF66"><a href="javascript:insertcode('FFFF66');" style="color:#000000;">FFFF66</a></td>
+ <td bgcolor="FFFF99"><a href="javascript:insertcode('FFFF99');" style="color:#000000;">FFFF99</a></td>
+ <td bgcolor="FFFFCC"><a href="javascript:insertcode('FFFFCC');" style="color:#000000;">FFFFCC</a></td>
+ <td bgcolor="FFFFFF"><a href="javascript:insertcode('FFFFFF');" style="color:#000000;">FFFFFF</a></td>
+ </tr>
+</table> \ No newline at end of file
diff --git a/0.4.9/config.pm b/0.4.9/config.pm
new file mode 100644
index 0000000..7602abc
--- /dev/null
+++ b/0.4.9/config.pm
@@ -0,0 +1,322 @@
+# yChat - Copyright by Paul C. Bütow
+
+########################### Dieser Teil bestimmt die Standart-Variabeln.
+##STANDART-CONFIGURATION:## (CSS, Farben, Version etc.)
+###########################
+$datum = "11.02.01";
+$version = "0.4.9";
+$title = "yChat [$version]";
+$gfxpath = "../../yChat";
+$style = <<ENDCSS;
+<style type="text/css">
+ body { background-color: #005146 }
+ body.blank { background-color: #000000 }
+ body.online { background-color: #000000 }
+ div { font-family: arial, verdana, helvetiva; font-size: 9pt; color: #ffffff }
+ div.b { font-weight: bold; color: #ffa500 }
+ a { color: #ffffef; }
+ a:hover { color: #ffffff; }
+ p { font-family:verdana, arial, geneva, helvetica, sans-serif; color:#FFFFFF; font-size:12px; }
+</style>
+<style type="text/css" media="all">
+ a { text-decoration: none; }
+ a:hover { text-decoration:underline; }
+ input { border:2px solid #000000; font-size:12px; color:#000000; height:23px; padding:2px;}
+ select { border:2px solid #000000; font-family:arial, verdana, helvetica; font-size:11px; color:#000000; height:21px; padding:2px;}
+</style>
+ENDCSS
+
+############### Dieser TeFil enthält Programmcode, der an verschiedenen
+##SHARED-SUBS## Stellen ausgeführt werden muß und jedem Skript zur
+############### Verfügung steht.
+
+sub printfile { # Liest eine externe Datei ein und gibt sie mit print aus
+ my ($file2print,$pagetitle,$bodyclass) = @_;
+ if ($pagetitle ne "") {
+ &start_html($pagetitle,$bodyclass);
+ }
+ open(FILE2PRINT,"<$file2print");
+ @file2print = <FILE2PRINT>;
+ close FILE2PRINT;
+ print @file2print;
+}
+
+sub start_html { # Der HEADER einer HTML-Datei
+print "<html><head>";
+print "<meta http-equiv=\"refresh\" content=\"20\" URL=\"online.pl?room=$room\">" if ($_[1] eq "online");
+print <<END;
+ <title>
+ $title - $_[0]
+ </title>
+ $_[2]
+ $style
+ </head>
+END
+ if ($_[1] eq "start") {
+ print "<body onload=\"document.login.alias.focus();\">";
+ } elsif ($_[1] ne "") {
+ print "<body class=$_[1]>";
+ } else {
+ print "<body>";
+ }
+}
+
+sub post { # Öffentliche Nachricht posten.
+ my ($room,$msg2post,$secroom) = @_;
+ my @rooms = $room;
+ @rooms = ($room,$secroom) if ($room ne $secroom);
+ foreach $raum (@rooms) {
+ open(MSGFILE,">>data/msgs/$raum");
+ print MSGFILE "!<;".time."<;!<;!<;$msg2post<;\n";
+ close MSGFILE;
+ opendir(PID,"data/online/pids/$raum");
+ my @pids = readdir(PID);
+ closedir(PID);
+ foreach(@pids) {
+ if (-f "data/online/pids/$raum/$_") {
+ kill USR1 => $_;
+ }
+ }
+ }
+ &log($msg2post) if ($room eq "Cyberbar");
+}
+
+sub post_prv { # Private Nachricht posten (flüstern).
+ my ($alias2post,$msg2post) = @_;
+ opendir(DIR,"data/online/rooms");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach $raum (@dir) {
+ opendir(DIR,"data/online/rooms/$raum");
+ my @chatter = readdir(DIR);
+ closedir(DIR);
+ foreach $chatter (@chatter) {
+ if ($chatter eq $alias2post) {
+ open(MSGFILE,">>data/msgs/$raum");
+ print MSGFILE "$alias2post<;".time."<;!<;!<;$msg2post<;\n";
+ close MSGFILE;
+ opendir(PID,"data/online/pids/$raum");
+ my @pids = readdir(PID);
+ closedir(PID);
+ foreach(@pids) {
+ if (-f "data/online/pids/$raum/$_") {
+ kill USR1 => $_;
+ }
+ }
+ goto ENDPRV;
+ }
+ }
+ }
+ENDPRV:
+}
+
+sub log { # Protokollieren der Nachrichten etc.
+ local $msg2log = $_[0];
+ &zeit;
+ my $js;
+ ($msg2log,$js) = split(/<script/, $msg2log);
+ open(LOG,">>data/logs/$day.$month.$year");
+ flock(LOG, 2);
+ print LOG "<br><font color=ffffef><i>($hours:$min:$sec)</i></font> $msg2log\n";
+ close LOG;
+}
+
+sub zeit { # Aktuelles Datum und Uhrzeit bestimmen.
+ ($sec, $min, $hours, $day, $month, $year) = (localtime)[0..5];
+ $month += 1;
+ $hours = "0".$hours if ($hours < 10);
+ $min = "0".$min if ($min < 10);
+ $sec = "0".$sec if ($sec < 10);
+ $day = "0".$day if ($day < 10);
+ $month = "0".$month if ($month < 10);
+ $year = $year - 100;
+ if ($year < 10) {
+ $year = "200".$year;
+ } else {
+ $year = "20".$year;
+ }
+}
+
+sub error { # Error-Ausgabe.
+ my $error_msg = $_[0];
+ &start_html( "Error: ($error_msg)" );
+ print $q->div( "Error: ($error_msg)" ),
+ $q->end_html;
+ open(ERROR,">>data/error");
+ flock(ERROR, 2);
+ print ERROR "$alias $tmpid $$ ".time." $error_msg \n";
+ close ERROR;
+ exit 0;
+}
+
+sub check_online { # Auf alte Räume und Chatter prüfen und ggf. entfernen.
+ open(PROVE,">data/online/prove");
+ print PROVE time;
+ close PROVE;
+ opendir(RAUMDIR, "data/online/rooms");
+ my @raumdir = readdir(RAUMDIR);
+ closedir(RAUMDIR);
+ foreach $raum (@raumdir) {
+ opendir(BENUTZERDIR, "data/online/rooms/$raum");
+ my @benutzerdir = readdir(BENUTZERDIR);
+ closedir(BENUTZERDIR);
+ my $raumleer= 1;
+ foreach $benutzer (@benutzerdir) {
+ if (-f "data/online/rooms/$raum/$benutzer") {
+ $raumleer = 0;
+ open (BENUTZER,"<data/online/rooms/$raum/$benutzer");
+ my $benutzerstamp = <BENUTZER>;
+ close BENUTZER;
+ if ($benutzerstamp < (time - 40)) {
+ unlink("data/online/$raum/$benutzer");
+ open (BENUTZER2,"<data/online/users/$benutzer");
+ my $benutzerstamp2 = <BENUTZER2>;
+ close BENUTZER2;
+ if ($benutzerstamp2 < (time - 40)) {
+ if ($benutzer ne $alias) {
+ &rm_alias($benutzer,$raum); # ohne $raum/benutzer entf.
+ } else {
+ unlink("data/online/rooms/$raum/$benutzer");
+ }
+ &zeit;
+ &post($raum,"<i><font color=ffffff>($hours:$min:$sec) $benutzer hat den Chat verlassen ... </font></i>");
+ }
+ }
+ }
+ }
+ opendir(PIDS,"data/online/pids/$raum");
+ my @pids = readdir(PIDS);
+ closedir(PIDS);
+ if ($raumleer == 1) { # Falls Raum leer ist => entf.
+ rmdir("data/online/rooms/$raum");
+ unlink("data/online/rstat/$raum");
+ unlink("data/online/rstat/$raum.away");
+ unlink("data/msgs/$raum");
+ foreach(@pids) {
+ if (-f "data/online/pids/$raum/$_") {
+ unlink("data/online/pids/$raum/$_");
+ }
+ }
+ rmdir("data/online/pids/$raum");
+ } else {
+ foreach(@pids) {
+ unless (kill 0 => $_) {
+ unlink("data/online/pids/$room/$_");
+ }
+ }
+ }
+ }
+}
+
+sub rm_alias { # Falls Benutzer offline gegangen ist
+ my($benutzer,$raum) = @_;
+ unlink("data/online/rooms/$raum/$benutzer");
+ unlink("data/online/users/$benutzer");
+ unlink("data/online/ident/$benutzer");
+ &rm_rstat($benutzer,$raum);
+}
+
+sub rm_rstat { # Benutzer als Raumbesetzer austragen
+ my ($r_alias,$rstatroom) = @_;
+ open (RSTAT,"<data/online/rstat/$rstatroom");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ my @rstat2 = ($rstat[0],$rstat[1]);
+ for ($i=2;$i<=$#rstat;$i++) {
+ chomp($rstat[$i]);
+ push(@rstat2,$rstat[$i]."\n") if ($rstat[$i] ne $r_alias);
+ }
+ open (RSTAT,">data/online/rstat/$rstatroom");
+ flock(RSTAT, 2);
+ print RSTAT @rstat2;
+ close RSTAT;
+}
+
+sub rm_away { # Benutzer als Raumbesetzer austragen
+ my ($a_alias,$rstatroom) = @_;
+ open (AWAY,"<data/online/rstat/$rstatroom.away");
+ my @away = <AWAY>;
+ close AWAY;
+ my @away2;
+ foreach (@away) {
+ my @split = split(/<;/);
+ push(@away2, $_) if ($a_alias ne $split[0]);
+ }
+ open (AWAY,">data/online/rstat/$rstatroom.away");
+ print AWAY @away2;
+ close AWAY;
+}
+
+sub secure_checkid { # TmpID überprüfen
+ my ($alias2check) = @_;
+ open(IDENT,"<data/online/ident/$alias2check");
+ my @ident = <IDENT>;
+ close IDENT;
+ if ($ident[1] ne $tmpid) {
+ &error("Falsche TempID ! Du bist nicht befugt zu handeln !");
+ }
+}
+
+sub hierachie { # Chatter nach Sonderrechte überprüfen.
+ my $alias2prove = $_[0];
+ $hierachie = undef;
+ open(WA,"<data/wa");
+ @was = <WA>;
+ close WA;
+ foreach(@was) {
+ chomp;
+ if ($_ eq $alias2prove) {
+ $hierachie = "wa";
+ last;
+ }
+ }
+ open(OW,"<data/ow");
+ @ows = <OW>;
+ close OW;
+ if ($hierachie ne "wa") {
+ foreach(@ows) {
+ chomp;
+ if ($_ eq $alias2prove) {
+ $hierachie = "ow";
+ last;
+ }
+ }
+ }
+}
+
+sub prove_besetzer { # Prüfen, ob Benutzer Raumbesetzerrechte hat
+ my ($r_alias,$r_room) = @_;
+ $r_besetzer = undef;
+ open(DATEI,"<data/online/rstat/$r_room");
+ @r_stat = <DATEI>;
+ close DATEI;
+ for($i=2;$i<=$#r_stat;$i++) {
+ chomp($r_stat[$i]);
+ if ($r_stat[$i] eq $r_alias) {
+ $r_besetzer = "true";
+ last;
+ }
+ }
+}
+
+sub prove_away { # Prüfen, ob Benutzer Raumbesetzerrechte hat
+ my ($a_alias,$a_room) = @_;
+ my $alias;
+ $away = undef;
+ open(DATEI,"<data/online/rstat/$a_room.away");
+ @away = <DATEI>;
+ close DATEI;
+ foreach(@away) {
+ if (/^$a_alias.*/) {
+ ($alias,$away) = split(/<; /);
+ chomp($away);
+ last;
+ }
+ }
+}
+
+#sub debug {
+# open(DEBUG,">data/debug");
+# print DEBUG @_;
+# close DEBUG;
+#} \ No newline at end of file
diff --git a/0.4.9/help.sno b/0.4.9/help.sno
new file mode 100644
index 0000000..4074cc0
--- /dev/null
+++ b/0.4.9/help.sno
@@ -0,0 +1,58 @@
+<div>
+ Alle Chat-Befehle:
+</div>
+<hr>
+<table width=100% bgcolor=000000>
+<tr><th bgcolor=666666><div>SU</div></th><th bgcolor=666666><div>Befehl</div></th><th bgcolor=666666><div>Beschreibung</div></th></tr>
+<tr><td><div>NC</div></td><td><div>/about</div></td><td><div>Zeigt aktuelle Version und andere Infos der Community an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/away <font color=red>Nachricht</font></div></td><td><div>Abmelden mit einer<font color=red>Abmeldenachricht</font></div></td></tr>
+<tr><td><div>NC</div></td><td><div>/clear</div></td><td><div>Bildschirm wird gelöscht</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/col <font color=red>XXXXXX</font> <font color=ffa500>XXXXXX</font></div></td><td><div>Farbe/n (<font color=red>Namensfarbe</font> / <font color=ffa500>Textfarbe</font>) wechseln. Angabe in Hexadezimal.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/date</div></td><td><div>Zeigt aktuelles Datum und Urzeit an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/j <font color=red>Raumname</font></div></td><td><div>Raum wechseln/erstellen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ju <font color=red>Alias</font></div></td><td><div>In den Raum wechseln/folgen, wo sich <font color=red>Alias</font> befindet.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/m <font color=red>Aktion</font></div></td><td><div>Handeln mit 2 Farben</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/me <font color=red>Aktion</font></div></td><td><div>Handeln mit einer Farbe</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/memo <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine <font color=ffa500>Memonachricht</font> hinterlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/msg <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine private <font color=ffa500>Nachricht</font> flüstern</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ <font color=ffa500>Nachricht</font></div></td><td><div>Eine private <font color=ffa500>Nachricht</font> demjenigen flüstern, dem zuletzt eine geflüstert wurde</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/online <font color=red>Alias</font></div></td><td><div>Zeigt Onlineminuten von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/q</div></td><td><div>Chat verlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/rmgb</div></td><td><div>Das eigene Gästebuch komplett weglöschen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/s <font color=red>Nachricht</font></div></td><td><div><font color=red>Nachricht</font> schreien</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/seen <font color=red>Alias</font></div></td><td><div>Zeigt an, vor wieviel Stunden sich <font color=red>Nachricht</font> zum letzten Mal in das System eingelogt hat</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/w</div></td><td><div>Zeigt an, wer sich im aktuellen Raum befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc <font color=red>Raum</font></div></td><td><div>Zeigt an, wer sich im <font color=red>Raum</font> befindet. Wird kein Raum angegeben, dann wird ledeglich angezeigt, wer sich im System befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc/</div></td><td><div>Zeigt alle offenen Räume und deren Chatter an</div></td></tr>
+<tr><td><div>NC</div></td><td> <div>/wj <font color=red>Alias</font></div></td><td><div>Zeigt an, in welchen Raum sich <font color=red>Alias</font> befindet</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/l</div></td><td><div>Der aktuelle Raum wird ab- bzw. aufgesperrt</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/rsu <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> die Raumbesetzerrechte entnehmen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/su <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Raumbesetzer ernennen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/t <font color=red>Thema</font></div></td><td><div>Dem aktuellen Raum wird ein <font color=red>Thema</font> gegeben</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban</div></td><td><div>Zeigt alle verbannten Benutzer an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> verbannen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/rban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> "entbannen"</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ip <font color=red>Alias</font></div></td><td><div>Zeigt die IP-Nummer von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/k <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird aus dem Chat katapultiert!</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ss <font color=red>Raum</font> <font color=ffa500>Nachricht</font></div></td><td><div>Eine <font color=ffa500>Nachricht</font> in <font color=red>Raum</font> hinüber rufen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/st <font color=red>Raum</font> <font color=ffa500>Thema</font></div></td><td><div>Einem anderen <font color=red>Raum</font> ein <font color=ffa500>Thema</font > geben</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/kill <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird ganz und gar aus dem System entfernt</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/wa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Wächter ernennen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/rwa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom Wächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/sys <font color=red>Nachricht</font></div></td><td><div>Systemnachricht schreiben. (Erscheint in allen existierenden Räumen)</div></td></tr>
+</table><hr>
+<div>
+ Zur Erklärung: NC steht für "Normale Chatter", RB für "Raumbesetzer", WÄ für "Wächter" und OW für "Oberwächter".
+ Obrige Befehle können nur von der/den jeweiligen Benutzergruppe/n werden.<br><br>
+ Allerdings gibt es folgendes zu beachten: Oberwächter verfügen über alle Chatbefehle. Normale Wächter über alle Chatbefehle, außer über die der Oberwächter.
+ Raumbesetzer können nur Raumbesetzerbefehle und die Befehle der normalen Chatter durchführen. Normale Chatter haben jedeglich die Standardbefehle zu verwenden.<br><br>
+ Weitere Besonderheiten der Wächter und Oberwächter:<br><br>
+ Wächter und Oberwächter können ....<br>
+ ... abgesperrte Chaträume problemlos betreten.<br>
+ ... nicht gekickt, verbannt oder gekillt werden.<br>
+ ... Logdateien der Cyberbar lesen.<br><br>
+
+ Des weiteren: Oberwächter ernennt nur der Systemadministrator!
+</div>
+</body>
+</html> \ No newline at end of file
diff --git a/0.4.9/htdocs.pl b/0.4.9/htdocs.pl
new file mode 100644
index 0000000..b8f8831
--- /dev/null
+++ b/0.4.9/htdocs.pl
@@ -0,0 +1,241 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header;
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+$var = $q->param("var");
+if ($var eq "help_html") {
+ &printfile("help.sno","Alle Chatbefehle");
+} elsif ($var eq "logo_html") {
+ &start_html("Logo");
+print<<END;
+<layer top=-3 left=0><div style="position:absolute; top:5; left:10">
+<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
+ codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0"
+ WIDTH=48 HEIGHT=48>
+ <PARAM NAME=movie VALUE="$gfxpath/ySymbol.swf">
+ <PARAM NAME=loop VALUE=false>
+ <PARAM NAME=menu VALUE=false>
+ <PARAM NAME=quality VALUE=high>
+ <PARAM NAME=scale VALUE=noborder>
+ <PARAM NAME=wmode VALUE=opaque>
+ <PARAM NAME=bgcolor VALUE=#005146>
+ <EMBED src="$gfxpath/ySymbol.swf" loop=false menu=false quality=high scale=noborder wmode=opaque bgcolor=#005146
+ WIDTH=48 HEIGHT=48 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED>
+</OBJECT>
+</div></layer>
+END
+print $q->end_html;
+} elsif ($var eq "menu_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ $tmp = $q->param("tmp");
+ &menu_html;
+} elsif ($var eq "werda_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &werda_html;
+} elsif ($var eq "logs_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ &logs_html;
+} elsif ($var eq "view_logs_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $tmp = $q->param("tmp");
+ &secure_checkid($alias);
+ &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ &printfile($tmp,"Logdatei","blank");
+ }
+} elsif ($var eq "superuser_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ &superuser_html;
+} else {
+ print
+ $q->start_html(-bgcolor=>"000000"),
+ $q->end_html;
+}
+
+sub menu_html {
+if ($tmp eq "quit") {
+ &start_html("Quit","blank","<script language=\"JavaScript\">open(\"index.pl?tmp=quit\",\"_top\");</script>");
+ print $q->end_html;
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffffff>$alias verläßt den Chat ... </font></i>");
+ sleep 2;
+ &rm_alias($alias,$room);
+ exit;
+}
+ENDJS
+ &start_html("Menü","blank");
+print <<END;
+<script language="JavaScript">
+function fenster(fenster,target) {
+ open(fenster,target,"width=500,height=500,screenX=100,screenY=100,scrollbars");
+}
+</script>
+<font size=2 face=verdana><p>
+ <a href='javascript:fenster("htdocs.pl?var=werda_html&alias=$alias&room=$room&col=$col&secol=$secol&tmp=$tmp&tmpid=$tmpid","weristda")'>Wer ist da?</a>
+ <a href='javascript:fenster("main2.pl?var=edit_profile_html&alias=$alias&tmpid=$tmpid&room=$room","ProfilAendern")'>Profil ändern</a>
+ <a href='javascript:fenster("main2.pl?var=edit_options_html&alias=$alias&tmpid=$tmpid&room=$room","Optionen")'>Chatoptionen</a>
+ <a href='javascript:fenster("main2.pl?var=list_alias_html&alias=$alias&tmpid=$tmpid","Benutzerliste")'>Benutzerliste</a>
+ <a href='javascript:fenster("htdocs.pl?var=help_html&tmpid=$tmpid","Befehle")'>Chatbefehle</a><br>
+ <a href='javascript:fenster("main2.pl?var=gb_html&alias=$alias&tmpid=$tmpid","Board")'>Benutzerboard</a>
+ <a href='javascript:fenster("htdocs.pl?var=superuser_html&alias=$alias&tmpid=$tmpid","Superuser")'>Superuser</a>
+ <a href='javascript:fenster("htdocs.pl?var=logs_html&alias=$alias&tmpid=$tmpid","Logdateien")'>Logs</a>
+ <a href='javascript:fenster("stat.pl?&alias=$alias&tmpid=$tmpid","Statistik")'>Statistik</a>
+ <a href="http://www.home.yChat.de" target="Home">Home</a>
+ <a href="http://www.credits.yChat.de" target="Credits">Credits</a>
+ <a href="htdocs.pl?alias=$alias&var=menu_html&room=$room&tmpid=$tmpid&tmp=quit">Verlassen</a>
+</p></font>
+</body>
+</html>
+END
+}
+
+sub werda_html { # Anzeige, wer eingelogt ist.
+ &start_html("Wer ist da?");
+ print <<END;
+<div>
+ $alias, schön daß Du hier bist :-)
+</div>
+<hr>
+<div>
+ Folgende Personen befinden sich im Chat:
+</div>
+<br>
+<div>
+END
+ opendir(ROOMDIRS,"data/online/rooms");
+ local @roomdirs = readdir(ROOMDIRS);
+ close(ROOMDIRS);
+ foreach(@roomdirs) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ my $room = $_;
+ open(RSTAT,"<data/online/rstat/$room");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ opendir(ROOMDIR,"data/online/rooms/$room");
+ my @roomdir = readdir(ROOMDIR);
+ close(ROOMDIR);
+ local $nr = $#roomdir-1;
+ print $q->b( $_ ),
+ " $door ($nr) Raumthema: $rstat[1]",
+ $q->br;
+ foreach(@roomdir) {
+ if ($_ ne ".." && $_ ne ".") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid" }, "$_"), " ";
+ }
+ }
+ print $q->br, $q->br;
+ }
+ }
+ print
+ "</div>",
+ $q->end_html;
+}
+
+sub logs_html {
+ &start_html("Logdateien");
+ print <<END;
+<div>
+ Hier befinden sich alle Logdateien
+</div>
+<hr>
+END
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ print $q->div( "Folgende Logdateien des Raumes \"Cyberbar\" können nur von Oberwächtern gelesen werden (Sortiert nach A-Z, a-z):" ),
+ $q->br;
+ opendir(LOGS,"data/logs");
+ local @logs = readdir(LOGS);
+ closedir(LOGS);
+ local @sortedir = sort(@logs);
+ foreach(@sortedir) {
+ if (-f "data/logs/$_") {
+ print $q->a( { -href=>"htdocs.pl?alias=$alias&var=view_logs_html&tmp=data/logs/$_&tmpid=$tmpid",
+ -target=>"_new" },
+ "$_" ),
+ " ";
+ }
+ }
+ } else {
+ print $q->div( "Logdateien können nur von Oberwächtern (OW) gelesen werden. Du bist jedoch ein Wächter (WÄ) oder ein",
+ "\"Normaler Chatter\". Oberwächter können alles nachlesen, was öffentlich im Raum \"Cyberbar\" gechattet wurde." ),
+ $q->hr;
+ &printfile("data/htdocs/logs_html");
+ }
+ print
+ $q->end_html;
+}
+
+sub superuser_html { # Zeigt an, wer Superuser ist
+ &start_html("Superuser");
+ print "<div>Hallo $alias. Du bist als ";
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ print
+ $q->b( "Oberwächter" ),
+ " (OW) eingetragen.</div>",
+ $q->hr;
+ } elsif ( $hierachie eq "wa") {
+ print
+ $q->b( "Wächter" ),
+ " (WÄ) eingetragen.</div>",
+ $q->hr;
+ } else {
+ print
+ $q->b( "normaler Chatter" ),
+ " (NC) eingetragen.</div>",
+ $q->hr;
+ }
+
+ my $nrow = $#ows+1;
+ print
+ "<div>",
+ $q->b( "OW" ),
+ "s ($nrow Stück)";
+ foreach(@ows) {
+ print
+ $q->font( { -color=>"ffa500" },
+ " ".$_);
+ }
+ my $nrwa = $#was+1;
+ print
+ "</div>",
+ $q->hr,
+ "<div>",
+ $q->b( "WÄ" ),
+ "s ($nrwa Stück)";
+ foreach(@was) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+print <<END;
+<hr>
+ Die jeweiligen Fähigkeiten der Oberwächter (OW) und der Wächter (WÄ) sind unter
+ "<a href="htdocs.pl?var=help_html">Chat-Befehle</a>"
+ dokumentiert.
+</div>
+</body>
+</html>
+END
+} \ No newline at end of file
diff --git a/0.4.9/index.pl b/0.4.9/index.pl
new file mode 100644
index 0000000..29f3399
--- /dev/null
+++ b/0.4.9/index.pl
@@ -0,0 +1,429 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header;
+
+#####################################
+##WELCHE SUB MUß AUFGERUFEN WERDEN?##
+#####################################
+
+$var = $q->param("var");
+$alias = $q->param("alias");
+$pw = $q->param("pw");
+$tmp = $q->param("tmp");
+
+if ($var eq "create_alias_html") {
+ &create_alias_html;
+} elsif ($var eq "create_alias") {
+ &create_alias;
+} elsif ($var eq "login_html") {
+ $tmp = $q->param("tmp");
+ &login_html;
+} elsif ($alias eq "") {
+ &login_html;
+} else {
+ &checklogin;
+}
+
+sub login_html { # Erste Startseite
+&check_online;
+local $counter = undef;
+open(COUNT,"<data/count");
+ $counter = <COUNT>;
+close COUNT;
+$counter++;
+open(COUNT,">data/count");
+ flock(COUNT, 2);
+ print COUNT $counter;
+close COUNT;
+opendir(USERS,"data/online/users");
+ local @users = readdir(USERS);
+closedir(USERS);
+opendir(REGISTRED,"data/user/options");
+ local @registred = readdir(REGISTRED);
+closedir(REGISTRED);
+local ($logtin,$users) = ($#users-1,$#registred-1);
+&start_html("Created & Copyright by Paul C. Bütow","start");
+print <<END;
+ <center>
+ <table width=500>
+ <tr>
+ <td>
+ <center>
+ <table>
+ <tr>
+ <td>
+ <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0" WIDTH=240 HEIGHT=240>
+ <PARAM NAME=movie VALUE="$gfxpath/yIntro.swf">
+ <PARAM NAME=loop VALUE=false>
+ <PARAM NAME=menu VALUE=false>
+ <PARAM NAME=quality VALUE=high>
+ <PARAM NAME=scale VALUE=noborder>
+ <PARAM NAME=wmode VALUE=opaque>
+ <PARAM NAME=bgcolor VALUE=#005146>
+ <EMBED src="$gfxpath/yIntro.swf" loop=false menu=false quality=high scale=noborder wmode=opaque bgcolor=#005146 WIDTH=240 HEIGHT=240 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED>
+ </object>
+ </td>
+ <td>
+ <div>
+ yChat: Version $version
+ <br><br>
+ Letztes Update: $datum
+ <br><br>
+ Seitenaufrufe: $counter
+ <br><br>
+ Benutzer registriert: $users
+ <br><br>
+ Benutzer online: $logtin
+ <br><br>
+ Webmaster: <a href="mailto:mail\@paulbuetow.de">Paul C. Bütow</a>
+ <br><br>
+ yChat-HP: <a href="http://www.home.yChat.de">home.yChat.de</a>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </center>
+ </div>
+ <br>
+ <br>
+END
+ if ($tmp eq "true") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Wahrscheinlich existiert Dein Alias "$alias" nicht,
+ <br>
+ Du hast Dich verschrieben oder das Passwort ist falsch.
+ <br>
+ Versuch es erneuert !
+ </div>
+END
+ } elsif ($tmp eq "quit") {
+print <<END;
+ <div>
+ Du hast soeben den Chat verlassen.
+ <br>
+ Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ } elsif ($tmp eq "autologout") {
+print <<END;
+ <div>
+ Du wurdest automatisch aus dem Chat ausgeloggt. Grund: Du warst 20 Minuten inaktiv.
+ <br>
+ Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ } elsif ($tmp eq "banned") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein Alias "$alias" wurde verbannt.
+ <br>
+ Z.z. kannst Du Dich leider nicht in den Chat einloggen.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($tmp eq "kick") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wurdest soeben aus dem Chat katapultiert!
+ <br>
+ Schlechtes Verhalten mag die Ursache hierfür sein.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($var eq "create_alias") {
+print "<div>Du hast sich soeben in die Datenbank eingetragen. Einfach auf \"Los Geht's\" klicken :-)</div>";
+ } else {
+print <<END;
+ <div>
+ Herzlich willkommen!
+ <br>
+ Einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <form name="login" action="index.pl" method="post">
+ <input type="hidden" name="tmp" value="true">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Alias:
+ <br>
+ <input name="alias" value="$alias">
+ </div>
+ </td>
+ <td>
+ <div>
+ Dein Passwort:
+ <br>
+ <input type="password" name="pw" value="$pw">
+ </div>
+ </td>
+ </tr>
+ </table>
+ <br>
+ <br>
+ <div>
+ Solltest Du noch keinen Nick besitzen, dann auf "Registrieren" klicken!
+ </div>
+ <br>
+ <table>
+ <tr>
+ <td>
+ <font color="ffffff">
+ <input type="submit" value="Los geht's!">
+ </font>
+ </form>
+ </td>
+ <td>
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias_html">
+ <font color="ffffff">
+ <input type="submit" value="Registrieren">
+ </font>
+ </form>
+ </td>
+ </tr>
+ </table>
+ <hr>
+ </td>
+ </tr>
+ </table>
+ </center>
+</body>
+</html>
+END
+ if (-d "data/online/rooms") {
+ } else {
+ mkdir "data/online/rooms", 0777;
+ }
+}
+
+
+sub create_alias_html { # HTML-Form für Erstellung eines neuen Benutzers.
+my $reload = $_[0];
+&start_html("Registration");
+print <<END;
+ <center>
+ <table width=500>
+ <tr>
+ <td>
+END
+ if ($reload eq "alias_exists") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Der von Dir gewählte Benutzername "$alias" existiert in unserer Datenbank bereits. Bitte versuch es erneuert mit
+ einem anderen Benutzernamen !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "pw_wrong") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Deine beiden Passworteingaben stimmen nicht überein. Bitte geb das Passwort erneuert an um sicherzugehen, daß
+ kein falsches Passwort abgespeichert wird !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "alias_prohibited") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein gewählter Benutername "$alias" enthält illegale Zeichen. Bitte versuch einen anderen Benutzernamen!
+ </div>
+ <hr>
+END
+} elsif ($reload eq "alias_length") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein gewählter Benutername "$alias" enthält zu viele Zeichen. Es sind maximal 15 Zeichen erlaubt!!
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Hier kannst Du Dich registrieren. Bitte beachte, daß die Passworteingabefelder übereinstimmen!
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias">
+ <div>
+ Dein Alias:
+ <font color="ffa500">
+ (Muß angegeben werden)
+ </font>
+ <br>
+ <input name="alias" VALUE="$alias">
+ </div>
+ <br>
+ <div>
+ Dein gewünschtes Passwort:
+ <br>
+ <input type="password" name="pw" value="$pw">
+ </div>
+ <br>
+ <div>
+ Geb hier Dein Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp">
+ </div>
+ <br>
+ <font color=ffffff>
+ <input type="submit" value="Registrieren">
+ </font>
+ <br>
+ </form>
+ <hr>
+ <div>
+ Um den Chat zu betreten müssen die Daten nach der Registration auf der Startseite erneuert bestätigt werden !
+ </div>
+ </td>
+ </tr>
+ </table>
+</center>
+</body>
+</html>
+END
+}
+
+sub checklogin { # Überprüfen, ob die Login-Daten korrekt sind.
+ my $lognotexists = "true";
+ opendir(USERDIR,"data/user/options");
+ my @userdir = readdir(USERDIR);
+ closedir(USERDIR);
+ foreach $user (@userdir) {
+ if ($user eq $alias) {
+ open(OPTIONS,"<data/user/options/$alias");
+ my @options = <OPTIONS>;
+ close OPTIONS;
+ foreach(@options) {
+ chomp $_;
+ }
+ if ($options[0] eq $pw) {
+ open(BAN,"<data/ban");
+ my @ban = <BAN>;
+ close BAN;
+ foreach(@ban) {
+ if ($_ eq "$alias\n") {
+ $tmp = "banned";
+ &login_html;
+ exit;
+ }
+ }
+ if ($options[1] eq undef) { $col = "ffffff";}
+ else { $col = $options[1]; }
+ if ($options[2] eq undef) { $secol = "ffffef";}
+ else { $secol = $options[2];}
+ if ($options[3] eq undef) { $maxVerlauf = "10";}
+ else { $maxVerlauf = $options[3];}
+ if ($options[4] eq undef) { $verlaufOrder = "1";}
+ else {$verlaufOrder = $options[4];}
+ $tmpid = time;
+ open(IDENT,">data/online/ident/$alias");
+ print IDENT $ENV{'REMOTE_ADDR'}."\n".$tmpid;
+ close IDENT;
+ open(LASTLOGIN,">data/user/lastlogin/$alias");
+ print LASTLOGIN time;
+ close LASTLOGIN;
+ &frameset_html;
+ exit;
+ } else {
+ $lognotexists = "false";
+ }
+ }
+ }
+ &login_html; # Falls Login-Daten inkorrekt sind, zurück zur Startseite.
+}
+
+sub create_alias { # Erstellung eines neuen Benutzers.
+ if ($alias =~ /[\W]/ || $alias eq "") {
+goto CREATE if ($alias =~ /[-]/);
+ &create_alias_html("alias_prohibited");;
+ exit 0;
+ } elsif ($pw ne $tmp) {
+ &create_alias_html("pw_wrong");
+ exit 0;
+ } elsif (length($alias) >= 15) {
+ &create_alias_html("alias_length");
+ exit 0;
+ }
+CREATE:
+ opendir(USERDIR,"data/user/options");
+ my @user = readdir(USERDIR);
+ close USERDIR;
+ foreach $user (@user) {
+ if ($user eq $alias) {
+ &create_alias_html("alias_exists");
+ exit;
+ }
+ }
+ open(OPTIONS,">data/user/options/$alias");
+ print OPTIONS $pw."\n";
+ close OPTIONS;
+ local $number = $#user;
+ &zeit;
+ &post("Cyberbar","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffffff>$alias [$number] hat sich soeben als neuer Benutzer registriert :-) ...</font></i>");
+ &login_html;
+}
+
+sub frameset_html {
+print <<END;
+<html>
+ <head>
+ <title>
+ $title - Powered by CXG - Chatters of the next generation
+ </title>
+ </head>
+<frameset border=0 frameborder=0 framespacing=0 cols="130,*">
+ <frameset border=0 frameborder=0 framespacing=0 rows="300,*,55">
+ <frame name="online" src="online.pl?room=Cyberbar&alias=$alias&tmpid=$tmpid">
+ <frame src="htdocs.pl">
+ <frameset border=0 frameborder=0 framespacing=0 cols="70,*">
+ <frame name="logo" src="htdocs.pl?var=logo_html" scrolling="no">
+ <frame name="reload" src="htdocs.pl" scrolling="no">
+ </frameset>
+ </frameset>
+ <frameset border=0 frameborder=0 framespacing=0 rows="60,*,55">
+ <frame name="menu" src="htdocs.pl?alias=$alias&var=menu_html&room=Cyberbar&col=$col&secol=$secol&tmpid=$tmpid" scrolling="no">
+ <frame name='main' src='push.pl?room=Cyberbar&alias=$alias&tmpid=$tmpid'>
+ <frame name="input" src="input.pl?alias=$alias&room=Cyberbar&col=$col&secol=$secol&tmp=login&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder" scrolling="no">
+ </frameset>
+</frameset>
+</html>
+END
+} \ No newline at end of file
diff --git a/0.4.9/input.pl b/0.4.9/input.pl
new file mode 100644
index 0000000..6244039
--- /dev/null
+++ b/0.4.9/input.pl
@@ -0,0 +1,201 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header();
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+#&secure_checkid($alias);
+$room = $q->param("room");
+$col = $q->param("col");
+$secol = $q->param("secol");
+$tmp = $q->param("tmp");
+$whisper = $q->param("whisper");
+$maxVerlauf = $q->param("maxVerlauf");
+$verlaufOrder = $q->param("verlaufOrder");
+
+if ($maxVerlauf eq undef) { $maxVerlauf = "10";}
+if ($verlaufOrder eq undef) { $verlaufOrder = "1";}
+
+if ($tmp eq "login") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias hat den Chat betreten ...</font></i>");
+}
+
+print <<END;
+<html>
+<head>
+<script language="JavaScript"><!--
+
+// Einstellungsvariablen
+maxVerlauf = $maxVerlauf; // Anzahl der Einträge des Verlaufs
+maxPreview = 20; // Zeichenlänge der Verlaufsvorschau
+verlaufOrder = $verlaufOrder; // Neue Nachrichten von: 0=oben, 1=unten
+//autoAwayTimeout = 20; // Sekunden, nach denen der User 'Away' gesetzt wird
+//autoQuitTimeout = 40; // Sekunden, nach denen der User den Chat verlässt
+autoAwayTimeout = 300; // Sekunden, nach denen der User 'Away' gesetzt wird
+autoQuitTimeout = 1200; // Sekunden, nach denen der User den Chat verlässt
+
+// Interne Variablen
+userNotFocused = false; // Wenn User nicht schreibt
+userAway = false; // Wenn User automatisch auf 'Away' gesetzt ist
+userAwayTime = 0; // Sekunden, die User 'Away' ist
+fullVerlauf = new Array( maxVerlauf ); // Verlaufspuffer
+
+function delout()
+{
+ addVerlauf (document.inf.msg.value); // Dem Verlauf eine Nachricht anhängen
+ document.inf.submit(); // Formular absenden
+ document.inf.msg.focus(); // Fukus in das Eingabeform
+ document.inf.msg.select(); // Text im Eigabeform markieren
+ return false; // Abbrechen, damit das Frame nicht neu geladen wird
+}
+
+function CheckAuswahl()
+{
+ id=document.verlaufform.verlauf.selectedIndex; // ID des ausgewählten Feldes
+
+ if (fullVerlauf[id-1] != null) // Nur, wenn das Feld nicht leer ist
+ {
+ document.inf.msg.value = fullVerlauf[id-1]; // Eintrag ins Textfeld
+ }
+
+ document.verlaufform.verlauf.selectedIndex = 0; // Ersten Eintrag (Überschrift) auswählen
+ document.inf.msg.focus(); // Eingabefeld fokusieren
+
+ return true;
+}
+
+function addVerlauf (msg)
+{
+ if (msg == "") // Falls msg leer
+ return false; // Aufruf ignorieren
+
+ if (verlaufOrder) // neue Nachrichten von unten
+ {
+ for (i=0; i<(maxVerlauf-1); i++) // Alle Einträge einen aufrutschen
+ {
+ document.verlaufform.verlauf.options[i+1].text = document.verlaufform.verlauf.options[i+2].text;
+ fullVerlauf[i] = fullVerlauf[i+1];
+ }
+ }
+ else // neue Nachrichten von oben
+ {
+ for (i=(maxVerlauf-2); i>=0; i--) // Alle Einträge einen aufrutschen
+ {
+ document.verlaufform.verlauf.options[i+2].text = document.verlaufform.verlauf.options[i+1].text;
+ fullVerlauf[i+1] = fullVerlauf[i];
+ }
+ }
+
+ if (msg.length > maxPreview) // Vorschau zuschneiden
+ pre = msg.slice(0, maxPreview-3) + "...";
+ else
+ pre = msg;
+
+ if (verlaufOrder) // pos = Position des neuen Eintrags
+ pos = maxVerlauf-1;
+ else
+ pos = 0
+
+ document.verlaufform.verlauf.options[pos+1].text = pre; // Neue Vorschau anfügen
+ fullVerlauf[pos] = msg; // Neuen Eintrag an den Verlauf anfügen
+
+// document.verlaufform.verlauf.selectedIndex = maxVerlauf; // Fokus auf den letzten Eintrag
+ document.verlaufform.verlauf.selectedIndex = 0; // Fokus auf den ersten Eintrag (Überschrift)
+}
+
+function msgBlur()
+{
+ userNotFocused = true;
+ userAwayTime = 0;
+ userAway = false;
+}
+
+function msgFocus()
+{
+ userNotFocused = false;
+ if (userAway) // Wird ausgeführt, falls User 'Away' war
+ {
+ ; // nop
+ }
+ userAwayTime = 0;
+ userAway = false;
+}
+
+function checkInterval()
+{
+// status = "userNotFocused=" + userNotFocused + "; userAway=" + userAway + "; userAwayTime=" + userAwayTime + ""; // Debug
+ if (userNotFocused)
+ {
+ userAwayTime += 5; // Addiere 5, da nur alle 5Sek ausgeführt
+ if (!userAway)
+ {
+ if (autoAwayTimeout < userAwayTime) // Falls Zeit abgelaufen
+ {
+ if (document.inf.tmp.value != "away")
+ open ("mail.pl?alias=$alias&tmpid=$tmpid&msg=/away&col=$col&room=$room&tmp=autoaway","reload"); // 'Away' setzen
+ userAway = true;
+ }
+ }
+ else
+ {
+ if (autoQuitTimeout < userAwayTime) // Falls Zeit abgelaufen
+ {
+ open ("mail.pl?alias=$alias&tmpid=$tmpid&msg=/q&room=$room&tmp=autologout","reload"); // Chat beenden
+ }
+ }
+ }
+
+ window.setTimeout("checkInterval()",5000); // In 5 Sekunden wieder aufrufen
+}
+
+function initFrame()
+{
+ window.setTimeout("checkInterval()",5000); // In 5 Sekunden aufrufen
+ document.inf.msg.focus(); // Eingabefeld fokusieren
+}
+//-->
+</script>
+$style
+</head>
+<body class="blank" onload="initFrame();">
+ <div align="left">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td>
+ <form name="inf" target="reload" action="main.pl" onsubmit="return delout();">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="room" value="$room">
+ <input type="hidden" name="col" value="$col">
+ <input type="hidden" name="secol" value="$secol">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="whisper" value="$whisper">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input size="50" maxlength="300" name="msg" onBlur="msgBlur();" onFocus="msgFocus();">
+ </form>
+ </td>
+ <td><form name="verlaufform">
+ <script language="JavaScript"><!--
+ document.write("<select size='1' name='verlauf' size='40' onChange='CheckAuswahl();'>");
+ document.write("<option value>- Nachrichten-Verlauf -</option>");
+ for(i=0; i<maxVerlauf; i++) // Leere Verlaufsfelder generieren
+ document.write("<option value>(leer)</option>");
+ document.write("</select>");
+ //-->
+ </script>
+ </form>
+ </td>
+ </tr>
+ </table>
+ </div>
+</body>
+</html>
+END
+
+&rm_away($alias,$room); \ No newline at end of file
diff --git a/0.4.9/main.pl b/0.4.9/main.pl
new file mode 100644
index 0000000..de40f2a
--- /dev/null
+++ b/0.4.9/main.pl
@@ -0,0 +1,910 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+print $q->header();
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+
+{
+ open(IDENT,"<data/online/ident/$alias");
+ my @ident = <IDENT>;
+ close IDENT;
+ if ($ident[1] ne $tmpid) {
+ &error("Falsche TempID ! Du bist nicht befugt zu handeln !");
+ }
+}
+
+$room = $q->param("room");
+$col = $q->param("col");
+$secol = $q->param("secol");
+$tmp = $q->param("tmp");
+$rmsg = \$q->param("msg");
+
+
+if ($tmp eq "away") {
+ require config;
+ &rm_away($alias,$room);
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias hat sich zurück gemeldet ... </font></i><script language='JavaScript'>parent.online.location.reload();</script>");
+}
+
+if ($q->param('var') eq "change_colors") {
+ &reload_html("","change_colors")
+}
+unless (-e "data/online/rooms/$room/$alias") {
+ require config;
+ &post_prv($alias,"<font color=ffffff>Du befindest Dich nicht im Raum \"<font color=ffa500>$room</font>\" und kannst dort auch keine Nachrichten posten!</font>");
+ &reload_html;
+} elsif (length($$rmsg) > 300) {
+ require config;
+ &post_prv($alias,"<font color=ffffff>Deine Nachricht enthält zu viele Zeichen. Maximal sind 300 Zeichen erlaubt.</font>");
+ &reload_html;
+}
+
+$$rmsg =~ s#<#&lt\;#g;
+if (substr($$rmsg,0,1) ne "/") {
+ open(MSGFILE,">>data/msgs/$room");
+ unless ($$rmsg =~ s#/me/#<i>$alias</i>#g || $$rmsg =~ s#/m/#<i><font color=$col>$alias</font></i>#g) {
+ print MSGFILE "!<;".time."<;!<;!<;<b><font color=$col>$alias: <font color=$secol>$$rmsg</font></font></b><;\n";
+ } else {
+ $$rmsg =~ s#/me/#<i>$alias</i>#g;
+ $$rmsg =~ s#/m/#<i><font color=$col>$alias</font></i>#g;
+ print MSGFILE "!<;".time."<;!<;!<;<b><font color=$secol>$$rmsg</font></font></b><;\n";
+ }
+ close MSGFILE;
+ opendir(PID,"data/online/pids/$room");
+ my @pids = readdir(PID);
+ closedir(PID);
+ foreach(@pids) {
+ if (-f "data/online/pids/$room/$_") {
+ kill USR1 => $_;
+ }
+ }
+ require config;
+ &log("<b><font color=$col>$alias: <font color=$secol>$$rmsg</font></font></b>") if ($room eq "Cyberbar");
+ &reload_html($whisper,$tmp);
+} else {
+ &cmd($$rmsg);
+}
+
+sub reload_html { # Wird neugeladen, wenn eine Nachricht getextet wird!
+ my ($whisper,$action) = @_;
+ print "<html><head><script language=\"JavaScript\">";
+ if ($action eq "change_room") {
+ print "open(\"online.pl?alias=$alias&room=$room&tmpid=$tmpid\",\"online\");";
+ print "parent.input.document.inf.room.value = \"$room\";";
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol&tmpid=$tmpid\",\"menu\");";
+ } elsif ($action eq "change_colors") {
+ print "parent.input.document.inf.col.value = \"$col\";";
+ print "parent.input.document.inf.secol.value = \"$secol\";";
+ print "open(\"htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol&tmpid=$tmpid\",\"menu\");";
+ } elsif ($action eq "whisper") {
+ print "parent.input.document.inf.whisper.value = \"$whisper\";";
+ } elsif ($action eq "away") {
+ print "parent.input.document.inf.tmp.value = \"away\";";
+ } elsif ($action eq "quit" && $tmp eq "autologout") {
+ print "open(\"index.pl?tmp=autologout\",\"_top\");";
+ &rm_alias($alias,$room);
+ } elsif ($action eq "quit") {
+ print "open(\"index.pl?tmp=quit\",\"_top\");";
+ &rm_alias($alias,$room);
+ }
+ print "parent.input.document.inf.tmp.value = \"notaway\";" if ($tmp eq "away");
+ print "</script></head><body bgcolor=$col>";
+ print $q->end_html;
+ exit 0;
+}
+
+sub change_room { # Den Chat-Raum wechseln
+ my ($method,$newroom,$oldroom,$alias2follow) = @_;
+ open(RSTAT, "<data/online/rstat/$newroom"); #Überprüfen, ob Alias Raum betreten darf
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ if ($rstat[0] eq "1\n") {
+ &hierachie($alias);
+ if ($hierachie eq "wa" || $hierachie eq "ow") { } else {
+ &post_prv($alias,"<font size=2 color=ffffff>Der Raum \"<font color=ffa500>$newroom</font>\" ist leider abgesperrt!</font>");
+ &reload_html($whisper,$action);
+ }
+ }
+ open(MSGFILE,">>data/msgs/$room");
+ flock(MSGFILE, 2);
+ print MSGFILE "$alias<;".time."<;cr<;$newroom<;!<;\n";
+ close MSGFILE;
+ $room = $oldroom;
+ my $tmpstamp = time+5;
+ &zeit;
+ if ($method eq "j") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias wechselt in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias kommt aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ open(MSGFILE,">>data/msgs/$room");
+ flock(MSGFILE, 2);
+ print MSGFILE "$alias<;$tmpstamp<;!<;!<;<i><font color=ffffff>($hours:$min:$sec) Du wechselst aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i><;\n";
+ close MSGFILE;
+ } elsif ($method eq "ju") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias folgt \"$alias2follow\" in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias kommt aus dem Raum \"$oldroom\" und folgt \"$alias2follow\" herein nach \"$newroom\" ...</font></i>");
+ open(MSGFILE,">>data/msgs/$room");
+ flock(MSGFILE, 2);
+ print MSGFILE "$alias<;$tmpstamp<;!<;!<;<i><font color=ffffff>($hours:$min:$sec) Du folgst \"$alias2follow\" aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i><;\n";
+ close MSGFILE;
+ }
+ opendir(PID,"data/online/pids/$raum");
+ my @pids = readdir(PID);
+ closedir(PID);
+ foreach(@pids) {
+ if (-f "data/online/pids/$raum/$_") {
+ kill USR1 => $_;
+ }
+ }
+ unlink("data/online/rooms/$oldroom/$alias");
+ &rm_rstat($alias,$oldroom);
+ &check_online;
+}
+
+sub cmd { # Alle Chatbefehle, die über input_html eingegeben werden können.
+ require config;
+ $_[0] = $_[0]." ";
+ $_[0] = substr($_[0], 1, length($_[0])-1);
+ my @cmd = split(/ /, $_[0]);
+ my $cmd = substr($_[0],0 , index($_[0], " "));
+#############>- NORMALE CHATBEFEHLE ( Alphabetisch sortiert ) -<
+#############>- INFORMATIONEN ÜBER DAS SYSTEM AUSGEBEN -<
+ if ($cmd eq "about") {
+ &post_prv("$alias","<font color=ffffff>Aktuelle Version ist $title und wurde am $datum aktuallisiert. Erstellt von Paul C. Bütow (2000 - 2001).</font>");
+ &reload_html;
+#############>- ABMELDEN MIT 'AWAY-NACHRICHT' -<
+ } elsif ($cmd eq "away") {
+# if ($tmp eq "away") { # Falls 2 mal hintereinander /away eingegeben wurde
+# my $away_msg = undef;
+# }
+ for ($i=1; $i <= $#cmd; $i++) {
+ $away_msg = $away_msg." ".$cmd[$i];
+ }
+ &zeit;
+ my $js = "<script language='JavaScript'>parent.online.location.reload();</script>";
+ if ($tmp ne "autoaway") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias meldet sich ab (<font color=ffa500>$away_msg</font> ) ...</i></font>$js");
+ } else {
+ $away_msg = " $alias wurde vom System abgemeldet ...";
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)$away_msg</i></font>$js");
+ }
+ open(AWAY,">>data/online/rstat/$room.away");
+ print AWAY "$alias<;$away_msg\n";
+ close AWAY;
+ &reload_html($whisper,"away");
+#############>- EIGENEN CHATBILDSCHIRM LÖSCHEN -<
+ } elsif ($cmd eq "clear") {
+ &post_prv($alias,"<script language=\"JavaScript\">window.open(\"push.pl?alias=$alias&room=$room&var=clear_screen&tmpid=$tmpid\",\"main\");</script>");
+ &reload_html;
+#############>- FARBEN WECHSELN -<
+ } elsif ($cmd eq "col") {
+ $col = $cmd[1];
+ my $tmpsecol = $cmd[2];
+ if ($tmpsecol eq "") {
+ $secol = $col
+ } else {
+ $secol = $tmpsecol;
+ }
+ open(OPTIONS,"<data/user/options/$alias");
+ my @options = <OPTIONS>;
+ close OPTIONS;
+ open(OPTIONS,">data/user/options/$alias");
+ print OPTIONS $options[0]."".$col."\n".$secol;
+ close OPTIONS;
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat die Farbe gewechselt ...</font></i>");
+ &reload_html($whisper,"change_colors");
+#############>- AKTUELLES DATUM UND URZEIT AUSGEBEN -<
+ } elsif ($cmd eq "date") {
+ &zeit;
+ &post_prv("$alias","<font color=ffffff>Heute ist der $day.$month. Jahr $year. Es ist genau $hours:$min Uhr und $sec Sekunden.</font>");
+ &reload_html;
+#############>- EINEN NEUEN RAUM ERSTELLEN BZW. IN EINEN BESTEHENDEN RAUM WECHSELN -<
+ } elsif ($cmd eq "j") {
+ &change_room("j",$cmd[1],$room);
+ &reload_html($whisper,"change_room");
+#############>- HANDELN -<
+ } elsif ($cmd eq "me" || $cmd eq "m") {
+ my $me_msg;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $me_msg = $me_msg." ".$cmd[$i];
+ }
+ $me_msg =~ s#/me/#<i>$alias</i>#g;
+ $me_msg =~ s#/m/#<i><font color=$col>$alias</font></i>#g;
+ if ($cmd eq "m") {
+ &post($room,"<b><font color=$col><i>$alias</i> <font color=$secol>$me_msg</font></font></b>");
+ } else {
+ &post($room,"<b><font color=$col><i>$alias</i> $me_msg</font></b>");
+ }
+ &reload_html;
+#############>- MEMO SCHREIBEN -<
+ } elsif ($cmd eq "memo") {
+ my $alias2memo = $cmd[1];
+ if(-f "data/user/options/$alias2memo") {
+ my $memo_msg;
+ for ($i=2; $i <= $#cmd; $i++) {
+ $memo_msg = $memo_msg." ".$cmd[$i];
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2memo <font color=ffffff>wurde folgende memo erfolgreich hinterlassen: $memo_msg</font></font>");
+ &zeit;
+ open(MEMO,">>data/user/memos/$alias2memo");
+ print MEMO "<font color=ffffff>($day.$month. - $hours:$min:$sec) <font color=ffa500>$alias</font> hat Dir eine Memo hinterlassen: <font color=ffa500>$memo_msg</font></font><br>\n";
+ close MEMO;
+ &reload_html;
+ }
+ &post_prv("$alias","<font color=ffa500>$alias2memo <font color=ffffff>existiert in der Datenbank nicht !</font></font>");
+ &reload_html;
+#############>- FLÜSTERN ( Auch mit '/' ) -<
+ } elsif ($cmd eq "msg" || $cmd eq "") {
+ my ($alias2post,$msg2post,$action) = ($cmd[1]);
+ if ($cmd eq "msg") {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ $action = "whisper";
+ } else {
+ $alias2post = $q->param('whisper');
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ }
+ $msg2post =~ s#/me/#<i>$alias</i>#g;
+ $msg2post =~ s#/m/#<i><font color=$col>$alias</font></i>#g;
+ if (-f "data/online/users/$alias2post") {
+ &post_prv($alias2post,"<b><font color=$col><i>$alias flüstert:</i> <font color=$secol>$msg2post</font></font></i></b>");
+ &post_prv($alias,"<b><font color=$col><i>Zu $alias2post geflüstert:</i> <font color=$secol>$msg2post</font></font></i></b>");
+ &reload_html($alias2post,$action);
+ }
+ &post_prv("$alias","<font color=ffa500>$alias2post <font color=ffffff>ist nicht anwesend !</font></font>");
+ &reload_html;
+#############>- TOTALONLINEZEIT VON ALIAS ANZEIGEN -<
+ } elsif ($cmd eq "online") {
+ my $alias2prove= $cmd[1];
+ if (-f "data/user/options/$alias2prove") {
+ open(ONLINE,"<data/user/counts/$alias2prove.online");
+ my $online = <ONLINE>;
+ close ONLINE;
+ my $totaltime = sprintf("%.2f",($online / 3600));
+ &post_prv("$alias","<font color=ffa500>$alias2prove <font color=ffffff> war insgesamt schon $totaltime Stunden online!</font></font>");
+ } else {
+ &post_prv("$alias","<font color=ffa500>$alias2prove <font color=ffffff>existiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+ &reload_html;
+#############>- DAS SYSTEM VERLASSEN -<
+ } elsif ($cmd eq "q") {
+ &zeit;
+ if ($tmp ne "autologout") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias loggt sich aus dem Chat aus ... </font></i>");
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias wurde vom System automatisch ausgeloggt ... </font></i>");
+ }
+ &reload_html($whisper,"quit");
+#############>- DAS EIGENE GÄSTEBUCH LÖSCHEN -<
+ } elsif ($cmd eq "rmgb") {
+ unlink("data/user/gbooks/$alias");
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias löscht das eigene Gästebuch ...</font></i>");
+ &reload_html;
+#############>- SCHREIEN -<
+ } elsif ($cmd eq "s") {
+ my $msg2scream;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2scream = $msg2scream." ".$cmd[$i];
+ }
+ my $msg2post = "\U$msg2scream";
+ &post($room,"<b><font color=$col><i>$alias schreit:</i> <font color=$secol>$msg2post</font></font></b>");
+ &reload_html;
+#############>- SEHEN, WANN SICH ALIAS ZUM LETZTEN MAL EINGElOGGT HAT -<
+ } elsif ($cmd eq "seen") {
+ my $alias2prove = $cmd[1];
+ if (-f "data/user/options/$alias2prove") {
+ if (-f "data/user/lastlogin/$alias2prove") {
+ open(LASTLOGIN,"<data/user/lastlogin/$alias2prove");
+ local $lastlogin = <LASTLOGIN>;
+ close LASTLOGIN;
+ local $timestamp = sprintf("%.2f",((time() - $lastlogin) / 3600));
+ &post_prv("$alias","<font color=ffa500>$alias2prove <font color=ffffff> hat sich vor $timestamp Stunden zuletzt in das System eingeloggt!</font></font>");
+ } else {
+ &post_prv("$alias","<font color=ffa500>$alias2prove <font color=ffffff> hat sich seit der Einführung dieses Befehls noch nie eingeloggt!</font></font>");
+ }
+ } else {
+ &post_prv("$alias","<font color=ffa500>$alias2prove <font color=ffffff> exsistiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+ &reload_html;
+#############>- ANZEIGEN WER SICH IM AKTUELLEN RAUM BEFINDET -<
+ } elsif ($cmd eq "w") {
+ open(RSTAT,"data/online/rstat/$room");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ chomp($rstat[1]);
+ my $theme = "Raumthema:".$rstat[1] if ($rstat[1] ne undef);
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ my ($is,$nr) = ("t",0);
+ opendir(DIR,"data/online/rooms/$room");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ my $personen;
+ foreach(@dir) {
+ if (-f "data/online/rooms/$room/$_") {
+ $personen = $personen." ".$_;
+ $nr++;
+ }
+ }
+ &post_prv($alias,"<font color=ffffff>Der aktuelle Raum: $room $theme $door ($nr) : <font color=ffa500>$personen</font></font>");
+ &reload_html;
+#############>- ANZEIGEN WER SICH IM SYSTEM BEFINDET -<
+ } elsif ($cmd eq "wc" || $cmd eq "wc/") {
+ my $raum = $cmd[1];
+ my $personen;
+ if ($raum eq "" && $cmd eq "wc") {
+ opendir(USERS,"data/online/users");
+ my @users = readdir(USERS);
+ close USERS;
+ foreach(@users) {
+ $personen = $personen." ".$_ if (-f "data/online/users/$_");
+ }
+ my $nr = ($#users-1);
+ my ($nrs,$is) = ("","ist");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "sind";
+ }
+ &post_prv("$alias","<font color=ffffff>$nr Person$nrs $is insgesamt eingeloggt: <font color=ffa500>$personen</font></font>");
+ } elsif ($raum eq "" && $cmd eq "wc/") {
+ my $msg2post;
+ opendir(DIR,"data/online/rooms");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ opendir(DIR,"data/online/rooms/$_");
+ my @dir2 = readdir(DIR);
+ closedir(DIR);
+ open(RSTAT,"<data/online/rstat/$_");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ chomp($rstat[1]);
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ my $nr = $#dir2-1;
+ $msg2post = $msg2post."<tr><td><b><font size=2 color=ffffff>$_ $door ($nr) [".$rstat[1]."]: </font></b></td></tr><tr><td><font size=2 color=ffa500>";
+ foreach $chatter (@dir2) {
+ if (-f "data/online/rooms/$_/$chatter") {
+ $msg2post = $msg2post."$chatter ";
+ }
+ }
+ print "</font></td>";
+ }
+ }
+ &post_prv("$alias","<font color=ffffff>Folgende Räume sind offen:</font><table>$msg2post</table>");
+ } elsif ($raum ne "") {
+ my $personen;
+ opendir(DIR,"data/online/rooms/$raum");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/rooms/$raum/$_");
+ }
+ my ($nr,$is) = (($#dir-1),"t");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "n";
+ }
+ &post_prv($alias,"<font color=ffffff> $nr Person$nrs befinde$is sich im Raum \"$raum\": <font color=ffa500>$personen</font></font>");
+ }
+ &reload_html;
+#############>- ANZEIGEN IN WELCHEN RAUM SICH JMD. BEFINDET BZW. JMD IN EINEN RAUM FOLGEN -<
+ } elsif ($cmd eq "wj" || $cmd eq "ju") {
+ my $alias2search = $cmd[1];
+ opendir(ROOMS,"data/online/rooms");
+ my @dir = readdir(ROOMS);
+ closedir(ROOMS);
+ foreach $raum (@dir) {
+ opendir(DIR2,"data/online/rooms/$raum");
+ my @dir2 = readdir(DIR2);
+ closedir(DIR2);
+ foreach $user (@dir2) {
+ if (-f "data/online/rooms/$raum/$user") {
+ if ($user eq $alias2search) {
+ if ($cmd eq "wj") {
+ &post_prv("$alias","<font color=ffa500>$alias2search <font color=ffffff>befindet sich im Raum \"$raum\" !</font></font>");
+ } else {
+ &change_room("ju",$raum,$room,$alias2search);
+ }
+ &reload_html($whisper,"change_room");
+ }
+ }
+ }
+ }
+ &post_prv("$alias","<font color=ffa500>$alias2search <font color=ffffff> ist nicht eingeloggt !</font></font>");
+ &reload_html;
+#############>- RAUMNESETZER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- RAUM ABSCHLIESSEN/AUFSCHLIESSEN -<
+ } elsif ($cmd eq "l") {
+ &prove_besetzer($alias,$room);
+ &hierachie($alias);
+ if ($r_besetzer eq "true" || $hierachie eq "wa" || $hierachie eq "ow") {
+ my $lock = "0\n";
+ &zeit;
+ if ($room eq "Cyberbar") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias sperrt den Raum ohne Erfolg ab ...</font></i>");
+ } else {
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias sperrt den Raum ab ...</font></i>");
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias sperrt den Raum auf ...</font></i>");
+ }
+ for ($i=1;$i<=$#r_stat;$i++) {
+ $lock = $lock.$r_stat[$i];
+ }
+ open(RSTAT,">data/online/rstat/$room");
+ print RSTAT $lock;
+ close RSTAT;
+ }
+ &reload_html;
+ }
+#############>- RAUMBESETZER ERNENNEN -<
+ } elsif ($cmd eq "su") {
+ &prove_besetzer($alias,$room);
+ &hierachie($alias);
+ if ($r_besetzer eq "true" || $hierachie eq "wa" || $hierachie eq "ow") {
+ my $alias2su = $cmd[1];
+ opendir(DIR,"data/online/rooms/$room");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ if ($_ eq $alias2su) {
+ open(DATEI,"<data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ &hierachie($alias2su);
+ &prove_besetzer($alias2su,$room);
+ if ($r_besetzer eq "true" || $hierachie eq "wa" || $hierachie eq "ow") {
+ &post_prv($alias,"<font color=ffa500>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist bereits RB, WÄ oder OW)</font>");
+ &reload_html;
+ }
+ open(RSTAT,">>data/online/rstat/$room");
+ flock(RSTAT, 2);
+ print RSTAT $alias2su."\n";
+ close RSTAT;
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias verleiht \"$alias2su\" Raumbesetzerrechte ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>");
+ &reload_html;
+ }
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist nicht anwesend)</font>");
+ &reload_html;
+ }
+#############>- RAUMBESETZER ENTNENNEN -<
+ } elsif ($cmd eq "rsu") {
+ &prove_besetzer($alias,$room);
+ &hierachie($alias);
+ if ($r_besetzer eq "true" || $hierachie eq "wa" || $hierachie eq "ow") {
+ my $alias2rsu = $cmd[1];
+# open(DATEI,"<data/online/rstat/$room");
+# my @rstat = <DATEI>;
+# close DATEI;
+ &prove_besetzer($alias2rsu,$room);
+ if ($r_besetzer eq "true") {
+ &rm_rstat($alias2rsu,$room);
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias entzieht \"$alias2rsu\" die Raumbesetzerrechte ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>");
+ } else {
+ &post_prv($alias,"<font color=ffa500>$alias2rsu <font color=ffffff>ist kein Raumbesetzer und kann dieser Status auch nicht aberkannt werden !</font></font>");
+ }
+ &reload_html;
+ }
+#############>- RAUM EIN THEMA GEBEN -<
+ } elsif ($cmd eq "t") {
+ &prove_besetzer($alias,$room);
+ &hierachie($alias);
+ if ($r_besetzer eq "true" || $hierachie eq "wa" || $hierachie eq "ow") {
+ &zeit;
+ my $theme;
+ if ($cmd[1] ne undef) {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $theme = $theme." ".$cmd[$i];
+ }
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias gibt dem Raum das Thema (<font color=ffa500> $theme </font>) ...</font></i>");
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias löscht das Thema des Raums ...</font></i>");
+ }
+ $theme = $r_stat[0].$theme."\n";
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $theme = $theme.$r_stat[$i]."\n";
+ }
+ open(RSTAT,">data/online/rstat/$room");
+ print RSTAT $theme;
+ close RSTAT;
+ &reload_html;
+ }
+#############>- SUPERUSER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- ALIAS VERBANNEN -<
+ } elsif ($cmd eq "ban") {
+ &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $alias2ban = $cmd[1];
+ open(BAN,"<data/ban");
+ my @ban = <BAN>;
+ close BAN;
+ if ($cmd[1] eq undef) {
+ my $nr = @ban;
+ my $banned;
+ foreach(@ban) {
+ chomp($_);
+ $banned .= " $_";
+ }
+ &post_prv("$alias","<font color=ffffff>Folgende Benutzer sind verbannt [$nr]: <font color=ffa500>$banned</font></font>");
+ &reload_html;
+ } elsif (-f "data/user/options/$alias2ban") {
+ &hierachie($alias2ban);
+ if ($hierachie eq "wa") {
+ &post_prv("$alias","<font color=ffa500>$alias2ban <font color=ffffff>ist Wächter und kann nicht verbannt werden!</font></font>");
+ &reload_html;
+ } elsif ($hierachie eq "ow") {
+ &post_prv("$alias","<font color=ffa500>$alias2ban <font color=ffffff>ist Oberwächter und kann nicht verbannt werden!</font></font>");
+ &reload_html;
+ }
+ foreach $ban (@ban) {
+ if ($ban eq $alias2ban."\n") {
+ &post_prv("$alias","<font color=ffa500>$alias2ban <font color=ffffff>ist bereits verbannt!</font></font>");
+ &reload_html;
+ }
+ }
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias verbannt \"$alias2ban\" aus dem Chat ...</font></i>");
+ open(BAN,">>data/ban");
+ print BAN $alias2ban."\n";
+ close BAN;
+ &reload_html;
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2ban <font color=ffffff>kann nicht verbannt werden da Benutzername nicht existiert!</font></font>");
+ &reload_html;
+ }
+#############>- ALIAS ENTBANNEN -<
+ } elsif ($cmd eq "rban") {
+ &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $alias2rban = $cmd[1];
+ open(BAN,"<data/ban");
+ @ban = <BAN>;
+ close BAN;
+ foreach $ban (@ban) {
+ if ($ban eq $alias2rban."\n") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias entbannt \"$alias2rban\" ...</font></i>");
+ my @ban2;
+ foreach(@ban) {
+ push(@ban2,$_) if ($_ ne $alias2rban."\n");
+ }
+ open(BAN,">data/ban");
+# flock(BAN, 2);
+ print BAN @ban2; #."\n";
+ close BAN;
+ &reload_html;
+ }
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2rban <font color=ffffff>ist nicht verbannt!</font></font>");
+ &reload_html;
+ }
+#############>- IP # VON ALIAS ANZEIGEN LASSEN -<
+} elsif ($cmd eq "ip") {
+ &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $alias2prove = $cmd[1];
+ opendir(DIR,"data/online/ident");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ if ($_ eq $alias2prove) {
+ open(DATEI,"<data/online/ident/$alias2prove");
+ local $ipnr = <DATEI>;
+ close DATEI;
+ chomp($ipnr);
+ &post_prv("$alias","<font color=ffa500>$_<font color=ffffff> hat die IP-Nummer $ipnr !</font></font>");
+ }
+ }
+ &reload_html;
+ }
+#############>- ALIAS AUS DEM CHAT KATAPULTIEREN -<
+ } elsif ($cmd eq "k") {
+ &hierachie($alias);
+ if ($hierachie eq "wa" || $hierachie eq "ow") {
+ my $alias2kick = $cmd[1];
+ if (-f "data/online/users/$alias2kick") {
+ opendir(DIR,"data/online/rooms");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach $raum (@dir) {
+ opendir(DIR,"data/online/rooms/$raum");
+ my @dir2 = readdir(DIR);
+ closedir(DIR);
+ foreach $chatter (@dir2) {
+ if ($chatter eq $alias2kick) {
+ &hierachie($alias2kick);
+ if ($hierachie eq "ow") {
+ &post_prv("$alias","<font color=ffa500>$alias2kick <font color=ffffff> ist Oberwächter und kann nicht \"gekickt\" werden !</font></font>");
+ } elsif ($hierachie eq "wa") {
+ &post_prv("$alias","<font color=ffa500>$alias2kick <font color=ffffff> ist Wächter und kann nicht \"gekickt\" werden !</font></font>");
+ } else {
+ &post_prv("$alias2kick","<script language=\"JavaScript\">window.open(\"index.pl?tmp=kick\",\"_top\");</script>");
+ $_ = undef if ($room eq $raum);
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias katapultiert \"$alias2kick\" aus dem Chat ...</font></i>",$raum);
+ &rm_alias($alias2kick,$raum);
+ &check_online;
+ }
+ &reload_html;
+ }
+ }
+ }
+ }
+ &post_prv("$alias","<font color=ffa500>$alias2kick <font color=ffffff> ist nicht anwesend und kann nicht \"gekickt\" werden !</font></font>");
+ &reload_html;
+ }
+#############>- EINEN BENUTZER AUS DEM SYSTEM LÖSCHEN -<
+ } elsif ($cmd eq "kill") {
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ my $alias2kill = $cmd[1];
+ if (-f "data/user/options/$alias2kill") {
+ &hierachie($alias2kill);
+ if ($hierachie eq "ow") {
+ &post_prv($alias,"<font color=ffa500>$alias2kill</font> <font color=ffffff>ist Oberwächter und kann nicht aus dem System entfernt werden !</font>");
+ } elsif ($hierachie eq "wa") {
+ &post_prv($alias,"<font color=ffa500>$alias2kill</font> <font color=ffffff>ist Wächter und kann nicht aus dem System entfernt werden !</font>");
+ } else {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias killt \"$alias2kill\" ganz und gar aus dem System ...</font></i>");
+ unlink("data/user/options/$alias2kill");
+ unlink("data/user/profiles/$alias2kill");
+ unlink("data/user/gbooks/$alias2kill");
+ unlink("data/user/counts/$alias2kill");
+ unlink("data/user/counts/$alias2kill.online");
+ unlink("data/user/lastlogin/$alias2kill");
+ unlink("data/user/memos/$alias2kill");
+ open(DEL, ">>data/kill");
+ print DEL "($day.$month.$year $hours:$min:$sec) $alias2kill wurde von $alias gekillt\n";
+ close DEL;
+ }
+ } else {
+ &post_prv("$alias","<font color=ffa500>$alias2kill <font color=ffffff> existiert nicht in der DB und kann nicht \"gekillt\" werden !</font></font>");
+ }
+ &reload_html;
+ }
+#############>- EINEN ANDEREN RAUM AUF-/ABSPERREN -<
+ } elsif ($cmd eq "sl") {
+ &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $sl_room = $cmd[1];
+ if (-e "data/online/rooms/$sl_room") {
+ my $lock = "0\n";
+ &zeit;
+ open(RSTAT,"<data/online/rstat/$sl_room");
+ my @r_stat = <RSTAT>;
+ close RSTAT;
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias sperrt den Raum \"$sl_room\" von aussen ab ...</font></i>",$sl_room);
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias sperrt den Raum \"$sl_room\" von aussen auf ...</font></i>",$sl_room);
+ }
+ for ($i=1;$i<=$#r_stat;$i++) {
+ $lock = $lock.$r_stat[$i];
+ }
+ open(RSTAT,">data/online/rstat/$sl_room");
+ print RSTAT $lock;
+ close RSTAT;
+ } else {
+ &post_prv($alias,"<font color=ffffff>Der Raum <font color=ffa500>$sl_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ }
+#############>- IN EINEN ANDEREN RAUM HINEINRUFEN -<
+ } elsif ($cmd eq "ss") {
+ &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $ss_room = $cmd[1];
+ if (-e "data/online/rooms/$ss_room") {
+ my $ss_msg;
+ for ($i=2; $i <= $#cmd; $i++) {
+ $ss_msg = $ss_msg." ".$cmd[$i];
+ }
+ my $msg2scream = "\U$ss_msg";
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias ruft in den Raum \"$ss_room\" hinein: <b><font color=$col>$msg2scream</font></b> ...</font></i>",$ss_room);
+ &reload_html;
+ } else {
+ &post_prv($alias,"<font color=ffffff>Der Raum <font color=ffa500>$ss_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ }
+#############>- EINEN ANDEREN RAUM EIN THEMA GEBEN -<
+ } elsif ($cmd eq "st") {
+ &hierachie($alias);
+ if ($hierachie eq "wa" || $hierachie eq "ow") {
+ my $st_room = $cmd[1];
+ if (-e "data/online/rooms/$st_room") {
+ my $theme;
+ &zeit;
+ if ($cmd[2] ne undef) {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $theme = $theme." ".$cmd[$i];
+ }
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias gibt dem Raum \"$st_room\" das Thema (<font color=ffa500> $theme </font>) ...</font></i>",$st_room);
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias löscht das Thema des Raums \"$st_room\" ...</font></i>",$st_room);
+ }
+ open(RSTAT,"<data/online/rstat/$st_room");
+ my @r_stat = <RSTAT>;
+ close RSTAT;
+ $theme = $r_stat[0].$theme."\n";
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $theme = $theme.$r_stat[$i];
+ }
+ open(RSTAT,">data/online/rstat/$st_room");
+ print RSTAT $theme;
+ close RSTAT;
+ } else {
+ &post_prv($alias,"<font color=ffffff>Der Raum <font color=ffa500>$st_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ }
+#############>- SYSTEMNACHRICHT IN ALLE BESTEHENDEN RÄUME POSTEN -<
+ } elsif ($cmd eq "sys") {
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ my $sys_msg;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $sys_msg = $sys_msg." ".$cmd[$i];
+ }
+ &zeit;
+ $sys_msg = "<i><font color=ffffff>($hours:$min:$sec)</font></i> <b><font size=2 color=red>SYSTEMNACHRICHT</font></b><i><font color=ffffff>: $sys_msg ...</font></i>";
+ opendir(ROOMS,"data/msgs");
+ my @rooms = readdir(ROOMS);
+ close(ROOMS);
+ foreach(@rooms) {
+ &post($_,$sys_msg);
+ }
+ &log($sys_msg);
+ &reload_html;
+ }
+#############>- ALIAS ZUM WÄCHTER ERNNENNEN -<
+ } elsif ($cmd eq "wa") {
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ my $alias2wa = $cmd[1];
+ &hierachie($alias2wa);
+ if ($hierachie eq "wa") {
+ &post_prv("$alias","<font color=ffa500>$alias2wa <font color=ffffff>ist bereits als Wächter eingetragen. Eine erneuerte Eintragung ist nicht möglich!</font></font>");
+ &reload_html;
+ } elsif ($hierachie eq "ow") {
+ &post_prv("$alias","<font color=ffa500>$alias2wa <font color=ffffff>ist bereits als Oberwächter eingetragen. Oberwächter können nicht gleichzeitig Wächter sein!</font></font>");
+ &reload_html;
+ }
+ if (-f "data/user/options/$alias2wa") {
+ &zeit;
+ open(WA,">>data/wa");
+ print WA $alias2wa."\n";
+ close WA;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias ernennt \"$alias2wa\" zum Wächter ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>");
+ &reload_html;
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2wa <font color=ffffff>kann nicht zum Wächter ernannt werden da Benutzername nicht existiert!</font></font>");
+ &reload_html;
+ }
+#############>- ALIAS DIE WÄCHTERRECHTE ENTZIEHEN -<
+ } elsif ($cmd eq "rwa") {
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ my $alias2rwa = $cmd[1];
+ &hierachie($alias2rwa);
+ if ($hierachie eq "wa") {
+ open(WA,"<data/wa");
+ @wa = <WA>;
+ close WA;
+ my @wa2;
+ foreach $wa (@wa) {
+ push(@wa2,$wa) if ($wa ne $alias2rwa."\n");
+ }
+ open(WA,">data/wa");
+ print WA @wa2;
+ close WA;
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias hat \"$alias2rwa\" vom Wächter zum normalen Chatter degradiert ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>");
+ } else {
+ &post_prv($alias,"<font color=ffa500>$alias2rwa <font color=ffffff>ist kein Wächter und können die Wächterrechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ }
+#############>- ADMINISTRATORBEFEHLE -<
+#############>- ALIAS ZUM OBERWÄCHTER ERNENNEN -<
+ } elsif ($cmd eq "ow" && $alias eq "Snooper") {
+ my $alias2ow = $cmd[1];
+ &hierachie($alias2ow);
+ if ($hierachie eq "wa") {
+ &post_prv("$alias","<font color=ffa500>$alias2ow <font color=ffffff>ist bereits als Wächter eingetragen. Wächter können nicht gleichzeitig Oberwächter sein!</font></font>");
+ &reload_html;
+ } elsif ($hierachie eq "ow") {
+ &post_prv("$alias","<font color=ffa500>$alias2ow <font color=ffffff>ist bereits als Oberwächter eingetragen!</font></font>");
+ &reload_html;
+ }
+ if (-f "data/user/options/$alias2ow") {
+ open(OW,">>data/ow");
+ print OW $alias2ow."\n";
+ close OW;
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias ernennt \"$alias2ow\" zum Oberwächter ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>");
+ &reload_html;
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2ow <font color=ffffff>kann nicht zum Oberwächter ernannt werden da Benutzername nicht existiert!</font></font>");
+ &reload_html;
+#############>- ALIAS DIE OBERWÄCHTERRECHTE ENTZIEHEN -<
+ } elsif ($cmd eq "row" && $alias eq "Snooper") {
+ &hierachie($alias);
+ if ($hierachie eq "ow") {
+ my $alias2row = $cmd[1];
+ &hierachie($alias2row);
+ if ($hierachie eq "ow") {
+ open(OW,"<data/ow");
+ @ow = <OW>;
+ close OW;
+ my @ow2;
+ foreach $ow (@ow) {
+ push(@ow2,$ow) if ($ow ne $alias2row."\n");
+ }
+ open(OW,">data/ow");
+ print OW @ow2;
+ close OW;
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias hat \"$alias2row\" vom Oberwächter zum normalen Chatter degradiert ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>");
+ } else {
+ &post_prv($alias,"<font color=ffa500>$alias2row <font color=ffffff>ist kein Oberwächter und können die Wächterrechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ }
+#############>- PASSWORD EINES BENUTZERS ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "pw" && $alias eq "Snooper") {
+ my $pw2show = $cmd[1];
+ if (-f "data/user/options/$pw2show") {
+ open(PW,"<data/user/options/$pw2show");
+ @pw = <PW>;
+ close PW;
+ &post_prv($alias,"<font color=ffa500>$pw2show <font color=ffffff> hat das Passwort \"".$pw[0]."\" !</font></font>");
+ &reload_html;
+ }
+ &post_prv($alias,"<font color=ffa500>$pw2show <font color=ffffff> existiert nicht in der Benutzerdatenbank !</font></font>");
+ &reload_html;
+#############>- SYSTEMMELDUNG POSTEN -<
+ } elsif ($cmd eq "cool" && $alias eq "Snooper" || $alias eq "Peacemaker") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $msg2post</font></i>");
+ &reload_html;
+#############>- SPION -<
+#} elsif ($cmd eq "sr") {
+# my $secroom = $cmd[1];
+# open(MSGFILE,">>data/msgs/$room");
+# print MSGFILE "$alias<;".time."<;sr<;$secroom<;!<;\n";
+# close MSGFILE;
+# &reload_html;
+#} elsif ($cmd eq "csr") {
+# my $secroom = $cmd[1];
+# open(MSGFILE,">>data/msgs/$room");
+# print MSGFILE "$alias<;".time."<;csr<;!<;!<;\n";
+# close MSGFILE;
+# &reload_html;
+#############>- ENDE DER CHATBEFEHLE -<
+ }
+ &post_prv($alias,"<font color=ffffff>Der Chatbefehl <font color=ffa500>/$cmd</font> existiert nicht oder Du hast keine Berechtigung diesen Befehl auszuführen!</font></font>");
+ &reload_html;
+} \ No newline at end of file
diff --git a/0.4.9/main2.pl b/0.4.9/main2.pl
new file mode 100644
index 0000000..54f5ce2
--- /dev/null
+++ b/0.4.9/main2.pl
@@ -0,0 +1,640 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header();
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+
+$var = $q->param("var");
+if ($var eq "list_alias_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &list_alias_html;
+} elsif ($var eq "alias_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $tmp = $q->param("tmp");
+ &alias_html;
+} elsif ($var eq "edit_profile_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ &edit_html("edit_profile_html");
+} elsif ($var eq "edit_options_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ &edit_html("edit_options_html");
+} elsif ($var eq "gb_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &gb_html;
+} elsif ($var eq "post_gb") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $msg = $q->param("msg");
+ $tmp = $q->param("tmp");
+ $id = $q->param("id");
+ &post_gb;
+} elsif ($var eq "edit_profile") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ &secure_checkid($alias);
+ &edit("edit_profile");
+} elsif ($var eq "edit_options") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $tmp = $q->param("tmp");
+ $id = $q->param("id");
+ $room = $q->param("room");
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ &edit("edit_options");
+} elsif ($var eq "rm_gb_alias") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $tmp = $q->param("tmp");
+ $id = $q->param("id");
+ &rm_gb;
+} else {
+ &error("Parameter fehlt");
+}
+
+###########################
+##HAUPTTEIL DIESER DATEI:##
+###########################
+
+sub gb_html { # Das Benutzerboard/Gästebuch.
+ my $message = $_[0];
+ &start_html("Benutzerboard");
+if ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </i>
+ einen Text und poste
+ <u>dann</u>
+ !
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Vielen Dank für Deinen Beitrag. Wenn Du willst, kannst Du jetzt gleich noch einen Eintrag posten ...
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Falls Du Anregungen oder Verbesserungsvorschläge für die Community hast, dann poste doch einen kleinen Eintrag :-)
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="guestbook">
+ <input type="hidden" name="id" value="y">
+ <input size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+ if (-e "data/guestbook") {
+ open (DATEI,"<data/guestbook") || &error("Konnte dat/guestbook nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ print
+ $q->div(@datei);
+ }
+ print
+ $q->end_html;
+}
+
+
+sub post_gb { # Wenn etwas in ein Gästebuch eingetragen wird
+ &zeit;
+ if ($msg eq "") {
+ if ($id eq "y") { # Überprüfen, ob Benutzerboard- oder Privatgästebuch
+ &gb_html("post_empty");
+ } else {
+ &alias_html("post_empty");
+ }
+ exit;
+ }
+ $msg =~ s#<#&lt\;#g;
+ my $tmpath = "";
+ if ($id eq "y") {
+ $tmpath = "data/guestbook";
+ } else {
+ $tmpath = "data/user/gbooks/$tmp";
+ }
+ open(GB,"$tmpath");
+ my @gb = <GB>;
+ close GB;
+ pop(@gb) if ($#gb > 99);
+ my @newdatei = "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ push(@newdatei,@gb);
+ open(GB,">$tmpath");
+ print GB @newdatei;
+ close GB;
+ if ($id eq "y") {
+ &gb_html("post_ok");
+ exit;
+ } else {
+ post_prv("$tmp","<font color=ffffff><a href=\"main2.pl?alias=$tmp&var=alias_html&tmp=$alias&tmpid=$tmpid\" target=\"_new\">$alias</a> hat soeben einen Pin in <a href=\"main2.pl?alias=$tmp&var=alias_html&tmp=$tmp&tmpid=$tmpid\" target=\"_new\">Dein Profil</a> gehängt ... </font>");
+ &alias_html;
+ exit;
+ }
+}
+
+sub rm_gb { # Gästebucheintrag entfernen
+ open(GB,"<data/user/gbooks/$alias");
+ my @gbfile = <GB>;
+ close GB;
+ my @newgbfile = ();
+ for ($i=0; $i <= $#gbfile; $i++) {
+ push(@newgbfile,$gbfile[$i]) if ($i != $id);
+ }
+ open(GB,">data/user/gbooks/$alias");
+ print GB @newgbfile;
+ close GB;
+ &alias_html("rm_ok");
+}
+
+sub list_alias_html { # Liste aller Benutzer
+ &start_html("Alle Benutzer");
+ opendir(REGISTERED,"data/user/options");
+ my @users = readdir(REGISTERED);
+ closedir(REGISTERED);
+ my @liste = sort(@users);
+ my $nr = $#users-1;
+print <<END;
+ <div>
+ Es sind z.Z. genau $nr Benutzernamen in der Datenbank vorhanden! (Sortiert nach #, A-Z, a-z)
+ </div>
+ <hr>
+ <div>
+END
+ foreach(@liste) {
+ if (-f "data/user/options/$_") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid" },
+ "$_"),
+ " ";
+ }
+ }
+print <<END;
+ </div>
+</body>
+</html>
+END
+}
+
+sub alias_html { # Anzeigen eines Benutzerprofils
+ my $message = $_[0];
+ open(COUNTS,"<data/user/counts/$tmp");
+ local $counter = <COUNTS>;
+ close COUNTS;
+ $counter++;
+ open(COUNTS,">data/user/counts/$tmp");
+ print COUNTS $counter;
+ close COUNTS;
+ &start_html($tmp);
+print <<END;
+<div>
+ <a href="htdocs.pl?var=werda_html&alias=$alias&tmpid=$tmpid">Hier</a>
+ gehts zur Gesamtübersicht !
+</div>
+<hr>
+END
+if ($message eq "rm_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Der von Dir gewählte Eintrag wurde erfolgreich gelöscht.
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </u>
+ einen Text und poste
+ <u>dann</u>
+ !
+ <hr>
+END
+}
+ open(PROFILE,"<data/user/profiles/$tmp");
+ @data = <PROFILE>;
+ close PROFILE;
+print <<END;
+ <div>
+ Dieses Profil wurde insgesamt schon $counter mal aufgerufen !
+ <br>
+ <br>
+ Alias: $tmp
+ <br>
+ <br>
+ Nachname: $data[0]
+ <br>
+ <br>
+ Vorname: $data[1]
+ <br>
+ <br>
+ Alter: $data[2]
+ <br>
+ <br>
+ Wohnort: $data[3]
+ <br>
+ <br>
+ E-Mail:
+ <a href="mailto:$data[4]">$data[4]</a>
+ <br>
+ <br>
+ ICQ-Nummer: $data[5]
+ <br>
+ <br>
+ Homepage:
+ <a href="$data[6]" target="_new">$data[6]</a>
+ <br>
+ <br>
+ Weiteres:
+ <br>
+ $data[7]
+ <hr>
+ Hier kannst Du $tmp eine Nachricht hinterlassen!
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input type="text" size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+if (-e "data/user/gbooks/$tmp") {
+ open (DATEI,"<data/user/gbooks/$tmp") || &error("Konnte data/user/gbooks/$tmp nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ my $nr = 1;
+ if ($alias ne $tmp) {
+ foreach(@datei) {
+ print "<br>Eintrag # $nr: $_";
+ $nr++;
+ }
+ } else {
+print <<END;
+ <table>
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="rm_gb_alias">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="$tmp">
+END
+for($i=0; $i <= $#datei; $i++) {
+print <<END;
+ <tr>
+ <td>
+ <input type="radio" name="id" value="$i">
+ </td>
+ <td>
+ <div class=q>
+ <br>
+ Eintrag # $nr:
+ $datei[$i]
+ </div>
+ </td>
+ </tr>
+END
+$nr++;
+}
+print <<END;
+ </table>
+ <table>
+ <tr>
+ <td>
+ <font color=ffffff>
+ <input type="submit" value="Markierten Eintrag löschen">
+ </font>
+ </td>
+ <td>
+ <font color=ffffff>
+ <input type="reset" value="Markierung rückgängig machen">
+ </font>
+ </td>
+ </tr>
+ </table>
+ </form>
+END
+}
+}
+ print
+ $q->end_html;
+}
+
+sub edit_html { # Chat-Optionen / Benutzerprofil editieren
+ my ($method,$message) = @_;
+ &start_html("Benutzerprofil ändern");
+ if ($method eq "edit_options_html") {
+ open(DATEI,"<data/user/options/$alias");
+ } elsif ($method eq "edit_profile_html") {
+ open(DATEI,"<data/user/profiles/$alias");
+ }
+ @data = <DATEI>;
+ close DATEI;
+ foreach(@data) {
+ chomp $_;
+ }
+ if ($method eq "edit_options_html") {
+ if ($message eq "edit_options_ok") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat die Chateinstellungen geändert ...</font></i>");
+print <<END;
+<script language="JavaScript">
+ open("main.pl?var=change_colors&alias=$alias&room=$room&col=$col&secol=$secol&tmpid=$tmpid","reload");
+</script>
+<div class=b>
+ Hinweis:
+</div>
+<div>
+ Du hast soeben Deine Chat-Optionen erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren. Um
+ weiterzuchatten einfach Fenster schliessen!
+</div>
+<hr>
+END
+ } elsif ($message eq "edit_pw_wrong") {
+print <<END;
+<div class=b>
+ ACHTUNG!
+</div>
+<div>
+ Du hast soeben versucht, dein Passwort zu ändern. Jedoch stimmte die Erste Eingabe nicht mit der Zweiten überein.
+ Bitte versuch es erneuert ...
+</div>
+<hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Deine Chat-Optionen editieren!" ),
+ $q->hr;
+ }
+print <<END;
+<script lang="javascript" type="text/javascript">
+<!--
+
+function radioWert(rObj) {
+ for (var i=0; i<rObj.length; i++) if (rObj[i].checked) return rObj[i].value;
+ return false;
+}
+
+function insertcode( code ) {
+ document.optionen.elements[radioWert(document.optionen.eingabe)].value = code;
+}
+
+//-->
+</script>
+
+<form name="optionen" action="main2.pl">
+ <input type="hidden" name="var" value="edit_options">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Passwort
+ <font color=ffa500>
+ (Gut merken !!)
+ </font>
+ <br>
+ <input type="password" name="id" value="$data[0]">
+ </div>
+ </td>
+ <td width=20>
+ </td>
+ <td>
+ <div>
+ Geb hier das Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp" value="$data[0]">
+ </div>
+ </td>
+ </tr>
+ </table>
+ <hr>
+ <div>Einstellungen für den Nachrichten-Verlauf</div>
+ <table>
+ <tr>
+ <td>
+ <br>
+ <div>Anzahl der Nachrichten im Verlauf (Standart = 10)</div>
+ <font color=ffffff>
+ <select name="maxVerlauf" size="1">
+ <option value="$data[3]">$data[3]
+END
+for($i=1;$i<=50;$i++) {
+ print "<option value=\"$i\">$i";
+}
+print<<END;
+ </select>
+ </font>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <br>
+<div>Wie sollen die Nachrichten im Verlauf angeordnet sein?</div>
+ <font color=ffffff>
+ <select name="verlaufOrder" size="1">
+ <option value="$data[4]">Bisherige Einstellung ($data[4])
+ <option value="0">Neue Verlaufnachrichten oben (0)
+ <option value="1">Neue Verlaufnachrichten unten (1)
+ </select>
+ </font>
+ </td>
+ </tr>
+ </table>
+<br>
+ <div>PS: Einstellungen des Nachrichten-Verlaufs werden erst nach einem Neueinloggen aktualisiert.</div>
+ <hr>
+ <table>
+ <tr>
+ <td>
+ <div>
+ <input type="radio" name="eingabe" value="col" checked>
+ Auswahl von Farbe 1
+ <br>
+ (Farbe Deines Nicks):
+ <br>
+ <input name="col" size="6" maxlength="6" value="$data[1]">
+ </div>
+ </td>
+ <td width=20>
+ </td>
+ <td>
+ <div>
+ <input type="radio" name="eingabe" value="secol">
+ Auswahl von Farbe 2
+ <br>
+ (Farbe Deiner Nachrichten):
+ <br>
+ <input name="secol" size="6" maxlength="6" value="$data[2]">
+ </div>
+ </td>
+ </tr>
+ </table>
+<br>
+ <div>
+ Beliebige Auswahl markieren und Farbe wählen. Um Deine Optionen abzuspeichern,
+ auf "Daten ändern" klicken!
+ </div>
+ <br>
+END
+ open(COLORS,"<colors.sno");
+ @colors = <COLORS>;
+ close COLORS;
+ print @colors;
+ } elsif ($method eq "edit_profile_html") {
+ if ($message eq "edit_profile_ok") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias hat das Profil geändert ...</font></i>");
+print <<END;
+ <div class=b>
+ Hinweis:
+ </div>
+ <div>
+ Du hast soeben Dein Profil erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren:
+ <hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Dein Profil editieren!" ),
+ $q->hr;
+ }
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="edit_profile">
+ <div>
+ Dein Nachname:
+ <br>
+ <input name="nachname" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ Dein Vorname:
+ <br>
+ <input name="vorname" value="$data[1]">
+ </div>
+ <br>
+ <div>
+ Dein Alter:
+ <br>
+ <input name="alter" value="$data[2]">
+ </div>
+ <br>
+ <div>
+ Dein Wohnort:
+ <br>
+ <input name="wohnort" value="$data[3]">
+ </div>
+ <br>
+ <div>
+ Deine E-Mail Adresse:
+ <br>
+ <input name="email" value="$data[4]">
+ </div>
+ <br>
+ <div>
+ Deine ICQ-Nummer:
+ <br>
+ <input name="icq" value="$data[5]">
+ </div>
+ <br>
+ <div>
+ Deine Homepage:
+ <br>
+ <input name="homepage" value="$data[6]">
+ </div>
+ <br>
+ <div>
+ Weiteres:
+ <br>
+ <textarea rows="5" cols="40"name="weiteres" wrap="virtual">$data[7]</textarea>
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <font color=ffffff>
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="room" value="$room">
+ <input type="submit" value="Daten ändern ...">
+ </font>
+ </form>
+</body>
+</html>
+END
+}
+
+
+sub edit { # Benutzerprofil od. Chat-Optionen abspeichern
+ my $method = $_[0];
+ &zeit;
+ if ($method eq "edit_profile") {
+ my $url = $q->param('homepage');
+ $url =~ s#^[http://]*##g;
+ open(PROFILE,">data/user/profiles/$alias");
+ print PROFILE $q->param('nachname')."\n".$q->param('vorname')."\n".$q->param('alter')."\n".$q->param('wohnort')."\n".$q->param('email')."\n".$q->param('icq')."\n"."http://$url\n".$q->param('weiteres');
+ close PROFILE;
+ &edit_html("edit_profile_html","edit_profile_ok");
+ } elsif ($method eq "edit_options") {
+ if ($id ne $tmp) {
+ &edit_html("edit_options_html","edit_pw_wrong");
+ exit;
+ }
+ open(OPTIONS,">data/user/options/$alias");
+ print OPTIONS $id."\n".$col."\n".$secol."\n".$q->param("maxVerlauf")."\n".$q->param("verlaufOrder");
+ close OPTIONS;
+ &edit_html("edit_options_html","edit_options_ok");
+ }
+} \ No newline at end of file
diff --git a/0.4.9/online.pl b/0.4.9/online.pl
new file mode 100644
index 0000000..e785652
--- /dev/null
+++ b/0.4.9/online.pl
@@ -0,0 +1,84 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print $q->header();
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+$room = $q->param("room");
+
+&secure_checkid($alias);
+
+# Onlinezeit zählen !
+open(DATEI,"<data/online/users/$alias");
+ my $oldstamp = <DATEI>;
+close DATEI;
+ if ($oldstamp > (time - 60)) {
+ open(DATEI,"<data/user/counts/$alias.online");
+ my $online = <DATEI>;
+ close DATEI;
+ my $total = (time-$oldstamp+$online);
+ open(DATEI,">data/user/counts/$alias.online");
+ print DATEI $total;
+ close DATEI;
+ }
+##### ENDE
+
+open(DATEI,">data/online/users/$alias");
+ print DATEI time;
+close DATEI;
+if (-f "data/online/rooms/$room") { } else { mkdir "data/online/rooms/$room", 0777; }
+if (-f "data/online/rstat/$room") { } else {
+ open(DATEI,">data/online/rstat/$room"); # Raumbesetzerstatus setzen
+ print DATEI "0\n\n$alias\n";
+ close DATEI;
+}
+open(DATEI,">data/online/rooms/$room/$alias");
+ print DATEI time;
+close DATEI;
+open(DATEI,"<data/online/prove"); # Räume und Chatter auf Existenz überprüfen
+ my $provetime = <DATEI>;
+close DATEI;
+if ($provetime < (time - 30)) {
+ &check_online;
+}
+
+&start_html("Online","online");
+opendir(ROOM,"data/online/rooms/".$room);
+ my @room = readdir(ROOM);
+closedir(ROOM);
+my $chatter = $#room-1;
+print $q->div( "$room ($chatter):" ), "<table>";
+ @room = sort(@room);
+ foreach $online (@room) {
+ if (-f "data/online/rooms/$room/$online") {
+ &prove_away($online,$room);
+ if ($away ne undef) {
+ print "<tr><td><img title='$away' alt='$away' src='$gfxpath/away.gif'></td>";
+ goto WEITER;
+ }
+ &hierachie($online);
+ if ($hierachie eq "ow") {
+ print "<tr><td><img title='Oberw&auml;chter' alt='Oberw&auml;chter' src='$gfxpath/ow.gif'></td>";
+ goto WEITER;
+ } elsif ($hierachie eq "wa") {
+ print "<tr><td><img title='W&auml;chter' alt='W&auml;chter' src='$gfxpath/wa.gif'></td>";
+ goto WEITER;
+ }
+ &prove_besetzer($online,$room);
+ if ($r_besetzer eq "true") {
+ print "<tr><td><img title='Raumbesetzer' alt='Raumbesetzer' src='$gfxpath/rb.gif'></td>";
+ } else {
+ print "<tr><td></td>";
+ }
+WEITER:
+ print "<td><a href='main2.pl?var=alias_html&alias=$alias&tmp=$online&tmpid=$tmpid' target='$online'><font size='1' face='arial'>$online</font></a></td></tr>";
+ }
+ }
+print "</table>", $q->end_html;
+
+
diff --git a/0.4.9/ow.gif b/0.4.9/ow.gif
new file mode 100644
index 0000000..c2a5c2a
--- /dev/null
+++ b/0.4.9/ow.gif
Binary files differ
diff --git a/0.4.9/push.pl b/0.4.9/push.pl
new file mode 100644
index 0000000..6606e52
--- /dev/null
+++ b/0.4.9/push.pl
@@ -0,0 +1,122 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+#CGI->compile(':all');
+$q = new CGI;
+print
+ $q->header;
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+
+{
+ open(IDENT,"<data/online/ident/$alias");
+ my @ident = <IDENT>;
+ close IDENT;
+ if ($ident[1] ne $tmpid) {
+ print $q->div( "Error: ($error_msg)" ),
+ $q->end_html;
+ open(ERROR,">>data/error");
+ print ERROR "$alias $tmpid $$ ".time." $error_msg \n";
+ close ERROR;
+ exit 0;
+ }
+}
+
+$room = $q->param("room");
+#$SIG{INT} = ignore;
+my $pid = $$;
+$| = 1;
+
+print <<END;
+<html>
+ <head>
+<script language="JavaScript">
+<!--
+// Scroll-Routine von Anklepper (http://www.anklepper.de)
+// speziell für yChat (http://www.yChat.de), Copyright 2000
+scrolling = true;
+moves_steps = 4; // Schrittgröße
+moves_interval = 4; // Schrittgeschwindigkeit
+
+function moves()
+{
+ if( scrolling != false )
+ window.scrollBy( 0, moves_steps );
+ window.setTimeout( "moves()", moves_interval );
+}
+
+moves();
+//-->
+</script>
+ </head>
+<body bgcolor=000000 link=FFFFFF alink=FFFFEF vlink=FFFFEF>
+<font size=1 color=ffffff face=arial>Willkommen im yChat [PID: $pid]</font><br>
+END
+
+if (-f "data/user/memos/$alias") {
+ open(MEMOS,"<data/user/memos/$alias");
+ my $memos = <MEMOS>;
+ close MEMOS;
+ print $memos;
+ unlink("data/user/memos/$alias");
+}
+
+my $startime,$change_room,@flood;
+OPENMSGFILE:
+$change_room = 0;
+$startime = time;
+
+if (-e "data/msgs/$room") {
+ open(MSGFILE,"<data/msgs/$room");
+ unless (-d "data/online/pids") {
+ mkdir "data/online/pids", 0777;
+ } unless (-d "data/online/pids/$room") {
+ mkdir "data/online/pids/$room", 0777;
+ }
+ open(PID,">data/online/pids/$room/$pid");
+ print PID time;
+ close PID;
+} else {
+ sleep 1;
+ goto OPENMSGFILE;
+}
+
+&sendmsgs;
+while (-f "data/online/users/$alias") {
+ local $SIG{USR1} = \&sendmsgs;
+ goto OPENMSGFILE if ($change_room == 1);
+ sleep 15;
+ print "\n";
+}
+
+sub sendmsgs {
+ for ($curpos = tell(MSGFILE); <MSGFILE>; $curpos = tell(MSGFILE)) {
+ my ($address, $stamp, $command, $action, $message) = split(/<;/, $_);
+ if ($address eq "!" || $address eq $alias) {
+ if ($stamp > $startime) {
+ if ($command eq "cr") {
+ unlink("data/online/pids/$room/$pid");
+ $room = $action;
+ close MSGFILE;
+ $change_room = 1;
+ }
+ print "$message<br>\n" if ($change_room != 1);
+ push(@flood,$message);
+ if ($flood[0] eq $flood[1] && $flood[0] eq $flood[2] && $flood[0] eq $flood[3]) {
+ print "<i><font color=red> Jemand floodet den Chat !</font></i><br>\n";
+ }
+ shift(@flood) if ($#flood > 2);
+ }
+ }
+ }
+ seek(MSGFILE, $curpos, 0);
+}
+
+#sub snp {
+# exec('perl push.pl?alias=$alias&room=$room');
+#}
+
+unlink("data/online/pids/$room/$pid"); \ No newline at end of file
diff --git a/0.4.9/rb.gif b/0.4.9/rb.gif
new file mode 100644
index 0000000..1187798
--- /dev/null
+++ b/0.4.9/rb.gif
Binary files differ
diff --git a/0.4.9/setup.sh b/0.4.9/setup.sh
new file mode 100644
index 0000000..6b3ef8a
--- /dev/null
+++ b/0.4.9/setup.sh
@@ -0,0 +1,50 @@
+#!/bin/sh
+echo
+echo yChat wird konfiguriert!
+echo
+mkdir data
+chmod 777 data
+mkdir data/logs
+chmod 777 data/logs
+mkdir data/msgs
+chmod 777 data/msgs
+mkdir data/user
+chmod 777 data/user
+mkdir data/user/counts
+chmod 777 data/user/counts
+mkdir data/user/memos
+chmod 777 data/user/memos
+mkdir data/user/options
+chmod 777 data/user/options
+mkdir data/user/profiles
+chmod 777 data/user/profiles
+mkdir data/user/gbooks
+chmod 777 data/user/gbooks
+mkdir data/user/lastlogin
+chmod 777 data/user/lastlogin
+mkdir data/online
+chmod 777 data/online
+mkdir data/online/rooms
+chmod 777 data/online/rooms
+mkdir data/online/pids
+chmod 777 data/online/pids
+mkdir data/online/rstat
+chmod 777 data/online/rstat
+mkdir data/online/users
+chmod 777 data/online/users
+mkdir data/online/ident
+chmod 777 data/online/ident
+chmod 777 data/htdocs/*
+chmod 777 *.pl
+chmod 777 config.pm
+mkdir dokus/
+mv *.txt dokus/
+mkdir ../../htdocs/yChat/
+mv *.gif ../../htdocs/yChat/
+mv *.swf ../../htdocs/yChat/
+
+echo
+echo yChat Setup beendet ...
+echo Created and Copyright by Paul C. Bütow
+echo
+
diff --git a/0.4.9/stat.pl b/0.4.9/stat.pl
new file mode 100644
index 0000000..51e4d4d
--- /dev/null
+++ b/0.4.9/stat.pl
@@ -0,0 +1,207 @@
+#!/usr/bin/perl -w
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+
+my $var = $q->param('var');
+my $alias = $q->param('alias');
+my $tmpid = $q->param('tmpid');
+
+print $q->header();
+&start_html("Statistiken");
+print $q->div("yChat Statistiken"), $q->hr,
+ $q->div( $q->a( { -href=>"stat.pl?var=ranking&alias=$alias&tmpid=$tmpid" }, "Rankings"), " | ",
+ $q->a( { -href=>"stat.pl?var=del&alias=$alias&tmpid=$tmpid" }, "Loginstatistiken"), " | ",
+ $q->a( { -href=>"stat.pl?var=stat&alias=$alias&tmpid=$tmpid" }, "DB-Statistik"), " | ",
+ $q->a( { -href=>"stat.pl?var=code&alias=$alias&tmpid=$tmpid" }, "Programmcode"), " | ",
+ ), $q->hr;
+# $q->a( { -href=>"stat.pl?var=var&alias=$alias&tmpid=$tmpid" }, "Umgebungsvariablen")
+
+
+if ($var eq "ranking") {
+
+ opendir(COUNTS, "data/user/counts");
+ my @counts = readdir(COUNTS);
+ closedir(COUNTS);
+
+ print "<div>";
+
+ my $nr_start = $q->param('start');
+ my $nr_end = $q->param('end');
+ my %online;
+ my $rank;
+ my $nr;
+
+ foreach(@counts) {
+ if(-f "data/user/counts/$_" ) {
+ if (s#.online##g) {
+ open(TOTAL, "<data/user/counts/$_.online");
+ my $total = <TOTAL>;
+ close TOTAL;
+ $online{sprintf("%.2f",($total / 3600))} = $_;
+ }
+ }
+ }
+ print "<div>", $q->b("Rankings:"), $q->br,
+ "<table><tr><td><div><b>#:</b></div></td><td><b><div>St.:</div></b></td><td><b><div>Name:</div></b></td></tr>";
+
+ if (!$nr_start) {
+ $nr_start = 1;
+ } if (!$nr_end) {
+ $nr_end = 20;
+ }
+
+ foreach $wert (reverse(sort { $a <=> $b } keys %online)) {
+ $nr++;
+ if ($online{$wert} eq $alias) {
+ $rank = $nr;
+ last if ($nr > $nr_end);
+ }
+ next if ($nr < $nr_start || $nr > $nr_end);
+ print "<tr><td><font color='ffffff' size='1' face='arial'>".$nr."</font></td><td><font color='ffffff' size='1' face='arial'> ".$wert."h </font></td><td> <a href='main2.pl?var=alias_html&alias=$alias&tmp=$online{$wert}&tmpid=$tmpid'><font size='1' face='arial'>$online{$wert}</font></a></td></tr>\n";
+ }
+ print "</table>", $q->hr;
+ $nr_start -= 20; $nr_end -= 20;
+ print "Rankings von <a href='stat.pl?var=ranking&start=$nr_start&end=$nr_end&alias=$alias&tmpid=$tmpid'>$nr_start bis $nr_end</a> anzeigen ...<br>" if ($nr_start > 0);
+ $nr_start += 40; $nr_end += 40;
+ print "Rankings von <a href='stat.pl?var=ranking&start=$nr_start&end=$nr_end&alias=$alias&tmpid=$tmpid'>$nr_start bis $nr_end</a> anzeigen ...",
+ $q->br, $q->br, $q->b("$alias, Du befindest Dich auf Rank $rank</div>");
+
+} elsif ($var eq "del") {
+
+ print "<div>", $q->b("Alte Benutzer l&ouml;schen:"), $q->br,
+ "Benutzer, die sich 1440 Stunden (60 Tage) nicht mehr in das System eingeloggt haben, werden gelöscht.", $q->br, $q->br;
+
+ opendir(USER, "data/user/options");
+ my @user = readdir(USER);
+ closedir(USER);
+ @user = sort(@user);
+
+ my $i = 0;
+ my $j;
+ my $k = 0;
+ my $l = 0;
+ my $full = $q->param('tmp');
+
+ foreach(@user) {
+ if (-f "data/user/lastlogin/$_") {
+ open(LOGIN,"<data/user/lastlogin/$_");
+ my $login = <LOGIN>;
+ close LOGIN;
+ $login = sprintf("%.2f",((time - $login) / 3600));
+ $j++;
+ if (999 < $login && $login < 1440) { # 1440 = 60 Tage
+ $k++;
+ print $q->font( { -color=>"ffa500" }, $q->b( "$j($k) $_ Letztes Login vor: ".$login."h") ), $q->br, "\n" if ($full ne undef);
+ } elsif ($login < 48) {
+ $l++;
+ print $q->font( { -color=>"ffffef" }, $q->b( "$j($l) $_ Letztes Login vor: ".$login."h") ), $q->br, "\n" if ($full ne undef);
+ } elsif ($login < 1440) {
+ print "$j $_ Letztes Login vor: ".$login."h", $q->br, "\n" if ($full ne undef);
+ } else {
+ $k++;
+ &kill($_,$i++,$login);
+ }
+ } elsif (-f "data/user/options/$_") {
+ &kill($_,$i++);
+ }
+ }
+ print $q->hr if ($full ne undef);
+ print "</div>", $q->div( $q->b(
+ "$j Benutzer befinden sich in der Datenbank!", $q->br,
+ $q->font( { -color=>"ffffef" }, "$l Benutzer haben sich innerhalb der letzten 48 Stunden eingeloggt!"), $q->br,
+ $q->font( { -color=>"ffa500" }, "$k Benutzer haben sich &uuml;ber 1000 Stunden nicht mehr eingeloggt!"), $q->br,
+ $q->font( { -color=>"ff0000" }, "$i Benutzer wurden gerade eben gelöscht!") ), $q->br, $q->br,
+ "PS: Jeder registrierte Benutzername wird nur einmal gez&auml;hlt!" );
+ print $q->br, $q->div( "(", $q->a( { -href=>"stat.pl?var=del&tmp=true&alias=$alias&tmpid=$tmpid"}, "Vollst&auml;ndige Ansicht"), ")" ) if ($full eq undef);
+
+} elsif ($var eq "var") {
+
+ print "<div>", $q->b("Server Umgebungsvariablen:"), $q->br, $q->br;
+ while(($key,$value) = each(%ENV)) {
+ print "$key = $value\n", $q->br;
+ }
+ print "</div>";
+
+} elsif ($var eq "stat") {
+
+ print $q->div( $q->b("yChat-DB Statistik:") ), $q->br;
+ $files = 0;
+ $size = 0;
+ $directorys = 1;
+ &zaehle("data");
+ $size = sprintf("%.2f", ($size/1048576));
+ print $q->div( "Dateien insgesamt: $files", $q->br, "MB insgesamt: $size", $q->br, "Verzeichnisse insgesamt: $directorys");
+
+ } elsif ($var eq "code") {
+
+ print $q->div( $q->b("yChat Programmcode-Statistik:") ), $q->br;
+
+ my $zeilen;
+ my $size;
+ my $bytes;
+ my $files;
+
+ opendir(DIR,".");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ $dir = sort(@dir);
+
+ foreach(@dir) {
+ if (/.+[pl]$/ || /.+[pm]$/) {
+ $bytes = (-s);
+ $size += $bytes;
+ open(PL, "<$_");
+ my @pl = <PL>;
+ close PL;
+ local $nr = $#pl+1;
+ $zeilen += $nr;
+ $files++;
+ print $q->div("Datei $files: $nr Zeilen, $bytes Bytes"), $q->br, "\n";
+ }
+ }
+print $q->div( $q->b("Programmcode: $files Dateien, $zeilen Zeilen", $q->br, "Größe: $size Bytes") );
+
+}
+
+print $q->end_html;
+
+sub zaehle {
+ local ($dir,$data) = @_;
+ $dir = "$dir/$data" if ($data ne undef);
+ opendir(DATA,$dir);
+ local @data = readdir(DATA);
+ closedir(DATA);
+ $files2 = 0;
+ foreach(@data) {
+ if (-f "$dir/$_") {
+ $files++;
+ $files2++;
+ $size += (-s "$dir/$_");
+ } elsif (-d "$dir/$_" && $_ ne "." && $_ ne "..") {
+ $directorys++;
+ &zaehle($dir,$_);
+ }
+ }
+}
+
+sub kill {
+ my ($rm,$nr,$login) = @_;
+ $login = "XXXXXX" if ($login eq undef);
+ print $q->font( { -color=>"ff0000" }, $q->b( "$j($nr) $rm Letztes Login vor: ".$login."h (wurde gel&ouml;scht)") ), $q->br, "\n";
+ print "<font size='1'>";
+ print "options " if unlink("data/user/options/$rm");
+ print "profiles " if unlink("data/user/profiles/$rm");
+ print "gbooks " if unlink("data/user/gbooks/$rm");
+ print "counts " if unlink("data/user/counts/$rm");
+ print "counts.online " if unlink("data/user/counts/".$rm.".online");
+ print "lastlogin " if unlink("data/user/lastlogin/$rm");
+ print "memos" if unlink("data/user/memos/$rm");
+ print "</font>", $q->hr, "\n";
+ &zeit;
+ open(DEL, ">>data/kill");
+ print DEL "($day.$month.$year $hours:$min:$sec) $rm wurde automatisch gekillt [$alias]\n";
+ close DEL;
+} \ No newline at end of file
diff --git a/0.4.9/wa.gif b/0.4.9/wa.gif
new file mode 100644
index 0000000..2b1ba45
--- /dev/null
+++ b/0.4.9/wa.gif
Binary files differ
diff --git a/0.4.9/y.gif b/0.4.9/y.gif
new file mode 100644
index 0000000..356175d
--- /dev/null
+++ b/0.4.9/y.gif
Binary files differ
diff --git a/0.4.9/yIntro.swf b/0.4.9/yIntro.swf
new file mode 100644
index 0000000..d592826
--- /dev/null
+++ b/0.4.9/yIntro.swf
Binary files differ
diff --git a/0.4.9/ySymbol.swf b/0.4.9/ySymbol.swf
new file mode 100644
index 0000000..2b899bb
--- /dev/null
+++ b/0.4.9/ySymbol.swf
Binary files differ
diff --git a/0.4.9/y_.gif b/0.4.9/y_.gif
new file mode 100644
index 0000000..f8b6ee5
--- /dev/null
+++ b/0.4.9/y_.gif
Binary files differ
diff --git a/0.6.0/CREDITS.txt b/0.6.0/CREDITS.txt
new file mode 100644
index 0000000..84ec216
--- /dev/null
+++ b/0.6.0/CREDITS.txt
@@ -0,0 +1,33 @@
+########################### yChat.de CREDITS ################################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+Vielen Dank an alle Personen, dir mit geholfen haben ( und immernoch helfen )
+yChat besser zu machen:
+
+ - Andreas Buchwald aka Anklepper, für ...
+ ... die Programmierung des "Nach-UntenScroll-JavaScripts", des
+ "Nachrichten-Verlauf-JavaScripts" im Texteingabeframe.
+ ... die technische Umsetzung, daß sich das Inputframe bei jedem
+ Textposting nicht wieder reloadet.
+ ... ein nettes JavaScript, welches erlaubt, Formularwerte
+ frameübergreifend zu ändern.
+ ... die Erstellung der Flashanimationen.
+ ... die Programmierung der Auto-Away- und der Auto-Logout Funktion.
+ ... die Optimierung der Statusgrafiken in der Onlineliste.
+ ( www.anklepper.de ).
+
+ - Dave aka Truhe, für ...
+ ... die Erstellung der Farbtabelle unter Chatoptionen inkl.
+ Auswähl-JavaScript!
+ ... die Erstellung einiger CSS.
+ ... die Unterstützung der Umsetzung der Auto-Away- und Auto-Logout
+ Funktion.
+ ... die Erstellung der "Chatiquette".
+ ... einige Bugfixes in JavaScript-Codes.
+ ( maligree.yi.org )
+
+ - Dommi für die Erstellung der Away-Grafik. Diese wurde jedoch nachträglich
+ von mir verfärbt :-)
+
+ - Larry Wall, für die Erfindung von Perl ! \ No newline at end of file
diff --git a/0.6.0/README.txt b/0.6.0/README.txt
new file mode 100644
index 0000000..b67f15e
--- /dev/null
+++ b/0.6.0/README.txt
@@ -0,0 +1,24 @@
+############################## yChat.de README ##############################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+Allgemeine Bedingungen bezgl. yChat:
+
+ - Das yChat-System darf ohne Erleubnis des Autors nicht auf irgendeiner Art
+ und Weise weitergegeben- oder eingesetzt werden.
+
+ - Wird das yChat-System eingesetzt, so darf es manipuliert werden, soweit
+ die Copyright-Hinweise des Autors, die Versionsbezeichnung und der Link
+ auf der Startseite nach www.home.yChat.de unverändert bleibt.
+ Ansonsten darf der gesamte Code manipuliert werden.
+
+ - Wird das yChat-System erlaubter Weise manipuliert, so muß das veränderte
+ Skript auf Anforderung an den Autor weitergegeben werden. Dieser darf
+ die Veränderungen in das Standard-yChat-System integrieren.
+
+ - Wird das yChat-System eingesetzt, su muß dem Autor die Location bzw. die
+ URL bekanntgegeben werden. Diese mit einer URL wwX.yChat.de verlinkt.
+ Wobei X für die Nummer des jew. Servers steht.
+
+ - Es ist verboten, Sourcecode aus dem yChat-System zu kopieren und
+ für andere, nicht von yChat abhängige Perl-Programme einzusetzen. \ No newline at end of file
diff --git a/0.6.0/SETUP.txt b/0.6.0/SETUP.txt
new file mode 100644
index 0000000..700b229
--- /dev/null
+++ b/0.6.0/SETUP.txt
@@ -0,0 +1,140 @@
+############################## yChat.de SETUP ###############################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+yChat findest Du im Internet unter der Adresse www.yChat.de. Bei Kritik,
+Anregungen oder Fragen bitte in das dort vorhandene Board posten oder eine
+E-Mail an die oben stehende Adresse senden. Ich bemühe mich, yChat so gut wie
+möglich zu machen und bin über Ratschläge immer sehr erfreut :-) ...
+
+Die Installation kann auf Unix-Systemen voll automatisch duchgeführt werden.
+Allerdings ist dafür ein Telnet-Zugang notwendig. Kopiere alle vorhandenen
+Dateien in das Verzeichnis cgi-bin/yChat und führe dann das Shellskript
+setup.sh mit dem Befehl ./setup.sh aus. Alle Verzeichnisse werden
+automatisch erstellt. Dies wurde allerdings nur auf SuSE Linux Systemen
+mit root-Zugriff getestet. Solltest Du ein anderes System verwenden oder
+den Chat auf einen virtuellen Webserver installieren wollen, dann mußt Du
+unter Umständen das Verzeichnis "../../htdocs/yChat" nach "../../yChat"
+in der setup.sh umbenennen. Ansonsten werden die dazugehörigen Grafikdateien
+falsch oder garnicht kopiert.
+
+Wenn Du keinen Telnet-Zugang hast, kannst Du hier die Verzeichnisse manuell
+einrichten:
+
+Folgende Basis-Dateien sind im Chat enthalten und müssen in das cgi-bin
+Verzeichnis kopiert werden. Z.B. nach ./cgi-bin/yChat/:
+
+config.pm => Configurationsdatei ("Shared subs")
+htdocs.pl => Generiert dynamische HTML-Inhalte
+index.pl => Startskript (Registrierung, Login, Chatframeset)
+input.pl => Skript für das Chateingabeframe
+main.pl => Hauptskript (Alle Hauptfunktionen des Chats)
+main2.pl => Skript für editieren der Benutzerdaten etc
+online.pl => Anzeige und Überprüfung der eingelogten Benutzer
+push.pl => Server-Push-Routine
+setup.sh => Dient zur automatischen Einrichtung des Chats
+stat.pl => Erstellt diverse Statistiken
+README.txt => Beinhaltet wichtige Informationen
+UPDATES.txt => Updateliste der verschiedenen Versionen
+CREDITS.txt => Personen, die geolfen haben yChat zu proggen
+SETUP.txt => Dieses Dokument
+chatiq.sno => Datei beinhaltet die Chatiquette
+colors.sno => Datei beinhaltet alle Farben in hex. für die Chatoptionen
+help.sno => Datei beinhaltet alle Chatbefehle
+
+Folgende Verzeichnisse müssen erstellt werden (chmod 777 sollte
+funktionieren):
+
+- Hier befinden sich alle für den Chat notwenidgen Daten:
+ ./cgi-bin/yChat/data/*
+
+- Hier befinden sich alle Logdateien, die vom Chat erstellt werden:
+ ./cgi-bin/yChat/data/logs/*
+
+- Hier befinden sich die Message-Dateien der eingelogten Benutzer:
+ ./cgi-bin/yChat/data/msgs/*
+
+- Hier befinden sich alle Daten der registrierten Benutzer:
+ ./cgi-bin/yChat/data/user/*
+
+- Hier wird abgespeichert, wie oft ein Benutzerprofil insgesant schon
+ aufgerufen wurde und wie lange die Chatter schon online waren:
+ ./cgi-bin/yChat/data/user/counts/*
+
+- Hier werden alle Memos abgespeichert.
+ ./cgi-bin/yChat/data/user/memos/*
+
+- Hier befinden sich alle Chat-Optionen und Passwörter der registrierten
+ Benutzer:
+ ./cgi-bin/yChat/data/user/options/*
+
+- Hier befinden sich alle Benutzerprofile der Benutzer:
+ ./cgi-bin/yChat/data/user/profiles/*
+
+- Hier befinden sich alle Gästebucheinträge der Benutzer:
+ ./cgi-bin/yChat/data/user/gbooks/*
+
+- Hier wird abgespeichert, wann der der jew. benutzer zum letzten mal das
+ System betreten hat.
+ ./cgi-bin/yChat/data/user/lastlogin/*
+
+- Hier befinden sich alle Daten zu den aktuellen Chaträumen und User die
+ online sind
+ ./cgi-bin/yChat/data/online/*
+
+- Verzeichnis für die Raumstatusdateien. Hier wird abgespeichert:
+ Raumbesetzer, Away (inkl. Away-Nachricht)und das Raumthema.
+ ./cgi-bin/yChat/data/online/rstat/*
+
+ - Hier befinden sich die Chatter, die sich in den jew. Räumen befinden. Die
+ Verzeichnisse der Räume werden automatisch erstellt.
+ ./cgi-bin/yChat/data/online/rooms/*
+
+- Hier befinden sich alle PIDs (Process IDs) der Chatter in den jew. Räumen.
+ ./cgi-bin/yChat/data/online/pids/*
+
+- Hier befinden sich alle Chatter, die sich z.Z. im System befinden
+ ./cgi-bin/yChat/data/online/users/*
+
+- Hier befinden sich alle IP-Nummern und TempIDs der eingelogten Chatter
+ ./cgi-bin/yChat/data/online/ident/*
+
+Alle Grafik- und Multimediadateien (*.gif, *.jpg, *.swf) sollten in ein
+nicht-CGI-BIN-Verzeichnis
+ kopiert werden. Z.B. nach ./yChat/.
+
+Zum schluß sollte die config.pm-Datei nach wünschen editiert werden.
+Allerdings sollten die Copyright Hinweise und die Versionsnummern nicht
+manipuliert werden.
+
+Im Folgendem werde ich ein wenig auf die im yChat-Sourcecode oft verwendeten .
+Variablen eingehen:
+
+ $var => Sagt dem Skript, wie es gestartet werden soll.
+ $alias => Teilt dem Skript den Benutzername mit.
+ $tmpid => Beim einloggen in den Chat wird für den Benutzer eine
+ temporäre ID generiert. Diese wird so wohl in der Variable
+ $tmpid als auch in eine Datei geschrieben. Handelt der
+ Benutzer, so wird vom Skript die Variable $tmpid mit dem
+ Eintrag in der Datei verglichen. Sind beide Werte
+ identisch, dann wird die Handlung des Benutzers
+ ausgeführt. Stimmen die Werte nicht überein, dann wird
+ die Fehlermeldung, daß der Benutzer die falsche $tmpid hat
+ um mit $alias zu handeln,ausgegeben und das Skript beendet
+ sich. Dies ist eine Sicherheitsmaßnahme welche verbietet,
+ mit fremden Benutzernamen im System zu handeln.
+ $room => Sagt dem Skript, wie der aktuelle Raumname lautet.
+ $col => Sagt dem Skript, wie die aktuelle Chatfarbe des Nicks von
+ $alias lautet.
+ $seccol => Sagt dem Skript, wie die aktuelle Chatfarbe der Schrift von
+ $alias lautet.
+ $msg => Beinhaltet den von $alias zu postenden Text im Chat.
+ Hiervon wird auch in den Benutzergästebüchern und im
+ Benutzerboard Gebrauch gemacht.
+ $whisper => Beinhaltet den Benutzernamen, zu dem $alias zuletzt
+ geflüstert hat.
+ $id und $tmp => Temporäre Variablen zwecks Übermittlung diverser Daten.
+ $pw => Wird im Skript index.pl verwendet um das Zugangspassword
+ zu übermitteln.
+
+Viel Spaß beim Chatten ... \ No newline at end of file
diff --git a/0.6.0/TODO.txt b/0.6.0/TODO.txt
new file mode 100644
index 0000000..4538bea
--- /dev/null
+++ b/0.6.0/TODO.txt
@@ -0,0 +1,32 @@
+############################## yChat.de TODO ################################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+Folgende Funktionen werden demnächst evtl. in yChat integriert:
+
+ - OOP bei den HTML-Eingabeformularen und dem Menü.
+
+ - Kein CGI.pm im main.pl und config.pm.
+
+ - Die Schlucht (Ein Raum wo Chatter hineingeworfen werden,
+ die sich nicht benehmen und noch nicht aus dem Chat
+ katapultiert werden sollen).
+
+ - IP-Adressen ver-/entbannen.
+
+ - E-Mail zusendung bei verlorenem Passwort.
+
+ - Unter "Benutzer" sollen Chatter über eine Eingabemaske nach dem
+ Anfangsbuchstaben gesucht werden können (vergl. Kilahu).
+
+ - Linux- und Windows-yChat-Client soll programmiert werden. Mit diesem läßt
+ sich dann im yChat chatten, ohne sich über http://www.yChat.de eingelogt zu
+ haben. Der Client soll gleicheitig auch als Messenger (ICQ-Like) fungieren
+ können (yChat-Messenger bzw. yCM).
+
+ - Der Cybarkeeper (künstlich intilligenter Chatroboter, der
+ sich im Hauptraum Cyberbar aufhält, virtuelle Drinks verteilt
+ und von Real-Chattern übernommen werden kann. (Zukunftsmusik)
+
+Für weitere Vorschläge bitte in das yChat-Board unter www.yChat.de
+texten oder eine E-Mail an mail@paulbuetow.de :-) \ No newline at end of file
diff --git a/0.6.0/UPDATES.txt b/0.6.0/UPDATES.txt
new file mode 100644
index 0000000..1bb6902
--- /dev/null
+++ b/0.6.0/UPDATES.txt
@@ -0,0 +1,249 @@
+########################### yChat.de UPDATE LIST ###########################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+Hier sind alle Erneuerungen der Versionen dokumentiert:
+
+Update von 0.4.9 auf 0.6.0 (22.02.01)
+ - Auf der Startseite wird angezeigt, wer alles eingeloggt ist.
+ - Das Skript 'online.pl' wurde komplett überarbeitet.
+ - Viele Programmteile des gesamten Systems wurden überarbeitet und
+ optimiert.
+ - Der Chat hat den neuen Menüpunkt "Chatiquette" bekommen, dort
+ stehen die wichtigsten Verhaltensregeln für Chatter.
+ - Oberwächter können in der "Statistik" die Serverumgebungsvariablen
+ einsehen.
+ - Erweiterung der Errorlogfunktion.
+ - Neue Befehle: mit "/banip Alias" wird ie IP-Nummer von Alias aus
+ dem Chat verbannt. Mit "/rbanip ip://x.x.x.x" wird diese IP-Nummer
+ entbannt. Mir "/rban ip://x.x.x.x" läßt sich eine verbannte
+ IP-Nummer zwar auch entbannen, diese wird jedoch allen Chattern
+ offen präsentiert. Die verbannten IP-Nummern sind mit dem bisher
+ bekannten Befehl "/ban" einzusehen. Die Liste der verbannten
+ IP-Nummern befindet sich in der Datei "data/ban".
+ - Die Liste der Chatbefehle wurde übersichtlicher gemacht.
+ - Noch zufälligere TempIDs.
+ - Bei "/kill Alias" wird Alias auch aus der Datei "data/ban"
+ entfernt.
+
+Update von 0.4.8 auf 0.4.9 (11.02.01)
+ - "/online Alias" zeigt die Onlinezeit in Stunden, nicht mehr in
+ Minuten an.
+ - Hinzufügung des Statistikskripts "stat.pl" unter dem Menüpunkt
+ "Statistik". Das Top 40 - PHP Skript wurde nicht mehr benötigt und
+ gelöscht.
+ - Neue Befehle: /me/ und /m/ (Müssen inmitten des Textes eingegeben
+ werden.)
+ - Wird ein Benutzer aus dem Chat gekillt, so wird dies in der Datei
+ "data/kill" protokolloert.
+ - In der main.pl wird die Datei "config.pm" per "require" nur noch
+ in das Dokument eingefügt, wenn es notwendig ist.
+ - In der Onlineliste neben dem Raumnamen steht nun, wieviele Benutzer
+ sich im aktuellen Raum befinden. Ausserdem wird in der Onlineliste
+ angezeigt, ob ein Benutzer abgemeldet ist oder nicht und welche
+ Rechte er hat. Die Onlineliste ist nun Alphabetisch sortiert.
+ - Wird das Profil geändert und das http:// bei der Homepage-Adresse
+ vergessen, so wird dies automatisch hinzugefügt.
+ - Viele Bugfixes.
+
+Update von 0.4.7 auf 0.4.8 (26.01.01)
+ - Top 20 Ranking Liste in PHP4.
+ - Überarbeitung des Flash-Intros.
+ - PIDs für die Signalhandler werden zuverlässiger abgespeichert und
+ ggf. wieder gelöscht.
+ - Das push.pl-Skript (endlosschleife) benötigt nun nurnoch halb so
+ viel Speicher beim Ausführen. Die Datei config.pm wird nicht mehr
+ mit "require config;" eingebunden.
+ - Benutzernamen dürfen maximal nurnoch 15 Zeichen lang sein.
+ - Chatnachrichten dürfen maximal nurnoch 300 Zeichen lang sein.
+ - Wenn ein Benutzer eine Nachricht textet, überprüft das System, ob
+ derjenige sich auch wirklich im jew. Raum befindet.
+ - In den Chatoptionen kann man zusätzliche Einstellungen vornehmen:
+ 1.) Anzahl der Nachrichten im Nachrichten-Verlauf
+ 2.) Anordnung der Nachrichten im Nachrichten-Verlauf.
+ Neueinstellungen dieser Optionen werden erst nach einem
+ Neueinloggen aktiv.
+ - Die Error-Logdatei "data/error" wurde erweitert.
+
+Update von 0.4.6 auf 0.4.7 (20.01.01)
+ - Auto-Away: Ist ein Chatter 5 Minuten inaktiv, dann erscheint im
+ aktuellen Raum die Nachricht "Alias wurde vom System
+ abgemeldet ..." . Bei Wiederaufnahme des Chats, meldet sich Alias
+ wieder zurück.
+ - Auto-Logout: Ist ein Chatter 20 Minuten inaktiv, dann wird dieser
+ aus dem System automatisch ausgelogt.
+ - Neue CSS für die Formulareingabefelder und dem Chat-Menü.
+ (Funktioniert allerdings nicht mit NN4.x, hier werden alle
+ Formulareingabefelder ohne CSS-Definitionen angezeigt.)
+
+Update von 0.4.5 auf 0.4.6 (18.01.01)
+ - Verbesserung: Beim Posten einer neuen Chatnachricht wird sogleich
+ ein Signal an alle laufenden Chatprozesse (PIDs) gesendet, so daß
+ diese aufgefordert werden, aus der Nachrichtendatei die neuen
+ Zeilen einzulesen. Das Push-Skript (push.pl) muß so nicht jede
+ Sekunde prüfen, ob neue Nachrichten da sind, da es diese
+ Information über das Signal erhält. Das Push-Skript verbraucht nun
+ weniger Prozessorleistung, da es jetzt 15 Sekunden lang
+ "dauerschläft" (sleep 15;), lediglich einen <!--PING--> versendet
+ und dann weiter schläft usw. Beendet sich push.pl, oder wird ein
+ Raum gewechselt, dann wird auch die PID aus der PID-Liste des
+ aktuellen Raums gelöscht und ggf. neu geschrieben.
+ Die Dateien "./data/online/pids/*" beinhalten alle aktuellen PIDs,
+ wobei * der jew. Raum ist.
+
+Update von 0.4.4 auf 0.4.5 (16.01.01)
+ - Jeder Chatraum hat nun eine globale Nachrichtendatei. Bisher
+ existierte für jeden Chatter enzelnd eine. Die Nachrichten werden
+ nun schneller gepostet.
+ - Neue Wächterbefehle:
+ "/st Raum Thema" ermöglicht das Ändern das Themas eines anderen
+ Raums.
+ "/sl Raum" ermöglicht das auf- und absperren eines anderen Raums.
+ - Nur noch Oberwächter können die Chatlogs lesen.
+ - Referenzierung der Variable $msg in main.pl.
+ - Flashanimationen.
+
+Update von 0.4.3 auf 0.4.4 (04.01.01)
+ - Optimiertung aller Chatbefehle.
+ - Neuer WÄ-Befehl: Mit "/ss Raum Nachricht" wird aus dem aktuellen
+ Raum heraus in den angegebenen Raum eine beliebige Nachricht
+ gerufen.
+ - Das Skript main.pl wurde in zwei verschiedene Skripts unterteilt:
+ main.pl => Beinhaltet hauptsächlich die Chatbefehle
+ input.pl => Beinhaltet das zu generierende Chateingabeframe.
+ - Das Chateingabeframe wird nun nie wieder reloadet. (Dies geschah
+ bisher noch nach Ausführung der Befehle /col /j /ju /msg und nach
+ Änderung der Chateinstellungen und erwies sich als recht nervige
+ Angelegenheit.) JavaScript macht es möglich.
+ - Überarbeitung und Erweiterung der Dokudateien.
+
+Update von 0.4.2 auf 0.4.3 (30.12.2k)
+ - Optimierung der Zuweisung der Variabeln im Programmcode:
+ Variablen werden nun wirklich nur deffiniert, wenn diese auch
+ erforderlich sind.
+ - Komplette Neuprogrammierung diverser Subs (nun leistungsfähiger)
+ - Bei Aufrug der Login-Seite wird der gesamte Chat auf leerstehende
+ Räume und "alte" Chatter überprüft und ggf. entfernt.
+ - Verbesserung diverser JavaScript-Codes.
+ - Editiert ein Benutzer sein Profil, so wird dies mit der Meldung
+ "Alias hat sein Profil geändert ..." bekanntgegeben.
+ - Mit "/t" ohne weiteren Text erscheint die Nachricht "Alias hat das
+ Thema des Raums gelöscht ..."
+ - Hinzufügung diverser Administratorbefehle: "/pw Alias" zeigt
+ Zugangspassword von Alias an. "/ow Alias" ernennt Alias zum OW.
+ "/row Alias" entzieht Alias die OW-Rechte.
+
+Update von 0.4.1 auf 0.4.2 (25.12.2k)
+ - Im Texteingabeformular werden nun per JavaScript die letzten 10
+ Postings zwischengespeichert und können per Drop-Down-Menü
+ wieder in das Submittextfeld geladen werden um erneuert getextet
+ zu werden.
+ - Neues Design.
+ - Diverse Dateien wurden umbenannt:
+ INSTALL.txt -> SETUP.txt
+ LIESMICH.txt -> README.txt
+ - Die Datei CREDITS.txt wurde angelegt und somit auch die URL
+ www.credits.yChat.de.
+
+Update von 0.4.0 auf 0.4.1 (22.12.2k)
+ - Design wurde geändert.
+ - Unter "Optionen" ist nun eine komplette Farbtabelle eingebaut.
+ - Folgende Oberwächterbefehle wurden nun auch für normale Wächter
+ freigegeben: /ip /ban /rban.
+
+Update von 0.2.6 auf 0.4.0 (19.12.2k)
+ - Der berüchtigte "IP-Bug" wurde beseitigt! Und zwar wurden TempIDs
+ eingeführt => Eine dauerhafte Überprüfung der Benutzer-IP-Nummer
+ ist also nicht mehr notwendig.
+ - Die totale Chat-Online-Zeit wird protokolliert und kann jew. mit
+ "/online Alias" aufgerufen werden. Die Onlinezeit wird alle 20 Sek.
+ aktualisiert.
+ - Neue Befehle: "/seen Alias" zeigt an, vor wieviel St. sich Alias
+ zuletzt in das System eingelogt hat. Der Befehle "/rmgb" entfernt
+ alle Einträge des eigenen Benutzergästebuchs im Profil.
+
+Update von 0.2.5 auf 0.2.6 (17.12.2k)
+ - Das Eingabeframe reloaded sich nicht mehr nach jedem Posting.
+ Vielen Dank an Truhe aka Dave und Klepper aka Andreas Buchwald!
+ Bei den Chatbefehlen /col /away /j und /ju muß sich das
+ Eingabeframe weiterhin reloaden.
+ - Der Befehl // wurde entfernt. Dieser war nicht mehr erforderlich.
+ weil Nachrichten werden nur noch sehr selten verschluckt. Dieser
+ Chatbefehl postete die letzte Nachricht nocheinmal.
+ - Neuer Befehl: mit "/memo Alias hier der Text" hinterläßt man
+ Alias eine Memo. Logt sich Alias in den Chat ein, dann erhält
+ er diese sofort. Dafür wurde das Verzeichnis ".data/user/memos/"
+ angelegt.
+ - Programmcode wurde ein wenig optimiert.
+ - Das Design wurde ein wenig geändert.
+ - Beseitigung diverser Bugs.
+
+Update von 0.2.4 auf 0.2.5 (15.12.2k)
+ - Derjenige, der einen Raum zuerst betritt, hat Raumbesetzerrechte.
+ - Raumbesetzer, Wächter und Oberwächte können weitere Raumbesetzer
+ bestimmen. Diese können Raumbeseter auch wieder degradieren.
+ - Raumbesetzer, Wächter und Oberwächter können dem aktuellen Raum
+ auf/absperren und Themen geben. Wächter und Oberwächter können
+ abgesperrte Räume betreten.
+ - Das Verzeichnis ".data/htdocs" wurde entfernt. Die Datei help_html
+ heist nun help.sno und befindet sich im yChat-Hauptverzeichnis.
+ - Das Verzeichnis ".data/user/lastlogin" wurde hinzugefügt. Hier
+ wird beim erfolgreichen Einloggen ein "Timestamp" gesetzt. Später
+ sollen Oberwächter "veraltete" Benutzer entfernen können.
+ - Neuer Oberwächterbefehl: "/kill Alias" entfernt Alias ganz und gar
+ vom System. Oberwächter und Wächter können nicht entfernt werden.
+ - Perl-Cache wurde im gesamten System komplett deaktiviert ( Weniger
+ Ladezeiten der HTML-Dokumente ).
+ - Nur Nachrichten aus dem Raum "Cyberbar" werden gelogt.
+ Selbsterstellte Räume werden nichtmehr gelogt. Viele Logfunktionen
+ wurden entfernt (weniger Serverbalast).
+ - Beseitigung einiger kleinen Bugs.
+ - Unter "Optionen" im Chat wir die Farbe nun mit einem Drop-Down-Menü
+ ausgewählt ( Vielen dank an Michi aka Snoopy ).
+ - Auf der Startseite wird nun angezeigt wieviele Benutzer eingelogt
+ sind. Ist keiner eingelogt, dann wird das System "aufgeräumt". D.h.
+ Dateien die nicht mehr gebraucht werden und noch nicht gelöscht
+ wurden werden entfernt ( z.B. Nachrichtendateien der einzelnen
+ Chatter und die Dateien die die IP-Nummern der eingelogten Benutzer
+ beinhalteten usw.).
+ - Hunzufügung einer TODO-Liste. Hier sind mehrere Funktionen
+ vermerkt, die in späteren yChat-Versionen eingebaut werden sollen.
+ (www.todo.yChat.de oder TODO.txt).
+
+Update von 0.2.3 auf 0.2.4 (30.11.2k)
+ - Optimierung bzw. Verbesserung der Push-Routine push.pl.
+ - Server-Ping wurde von 2-Pings-per-Minute auf 4 erhöht.
+ - yChat-Banner wurde erstellt und ist unter
+ documents.yChat.de/yBanner.jpg vorzufinden.
+ - Unter der URL servers.yChat.de wurde eine Serverliste angelegt,
+ welche anzeigt wo yChat-Systeme laufen.
+ - Des weiteren wurden die URLs updates.yChat.de, install.yChat.de
+ und liesmich.yChat.de eingerichtet.
+ - Die Menüpunkte wurden zusammengefaßt, damit sie unter einer
+ Auflösung von 800x600 nur eine Zeile belegen.
+ - Einige Bugs wurden entfernt.
+
+Update von 0.2.2 auf 0.2.3 (25.11.2k)
+ - Smooth scrolling JavaScript ( Vielen Dank an Andreas Buchwald ).
+ - "IP#-Fehler" wurde so gut wie beseitigt.
+ - Aufrufe der einzelnen Benutzerprofile wird gezählt und angezeigt.
+ Diese werden in data/user/counts/* gespeichert.
+ - Automatische Einrichtung des Chats mit setup.sh und Telnet.
+ - Menüpunkt "Dein Profil" wurde entfernt da eigenes Profil auch
+ stets über die Onlineliste aufgerufen werden kann.
+
+Update von 0.2.1 auf 0.2.2 (23.11.2k)
+ - Einige Bugs wurden entfernt.
+ - Geschwindigkeit des Chats wurde optimiert.
+ - Eine Liste aller eingelogten Benutzer erscheint am Rand. Hierfür
+ wurde die Datei online.pl eingeführt. Sie aktuallisiert sich alle
+ 20 Sekunden.
+ - Die UPDATES.txt wurde eingeführt.
+
+Update von 0.2.0 auf 0.2.1
+ - Einige Bugs wurden entfernt.
+ - Die IP# der eingelogten Benutzer werden nun anders verwaltet.
+
+Update von Alpha XVIII auf 0.2.0
+ - Die Handhabung der eingelogten Benutzer im System wurde komplett neu
+ überarbeitet.
+ - Neue Versionsnumern wurden eingeführt. \ No newline at end of file
diff --git a/0.6.0/away.gif b/0.6.0/away.gif
new file mode 100644
index 0000000..10d460b
--- /dev/null
+++ b/0.6.0/away.gif
Binary files differ
diff --git a/0.6.0/chatiq.sno b/0.6.0/chatiq.sno
new file mode 100644
index 0000000..cf8be28
--- /dev/null
+++ b/0.6.0/chatiq.sno
@@ -0,0 +1 @@
+<style type="text/css"> li { color: #ffffff } </style> <div><h2>Chatiquette</h2></div> <hr> <div> Hier einige Grundlagen ...</div> <ul><li><div> Vergiss nie, dass am anderen Ende auch nur Menschen sitzen. Diese m&ouml;gen es gar nicht, angep&ouml;belt, beleidigt oder in sonstiger Weise angegriffen zu werden. </div></li> <li><div> St&ouml;rend ist auch immer, wenn ein privater Streit im Chat ausgetragen wird. Tragt eure privaten Sachen ausserhalb des Chats aus.<br>Selbst wenn es nur Spass ist - weiss der Rest im Chat das? </div></li> <li><div> Dauergeschrei f&auml;llt auch immer wieder st&ouml;rend auf. Was in Grossbuchstaben geschrieben wird, wird als Schreien bezeichnet. </div></li> <li><div> Unsere ganz besonderen Spezialisten wollen auch immer wieder rausfliegen. Um das zu erreichen, senden sie die ganze Zeit Unsinn. </div></li> <li><div> Diskussionen sind dagegen kein Problem. Daf&uuml;r ist ein Chat ja da. Sobald allerdings das Thema der Diskussion zu sehr entgleist, sollte die Diskussion in einen etwas weniger &ouml;ffentlichen Raum verlegt werden. </div></li> </ul><div> Daraus ergeben sich folgende Regeln: </div><ul> <li><div> keinen beleidigenden Wortschatz verwenden </div></li> <li><div> obz&ouml;ner und verfassungsfeindlicher Wortschatz f&auml;llt auch weg </div></li> <li><div> streitet euch woanders oder in einem privaten Raum </div></li> <li><div> schreit nich so viel </div></li> <li><div> schreibt keinen Unsinn, der so aussieht, als ob eure Katze über die Tastatur gelaufen ist </div></li> <li><div> schreibt nicht zu schnell hintereinander, besonders nicht dasselbe </div></li> <li><div> verlagert die Diskussion, wenn sich jemand gest&ouml;rt f&uuml;hlt </div></li> <li><div> Diese Liste ist nicht vollst&auml;ndig. Mit dem gesunden Menschenverstand sollte es eigentlich m&ouml;glich sein, sich die nicht aufgef&uuml;hrten Punkte zu denken. </div></li> </ul><div> So - nach den ganzen "lass-es-bessers" noch ein paar &Uuml;berlebenstips: </div><ul> <li><div> beachte die oben stehenden Punkte ;-) </div></li> <li><div> es macht sich immer gut, beim Reinkommen mal zu gr&uuml;ssen </div></li> <li><div> warte nicht, bis man/frau dich anspricht - werde selbst aktiv und gib deinen Senf dazu </div></li> <li><div> es gibt meist kein allgemein anerkanntes Gespr&auml;chsthema - lies dich einfach rein </div></li> <li><div> die frage &quot;wer will chatten&quot; ist eigentlich &uuml;berfl&uuml;ssig in einem Chat (wir warten doch alle nur aufs Ufo ;-) </div></li> <li><div> fang nich sofort mit den W-Fragen (woher, wie alt, weiblich oder männlich?) an - es st&ouml;rt einige Leute </div></li></ul> <div> Problematisch f&uuml;r die W&auml;chter und Oberw&auml;chter ist: </div><ul> <li><div> &quot;der nervt mich - schmeiss den mal raus&quot; ist oft nicht nachvollziehbar, weil der W&Auml; oder OW die Vorgeschichte - die vielleicht ausserhalb des yChat stattgefunden hat - nicht kennt oder keinen Beweis daf&uuml;r hat. </div></li></ul> <hr> <div><h2> Richtlinien f&uuml;r den gestressten W&Auml; und OW: </h2></div> <ul><li><div> Du hast die Macht - aber mi&szlig;brauche sie nicht! </div></li> <li><div> Leute, die ganz offensichtlich st&ouml;ren wollen und dabei den Chatbetrieb massiv behindern, sofort rausschmeissen! Kriterien dazu: </div> <ul><li><div> Fluten des Chats </div></li><li><div> Wiederholung von Parolen </div></li><li><div> Exzessive Nutzung von zuf&auml;lligen Buchstaben-/Zeichenfolgen </div></li> <li><div> usw... </div></li></ul> </li> <li><div> Bei den anderen vorher noch eine Warnung aussprechen... </div></li> <li><div> Nicht vergessen: auch f&uuml;r euch gelten die oben aufgef&uuml;hrten Regeln! </div></li> <li><div> Vergabe von Raumbesetzer- und W&auml;chterrechten:<br> (dies gilt f&uuml;r RB-Vergabe in der Cyberbar, W&Auml; allgemein) </div> <ul> <li><div> Um RB oder W&Auml; betteln wird schon mal gar nicht beachtet. </div></li> <li><div> Wer W&Auml; wird, soll sichs verdienen - z.B. durch h&auml;ufiges Helfen bei Neulingen. </div></li> <li><div> Ein W&Auml; sollte schon &ouml;fter im Chat sein. </div></li> <li><div> Oberw&auml;chter zu werden ist sehr schwierig. Frag gar nicht erst danach ;-) </div></li> </ul> </ul><div> Wer meint, von einem W&auml;chter oder Oberw&auml;chter ungerecht behandelt worden zu sein (z.B. weil dieser wegen persönlichen Streitigkeiten rausschmeisst), richte seine Klage an einen Oberw&auml;chter oder direkt an den obersten Boss: Snooper (<a href="mailto:admin@ychat.de">admin@ychat.de</a>). </div> </body> </html> \ No newline at end of file
diff --git a/0.6.0/colors.sno b/0.6.0/colors.sno
new file mode 100644
index 0000000..3640b9e
--- /dev/null
+++ b/0.6.0/colors.sno
@@ -0,0 +1,290 @@
+ <table cellspacing=0 cellpadding=5 border=0>
+ <tr>
+ <td bgcolor="000000"><span style="color:#FFFFFF; text-decoration:line-through;">000000</span></td>
+ <td bgcolor="000033"><span style="color:#FFFFFF; text-decoration:line-through;">000033</span></td>
+ <td bgcolor="000066"><span style="color:#FFFFFF; text-decoration:line-through;">000066</span></td>
+ <td bgcolor="000099"><span style="color:#FFFFFF; text-decoration:line-through;">000099</span></td>
+ <td bgcolor="0000CC"><span style="color:#FFFFFF; text-decoration:line-through;">0000CC</span></td>
+ <td bgcolor="0000FF"><a href="javascript:insertcode('0000FF');" style="color:#FFFFFF;">0000FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="003300"><span style="color:#FFFFFF; text-decoration:line-through;">003300</span></td>
+ <td bgcolor="003333"><span style="color:#FFFFFF; text-decoration:line-through;">003333</span></td>
+ <td bgcolor="003366"><span style="color:#FFFFFF; text-decoration:line-through;">003366</span></td>
+ <td bgcolor="003399"><a href="javascript:insertcode('003399');" style="color:#FFFFFF;">003399</a></td>
+ <td bgcolor="0033CC"><a href="javascript:insertcode('0033CC');" style="color:#FFFFFF;">0033CC</a></td>
+ <td bgcolor="0033FF"><a href="javascript:insertcode('0033FF');" style="color:#FFFFFF;">0033FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="006600"><span style="color:#FFFFFF; text-decoration:line-through;">006600</span></td>
+ <td bgcolor="006633"><span style="color:#FFFFFF; text-decoration:line-through;">006633</span></td>
+ <td bgcolor="006666"><a href="javascript:insertcode('006666');" style="color:#FFFFFF;">006666</a></td>
+ <td bgcolor="006699"><a href="javascript:insertcode('006699');" style="color:#FFFFFF;">006699</a></td>
+ <td bgcolor="0066CC"><a href="javascript:insertcode('0066CC');" style="color:#FFFFFF;">0066CC</a></td>
+ <td bgcolor="0066FF"><a href="javascript:insertcode('0066FF');" style="color:#FFFFFF;">0066FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="009900"><a href="javascript:insertcode('009900');" style="color:#FFFFFF;">009900</a></td>
+ <td bgcolor="009933"><a href="javascript:insertcode('009933');" style="color:#FFFFFF;">009933</a></td>
+ <td bgcolor="009966"><a href="javascript:insertcode('009966');" style="color:#FFFFFF;">009966</a></td>
+ <td bgcolor="009999"><a href="javascript:insertcode('009999');" style="color:#FFFFFF;">009999</a></td>
+ <td bgcolor="0099CC"><a href="javascript:insertcode('0099CC');" style="color:#FFFFFF;">0099CC</a></td>
+ <td bgcolor="0099FF"><a href="javascript:insertcode('0099FF');" style="color:#FFFFFF;">0099FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00CC00"><a href="javascript:insertcode('00CC00');" style="color:#000000;">00CC00</a></td>
+ <td bgcolor="00CC33"><a href="javascript:insertcode('00CC33');" style="color:#000000;">00CC33</a></td>
+ <td bgcolor="00CC66"><a href="javascript:insertcode('00CC66');" style="color:#000000;">00CC66</a></td>
+ <td bgcolor="00CC99"><a href="javascript:insertcode('00CC99');" style="color:#000000;">00CC99</a></td>
+ <td bgcolor="00CCCC"><a href="javascript:insertcode('00CCCC');" style="color:#000000;">00CCCC</a></td>
+ <td bgcolor="00CCFF"><a href="javascript:insertcode('00CCFF');" style="color:#000000;">00CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00FF00"><a href="javascript:insertcode('00FF00');" style="color:#000000;">00FF00</a></td>
+ <td bgcolor="00FF33"><a href="javascript:insertcode('00FF33');" style="color:#000000;">00FF33</a></td>
+ <td bgcolor="00FF66"><a href="javascript:insertcode('00FF66');" style="color:#000000;">00FF66</a></td>
+ <td bgcolor="00FF99"><a href="javascript:insertcode('00FF99');" style="color:#000000;">00FF99</a></td>
+ <td bgcolor="00FFCC"><a href="javascript:insertcode('00FFCC');" style="color:#000000;">00FFCC</a></td>
+ <td bgcolor="00FFFF"><a href="javascript:insertcode('00FFFF');" style="color:#000000;">00FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="330000"><span style="color:#FFFFFF; text-decoration:line-through;">330000</span></td>
+ <td bgcolor="330033"><span style="color:#FFFFFF; text-decoration:line-through;">330033</span></td>
+ <td bgcolor="330066"><span style="color:#FFFFFF; text-decoration:line-through;">330066</span></td>
+ <td bgcolor="330099"><a href="javascript:insertcode('330099');" style="color:#FFFFFF;">330099</a></td>
+ <td bgcolor="3300CC"><a href="javascript:insertcode('3300CC');" style="color:#FFFFFF;">3300CC</a></td>
+ <td bgcolor="3300FF"><a href="javascript:insertcode('3300FF');" style="color:#FFFFFF;">3300FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="333300"><span style="color:#FFFFFF; text-decoration:line-through;">333300</span></td>
+ <td bgcolor="333333"><span style="color:#FFFFFF; text-decoration:line-through;">333333</span></td>
+ <td bgcolor="333366"><a href="javascript:insertcode('333366');" style="color:#FFFFFF;">333366</a></td>
+ <td bgcolor="333399"><a href="javascript:insertcode('333399');" style="color:#FFFFFF;">333399</a></td>
+ <td bgcolor="3333CC"><a href="javascript:insertcode('3333CC');" style="color:#FFFFFF;">3333CC</a></td>
+ <td bgcolor="3333FF"><a href="javascript:insertcode('3333FF');" style="color:#FFFFFF;">3333FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="336600"><a href="javascript:insertcode('336600');" style="color:#FFFFFF;">336600</a></td>
+ <td bgcolor="336633"><a href="javascript:insertcode('336633');" style="color:#FFFFFF;">336633</a></td>
+ <td bgcolor="336666"><a href="javascript:insertcode('336666');" style="color:#FFFFFF;">336666</a></td>
+ <td bgcolor="336699"><a href="javascript:insertcode('336699');" style="color:#FFFFFF;">336699</a></td>
+ <td bgcolor="3366CC"><a href="javascript:insertcode('3366CC');" style="color:#FFFFFF;">3366CC</a></td>
+ <td bgcolor="3366FF"><a href="javascript:insertcode('3366FF');" style="color:#FFFFFF;">3366FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="339900"><a href="javascript:insertcode('339900');" style="color:#FFFFFF;">339900</a></td>
+ <td bgcolor="339933"><a href="javascript:insertcode('339933');" style="color:#FFFFFF;">339933</a></td>
+ <td bgcolor="339966"><a href="javascript:insertcode('339966');" style="color:#FFFFFF;">339966</a></td>
+ <td bgcolor="339999"><a href="javascript:insertcode('339999');" style="color:#FFFFFF;">339999</a></td>
+ <td bgcolor="3399CC"><a href="javascript:insertcode('3399CC');" style="color:#FFFFFF;">3399CC</a></td>
+ <td bgcolor="3399FF"><a href="javascript:insertcode('3399FF');" style="color:#FFFFFF;">3399FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33CC00"><a href="javascript:insertcode('33CC00');" style="color:#000000;">33CC00</a></td>
+ <td bgcolor="33CC33"><a href="javascript:insertcode('33CC33');" style="color:#000000;">33CC33</a></td>
+ <td bgcolor="33CC66"><a href="javascript:insertcode('33CC66');" style="color:#000000;">33CC66</a></td>
+ <td bgcolor="33CC99"><a href="javascript:insertcode('33CC99');" style="color:#000000;">33CC99</a></td>
+ <td bgcolor="33CCCC"><a href="javascript:insertcode('33CCCC');" style="color:#000000;">33CCCC</a></td>
+ <td bgcolor="33CCFF"><a href="javascript:insertcode('33CCFF');" style="color:#000000;">33CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33FF00"><a href="javascript:insertcode('33FF00');" style="color:#000000;">33FF00</a></td>
+ <td bgcolor="33FF33"><a href="javascript:insertcode('33FF33');" style="color:#000000;">33FF33</a></td>
+ <td bgcolor="33FF66"><a href="javascript:insertcode('33FF66');" style="color:#000000;">33FF66</a></td>
+ <td bgcolor="33FF99"><a href="javascript:insertcode('33FF99');" style="color:#000000;">33FF99</a></td>
+ <td bgcolor="33FFCC"><a href="javascript:insertcode('33FFCC');" style="color:#000000;">33FFCC</a></td>
+ <td bgcolor="33FFFF"><a href="javascript:insertcode('33FFFF');" style="color:#000000;">33FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="660000"><span style="color:#FFFFFF; text-decoration:line-through;">660000</span></td>
+ <td bgcolor="660033"><span style="color:#FFFFFF; text-decoration:line-through;">660033</span></td>
+ <td bgcolor="660066"><a href="javascript:insertcode('660066');" style="color:#FFFFFF;">660066</a></td>
+ <td bgcolor="660099"><a href="javascript:insertcode('660099');" style="color:#FFFFFF;">660099</a></td>
+ <td bgcolor="6600CC"><a href="javascript:insertcode('6600CC');" style="color:#FFFFFF;">6600CC</a></td>
+ <td bgcolor="6600FF"><a href="javascript:insertcode('6600FF');" style="color:#FFFFFF;">6600FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="663300"><a href="javascript:insertcode('663300');" style="color:#FFFFFF;">663300</a></td>
+ <td bgcolor="663333"><a href="javascript:insertcode('663333');" style="color:#FFFFFF;">663333</a></td>
+ <td bgcolor="663366"><a href="javascript:insertcode('663366');" style="color:#FFFFFF;">663366</a></td>
+ <td bgcolor="663399"><a href="javascript:insertcode('663399');" style="color:#FFFFFF;">663399</a></td>
+ <td bgcolor="6633CC"><a href="javascript:insertcode('6633CC');" style="color:#FFFFFF;">6633CC</a></td>
+ <td bgcolor="6633FF"><a href="javascript:insertcode('6633FF');" style="color:#FFFFFF;">6633FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="666600"><a href="javascript:insertcode('666600');" style="color:#FFFFFF;">666600</a></td>
+ <td bgcolor="666633"><a href="javascript:insertcode('666633');" style="color:#FFFFFF;">666633</a></td>
+ <td bgcolor="666666"><a href="javascript:insertcode('666666');" style="color:#FFFFFF;">666666</a></td>
+ <td bgcolor="666699"><a href="javascript:insertcode('666699');" style="color:#FFFFFF;">666699</a></td>
+ <td bgcolor="6666CC"><a href="javascript:insertcode('6666CC');" style="color:#FFFFFF;">6666CC</a></td>
+ <td bgcolor="6666FF"><a href="javascript:insertcode('6666FF');" style="color:#FFFFFF;">6666FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="669900"><a href="javascript:insertcode('669900');" style="color:#000000;">669900</a></td>
+ <td bgcolor="669933"><a href="javascript:insertcode('669933');" style="color:#000000;">669933</a></td>
+ <td bgcolor="669966"><a href="javascript:insertcode('669966');" style="color:#000000;">669966</a></td>
+ <td bgcolor="669999"><a href="javascript:insertcode('669999');" style="color:#000000;">669999</a></td>
+ <td bgcolor="6699CC"><a href="javascript:insertcode('6699CC');" style="color:#000000;">6699CC</a></td>
+ <td bgcolor="6699FF"><a href="javascript:insertcode('6699FF');" style="color:#000000;">6699FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66CC00"><a href="javascript:insertcode('66CC00');" style="color:#000000;">66CC00</a></td>
+ <td bgcolor="66CC33"><a href="javascript:insertcode('66CC33');" style="color:#000000;">66CC33</a></td>
+ <td bgcolor="66CC66"><a href="javascript:insertcode('66CC66');" style="color:#000000;">66CC66</a></td>
+ <td bgcolor="66CC99"><a href="javascript:insertcode('66CC99');" style="color:#000000;">66CC99</a></td>
+ <td bgcolor="66CCCC"><a href="javascript:insertcode('66CCCC');" style="color:#000000;">66CCCC</a></td>
+ <td bgcolor="66CCFF"><a href="javascript:insertcode('66CCFF');" style="color:#000000;">66CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66FF00"><a href="javascript:insertcode('66FF00');" style="color:#000000;">66FF00</a></td>
+ <td bgcolor="66FF33"><a href="javascript:insertcode('66FF33');" style="color:#000000;">66FF33</a></td>
+ <td bgcolor="66FF66"><a href="javascript:insertcode('66FF66');" style="color:#000000;">66FF66</a></td>
+ <td bgcolor="66FF99"><a href="javascript:insertcode('66FF99');" style="color:#000000;">66FF99</a></td>
+ <td bgcolor="66FFCC"><a href="javascript:insertcode('66FFCC');" style="color:#000000;">66FFCC</a></td>
+ <td bgcolor="66FFFF"><a href="javascript:insertcode('66FFFF');" style="color:#000000;">66FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="990000"><a href="javascript:insertcode('990000');" style="color:#FFFFFF;">990000</a></td>
+ <td bgcolor="990033"><a href="javascript:insertcode('990033');" style="color:#FFFFFF;">990033</a></td>
+ <td bgcolor="990066"><a href="javascript:insertcode('990066');" style="color:#FFFFFF;">990066</a></td>
+ <td bgcolor="990099"><a href="javascript:insertcode('990099');" style="color:#FFFFFF;">990099</a></td>
+ <td bgcolor="9900CC"><a href="javascript:insertcode('9900CC');" style="color:#FFFFFF;">9900CC</a></td>
+ <td bgcolor="9900FF"><a href="javascript:insertcode('9900FF');" style="color:#FFFFFF;">9900FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="993300"><a href="javascript:insertcode('993300');" style="color:#FFFFFF;">993300</a></td>
+ <td bgcolor="993333"><a href="javascript:insertcode('993333');" style="color:#FFFFFF;">993333</a></td>
+ <td bgcolor="993366"><a href="javascript:insertcode('993366');" style="color:#FFFFFF;">993366</a></td>
+ <td bgcolor="993399"><a href="javascript:insertcode('993399');" style="color:#FFFFFF;">993399</a></td>
+ <td bgcolor="9933CC"><a href="javascript:insertcode('9933CC');" style="color:#FFFFFF;">9933CC</a></td>
+ <td bgcolor="9933FF"><a href="javascript:insertcode('9933FF');" style="color:#FFFFFF;">9933FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="996600"><a href="javascript:insertcode('996600');" style="color:#FFFFFF;">996600</a></td>
+ <td bgcolor="996633"><a href="javascript:insertcode('996633');" style="color:#FFFFFF;">996633</a></td>
+ <td bgcolor="996666"><a href="javascript:insertcode('996666');" style="color:#FFFFFF;">996666</a></td>
+ <td bgcolor="996699"><a href="javascript:insertcode('996699');" style="color:#FFFFFF;">996699</a></td>
+ <td bgcolor="9966CC"><a href="javascript:insertcode('9966CC');" style="color:#FFFFFF;">9966CC</a></td>
+ <td bgcolor="9966FF"><a href="javascript:insertcode('9966FF');" style="color:#FFFFFF;">9966FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="999900"><a href="javascript:insertcode('999900');" style="color:#000000;">999900</a></td>
+ <td bgcolor="999933"><a href="javascript:insertcode('999933');" style="color:#000000;">999933</a></td>
+ <td bgcolor="999966"><a href="javascript:insertcode('999966');" style="color:#000000;">999966</a></td>
+ <td bgcolor="999999"><a href="javascript:insertcode('999999');" style="color:#000000;">999999</a></td>
+ <td bgcolor="9999CC"><a href="javascript:insertcode('9999CC');" style="color:#000000;">9999CC</a></td>
+ <td bgcolor="9999FF"><a href="javascript:insertcode('9999FF');" style="color:#000000;">9999FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99CC00"><a href="javascript:insertcode('99CC00');" style="color:#000000;">99CC00</a></td>
+ <td bgcolor="99CC33"><a href="javascript:insertcode('99CC33');" style="color:#000000;">99CC33</a></td>
+ <td bgcolor="99CC66"><a href="javascript:insertcode('99CC66');" style="color:#000000;">99CC66</a></td>
+ <td bgcolor="99CC99"><a href="javascript:insertcode('99CC99');" style="color:#000000;">99CC99</a></td>
+ <td bgcolor="99CCCC"><a href="javascript:insertcode('99CCCC');" style="color:#000000;">99CCCC</a></td>
+ <td bgcolor="99CCFF"><a href="javascript:insertcode('99CCFF');" style="color:#000000;">99CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99FF00"><a href="javascript:insertcode('99FF00');" style="color:#000000;">99FF00</a></td>
+ <td bgcolor="99FF33"><a href="javascript:insertcode('99FF33');" style="color:#000000;">99FF33</a></td>
+ <td bgcolor="99FF66"><a href="javascript:insertcode('99FF66');" style="color:#000000;">99FF66</a></td>
+ <td bgcolor="99FF99"><a href="javascript:insertcode('99FF99');" style="color:#000000;">99FF99</a></td>
+ <td bgcolor="99FFCC"><a href="javascript:insertcode('99FFCC');" style="color:#000000;">99FFCC</a></td>
+ <td bgcolor="99FFFF"><a href="javascript:insertcode('99FFFF');" style="color:#000000;">99FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC0000"><a href="javascript:insertcode('CC0000');" style="color:#FFFFFF;">CC0000</a></td>
+ <td bgcolor="CC0033"><a href="javascript:insertcode('CC0033');" style="color:#FFFFFF;">CC0033</a></td>
+ <td bgcolor="CC0066"><a href="javascript:insertcode('CC0066');" style="color:#FFFFFF;">CC0066</a></td>
+ <td bgcolor="CC0099"><a href="javascript:insertcode('CC0099');" style="color:#FFFFFF;">CC0099</a></td>
+ <td bgcolor="CC00CC"><a href="javascript:insertcode('CC00CC');" style="color:#FFFFFF;">CC00CC</a></td>
+ <td bgcolor="CC00FF"><a href="javascript:insertcode('CC00FF');" style="color:#FFFFFF;">CC00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC3300"><a href="javascript:insertcode('CC3300');" style="color:#FFFFFF;">CC3300</a></td>
+ <td bgcolor="CC3333"><a href="javascript:insertcode('CC3333');" style="color:#FFFFFF;">CC3333</a></td>
+ <td bgcolor="CC3366"><a href="javascript:insertcode('CC3366');" style="color:#FFFFFF;">CC3366</a></td>
+ <td bgcolor="CC3399"><a href="javascript:insertcode('CC3399');" style="color:#FFFFFF;">CC3399</a></td>
+ <td bgcolor="CC33CC"><a href="javascript:insertcode('CC33CC');" style="color:#FFFFFF;">CC33CC</a></td>
+ <td bgcolor="CC33FF"><a href="javascript:insertcode('CC33FF');" style="color:#FFFFFF;">CC33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC6600"><a href="javascript:insertcode('CC6600');" style="color:#000000;">CC6600</a></td>
+ <td bgcolor="CC6633"><a href="javascript:insertcode('CC6633');" style="color:#000000;">CC6633</a></td>
+ <td bgcolor="CC6666"><a href="javascript:insertcode('CC6666');" style="color:#000000;">CC6666</a></td>
+ <td bgcolor="CC6699"><a href="javascript:insertcode('CC6699');" style="color:#000000;">CC6699</a></td>
+ <td bgcolor="CC66CC"><a href="javascript:insertcode('CC66CC');" style="color:#000000;">CC66CC</a></td>
+ <td bgcolor="CC66FF"><a href="javascript:insertcode('CC66FF');" style="color:#000000;">CC66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC9900"><a href="javascript:insertcode('CC9900');" style="color:#000000;">CC9900</a></td>
+ <td bgcolor="CC9933"><a href="javascript:insertcode('CC9933');" style="color:#000000;">CC9933</a></td>
+ <td bgcolor="CC9966"><a href="javascript:insertcode('CC9966');" style="color:#000000;">CC9966</a></td>
+ <td bgcolor="CC9999"><a href="javascript:insertcode('CC9999');" style="color:#000000;">CC9999</a></td>
+ <td bgcolor="CC99CC"><a href="javascript:insertcode('CC99CC');" style="color:#000000;">CC99CC</a></td>
+ <td bgcolor="CC99FF"><a href="javascript:insertcode('CC99FF');" style="color:#000000;">CC99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCCC00"><a href="javascript:insertcode('CCCC00');" style="color:#000000;">CCCC00</a></td>
+ <td bgcolor="CCCC33"><a href="javascript:insertcode('CCCC33');" style="color:#000000;">CCCC33</a></td>
+ <td bgcolor="CCCC66"><a href="javascript:insertcode('CCCC66');" style="color:#000000;">CCCC66</a></td>
+ <td bgcolor="CCCC99"><a href="javascript:insertcode('CCCC99');" style="color:#000000;">CCCC99</a></td>
+ <td bgcolor="CCCCCC"><a href="javascript:insertcode('CCCCCC');" style="color:#000000;">CCCCCC</a></td>
+ <td bgcolor="CCCCFF"><a href="javascript:insertcode('CCCCFF');" style="color:#000000;">CCCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCFF00"><a href="javascript:insertcode('CCFF00');" style="color:#000000;">CCFF00</a></td>
+ <td bgcolor="CCFF33"><a href="javascript:insertcode('CCFF33');" style="color:#000000;">CCFF33</a></td>
+ <td bgcolor="CCFF66"><a href="javascript:insertcode('CCFF66');" style="color:#000000;">CCFF66</a></td>
+ <td bgcolor="CCFF99"><a href="javascript:insertcode('CCFF99');" style="color:#000000;">CCFF99</a></td>
+ <td bgcolor="CCFFCC"><a href="javascript:insertcode('CCFFCC');" style="color:#000000;">CCFFCC</a></td>
+ <td bgcolor="CCFFFF"><a href="javascript:insertcode('CCFFFF');" style="color:#000000;">CCFFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF0000"><a href="javascript:insertcode('FF0000');" style="color:#FFFFFF;">FF0000</a></td>
+ <td bgcolor="FF0033"><a href="javascript:insertcode('FF0033');" style="color:#FFFFFF;">FF0033</a></td>
+ <td bgcolor="FF0066"><a href="javascript:insertcode('FF0066');" style="color:#FFFFFF;">FF0066</a></td>
+ <td bgcolor="FF0099"><a href="javascript:insertcode('FF0099');" style="color:#FFFFFF;">FF0099</a></td>
+ <td bgcolor="FF00CC"><a href="javascript:insertcode('FF00CC');" style="color:#FFFFFF;">FF00CC</a></td>
+ <td bgcolor="FF00FF"><a href="javascript:insertcode('FF00FF');" style="color:#FFFFFF;">FF00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF3300"><a href="javascript:insertcode('FF3300');" style="color:#FFFFFF;">FF3300</a></td>
+ <td bgcolor="FF3333"><a href="javascript:insertcode('FF3333');" style="color:#FFFFFF;">FF3333</a></td>
+ <td bgcolor="FF3366"><a href="javascript:insertcode('FF3366');" style="color:#FFFFFF;">FF3366</a></td>
+ <td bgcolor="FF3399"><a href="javascript:insertcode('FF3399');" style="color:#FFFFFF;">FF3399</a></td>
+ <td bgcolor="FF33CC"><a href="javascript:insertcode('FF33CC');" style="color:#FFFFFF;">FF33CC</a></td>
+ <td bgcolor="FF33FF"><a href="javascript:insertcode('FF33FF');" style="color:#FFFFFF;">FF33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF6600"><a href="javascript:insertcode('FF6600');" style="color:#000000;">FF6600</a></td>
+ <td bgcolor="FF6633"><a href="javascript:insertcode('FF6633');" style="color:#000000;">FF6633</a></td>
+ <td bgcolor="FF6666"><a href="javascript:insertcode('FF6666');" style="color:#000000;">FF6666</a></td>
+ <td bgcolor="FF6699"><a href="javascript:insertcode('FF6699');" style="color:#000000;">FF6699</a></td>
+ <td bgcolor="FF66CC"><a href="javascript:insertcode('FF66CC');" style="color:#000000;">FF66CC</a></td>
+ <td bgcolor="FF66FF"><a href="javascript:insertcode('FF66FF');" style="color:#000000;">FF66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF9900"><a href="javascript:insertcode('FF9900');" style="color:#000000;">FF9900</a></td>
+ <td bgcolor="FF9933"><a href="javascript:insertcode('FF9933');" style="color:#000000;">FF9933</a></td>
+ <td bgcolor="FF9966"><a href="javascript:insertcode('FF9966');" style="color:#000000;">FF9966</a></td>
+ <td bgcolor="FF9999"><a href="javascript:insertcode('FF9999');" style="color:#000000;">FF9999</a></td>
+ <td bgcolor="FF99CC"><a href="javascript:insertcode('FF99CC');" style="color:#000000;">FF99CC</a></td>
+ <td bgcolor="FF99FF"><a href="javascript:insertcode('FF99FF');" style="color:#000000;">FF99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFCC00"><a href="javascript:insertcode('FFCC00');" style="color:#000000;">FFCC00</a></td>
+ <td bgcolor="FFCC33"><a href="javascript:insertcode('FFCC33');" style="color:#000000;">FFCC33</a></td>
+ <td bgcolor="FFCC66"><a href="javascript:insertcode('FFCC66');" style="color:#000000;">FFCC66</a></td>
+ <td bgcolor="FFCC99"><a href="javascript:insertcode('FFCC99');" style="color:#000000;">FFCC99</a></td>
+ <td bgcolor="FFCCCC"><a href="javascript:insertcode('FFCCCC');" style="color:#000000;">FFCCCC</a></td>
+ <td bgcolor="FFCCFF"><a href="javascript:insertcode('FFCCFF');" style="color:#000000;">FFCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFFF00"><a href="javascript:insertcode('FFFF00');" style="color:#000000;">FFFF00</a></td>
+ <td bgcolor="FFFF33"><a href="javascript:insertcode('FFFF33');" style="color:#000000;">FFFF33</a></td>
+ <td bgcolor="FFFF66"><a href="javascript:insertcode('FFFF66');" style="color:#000000;">FFFF66</a></td>
+ <td bgcolor="FFFF99"><a href="javascript:insertcode('FFFF99');" style="color:#000000;">FFFF99</a></td>
+ <td bgcolor="FFFFCC"><a href="javascript:insertcode('FFFFCC');" style="color:#000000;">FFFFCC</a></td>
+ <td bgcolor="FFFFFF"><a href="javascript:insertcode('FFFFFF');" style="color:#000000;">FFFFFF</a></td>
+ </tr>
+</table> \ No newline at end of file
diff --git a/0.6.0/config.pm b/0.6.0/config.pm
new file mode 100644
index 0000000..6f79fb9
--- /dev/null
+++ b/0.6.0/config.pm
@@ -0,0 +1,314 @@
+# yChat - Copyright by Paul C. Bütow
+
+########################### Dieser Teil bestimmt die Standart-Variabeln.
+##STANDART-CONFIGURATION:## (CSS, Farben, Version etc.)
+###########################
+$datum = "22.02.01";
+$version = "0.6.0";
+$title = "yChat [$version]";
+$gfxpath = "../../yChat";
+$style = <<ENDCSS;
+<style type="text/css">
+ body { background-color: #005146 }
+ body.blank { background-color: #000000 }
+ body.online { background-color: #000000 }
+ div { font-family: arial, geneva, verdana, helvetiva; font-size: 12px; color: #ffffff }
+ div.b { font-weight: bold; color: #ffa500 }
+ a { color: #ffffef; }
+ a:hover { color: #ffffff; }
+ p { font-family:verdana, arial, geneva, helvetica, sans-serif; color:#FFFFFF; font-size:12px; }
+</style>
+<style type="text/css" media="all">
+ a { text-decoration: none; }
+ a:hover { text-decoration:underline; }
+ input { border:2px solid #000000; font-size:12px; color:#000000; background-color: #ffffff; height:23px; padding:2px;}
+ select { border:2px solid #000000; font-family:arial, verdana, helvetica; font-size:11px; color:#000000; height:21px; padding:2px;}
+</style>
+ENDCSS
+
+############### Dieser TeFil enthält Programmcode, der an verschiedenen
+##SHARED-SUBS## Stellen ausgeführt werden muß und jedem Skript zur
+############### Verfügung steht.
+
+sub printfile { # Liest eine externe Datei ein und gibt sie mit print aus
+ my ($file2print,$pagetitle,$bodyclass) = @_;
+ if ($pagetitle ne "") {
+ &start_html($pagetitle,$bodyclass);
+ }
+ open(FILE2PRINT,"<$file2print");
+ while(<FILE2PRINT>) {
+ print "$_\n";
+ }
+ close FILE2PRINT;
+}
+
+sub start_html { # Der HEADER einer HTML-Datei
+ print "<html><head><title>$title - $_[0]</title>$_[2]$style</head>";
+ if ($_[1] eq "start") {
+ print "<body onload=\"document.login.alias.focus();\">";
+ } elsif ($_[1] ne "") {
+ print "<body class=$_[1]>";
+ } else {
+ print "<body>";
+ }
+}
+
+sub post { # Öffentliche Nachricht posten.
+ my ($room,$msg2post,$secroom) = @_;
+ my @rooms = $room;
+ @rooms = ($room,$secroom) if ($room ne $secroom);
+ foreach $raum (@rooms) {
+ open(MSGFILE,">>data/msgs/$raum");
+ print MSGFILE "!<;".time."<;!<;!<;$msg2post<;\n";
+ close MSGFILE;
+ opendir(PID,"data/online/pids/$raum");
+ my @pids = readdir(PID);
+ closedir(PID);
+ foreach(@pids) {
+ if (-f "data/online/pids/$raum/$_") {
+ kill USR1 => $_;
+ }
+ }
+ }
+ &log($msg2post) if ($room eq "Cyberbar");
+}
+
+sub post_prv { # Private Nachricht posten (flüstern).
+ my ($alias2post,$msg2post) = @_;
+ opendir(DIR,"data/online/rooms");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach $raum (@dir) {
+ opendir(DIR,"data/online/rooms/$raum");
+ my @chatter = readdir(DIR);
+ closedir(DIR);
+ foreach $chatter (@chatter) {
+ if ($chatter eq $alias2post) {
+ open(MSGFILE,">>data/msgs/$raum");
+ print MSGFILE "$alias2post<;".time."<;!<;!<;$msg2post<;\n";
+ close MSGFILE;
+ opendir(PID,"data/online/pids/$raum");
+ my @pids = readdir(PID);
+ closedir(PID);
+ foreach(@pids) {
+ if (-f "data/online/pids/$raum/$_") {
+ kill USR1 => $_;
+ }
+ }
+ goto ENDPRV;
+ }
+ }
+ }
+ENDPRV:
+}
+
+sub log { # Protokollieren der Nachrichten etc.
+ my $msg2log = $_[0];
+ my $js;
+ &zeit;
+ ($msg2log,$js) = split(/<script/, $msg2log);
+ open(LOG,">>data/logs/$day.$month.$year");
+ print LOG "<br><font color=ffffef><i>($hours:$min:$sec)</i></font> $msg2log\n";
+ close LOG;
+}
+
+sub zeit { # Aktuelles Datum und Uhrzeit bestimmen.
+ ($sec, $min, $hours, $day, $month, $year) = (localtime)[0..5];
+ $month += 1;
+ $hours = "0".$hours if ($hours < 10);
+ $min = "0".$min if ($min < 10);
+ $sec = "0".$sec if ($sec < 10);
+ $day = "0".$day if ($day < 10);
+ $month = "0".$month if ($month < 10);
+ $year = $year - 100;
+ if ($year < 10) {
+ $year = "200".$year;
+ } else {
+ $year = "20".$year;
+ }
+}
+
+sub error { # Error-Ausgabe.
+ my $error_msg = $_[0];
+ &start_html( "Error: ($error_msg)" );
+ print $q->div( "Error: ($error_msg)" ),
+ $q->end_html;
+ open(ERROR,">>data/error");
+ flock(ERROR, 2);
+ print ERROR "Alias: $alias TempID: $tmpid File. $0 PID: $$ Time: ".time." Message: $error_msg \n";
+ close ERROR;
+ exit 0;
+}
+
+sub check_online { # Auf alte Räume und Chatter prüfen und ggf. entfernen.
+ open(PROVE,">data/online/prove");
+ print PROVE time;
+ close PROVE;
+ opendir(RAUMDIR, "data/online/rooms");
+ my @raumdir = readdir(RAUMDIR);
+ closedir(RAUMDIR);
+ foreach $raum (@raumdir) {
+ opendir(BENUTZERDIR, "data/online/rooms/$raum");
+ my @benutzerdir = readdir(BENUTZERDIR);
+ closedir(BENUTZERDIR);
+ my $raumleer= 1;
+ foreach $benutzer (@benutzerdir) {
+ if (-f "data/online/rooms/$raum/$benutzer") {
+ $raumleer = 0;
+ open (BENUTZER,"<data/online/rooms/$raum/$benutzer");
+ my $benutzerstamp = <BENUTZER>;
+ close BENUTZER;
+ if ($benutzerstamp < (time - 40)) {
+ unlink("data/online/$raum/$benutzer");
+ open (BENUTZER2,"<data/online/users/$benutzer");
+ my $benutzerstamp2 = <BENUTZER2>;
+ close BENUTZER2;
+ if ($benutzerstamp2 < (time - 40)) {
+ if ($benutzer ne $alias) {
+ &rm_alias($benutzer,$raum);
+ } else {
+ unlink("data/online/rooms/$raum/$benutzer");
+ }
+ &zeit;
+ &post($raum,"<i><font color=ffffff>($hours:$min:$sec) $benutzer hat den Chat verlassen ... </font></i>");
+ }
+ }
+ }
+ }
+ opendir(PIDS,"data/online/pids/$raum");
+ my @pids = readdir(PIDS);
+ closedir(PIDS);
+ if ($raumleer == 1) { # Falls Raum leer ist => entf.
+ rmdir("data/online/rooms/$raum");
+ unlink("data/online/rstat/$raum");
+ unlink("data/online/rstat/$raum.away");
+ unlink("data/msgs/$raum");
+ foreach(@pids) {
+ if (-f "data/online/pids/$raum/$_") {
+ unlink("data/online/pids/$raum/$_");
+ }
+ }
+ rmdir("data/online/pids/$raum");
+ } else {
+ foreach(@pids) {
+ unless (kill 0 => $_) {
+ unlink("data/online/pids/$room/$_");
+ }
+ }
+ }
+ }
+}
+
+sub rm_alias { # Falls Benutzer offline gegangen ist
+ my($benutzer,$raum) = @_;
+ unlink("data/online/rooms/$raum/$benutzer");
+ unlink("data/online/users/$benutzer");
+ unlink("data/online/ident/$benutzer");
+ &rm_rstat($benutzer,$raum);
+}
+
+sub rm_rstat { # Benutzer als Raumbesetzer austragen
+ my ($r_alias,$rstatroom) = @_;
+ open (RSTAT,"<data/online/rstat/$rstatroom");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ my @rstat2 = ($rstat[0],$rstat[1]);
+ for ($i=2;$i<=$#rstat;$i++) {
+ chomp($rstat[$i]);
+ push(@rstat2,$rstat[$i]."\n") if ($rstat[$i] ne $r_alias);
+ }
+ open (RSTAT,">data/online/rstat/$rstatroom");
+ flock(RSTAT, 2);
+ print RSTAT @rstat2;
+ close RSTAT;
+}
+
+sub rm_away { # Benutzer als Raumbesetzer austragen
+ my ($a_alias,$rstatroom) = @_;
+ open (AWAY,"<data/online/rstat/$rstatroom.away");
+ my @away = <AWAY>;
+ close AWAY;
+ my @away2;
+ foreach (@away) {
+ my @split = split(/<;/);
+ push(@away2, $_) if ($a_alias ne $split[0]);
+ }
+ open (AWAY,">data/online/rstat/$rstatroom.away");
+ print AWAY @away2;
+ close AWAY;
+}
+
+sub secure_checkid { # TmpID überprüfen
+ my ($alias2check,) = @_;
+ open(IDENT,"<data/online/ident/$alias2check");
+ my @ident = <IDENT>;
+ close IDENT;
+ if ($ident[1] ne $tmpid) {
+ &error("Falsche TempID!");
+ }
+}
+
+sub hierachie { # Chatter nach SU überprüfen.
+ open WA, "<data/wa";
+ my @was = <WA>;
+ close WA;
+ foreach(@was) {
+ chomp;
+ if ($_ eq $_[0]) {
+ return "wa";
+ }
+ }
+ open OW, "<data/ow";
+ my @ows = <OW>;
+ close OW;
+ foreach(@ows) {
+ chomp;
+ if ($_ eq $_[0]) {
+ return "ow";
+ }
+ }
+}
+
+sub prove_besetzer { # Prüfen, ob Benutzer Raumbesetzerrechte hat
+ my ($alias,$room,$method) = @_;
+ open DATEI,"<data/online/rstat/$room";
+ my @rstat = <DATEI>;
+ close DATEI;
+ if ($method eq "return_list") {
+ my @value;
+ for($i=2;$i<=$#rstat;$i++) {
+ push @value,$rstat[$i];
+ }
+ return @value;
+ }
+ for($i=2;$i<=$#rstat;$i++) {
+ chomp($rstat[$i]);
+ if ($rstat[$i] eq $alias) {
+ return 1;
+ }
+ }
+}
+
+sub prove_away { # Prüfen, ob Benutzer abgemeldet ist
+ my ($a_alias,$room,$method) = @_;
+ open(DATEI,"<data/online/rstat/$room.away");
+ @away = <DATEI>;
+ close DATEI;
+ if ($method eq "return_list") {
+ my %away;
+ foreach(@away) {
+ $away{$alias} = split(/<; /);
+ }
+ return %away;
+ }
+ my $alias, $away;
+ foreach(@away) {
+ if (/^$a_alias.*/) {
+ ($alias,$away) = split(/<; /);
+ chomp($away);
+ return $away;
+ }
+ }
+}
+
+# sub debug { open DEBUG,">data/debug"; while(@_) { chomp; print DEBUG "$_\n"; } close DEBUG;} \ No newline at end of file
diff --git a/0.6.0/help.sno b/0.6.0/help.sno
new file mode 100644
index 0000000..9f44f96
--- /dev/null
+++ b/0.6.0/help.sno
@@ -0,0 +1,60 @@
+<div>
+ Alle Chat-Befehle:
+</div>
+<hr>
+<table border=1>
+<tr><th><div>SU</div></th><th><div>Befehl</div></th><th><div>Beschreibung</div></th></tr>
+<tr><td><div>NC</div></td><td><div>/about</div></td><td><div>Zeigt aktuelle Version und andere Infos der Community an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/away <font color=red>Nachricht</font></div></td><td><div>Abmelden mit einer<font color=red>Abmeldenachricht</font></div></td></tr>
+<tr><td><div>NC</div></td><td><div>/clear</div></td><td><div>Bildschirm wird gelöscht</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/col <font color=red>XXXXXX</font> <font color=ffa500>XXXXXX</font></div></td><td><div>Farbe/n (<font color=red>Namensfarbe</font> / <font color=ffa500>Textfarbe</font>) wechseln. Angabe in Hexadezimal.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/date</div></td><td><div>Zeigt aktuelles Datum und Urzeit an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/j <font color=red>Raumname</font></div></td><td><div>Raum wechseln/erstellen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ju <font color=red>Alias</font></div></td><td><div>In den Raum wechseln/folgen, wo sich <font color=red>Alias</font> befindet.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/m <font color=red>Aktion</font></div></td><td><div>Handeln mit 2 Farben</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/me <font color=red>Aktion</font></div></td><td><div>Handeln mit einer Farbe</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/memo <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine <font color=ffa500>Memonachricht</font> hinterlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/msg <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine private <font color=ffa500>Nachricht</font> flüstern</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ <font color=ffa500>Nachricht</font></div></td><td><div>Eine private <font color=ffa500>Nachricht</font> demjenigen flüstern, dem zuletzt eine geflüstert wurde</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/online <font color=red>Alias</font></div></td><td><div>Zeigt Onlineminuten von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/q</div></td><td><div>Chat verlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/rmgb</div></td><td><div>Das eigene Gästebuch komplett weglöschen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/s <font color=red>Nachricht</font></div></td><td><div><font color=red>Nachricht</font> schreien</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/seen <font color=red>Alias</font></div></td><td><div>Zeigt an, vor wieviel Stunden sich <font color=red>Nachricht</font> zum letzten Mal in das System eingelogt hat</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/w</div></td><td><div>Zeigt an, wer sich im aktuellen Raum befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc <font color=red>Raum</font></div></td><td><div>Zeigt an, wer sich im <font color=red>Raum</font> befindet. Wird kein Raum angegeben, dann wird ledeglich angezeigt, wer sich im System befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc/</div></td><td><div>Zeigt alle offenen Räume und deren Chatter an</div></td></tr>
+<tr><td><div>NC</div></td><td> <div>/wj <font color=red>Alias</font></div></td><td><div>Zeigt an, in welchen Raum sich <font color=red>Alias</font> befindet</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/l</div></td><td><div>Der aktuelle Raum wird ab- bzw. aufgesperrt</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/rsu <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> die Raumbesetzerrechte entnehmen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/su <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Raumbesetzer ernennen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/t <font color=red>Thema</font></div></td><td><div>Dem aktuellen Raum wird ein <font color=red>Thema</font> gegeben</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban</div></td><td><div>Zeigt alle verbannten Benutzer an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> verbannen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/rban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> "entbannen"</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ip <font color=red>Alias</font></div></td><td><div>Zeigt die IP-Nummer von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/k <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird aus dem Chat katapultiert!</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/sl <font color=red>Raum</font></div></td><td><div>Einen anderen <font color=ffa500>Raum</font> absperren</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ss <font color=red>Raum</font> <font color=ffa500>Nachricht</font></div></td><td><div>Eine <font color=ffa500>Nachricht</font> in <font color=red>Raum</font> hinüber rufen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/st <font color=red>Raum</font> <font color=ffa500>Thema</font></div></td><td><div>Einem anderen <font color=ffa500>Raum</font> ein <font color=ffa500>Thema</font > geben</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/banip <font color=red>Alias</font></div></td><td><div>Die IP-Nummer von <font color=red>Alias</font> verbannen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/rbanip ip://<font color=red>x.x.x.x</font></div></td><td><div>Die IP-Nummer <font color=red>x.x.x.x</font> "entbannen"</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/kill <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird ganz und gar aus dem System entfernt</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/wa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Wächter ernennen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/rwa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom Wächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/sys <font color=red>Nachricht</font></div></td><td><div>Systemnachricht schreiben. (Erscheint in allen existierenden Räumen)</div></td></tr>
+</table><hr>
+<div>
+ Zur Erklärung: NC steht für "Normale Chatter", RB für "Raumbesetzer", WÄ für "Wächter" und OW für "Oberwächter".
+ Obrige Befehle können nur von der/den jeweiligen Benutzergruppe/n werden.<br><br>
+ Allerdings gibt es folgendes zu beachten: Oberwächter verfügen über alle Chatbefehle. Normale Wächter über alle Chatbefehle, außer über die der Oberwächter.
+ Raumbesetzer können nur Raumbesetzerbefehle und die Befehle der normalen Chatter durchführen. Normale Chatter haben jedeglich die Standardbefehle zu verwenden.<br><br>
+ Weitere Besonderheiten der Wächter und Oberwächter:<br><br>
+ Wächter und Oberwächter können ....<br>
+ ... abgesperrte Chaträume problemlos betreten.<br>
+ ... nicht gekickt, verbannt oder gekillt werden.<br><br>
+ Nur Oberwächer können Logdateien der Cyberbar lesen!<br><br>
+ Oberwächter ernennt nur der Systemadministrator!
+</div>
+</body>
+</html> \ No newline at end of file
diff --git a/0.6.0/htdocs.pl b/0.6.0/htdocs.pl
new file mode 100644
index 0000000..8476962
--- /dev/null
+++ b/0.6.0/htdocs.pl
@@ -0,0 +1,245 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print $q->header;
+
+$var = $q->param("var");
+
+if ($var eq "help_html") {
+ &printfile("help.sno","Alle Chatbefehle");
+} elsif ($var eq "logo_html") {
+ &start_html("Logo");
+print<<END;
+<layer top=-3 left=0><div style="position:absolute; top:5; left:10">
+<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
+ codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0"
+ WIDTH=48 HEIGHT=48>
+ <PARAM NAME=movie VALUE="$gfxpath/ySymbol.swf">
+ <PARAM NAME=loop VALUE=false>
+ <PARAM NAME=menu VALUE=false>
+ <PARAM NAME=quality VALUE=high>
+ <PARAM NAME=scale VALUE=noborder>
+ <PARAM NAME=wmode VALUE=opaque>
+ <PARAM NAME=bgcolor VALUE=#005146>
+ <EMBED src="$gfxpath/ySymbol.swf" loop=false menu=false quality=high scale=noborder wmode=opaque bgcolor=#005146
+ WIDTH=48 HEIGHT=48 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED>
+</OBJECT>
+</div></layer>
+END
+print $q->end_html;
+} elsif ($var eq "menu_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ $tmp = $q->param("tmp");
+ &menu_html;
+} elsif ($var eq "werda_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &werda_html;
+} elsif ($var eq "logs_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ &logs_html;
+} elsif ($var eq "view_logs_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $tmp = $q->param("tmp");
+ &secure_checkid($alias);
+ if (&hierachie($alias) eq "ow") {
+ &printfile($tmp,"Logdatei","blank");
+ }
+} elsif ($var eq "superuser_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ &superuser_html;
+} elsif ($var eq "chatiquette_html") {
+ &printfile("chatiq.sno","Chatiquette");
+} else {
+ print
+ $q->start_html(-bgcolor=>"000000"),
+ $q->end_html;
+}
+
+sub menu_html {
+if ($tmp eq "quit") {
+ &start_html("Quit","blank","<script language=\"JavaScript\">open(\"index.pl?tmp=quit\",\"_top\");</script>");
+ print $q->end_html;
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffffff>$alias verläßt den Chat ... </font></i>");
+ sleep 2;
+ &rm_alias($alias,$room);
+ exit;
+}
+ENDJS
+ &start_html("Menü","blank");
+print <<END;
+<script language="JavaScript">
+function fenster(fenster,target) {
+ open(fenster,target,"width=500,height=500,screenX=100,screenY=100,scrollbars");
+}
+</script>
+<font size=2 face=verdana><p>
+ <a href='javascript:fenster("htdocs.pl?var=werda_html&alias=$alias&room=$room&col=$col&secol=$secol&tmp=$tmp&tmpid=$tmpid","weristda")'>Wer ist da?</a>
+ <a href='javascript:fenster("main2.pl?var=edit_profile_html&alias=$alias&tmpid=$tmpid&room=$room","ProfilAendern")'>Profil ändern</a>
+ <a href='javascript:fenster("main2.pl?var=edit_options_html&alias=$alias&tmpid=$tmpid&room=$room","Optionen")'>Optionen</a>
+ <a href='javascript:fenster("main2.pl?var=list_alias_html&alias=$alias&tmpid=$tmpid","Benutzerliste")'>Benutzer</a>
+ <a href='javascript:fenster("htdocs.pl?var=help_html&tmpid=$tmpid","Befehle")'>Befehle</a>
+ <a href='javascript:fenster("main2.pl?var=gb_html&alias=$alias&tmpid=$tmpid","Board")'>Board</a><br>
+ <a href='javascript:fenster("htdocs.pl?var=superuser_html&alias=$alias&tmpid=$tmpid","Superuser")'>Superuser</a>
+ <a href='javascript:fenster("htdocs.pl?var=logs_html&alias=$alias&tmpid=$tmpid","Logdateien")'>Logs</a>
+ <a href='javascript:fenster("stat.pl?&alias=$alias&tmpid=$tmpid","Statistik")'>Statistik</a>
+ <a href='javascript:fenster("htdocs.pl?var=chatiquette_html","Chatiquette")'>Chatiquette</a>
+ <a href="http://www.home.yChat.de" target="Home">Home</a>
+ <a href="http://www.credits.yChat.de" target="Credits">Credits</a>
+ <a href="htdocs.pl?alias=$alias&var=menu_html&room=$room&tmpid=$tmpid&tmp=quit">Verlassen</a>
+</p></font>
+</body>
+</html>
+END
+}
+
+sub werda_html { # Anzeige, wer eingelogt ist.
+ &start_html("Wer ist da?");
+ print <<END;
+<div>
+ $alias, schön daß Du hier bist :-)
+</div>
+<hr>
+<div>
+ Folgende Personen befinden sich im Chat:
+</div>
+<br>
+<div>
+END
+ opendir(ROOMDIRS,"data/online/rooms");
+ local @roomdirs = readdir(ROOMDIRS);
+ close(ROOMDIRS);
+ foreach(@roomdirs) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ my $room = $_;
+ open(RSTAT,"<data/online/rstat/$room");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ opendir(ROOMDIR,"data/online/rooms/$room");
+ my @roomdir = readdir(ROOMDIR);
+ close(ROOMDIR);
+ local $nr = $#roomdir-1;
+ print $q->b( $_ ),
+ " $door ($nr) Raumthema: $rstat[1]",
+ $q->br;
+ foreach(@roomdir) {
+ if ($_ ne ".." && $_ ne ".") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid" }, "$_"), " ";
+ }
+ }
+ print $q->br, $q->br;
+ }
+ }
+ print
+ "</div>",
+ $q->end_html;
+}
+
+sub logs_html {
+ &start_html("Logdateien");
+ print <<END;
+<div>
+ Hier befinden sich alle Logdateien
+</div>
+<hr>
+END
+ if (&hierachie($alias) eq "ow") {
+ print $q->div( "Folgende Logdateien des Raumes \"Cyberbar\" können nur von Oberwächtern gelesen werden (Sortiert nach A-Z, a-z):" ),
+ $q->br;
+ opendir(LOGS,"data/logs");
+ local @logs = readdir(LOGS);
+ closedir(LOGS);
+ local @sortedir = sort(@logs);
+ foreach(@sortedir) {
+ if (-f "data/logs/$_") {
+ print $q->a( { -href=>"htdocs.pl?alias=$alias&var=view_logs_html&tmp=data/logs/$_&tmpid=$tmpid",
+ -target=>"_new" },
+ "$_" ),
+ " ";
+ }
+ }
+ } else {
+ print $q->div( "Logdateien können nur von Oberwächtern (OW) gelesen werden. Du bist jedoch ein Wächter (WÄ) oder ein",
+ "\"Normaler Chatter\". Oberwächter können alles nachlesen, was öffentlich im Raum \"Cyberbar\" gechattet wurde." ),
+ $q->hr;
+ &printfile("data/htdocs/logs_html");
+ }
+ print
+ $q->end_html;
+}
+
+sub superuser_html { # Zeigt an, wer Superuser ist
+ start_html("Superuser");
+ print "<div>Hallo $alias. Du bist als ";
+ if (hierachie($alias) eq "ow") {
+ print
+ $q->b( "Oberwächter" ),
+ " (OW) eingetragen.</div>",
+ $q->hr;
+ } elsif (hierachie($alias) eq "wa") {
+ print
+ $q->b( "Wächter" ),
+ " (WÄ) eingetragen.</div>",
+ $q->hr;
+ } else {
+ print
+ $q->b( "normaler Chatter" ),
+ " (NC) eingetragen.</div>",
+ $q->hr;
+ }
+
+ open WA, "<data/wa";
+ my @was = <WA>;
+ close WA;
+ open OW, "<data/ow";
+ my @ows = <OW>;
+ close OW;
+
+ my $nrow = $#ows+1;
+ print
+ "<div>",
+ $q->b( "OW" ),
+ "s ($nrow Stück)";
+ foreach(@ows) {
+ print
+ $q->font( { -color=>"ffa500" },
+ " ".$_);
+ }
+ my $nrwa = $#was+1;
+ print
+ "</div>",
+ $q->hr,
+ "<div>",
+ $q->b( "WÄ" ),
+ "s ($nrwa Stück)";
+ foreach(@was) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+print <<END;
+<hr>
+ Die jeweiligen Fähigkeiten der Oberwächter (OW) und der Wächter (WÄ) sind unter
+ "<a href="htdocs.pl?var=help_html">Chat-Befehle</a>"
+ dokumentiert.
+</div>
+</body>
+</html>
+END
+} \ No newline at end of file
diff --git a/0.6.0/index.pl b/0.6.0/index.pl
new file mode 100644
index 0000000..5440dd3
--- /dev/null
+++ b/0.6.0/index.pl
@@ -0,0 +1,446 @@
+#!/usr/bin/perl
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print $q->header;
+
+$var = $q->param("var");
+$alias = $q->param("alias");
+$pw = $q->param("pw");
+$tmp = $q->param("tmp");
+
+if ($var eq "create_alias_html") {
+ &create_alias_html;
+} elsif ($var eq "create_alias") {
+ &create_alias;
+} elsif ($var eq "login_html") {
+ $tmp = $q->param("tmp");
+ &login_html;
+} elsif ($alias eq "") {
+ &login_html;
+} else {
+ &checklogin;
+}
+
+sub login_html { # Erste Startseite
+&check_online;
+local $counter = undef;
+open(COUNT,"<data/count");
+ $counter = <COUNT>;
+close COUNT;
+$counter++;
+open(COUNT,">data/count");
+ flock(COUNT, 2);
+ print COUNT $counter;
+close COUNT;
+opendir(USERS,"data/online/users");
+ my @users = readdir(USERS);
+closedir(USERS);
+opendir(REGISTRED,"data/user/options");
+ local @registred = readdir(REGISTRED);
+closedir(REGISTRED);
+local ($logtin,$users) = ($#users-1,$#registred-1);
+&start_html("Created & Copyright by Paul C. Bütow","start");
+print <<END;
+ <center>
+ <table width=500>
+ <tr>
+ <td>
+ <center>
+ <table>
+ <tr>
+ <td>
+ <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0" WIDTH=240 HEIGHT=240>
+ <param name=movie value="$gfxpath/yIntro.swf">
+ <param name=loop value=false>
+ <param name=menu value=false>
+ <param name=quality value=high>
+ <param name=scale value=noborder>
+ <param name=wmode value=opaque>
+ <param name=bgcolor value=#005146>
+ <embed src="$gfxpath/yIntro.swf" loop=false menu=false quality=high scale=noborder wmode=opaque bgcolor=#005146 WIDTH=240 HEIGHT=240 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED>
+ </object>
+ </td>
+ <td>
+ <div>
+ yChat: Version $version
+ <br><br>
+ Letztes Update: $datum
+ <br><br>
+ Seitenaufrufe: $counter
+ <br><br>
+ Benutzer registriert: $users
+ <br><br>
+ Benutzer online: $logtin
+ <br><br>
+ Webmaster: <a href="mailto:mail\@paulbuetow.de">Paul C. Bütow</a>
+ <br><br>
+ yChat-HP: <a href="http://www.home.yChat.de">home.yChat.de</a>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </center>
+ </div>
+ <br>
+ <br>
+END
+ if ($tmp eq "true") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Wahrscheinlich existiert Dein Alias "$alias" nicht,
+ <br>
+ Du hast Dich verschrieben oder das Passwort ist falsch.
+ <br>
+ Versuch es erneuert !
+ </div>
+END
+ } elsif ($tmp eq "quit") {
+print <<END;
+ <div>
+ Du hast soeben den Chat verlassen.
+ <br>
+ Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ } elsif ($tmp eq "autologout") {
+print <<END;
+ <div>
+ Du wurdest automatisch aus dem Chat ausgeloggt. Grund: Du warst 20 Minuten inaktiv.
+ <br>
+ Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ } elsif ($tmp eq "banned") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wurdest aus dem Chat verbannt!!!
+ <br>
+ Z.z. kannst Du Dich leider nicht in den Chat einloggen.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($tmp eq "kick") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wurdest soeben aus dem Chat katapultiert!
+ <br>
+ Schlechtes Verhalten mag die Ursache hierfür sein.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($var eq "create_alias") {
+print "<div>Du hast sich soeben in die Datenbank eingetragen. Einfach auf \"Los Geht's\" klicken :-)</div>";
+ } else {
+print <<END;
+ <div>
+ Herzlich willkommen!
+ <br>
+ Einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <form name="login" action="index.pl" method="post">
+ <input type="hidden" name="tmp" value="true">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Alias:
+ <br>
+ <input name="alias" value="$alias">
+ </div>
+ </td>
+ <td>
+ <div>
+ Dein Passwort:
+ <br>
+ <input type="password" name="pw" value="$pw">
+ </div>
+ </td>
+ </tr>
+ </table>
+ <br>
+ <br>
+ <div>
+ Solltest Du noch keinen Nick besitzen, dann auf "Registrieren" klicken!
+ </div>
+ <br>
+ <table>
+ <tr>
+ <td>
+ <font color="ffffff">
+ <input type="submit" value="Los geht's!">
+ </font>
+ </form>
+ </td>
+ <td>
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias_html">
+ <font color="ffffff">
+ <input type="submit" value="Registrieren">
+ </font>
+ </form>
+ </td>
+ </tr>
+ </table>
+ <hr>
+END
+if ($logtin > 0) {
+ print "<div>Folgende Personen sind eingeloggt:<br><font size='1'>";
+ foreach(@users) {
+ print "$_ " if (-f "data/online/users/$_");
+ }
+ print "</font></div>";
+}
+print<<END;
+ </td>
+ </tr>
+ </table>
+ </center>
+</body>
+</html>
+END
+ if (-d "data/online/rooms") {
+ } else {
+ mkdir "data/online/rooms", 0777;
+ }
+}
+
+
+sub create_alias_html { # HTML-Form für Erstellung eines neuen Benutzers.
+my $reload = $_[0];
+&start_html("Registration");
+print <<END;
+ <center>
+ <table width=500>
+ <tr>
+ <td>
+END
+ if ($reload eq "alias_exists") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Der von Dir gewählte Benutzername "$alias" existiert in unserer Datenbank bereits. Bitte versuch es erneuert mit
+ einem anderen Benutzernamen !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "pw_wrong") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Deine beiden Passworteingaben stimmen nicht überein. Bitte geb das Passwort erneuert an um sicherzugehen, daß
+ kein falsches Passwort abgespeichert wird !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "alias_prohibited") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein gewählter Benutername "$alias" enthält illegale Zeichen. Bitte versuch einen anderen Benutzernamen!
+ </div>
+ <hr>
+END
+} elsif ($reload eq "alias_length") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein gewählter Benutername "$alias" enthält zu viele Zeichen. Es sind maximal 15 Zeichen erlaubt!!
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Hier kannst Du Dich registrieren. Bitte beachte, daß die Passworteingabefelder übereinstimmen!
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias">
+ <div>
+ Dein Alias:
+ <font color="ffa500">
+ (Muß angegeben werden)
+ </font>
+ <br>
+ <input name="alias" VALUE="$alias">
+ </div>
+ <br>
+ <div>
+ Dein gewünschtes Passwort:
+ <br>
+ <input type="password" name="pw" value="$pw">
+ </div>
+ <br>
+ <div>
+ Geb hier Dein Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp">
+ </div>
+ <br>
+ <font color=ffffff>
+ <input type="submit" value="Registrieren">
+ </font>
+ <br>
+ </form>
+ <hr>
+ <div>
+ Um den Chat zu betreten müssen die Daten nach der Registration auf der Startseite erneuert bestätigt werden !
+ </div>
+ </td>
+ </tr>
+ </table>
+</center>
+</body>
+</html>
+END
+}
+
+sub checklogin { # Überprüfen, ob die Login-Daten korrekt sind.
+ my $lognotexists = "true";
+ opendir(USERDIR,"data/user/options");
+ my @userdir = readdir(USERDIR);
+ closedir(USERDIR);
+ foreach $user (@userdir) {
+ if ($user eq $alias) {
+ open(OPTIONS,"<data/user/options/$alias");
+ my @options = <OPTIONS>;
+ close OPTIONS;
+ foreach(@options) {
+ chomp $_;
+ }
+ if ($options[0] eq $pw) {
+ open(BAN,"<data/ban");
+ my @ban = <BAN>;
+ close BAN;
+ foreach(@ban) {
+ chomp;
+ if ($_ eq "$alias" || $_ eq "ip://".$ENV{'REMOTE_ADDR'}) {
+ $tmp = "banned";
+ &login_html;
+ exit 0;
+ }
+ }
+ if ($options[1] eq undef) { $col = "ffffff";}
+ else { $col = $options[1]; }
+ if ($options[2] eq undef) { $secol = "ffffef";}
+ else { $secol = $options[2];}
+ if ($options[3] eq undef) { $maxVerlauf = "10";}
+ else { $maxVerlauf = $options[3];}
+ if ($options[4] eq undef) { $verlaufOrder = "1";}
+ else {$verlaufOrder = $options[4];}
+ my @digit = (A..Z, a..z, 0..9);
+ my $num1 = rand(@digit);
+ my $num2 = rand(@digit);
+ my $num3 = rand(@digit);
+ my $num4 = rand(@digit);
+ my $num5 = rand(@digit);
+ my $num6 = rand(@digit);
+ my $num7 = rand(@digit);
+ my $num8 = rand(@digit);
+ my $num9 = rand(@digit);
+ my $num10 = rand(@digit);
+ $tmpid = ($digit[$num1].$digit[$num2].$digit[$num3].$digit[$num4].$digit[$num5].$digit[$num6].$digit[$num7].$digit[$num8].$digit[$num9].$digit[$num10]);
+
+ open(IDENT,">data/online/ident/$alias");
+ print IDENT $ENV{'REMOTE_ADDR'}."\n".$tmpid;
+ close IDENT;
+ open(LASTLOGIN,">data/user/lastlogin/$alias");
+ print LASTLOGIN time;
+ close LASTLOGIN;
+ &frameset_html;
+ exit;
+ } else {
+ $lognotexists = "false";
+ }
+ }
+ }
+ &login_html; # Falls Login-Daten inkorrekt sind, zurück zur Startseite.
+}
+
+sub create_alias { # Erstellung eines neuen Benutzers.
+ if ($alias =~ /[\W]/ || $alias eq "") {
+goto CREATE if ($alias =~ /[-]/);
+ &create_alias_html("alias_prohibited");;
+ exit 0;
+ } elsif ($pw ne $tmp) {
+ &create_alias_html("pw_wrong");
+ exit 0;
+ } elsif (length($alias) >= 15) {
+ &create_alias_html("alias_length");
+ exit 0;
+ }
+CREATE:
+ opendir(USERDIR,"data/user/options");
+ my @user = readdir(USERDIR);
+ close USERDIR;
+ foreach $user (@user) {
+ if ($user eq $alias) {
+ &create_alias_html("alias_exists");
+ exit;
+ }
+ }
+ open(OPTIONS,">data/user/options/$alias");
+ print OPTIONS $pw."\n";
+ close OPTIONS;
+ local $number = $#user;
+ &zeit;
+ &post("Cyberbar","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffffff>$alias [$number] hat sich soeben als neuer Benutzer registriert :-) ...</font></i>");
+ &login_html;
+}
+
+sub frameset_html {
+print <<END;
+<html>
+ <head>
+ <title>
+ $title - Powered by CXG - Chatters of the next generation
+ </title>
+ </head>
+<frameset border=0 frameborder=0 framespacing=0 cols="130,*">
+ <frameset border=0 frameborder=0 framespacing=0 rows="300,*,55">
+ <frame name="online" src="online.pl?room=Cyberbar&alias=$alias&tmpid=$tmpid">
+ <frame src="htdocs.pl">
+ <frameset border=0 frameborder=0 framespacing=0 cols="70,*">
+ <frame name="logo" src="htdocs.pl?var=logo_html" scrolling="no">
+ <frame name="reload" src="htdocs.pl" scrolling="no">
+ </frameset>
+ </frameset>
+ <frameset border=0 frameborder=0 framespacing=0 rows="60,*,55">
+ <frame name="menu" src="htdocs.pl?alias=$alias&var=menu_html&room=Cyberbar&col=$col&secol=$secol&tmpid=$tmpid" scrolling="no">
+ <frame name='main' src='push.pl?room=Cyberbar&alias=$alias&tmpid=$tmpid'>
+ <frame name="input" src="input.pl?alias=$alias&room=Cyberbar&col=$col&secol=$secol&tmp=login&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder" scrolling="no">
+ </frameset>
+</frameset>
+</html>
+END
+} \ No newline at end of file
diff --git a/0.6.0/input.pl b/0.6.0/input.pl
new file mode 100644
index 0000000..55007eb
--- /dev/null
+++ b/0.6.0/input.pl
@@ -0,0 +1,201 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header();
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+#&secure_checkid($alias);
+$room = $q->param("room");
+$col = $q->param("col");
+$secol = $q->param("secol");
+$tmp = $q->param("tmp");
+$whisper = $q->param("whisper");
+$maxVerlauf = $q->param("maxVerlauf");
+$verlaufOrder = $q->param("verlaufOrder");
+
+if ($maxVerlauf eq undef) { $maxVerlauf = "10";}
+if ($verlaufOrder eq undef) { $verlaufOrder = "1";}
+
+if ($tmp eq "login") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias hat den Chat betreten ...</font></i>");
+}
+
+print <<END;
+<html>
+<head>
+<script language="JavaScript"><!--
+
+// Einstellungsvariablen
+maxVerlauf = $maxVerlauf; // Anzahl der Einträge des Verlaufs
+maxPreview = 20; // Zeichenlänge der Verlaufsvorschau
+verlaufOrder = $verlaufOrder; // Neue Nachrichten von: 0=oben, 1=unten
+//autoAwayTimeout = 20; // Sekunden, nach denen der User 'Away' gesetzt wird
+//autoQuitTimeout = 40; // Sekunden, nach denen der User den Chat verlässt
+autoAwayTimeout = 300; // Sekunden, nach denen der User 'Away' gesetzt wird
+autoQuitTimeout = 1200; // Sekunden, nach denen der User den Chat verlässt
+
+// Interne Variablen
+userNotFocused = false; // Wenn User nicht schreibt
+userAway = false; // Wenn User automatisch auf 'Away' gesetzt ist
+userAwayTime = 0; // Sekunden, die User 'Away' ist
+fullVerlauf = new Array( maxVerlauf ); // Verlaufspuffer
+
+function delout()
+{
+ addVerlauf (document.inf.msg.value); // Dem Verlauf eine Nachricht anhängen
+ document.inf.msg.focus(); // Fukus in das Eingabeform
+ document.inf.msg.select(); // Text im Eigabeform markieren
+ document.inf.submit(); // Formular absenden
+ return false; // Abbrechen, damit das Frame nicht neu geladen wird
+}
+
+function CheckAuswahl()
+{
+ id=document.verlaufform.verlauf.selectedIndex; // ID des ausgewählten Feldes
+
+ if (fullVerlauf[id-1] != null) // Nur, wenn das Feld nicht leer ist
+ {
+ document.inf.msg.value = fullVerlauf[id-1]; // Eintrag ins Textfeld
+ }
+
+ document.verlaufform.verlauf.selectedIndex = 0; // Ersten Eintrag (Überschrift) auswählen
+ document.inf.msg.focus(); // Eingabefeld fokusieren
+
+ return true;
+}
+
+function addVerlauf (msg)
+{
+ if (msg == "") // Falls msg leer
+ return false; // Aufruf ignorieren
+
+ if (verlaufOrder) // neue Nachrichten von unten
+ {
+ for (i=0; i<(maxVerlauf-1); i++) // Alle Einträge einen aufrutschen
+ {
+ document.verlaufform.verlauf.options[i+1].text = document.verlaufform.verlauf.options[i+2].text;
+ fullVerlauf[i] = fullVerlauf[i+1];
+ }
+ }
+ else // neue Nachrichten von oben
+ {
+ for (i=(maxVerlauf-2); i>=0; i--) // Alle Einträge einen aufrutschen
+ {
+ document.verlaufform.verlauf.options[i+2].text = document.verlaufform.verlauf.options[i+1].text;
+ fullVerlauf[i+1] = fullVerlauf[i];
+ }
+ }
+
+ if (msg.length > maxPreview) // Vorschau zuschneiden
+ pre = msg.slice(0, maxPreview-3) + "...";
+ else
+ pre = msg;
+
+ if (verlaufOrder) // pos = Position des neuen Eintrags
+ pos = maxVerlauf-1;
+ else
+ pos = 0
+
+ document.verlaufform.verlauf.options[pos+1].text = pre; // Neue Vorschau anfügen
+ fullVerlauf[pos] = msg; // Neuen Eintrag an den Verlauf anfügen
+
+// document.verlaufform.verlauf.selectedIndex = maxVerlauf; // Fokus auf den letzten Eintrag
+ document.verlaufform.verlauf.selectedIndex = 0; // Fokus auf den ersten Eintrag (Überschrift)
+}
+
+function msgBlur()
+{
+ userNotFocused = true;
+ userAwayTime = 0;
+ userAway = false;
+}
+
+function msgFocus()
+{
+ userNotFocused = false;
+ if (userAway) // Wird ausgeführt, falls User 'Away' war
+ {
+ ; // nop
+ }
+ userAwayTime = 0;
+ userAway = false;
+}
+
+function checkInterval()
+{
+// status = "userNotFocused=" + userNotFocused + "; userAway=" + userAway + "; userAwayTime=" + userAwayTime + ""; // Debug
+ if (userNotFocused)
+ {
+ userAwayTime += 5; // Addiere 5, da nur alle 5Sek ausgeführt
+ if (!userAway)
+ {
+ if (autoAwayTimeout < userAwayTime) // Falls Zeit abgelaufen
+ {
+ if (document.inf.tmp.value != "away")
+ open ("mail.pl?alias=$alias&tmpid=$tmpid&msg=/away&col=$col&room=$room&tmp=autoaway","reload"); // 'Away' setzen
+ userAway = true;
+ }
+ }
+ else
+ {
+ if (autoQuitTimeout < userAwayTime) // Falls Zeit abgelaufen
+ {
+ open ("mail.pl?alias=$alias&tmpid=$tmpid&msg=/q&room=$room&tmp=autologout","reload"); // Chat beenden
+ }
+ }
+ }
+
+ window.setTimeout("checkInterval()",5000); // In 5 Sekunden wieder aufrufen
+}
+
+function initFrame()
+{
+ window.setTimeout("checkInterval()",5000); // In 5 Sekunden aufrufen
+ document.inf.msg.focus(); // Eingabefeld fokusieren
+}
+//-->
+</script>
+$style
+</head>
+<body class="blank" onload="initFrame();">
+ <div align="left">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td>
+ <form name="inf" target="reload" action="main.pl" onsubmit="return delout();">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="room" value="$room">
+ <input type="hidden" name="col" value="$col">
+ <input type="hidden" name="secol" value="$secol">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="whisper" value="$whisper">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input size="50" maxlength="300" name="msg" onBlur="msgBlur();" onFocus="msgFocus();">
+ </form>
+ </td>
+ <td><form name="verlaufform">
+ <script language="JavaScript"><!--
+ document.write("<select size='1' name='verlauf' size='40' onChange='CheckAuswahl();'>");
+ document.write("<option value>- Nachrichten-Verlauf -</option>");
+ for(i=0; i<maxVerlauf; i++) // Leere Verlaufsfelder generieren
+ document.write("<option value>(leer)</option>");
+ document.write("</select>");
+ //-->
+ </script>
+ </form>
+ </td>
+ </tr>
+ </table>
+ </div>
+</body>
+</html>
+END
+
+&rm_away($alias,$room); \ No newline at end of file
diff --git a/0.6.0/main.pl b/0.6.0/main.pl
new file mode 100644
index 0000000..37b11bb
--- /dev/null
+++ b/0.6.0/main.pl
@@ -0,0 +1,901 @@
+#!/usr/bin/perl
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+print $q->header();
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+
+{
+ open(IDENT,"<data/online/ident/$alias");
+ my @ident = <IDENT>;
+ close IDENT;
+ if ($ident[1] ne $tmpid) {
+ &error("Falsche TempID ! Du bist nicht befugt zu handeln!");
+ }
+}
+
+$room = $q->param("room");
+$col = $q->param("col");
+$secol = $q->param("secol");
+$tmp = $q->param("tmp");
+$rmsg = \$q->param("msg");
+
+if ($tmp eq "away") {
+ require config;
+ &rm_away($alias,$room);
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias hat sich zurück gemeldet ... </font></i><script language='JavaScript'>parent.online.location.reload();</script>");
+}
+
+if ($q->param('var') eq "change_colors") {
+ &reload_html("change_colors")
+}
+
+unless (-e "data/online/rooms/$room/$alias") {
+ require config;
+ &post_prv($alias,"<font color=ffffff>Du befindest Dich nicht im Raum \"<font color=ffa500>$room</font>\" und kannst dort auch keine Nachrichten posten!</font>");
+ &reload_html;
+} elsif (length($$rmsg) > 300) {
+ require config;
+ &post_prv($alias,"<font color=ffffff>Deine Nachricht enthält zu viele Zeichen. Maximal sind 300 Zeichen erlaubt.</font>");
+ &reload_html;
+}
+
+$$rmsg =~ s#<#&lt\;#g;
+if (substr($$rmsg,0,1) ne "/") {
+ open MSGFILE,">>data/msgs/$room";
+ unless ($$rmsg =~ s#/me/#<i>$alias</i>#g || $$rmsg =~ s#/m/#<i><font color=$col>$alias</font></i>#g) {
+ print MSGFILE "!<;".time."<;!<;!<;<b><font color=$col>$alias: <font color=$secol>$$rmsg</font></font></b><;\n";
+ } else {
+ $$rmsg =~ s#/me/#<i>$alias</i>#g;
+ $$rmsg =~ s#/m/#<i><font color=$col>$alias</font></i>#g;
+ print MSGFILE "!<;".time."<;!<;!<;<b><font color=$secol>$$rmsg</font></font></b><;\n";
+ }
+ close MSGFILE;
+ opendir PID,"data/online/pids/$room";
+ my @pids = readdir(PID);
+ closedir(PID);
+ foreach(@pids) {
+ if (-f "data/online/pids/$room/$_") {
+ kill USR1 => $_;
+ }
+ }
+ require config;
+ &log("<b><font color=$col>$alias: <font color=$secol>$$rmsg</font></font></b>") if ($room eq "Cyberbar");
+ &reload_html;
+} else {
+ &cmd($$rmsg);
+}
+
+sub reload_html { # Wird neugeladen, wenn eine Nachricht getextet wird!
+ my ($action,$whisper) = @_;
+ print "<html><head><script language='JavaScript'>";
+ if ($action eq "change_room") {
+ print "open('online.pl?alias=$alias&room=$room&tmpid=$tmpid','online');";
+ print "parent.input.document.inf.room.value = '$room';";
+ print "open('htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol&tmpid=$tmpid','menu');";
+ } elsif ($action eq "change_colors") {
+ print "parent.input.document.inf.col.value = '$col';";
+ print "parent.input.document.inf.secol.value = '$secol';";
+ print "open('htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol&tmpid=$tmpid','menu');";
+ } elsif ($action eq "whisper") {
+ print "parent.input.document.inf.whisper.value = '$whisper';";
+ } elsif ($action eq "away") {
+ print "parent.input.document.inf.tmp.value = 'away';";
+ } elsif ($action eq "quit" && $tmp eq "autologout") {
+ print "open('index.pl?tmp=autologout','_top');";
+ &rm_alias($alias,$room);
+ } elsif ($action eq "quit") {
+ print "open('index.pl?tmp=quit','_top');";
+ &rm_alias($alias,$room);
+ }
+ print "parent.input.document.inf.tmp.value = 'notaway';" if ($tmp eq "away");
+ print "</script></head><body bgcolor='$col'>";
+ print $q->end_html;
+ exit 0;
+}
+
+sub change_room { # Den Chat-Raum wechseln
+ my ($method,$newroom,$oldroom,$alias2follow) = @_;
+ open RSTAT, "<data/online/rstat/$newroom"; #Überprüfen, ob Alias Raum betreten darf
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ if ($rstat[0] eq "1\n") {
+ &hierachie($alias);
+ if ($hierachie eq "wa" || $hierachie eq "ow") { } else {
+ &post_prv($alias,"<font size=2 color=ffffff>Der Raum \"<font color=ffa500>$newroom</font>\" ist leider abgesperrt!</font>");
+ &reload_html($whisper,$action);
+ }
+ }
+ open MSGFILE,">>data/msgs/$room";
+ print MSGFILE "$alias<;".time."<;cr<;$newroom<;!<;\n";
+ close MSGFILE;
+ $room = $oldroom;
+ my $tmpstamp = time+5;
+ &zeit;
+ if ($method eq "j") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias wechselt in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias kommt aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ open MSGFILE,">>data/msgs/$room";
+ print MSGFILE "$alias<;$tmpstamp<;!<;!<;<i><font color=ffffff>($hours:$min:$sec) Du wechselst aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i><;\n";
+ close MSGFILE;
+ } elsif ($method eq "ju") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias folgt \"$alias2follow\" in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias kommt aus dem Raum \"$oldroom\" und folgt \"$alias2follow\" herein nach \"$newroom\" ...</font></i>");
+ open(MSGFILE,">>data/msgs/$room");
+ flock(MSGFILE, 2);
+ print MSGFILE "$alias<;$tmpstamp<;!<;!<;<i><font color=ffffff>($hours:$min:$sec) Du folgst \"$alias2follow\" aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i><;\n";
+ close MSGFILE;
+ }
+ opendir(PID,"data/online/pids/$raum");
+ my @pids = readdir(PID);
+ closedir(PID);
+ foreach(@pids) {
+ if (-f "data/online/pids/$raum/$_") {
+ kill USR1 => $_;
+ }
+ }
+ unlink("data/online/rooms/$oldroom/$alias");
+ rm_rstat($alias,$oldroom);
+ check_online;
+}
+
+sub cmd { # Alle Chatbefehle, die über input_html eingegeben werden können.
+ require config;
+ $_[0] = $_[0]." ";
+ $_[0] = substr($_[0], 1, length($_[0])-1);
+ my @cmd = split(/ /, $_[0]);
+ my $cmd = substr($_[0],0 , index($_[0], " "));
+#############>- NORMALE CHATBEFEHLE ( Alphabetisch sortiert ) -<
+#############>- INFORMATIONEN ÜBER DAS SYSTEM AUSGEBEN -<
+ if ($cmd eq "about") {
+ &post_prv("$alias","<font color=ffffff>Aktuelle Version ist $title und wurde am $datum aktuallisiert. Programmiert von Paul C. Bütow (2000 - 2001).</font>");
+ &reload_html;
+#############>- ABMELDEN MIT 'AWAY-NACHRICHT' -<
+ } elsif ($cmd eq "away") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $away_msg = $away_msg." ".$cmd[$i];
+ }
+ &zeit;
+ my $js = "<script language='JavaScript'>parent.online.location.reload();</script>";
+ if ($tmp ne "autoaway") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias meldet sich ab (<font color=ffa500>$away_msg</font> ) ...</i></font>$js");
+ } else {
+ $away_msg = " $alias wurde vom System abgemeldet ...";
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)$away_msg</i></font>$js");
+ }
+ open AWAY,">>data/online/rstat/$room.away";
+ flock AWAY, 2;
+ print AWAY "$alias<;$away_msg\n";
+ close AWAY;
+ &reload_html("away");
+#############>- EIGENEN CHATBILDSCHIRM LÖSCHEN -<
+ } elsif ($cmd eq "clear") {
+ &post_prv($alias,"<script language='JavaScript'>window.open('push.pl?alias=$alias&room=$room&var=clear_screen&tmpid=$tmpid','main');</script>");
+ &reload_html;
+#############>- FARBEN WECHSELN -<
+ } elsif ($cmd eq "col") {
+ $col = $cmd[1];
+ my $tmpsecol = $cmd[2];
+ if ($tmpsecol eq "") {
+ $secol = $col
+ } else {
+ $secol = $tmpsecol;
+ }
+ open OPTIONS,"<data/user/options/$alias";
+ my @options = <OPTIONS>;
+ close OPTIONS;
+ open OPTIONS,">data/user/options/$alias";
+ print OPTIONS $options[0]."".$col."\n".$secol;
+ close OPTIONS;
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat die Farbe gewechselt ...</font></i>");
+ &reload_html("change_colors");
+#############>- AKTUELLES DATUM UND URZEIT AUSGEBEN -<
+ } elsif ($cmd eq "date") {
+ &zeit;
+ &post_prv("$alias","<font color=ffffff>Heute ist der $day.$month. Jahr $year. Es ist genau $hours:$min Uhr und $sec Sekunden.</font>");
+ &reload_html;
+#############>- EINEN NEUEN RAUM ERSTELLEN BZW. IN EINEN BESTEHENDEN RAUM WECHSELN -<
+ } elsif ($cmd eq "j") {
+ &change_room("j",$cmd[1],$room);
+ &reload_html("change_room");
+#############>- HANDELN -<
+ } elsif ($cmd eq "me" || $cmd eq "m") {
+ my $me_msg;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $me_msg = $me_msg." ".$cmd[$i];
+ }
+ $me_msg =~ s#/me/#<i>$alias</i>#g;
+ $me_msg =~ s#/m/#<i><font color=$col>$alias</font></i>#g;
+ if ($cmd eq "m") {
+ &post($room,"<b><font color=$col><i>$alias</i> <font color=$secol>$me_msg</font></font></b>");
+ } else {
+ &post($room,"<b><font color=$col><i>$alias</i> $me_msg</font></b>");
+ }
+ &reload_html;
+#############>- MEMO SCHREIBEN -<
+ } elsif ($cmd eq "memo") {
+ my $alias2memo = $cmd[1];
+ if(-f "data/user/options/$alias2memo") {
+ my $memo_msg;
+ for ($i=2; $i <= $#cmd; $i++) {
+ $memo_msg = $memo_msg." ".$cmd[$i];
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2memo <font color=ffffff>wurde folgende memo erfolgreich hinterlassen: $memo_msg</font></font>");
+ &zeit;
+ open MEMO,">>data/user/memos/$alias2memo";
+ flock MEMO, 2;
+ print MEMO "<font color=ffffff>($day.$month. - $hours:$min:$sec) <font color=ffa500>$alias</font> hat Dir eine Memo hinterlassen: <font color=ffa500>$memo_msg</font></font><br>\n";
+ close MEMO;
+ &reload_html;
+ }
+ &post_prv("$alias","<font color=ffa500>$alias2memo <font color=ffffff>existiert in der Datenbank nicht !</font></font>");
+ &reload_html;
+#############>- FLÜSTERN ( Auch mit '/' ) -<
+ } elsif ($cmd eq "msg" || $cmd eq "") {
+ my ($alias2post,$msg2post,$action) = ($cmd[1]);
+ if ($cmd eq "msg") {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ $action = "whisper";
+ } else {
+ $alias2post = $q->param('whisper');
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ }
+ $msg2post =~ s#/me/#<i>$alias</i>#g;
+ $msg2post =~ s#/m/#<i><font color=$col>$alias</font></i>#g;
+ if (-f "data/online/users/$alias2post") {
+ &post_prv($alias,"<b><font color=$col><i>Zu $alias2post geflüstert:</i> <font color=$secol>$msg2post</font></font></i></b>");
+ &post_prv($alias2post,"<b><font color=$col><i>$alias flüstert:</i> <font color=$secol>$msg2post</font></font></i></b>");
+ &reload_html($action,$alias2post);
+ }
+ &post_prv("$alias","<font color=ffa500>$alias2post <font color=ffffff>ist nicht anwesend !</font></font>");
+ &reload_html;
+#############>- TOTALONLINEZEIT VON ALIAS ANZEIGEN -<
+ } elsif ($cmd eq "online") {
+ my $alias2prove= $cmd[1];
+ if (-f "data/user/options/$alias2prove") {
+ open ONLINE,"<data/user/counts/$alias2prove.online";
+ my $online = <ONLINE>;
+ close ONLINE;
+ my $totaltime = sprintf("%.2f",($online / 3600));
+ &post_prv("$alias","<font color=ffa500>$alias2prove <font color=ffffff>war insgesamt schon $totaltime Stunden online!</font></font>");
+ } else {
+ &post_prv("$alias","<font color=ffa500>$alias2prove <font color=ffffff>existiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+ &reload_html;
+#############>- DAS SYSTEM VERLASSEN -<
+ } elsif ($cmd eq "q") {
+ &zeit;
+ if ($tmp ne "autologout") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias loggt sich aus dem Chat aus ... </font></i>");
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias wurde vom System automatisch ausgeloggt ... </font></i>");
+ }
+ &reload_html("quit");
+#############>- DAS EIGENE GÄSTEBUCH LÖSCHEN -<
+ } elsif ($cmd eq "rmgb") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias löscht das eigene Gästebuch ...</font></i>");
+ unlink("data/user/gbooks/$alias");
+ &reload_html;
+#############>- SCHREIEN -<
+ } elsif ($cmd eq "s") {
+ my $msg2scream;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2scream = $msg2scream." ".$cmd[$i];
+ }
+ $msg2scream =~ s#ä#Ä#g; $msg2scream =~ s#ö#Ö#g; $msg2scream =~ s#ü#Ü#g; $msg2scream = "\U$msg2scream";
+ &post($room,"<b><font color=$col><i>$alias schreit:</i> <font color=$secol>$msg2scream</font></font></b>");
+ &reload_html;
+#############>- SEHEN, WANN SICH ALIAS ZUM LETZTEN MAL EINGElOGGT HAT -<
+ } elsif ($cmd eq "seen") {
+ my $alias2prove = $cmd[1];
+ if (-f "data/user/options/$alias2prove") {
+ if (-f "data/user/lastlogin/$alias2prove") {
+ open LASTLOGIN,"<data/user/lastlogin/$alias2prove";
+ my $lastlogin = <LASTLOGIN>;
+ close LASTLOGIN;
+ my $timestamp = sprintf("%.2f",((time() - $lastlogin) / 3600));
+ &post_prv("$alias","<font color=ffa500>$alias2prove <font color=ffffff> hat sich vor $timestamp Stunden zuletzt in das System eingeloggt!</font></font>");
+ } else {
+ &post_prv("$alias","<font color=ffa500>$alias2prove <font color=ffffff> hat sich seit der Einführung dieses Befehls noch nie eingeloggt!</font></font>");
+ }
+ } else {
+ &post_prv("$alias","<font color=ffa500>$alias2prove <font color=ffffff> exsistiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+ &reload_html;
+#############>- ANZEIGEN WER SICH IM AKTUELLEN RAUM BEFINDET -<
+ } elsif ($cmd eq "w") {
+ open RSTAT,"data/online/rstat/$room";
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ chomp($rstat[1]);
+ my $theme = "Raumthema:".$rstat[1] if ($rstat[1] ne undef);
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ my ($is,$nr) = ("t",0);
+ opendir DIR,"data/online/rooms/$room";
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ my $personen;
+ foreach(@dir) {
+ if (-f "data/online/rooms/$room/$_") {
+ $personen = $personen." ".$_;
+ $nr++;
+ }
+ }
+ &post_prv($alias,"<font color=ffffff>Der aktuelle Raum: $room $theme $door ($nr) : <font color=ffa500>$personen</font></font>");
+ &reload_html;
+#############>- ANZEIGEN WER SICH IM SYSTEM BEFINDET -<
+ } elsif ($cmd eq "wc" || $cmd eq "wc/") {
+ my $raum = $cmd[1];
+ my $personen;
+ if ($raum eq "" && $cmd eq "wc") {
+ opendir USERS,"data/online/users";
+ my @users = readdir(USERS);
+ close USERS;
+ foreach(@users) {
+ $personen = $personen." ".$_ if (-f "data/online/users/$_");
+ }
+ my $nr = ($#users-1);
+ my ($nrs,$is) = ("","ist");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "sind";
+ }
+ &post_prv("$alias","<font color=ffffff>$nr Person$nrs $is insgesamt eingeloggt: <font color=ffa500>$personen</font></font>");
+ } elsif ($raum eq "" && $cmd eq "wc/") {
+ my $msg2post;
+ opendir DIR,"data/online/rooms";
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ opendir(DIR,"data/online/rooms/$_");
+ my @dir2 = readdir(DIR);
+ closedir(DIR);
+ open(RSTAT,"<data/online/rstat/$_");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ chomp($rstat[1]);
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ my $nr = $#dir2-1;
+ $msg2post = $msg2post."<tr><td><b><font size=2 color=ffffff>$_ $door ($nr) [".$rstat[1]."]: </font></b></td></tr><tr><td><font size=2 color=ffa500>";
+ foreach $chatter (@dir2) {
+ if (-f "data/online/rooms/$_/$chatter") {
+ $msg2post = $msg2post."$chatter ";
+ }
+ }
+ print "</font></td>";
+ }
+ }
+ &post_prv("$alias","<font color=ffffff>Folgende Räume sind offen:</font><table>$msg2post</table>");
+ } elsif ($raum ne "") {
+ my $personen;
+ opendir(DIR,"data/online/rooms/$raum");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/rooms/$raum/$_");
+ }
+ my ($nr,$is) = (($#dir-1),"t");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "n";
+ }
+ &post_prv($alias,"<font color=ffffff> $nr Person$nrs befinde$is sich im Raum \"$raum\": <font color=ffa500>$personen</font></font>");
+ }
+ &reload_html;
+#############>- ANZEIGEN IN WELCHEN RAUM SICH JMD. BEFINDET BZW. JMD IN EINEN RAUM FOLGEN -<
+ } elsif ($cmd eq "wj" || $cmd eq "ju") {
+ my $alias2search = $cmd[1];
+ opendir ROOMS,"data/online/rooms";
+ my @dir = readdir(ROOMS);
+ closedir(ROOMS);
+ foreach $raum (@dir) {
+ opendir DIR2,"data/online/rooms/$raum";
+ my @dir2 = readdir(DIR2);
+ closedir(DIR2);
+ foreach $user (@dir2) {
+ if (-f "data/online/rooms/$raum/$user" && $user eq $alias2search) {
+ if ($cmd eq "wj") {
+ &post_prv("$alias","<font color=ffa500>$alias2search <font color=ffffff>befindet sich im Raum \"$raum\" !</font></font>");
+ } else {
+ &change_room("ju",$raum,$room,$alias2search);
+ }
+ &reload_html("change_room");
+ }
+ }
+ }
+ &post_prv("$alias","<font color=ffa500>$alias2search <font color=ffffff> ist nicht eingeloggt !</font></font>");
+ &reload_html;
+#############>- RAUMNESETZER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- RAUM ABSCHLIESSEN/AUFSCHLIESSEN -<
+ } elsif ($cmd eq "l") {
+ my $hierachie = &hierachie($alias);
+ if (prove_besetzer($alias,$room) == 1 || $hierachie eq "wa" || $hierachie eq "ow") {
+ open RSTAT, "data/online/rstat/$room";
+ my @r_stat = <RSTAT>;
+ close RSTAT;
+ my $lock = "0\n";
+ &zeit;
+ if ($room eq "Cyberbar") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias sperrt den Raum ohne Erfolg ab ...</font></i>");
+ } else {
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias sperrt den Raum ab ...</font></i>");
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias sperrt den Raum auf ...</font></i>");
+ }
+ for ($i=1;$i<=$#r_stat;$i++) {
+ $lock = $lock.$r_stat[$i];
+ }
+ open RSTAT,">data/online/rstat/$room";
+ flock RSTAT, 2;
+ print RSTAT $lock;
+ close RSTAT;
+ }
+ &reload_html;
+ }
+#############>- RAUMBESETZER ERNENNEN -<
+ } elsif ($cmd eq "su") {
+ my $hierachie = &hierachie($alias);
+ if (prove_besetzer($alias,$room) == 1 || $hierachie eq "wa" || $hierachie eq "ow") {
+ my $alias2su = $cmd[1];
+ opendir DIR,"data/online/rooms/$room";
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ if ($_ eq $alias2su) {
+ open(DATEI,"<data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ if (prove_besetzer($alias2su,$room) == 1 || &hierachie($alias2su) eq "wa" || &hierachie($alias2su) eq "ow") {
+ &post_prv($alias,"<font color=ffa500>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist bereits RB, WÄ oder OW)</font>");
+ &reload_html;
+ }
+ open RSTAT,">>data/online/rstat/$room";
+ flock(RSTAT, 2);
+ print RSTAT $alias2su."\n";
+ close RSTAT;
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias verleiht \"$alias2su\" Raumbesetzerrechte ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>");
+ &reload_html;
+ }
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist nicht anwesend)</font>");
+ &reload_html;
+ }
+#############>- RAUMBESETZER ENTNENNEN -<
+ } elsif ($cmd eq "rsu") {
+ my $hierachie = &hierachie($alias);
+ if (prove_besetzer($alias,$room) == 1 || $hierachie eq "wa" || $hierachie eq "ow") {
+ my $alias2rsu = $cmd[1];
+ open(DATEI,"<data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ if (prove_besetzer($alias2rsu,$room) == 1) {
+ &rm_rstat($alias2rsu,$room);
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias entzieht \"$alias2rsu\" die Raumbesetzerrechte ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>");
+ } else {
+ &post_prv($alias,"<font color=ffa500>$alias2rsu <font color=ffffff>ist kein Raumbesetzer und kann dieser Status auch nicht aberkannt werden !</font></font>");
+ }
+ &reload_html;
+ }
+#############>- RAUM EIN THEMA GEBEN -<
+ } elsif ($cmd eq "t") {
+ my $hierachie = &hierachie($alias);
+ if (prove_besetzer($alias,$room) == 1 || $hierachie eq "wa" || $hierachie eq "ow") {
+ open RSTAT, "data/online/rstat/$room";
+ my @r_stat = <RSTAT>;
+ close RSTAT;
+ &zeit;
+ my $theme;
+ if ($cmd[1] ne undef) {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $theme = $theme." ".$cmd[$i];
+ }
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias gibt dem Raum das Thema (<font color=ffa500> $theme </font>) ...</font></i>");
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias löscht das Thema des Raums ...</font></i>");
+ }
+ $theme = $r_stat[0].$theme."\n";
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $theme = $theme.$r_stat[$i]."\n";
+ }
+ open RSTAT,">data/online/rstat/$room";
+ print RSTAT $theme;
+ close RSTAT;
+ &reload_html;
+ }
+#############>- SUPERUSER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- ALIAS VERBANNEN -<
+ } elsif ($cmd eq "ban" || $cmd eq "banip") {
+ my $hierachiealias = &hierachie($alias);
+ if ($hierachiealias eq "wa" || $hierachiealias eq "ow") {
+ $hierachie = &hierachie($alias2ban);
+ my $alias2ban = $cmd[1];
+ open BAN,"<data/ban";
+ my @ban = <BAN>;
+ close BAN;
+ if ($cmd[1] eq undef) {
+ my $nr = @ban;
+ my $banned;
+ foreach(@ban) {
+ chomp($_);
+ $banned .= " $_";
+ }
+ &post_prv("$alias","<font color=ffffff>Folgende Benutzer sind verbannt [$nr]: <font color=ffa500>$banned</font></font>");
+ &reload_html;
+ } elsif (-f "data/user/options/$alias2ban") {
+ if ($hierachie eq "wa") {
+ &post_prv("$alias","<font color=ffa500>$alias2ban <font color=ffffff>ist Wächter und kann nicht verbannt werden!</font></font>");
+ &reload_html;
+ } elsif ($hierachie eq "ow") {
+ &post_prv("$alias","<font color=ffa500>$alias2ban <font color=ffffff>ist Oberwächter und kann nicht verbannt werden!</font></font>");
+ &reload_html;
+ }
+ if ($cmd eq "ban") {
+ if (add_entry($alias2ban,"ban") == 1) {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias verbannt \"$alias2ban\" aus dem Chat ...</font></i>");
+ } else {
+ &post_prv("$alias","<font color=ffa500>$alias2ban <font color=ffffff>ist bereits verbannt!</font></font>");
+ }
+ } elsif ($hierachiealias eq "ow") {
+ if (-f "data/online/ident/$alias2ban") {
+ open DATEI, "<data/online/ident/$alias2ban";
+ my $ipnr = <DATEI>;
+ close DATEI;
+ chomp($ipnr);
+ if (add_entry("ip://$ipnr","ban") == 1) {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias verbannt die IP-Nummer von \"$alias2ban\" aus dem Chat ...</font></i>");
+ } else {
+ &post_prv("$alias","<font color=ffffff>Die IP-Nummer <font color=ffa500>$ipnr</font> von $alias2ban ist bereits verbannt!</font></font>");
+ }
+ &reload_html;
+ } else {
+ &post_prv("$alias","<font color=ffffff>Die IP-Nummer von <font color=ffa500>$alias2ban </font>kann nicht verbannt werden, da Benutzer nicht eingeloggt ist!</font></font>");
+ &reload_html;
+ }
+ } else {
+ goto ENDCMD;
+ }
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2ban $ipnr<font color=ffffff>kann nicht verbannt werden, da Benutzername nicht existiert!</font></font>");
+ &reload_html;
+ }
+#############>- ALIAS ENTBANNEN -<
+ } elsif ($cmd eq "rban" || $cmd eq "rbanip") {
+ my $hierachie = &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $alias2rban = $cmd[1];
+ open(BAN,"<data/ban");
+ @ban = <BAN>;
+ close BAN;
+ foreach $ban (@ban) {
+ if (&rm_entry($alias2rban,"ban") == 1) {
+ if ($cmd eq "rban") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias entbannt \"$alias2rban\" ...</font></i>");
+ } else {
+ &post_prv($alias,"<font color=ffffff>Die IP-Nummer <font color=ffa500>$alias2rban </font>wurde aus der Banliste ausgetragen!</font></font>");
+ }
+ &reload_html;
+ }
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2rban <font color=ffffff>ist nicht verbannt!</font></font>");
+ &reload_html;
+ }
+#############>- IP # VON ALIAS ANZEIGEN LASSEN -<
+} elsif ($cmd eq "ip") {
+ my $hierachie = &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $alias2prove = $cmd[1];
+ opendir DIR,"data/online/ident";
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ if ($_ eq $alias2prove) {
+ open DATEI, "<data/online/ident/$alias2prove";
+ my $ipnr = <DATEI>;
+ close DATEI;
+ chomp($ipnr);
+ &post_prv("$alias","<font color=ffa500>$_<font color=ffffff> hat die IP-Nummer $ipnr !</font></font>");
+ }
+ }
+ &reload_html;
+ }
+#############>- ALIAS AUS DEM CHAT KATAPULTIEREN -<
+ } elsif ($cmd eq "k") {
+ my $hierachie= &hierachie($alias);
+ if ($hierachie eq "wa" || $hierachie eq "ow") {
+ my $alias2kick = $cmd[1];
+ if (-f "data/online/users/$alias2kick") {
+ opendir DIR,"data/online/rooms";
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach $raum (@dir) {
+ opendir DIR, "data/online/rooms/$raum";
+ my @dir2 = readdir(DIR);
+ closedir(DIR);
+ foreach $chatter (@dir2) {
+ if ($chatter eq $alias2kick) {
+ my $hierachie = &hierachie($alias2kick);
+ if ($hierachie eq "ow") {
+ &post_prv("$alias","<font color=ffa500>$alias2kick <font color=ffffff> ist Oberwächter und kann nicht \"gekickt\" werden !</font></font>");
+ } elsif ($hierachie eq "wa") {
+ &post_prv("$alias","<font color=ffa500>$alias2kick <font color=ffffff> ist Wächter und kann nicht \"gekickt\" werden !</font></font>");
+ } else {
+ &post_prv("$alias2kick","<script language=\"JavaScript\">window.open(\"index.pl?tmp=kick\",\"_top\");</script>");
+ $_ = undef if ($room eq $raum);
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias katapultiert \"$alias2kick\" aus dem Chat ...</font></i>",$raum);
+ rm_alias($alias2kick,$raum);
+ check_online;
+ }
+ &reload_html;
+ }
+ }
+ }
+ }
+ &post_prv("$alias","<font color=ffa500>$alias2kick <font color=ffffff> ist nicht anwesend und kann nicht \"gekickt\" werden !</font></font>");
+ &reload_html;
+ }
+#############>- EINEN BENUTZER AUS DEM SYSTEM LÖSCHEN -<
+ } elsif ($cmd eq "kill") {
+ if (hierachie($alias) eq "ow") {
+ my $alias2kill = $cmd[1];
+ if (-f "data/user/options/$alias2kill") {
+ my $hierachie = &hierachie($alias2kill);
+ if ($hierachie eq "ow") {
+ &post_prv($alias,"<font color=ffa500>$alias2kill</font> <font color=ffffff>ist Oberwächter und kann nicht aus dem System entfernt werden !</font>");
+ } elsif ($hierachie eq "wa") {
+ &post_prv($alias,"<font color=ffa500>$alias2kill</font> <font color=ffffff>ist Wächter und kann nicht aus dem System entfernt werden !</font>");
+ } else {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias killt \"$alias2kill\" ganz und gar aus dem System ...</font></i>");
+ unlink("data/user/options/$alias2kill");
+ unlink("data/user/profiles/$alias2kill");
+ unlink("data/user/gbooks/$alias2kill");
+ unlink("data/user/counts/$alias2kill");
+ unlink("data/user/counts/$alias2kill.online");
+ unlink("data/user/lastlogin/$alias2kill");
+ unlink("data/user/memos/$alias2kill");
+ &rm_entry($alias2kill,"ban");
+ open(DEL, ">>data/kill");
+ print DEL "($day.$month.$year $hours:$min:$sec) $alias2kill wurde von $alias gekillt\n";
+ close DEL;
+ }
+ } else {
+ &post_prv("$alias","<font color=ffa500>$alias2kill <font color=ffffff> existiert nicht in der DB und kann nicht \"gekillt\" werden !</font></font>");
+ }
+ &reload_html;
+ }
+#############>- EINEN ANDEREN RAUM AUF-/ABSPERREN -<
+ } elsif ($cmd eq "sl") {
+ my $hierachie = &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $sl_room = $cmd[1];
+ if (-e "data/online/rooms/$sl_room") {
+ my $lock = "0\n";
+ &zeit;
+ open RSTAT,"<data/online/rstat/$sl_room";
+ my @r_stat = <RSTAT>;
+ close RSTAT;
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias sperrt den Raum \"$sl_room\" von aussen ab ...</font></i>",$sl_room);
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias sperrt den Raum \"$sl_room\" von aussen auf ...</font></i>",$sl_room);
+ }
+ for ($i=1;$i<=$#r_stat;$i++) {
+ $lock = $lock.$r_stat[$i];
+ }
+ open RSTAT,">data/online/rstat/$sl_room";
+ print RSTAT $lock;
+ close RSTAT;
+ } else {
+ &post_prv($alias,"<font color=ffffff>Der Raum <font color=ffa500>$sl_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ }
+#############>- IN EINEN ANDEREN RAUM HINEINRUFEN -<
+ } elsif ($cmd eq "ss") {
+ my $hierachie = &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $ss_room = $cmd[1];
+ if (-e "data/online/rooms/$ss_room") {
+ my $ss_msg;
+ for ($i=2; $i <= $#cmd; $i++) {
+ $ss_msg = $ss_msg." ".$cmd[$i];
+ }
+ my $msg2scream = "\U$ss_msg";
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias ruft in den Raum \"$ss_room\" hinein: <b><font color=$col>$msg2scream</font></b> ...</font></i>",$ss_room);
+ &reload_html;
+ } else {
+ &post_prv($alias,"<font color=ffffff>Der Raum <font color=ffa500>$ss_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ }
+#############>- EINEN ANDEREN RAUM EIN THEMA GEBEN -<
+ } elsif ($cmd eq "st") {
+ my $hierachie = &hierachie($alias);
+ if ($hierachie eq "wa" || $hierachie eq "ow") {
+ my $st_room = $cmd[1];
+ if (-e "data/online/rooms/$st_room") {
+ my $theme;
+ &zeit;
+ if ($cmd[2] ne undef) {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $theme = $theme." ".$cmd[$i];
+ }
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias gibt dem Raum \"$st_room\" das Thema (<font color=ffa500> $theme </font>) ...</font></i>",$st_room);
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias löscht das Thema des Raums \"$st_room\" ...</font></i>",$st_room);
+ }
+ open RSTAT,"<data/online/rstat/$st_room";
+ my @r_stat = <RSTAT>;
+ close RSTAT;
+ $theme = $r_stat[0].$theme."\n";
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $theme = $theme.$r_stat[$i];
+ }
+ open RSTAT,">data/online/rstat/$st_room";
+ print RSTAT $theme;
+ close RSTAT;
+ } else {
+ &post_prv($alias,"<font color=ffffff>Der Raum <font color=ffa500>$st_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ }
+#############>- SYSTEMNACHRICHT IN ALLE BESTEHENDEN RÄUME &postEN -<
+ } elsif ($cmd eq "sys") {
+ my $hierachie = &hierachie($alias);
+ if ($hierachie eq "ow") {
+ my $sys_msg;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $sys_msg = $sys_msg." ".$cmd[$i];
+ }
+ &zeit;
+ $sys_msg = "<i><font color=ffffff>($hours:$min:$sec)</font></i> <b><font size=2 color=red>SYSTEMNACHRICHT</font></b><i><font color=ffffff>: $sys_msg ...</font></i>";
+ opendir(ROOMS,"data/msgs");
+ my @rooms = readdir(ROOMS);
+ close(ROOMS);
+ foreach(@rooms) {
+ &post($_,$sys_msg);
+ }
+ log($sys_msg);
+ &reload_html;
+ }
+#############>- ALIAS ZUM WÄCHTER ERNNENNEN -<
+ } elsif ($cmd eq "wa") {
+ if (hierachie($alias) eq "ow") {
+ if (-f "data/user/options/$cmd[1]") {
+ if (hierachie($cmd[1]) eq "ow") {
+ &post_prv("$alias","<font color=ffa500>$cmd[1] <font color=ffffff>ist bereits als Oberwächter eingetragen. Oberwächter können nicht gleichzeitig Wächter sein!</font></font>");
+ } elsif (!add_entry($cmd[1],"wa")) {
+ &post_prv("$alias","<font color=ffa500>$cmd[1] <font color=ffffff>ist bereits als Wächter eingetragen. Eine erneuerte Eintragung ist nicht möglich!</font></font>")
+ } else {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias ernennt \"$cmd[1]\" zum Wächter ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>");
+ }
+ &reload_html;
+ } else {
+ &post_prv($alias,"<font color=ffa500>$alias2wa <font color=ffffff>kann nicht zum Wächter ernannt werden da Benutzername nicht existiert!</font></font>");
+ }
+ &reload_html;
+ }
+#############>- ALIAS DIE WÄCHTERRECHTE ENTZIEHEN -<
+ } elsif ($cmd eq "rwa") {
+ if (hierachie($alias) eq "ow") {
+ if (&rm_entry($cmd[1],"wa") == 1) {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias hat \"$cmd[1]\" vom Wächter zum normalen Chatter degradiert ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>");
+ } else {
+ &post_prv($alias,"<font color=ffa500>$cmd[1] <font color=ffffff>ist kein Wächter und können die Wächterrechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ }
+#############>- ADMINISTRATORBEFEHLE -<
+#############>- ALIAS ZUM OBERWÄCHTER ERNENNEN -<
+ } elsif ($cmd eq "ow" && $alias eq "Snooper") {
+ if (-f "data/user/options/$cmd[1]") {
+ if (add_entry($cmd[1],"ow") == 1) {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias ernennt \"$cmd[1]\" zum Oberwächter ...</font></i>");
+ } else {
+ &post_prv("$alias","<font color=ffa500>$cmd[1] <font color=ffffff>ist bereits als Oberwächter eingetragen!</font></font>");
+ }
+ } else {
+ &post_prv($alias,"<font color=ffa500>$alias2wa <font color=ffffff>kann nicht zum Wächter ernannt werden da Benutzername nicht existiert!</font></font>");
+ }
+ &reload_html;
+#############>- ALIAS DIE OBERWÄCHTERRECHTE ENTZIEHEN -<
+ } elsif ($cmd eq "row" && $alias eq "Snooper") {
+ if (&rm_entry($cmd[1],"ow") ne undef) {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias hat \"$cmd[1]\" vom Oberwächter zum normalen Chatter degradiert ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>");
+ } else {
+ &post_prv($alias,"<font color=ffa500>$cmd[1] <font color=ffffff>ist kein Oberwächter und können die Rechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+#############>- PASSWORD EINES BENUTZERS ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "pw" && $alias eq "Snooper") {
+ my $pw2show = $cmd[1];
+ if (-f "data/user/options/$pw2show") {
+ open PW,"<data/user/options/$pw2show";
+ my @pw = <PW>;
+ close PW;
+ chomp($pw[0]);
+ &post_prv($alias,"<font color=ffa500>$pw2show <font color=ffffff> hat das Passwort \"$pw[0]\" !</font></font>");
+ &reload_html;
+ }
+ &post_prv($alias,"<font color=ffa500>$pw2show <font color=ffffff> existiert nicht in der Benutzerdatenbank !</font></font>");
+ &reload_html;
+#############>- SYSTEMMELDUNG &postEN -<
+ } elsif ($cmd eq "cool" && $alias eq "Snooper" || $alias eq "Peacemaker") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $msg2post</font></i>");
+ &reload_html;
+#############>- ENDE DER CHATBEFEHLE -<
+ }
+ENDCMD:
+ &post_prv($alias,"<font color=ffffff>Der Chatbefehl <font color=ffa500>/$cmd</font> existiert nicht oder Du hast keine Berechtigung diesen Befehl auszuführen!</font></font>");
+ &reload_html;
+}
+
+sub rm_entry {
+ my ($alias,$file) = @_;
+ open ENTRY, "<data/$file";
+ my @entry = <ENTRY>;
+ close ENTRY;
+ my @new;
+ foreach(@entry) {
+ push @new,$_ if ($alias."\n" ne $_);
+ }
+ if (@entry != @new) {
+ open ENTRY, ">data/$file";
+ flock ENTRY, 2;
+ print ENTRY @new;
+ close ENTRY;
+ return 1;
+ } else {
+ return;
+ }
+}
+
+sub add_entry {
+ my ($alias,$file) = @_;
+ open ENTRY, "<data/$file";
+ my @entry = <ENTRY>;
+ close ENTRY;
+ foreach(@entry) {
+ chomp;
+ if ($alias eq $_) {
+ return;
+ }
+ }
+ open ENTRY, ">>data/$file";
+ flock ENTRY, 2;
+ print ENTRY $alias."\n";
+ close ENTRY;
+ return 1;
+} \ No newline at end of file
diff --git a/0.6.0/main2.pl b/0.6.0/main2.pl
new file mode 100644
index 0000000..96408ba
--- /dev/null
+++ b/0.6.0/main2.pl
@@ -0,0 +1,618 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print $q->header();
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+
+$var = $q->param("var");
+if ($var eq "list_alias_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &list_alias_html;
+} elsif ($var eq "alias_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $tmp = $q->param("tmp");
+ &alias_html;
+} elsif ($var eq "edit_profile_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ &edit_html("edit_profile_html");
+} elsif ($var eq "edit_options_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ &edit_html("edit_options_html");
+} elsif ($var eq "gb_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &gb_html;
+} elsif ($var eq "post_gb") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $msg = $q->param("msg");
+ $tmp = $q->param("tmp");
+ $id = $q->param("id");
+ &post_gb;
+} elsif ($var eq "edit_profile") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ &secure_checkid($alias);
+ &edit("edit_profile");
+} elsif ($var eq "edit_options") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $tmp = $q->param("tmp");
+ $id = $q->param("id");
+ $room = $q->param("room");
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ &edit("edit_options");
+} elsif ($var eq "rm_gb_alias") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $tmp = $q->param("tmp");
+ $id = $q->param("id");
+ &rm_gb;
+} else {
+ &error("Parameter fehlt");
+}
+
+###########################
+##HAUPTTEIL DIESER DATEI:##
+###########################
+
+sub gb_html { # Das Benutzerboard/Gästebuch.
+ my $message = $_[0];
+ &start_html("Benutzerboard");
+if ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </i>
+ einen Text und poste
+ <u>dann</u>
+ !
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Vielen Dank für Deinen Beitrag. Wenn Du willst, kannst Du jetzt gleich noch einen Eintrag posten ...
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Falls Du Anregungen oder Verbesserungsvorschläge für die Community hast, dann poste doch einen kleinen Eintrag :-)
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="guestbook">
+ <input type="hidden" name="id" value="y">
+ <input size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+ if (-e "data/guestbook") {
+ open (DATEI,"<data/guestbook") || &error("Konnte dat/guestbook nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ print
+ $q->div(@datei);
+ }
+ print
+ $q->end_html;
+}
+
+
+sub post_gb { # Wenn etwas in ein Gästebuch eingetragen wird
+ &zeit;
+ if ($msg eq "") {
+ if ($id eq "y") { # Überprüfen, ob Benutzerboard- oder Privatgästebuch
+ &gb_html("post_empty");
+ } else {
+ &alias_html("post_empty");
+ }
+ exit;
+ }
+ $msg =~ s#<#&lt\;#g;
+ my $tmpath = "";
+ if ($id eq "y") {
+ $tmpath = "data/guestbook";
+ } else {
+ $tmpath = "data/user/gbooks/$tmp";
+ }
+ open(GB,"$tmpath");
+ my @gb = <GB>;
+ close GB;
+ pop(@gb) if ($#gb > 99);
+ my @newdatei = "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ push(@newdatei,@gb);
+ open(GB,">$tmpath");
+ print GB @newdatei;
+ close GB;
+ if ($id eq "y") {
+ &gb_html("post_ok");
+ exit;
+ } else {
+ post_prv("$tmp","<font color=ffffff><a href=\"main2.pl?alias=$tmp&var=alias_html&tmp=$alias&tmpid=$tmpid\" target=\"_new\">$alias</a> hat soeben einen Pin in <a href=\"main2.pl?alias=$tmp&var=alias_html&tmp=$tmp&tmpid=$tmpid\" target=\"_new\">Dein Profil</a> gehängt ... </font>");
+ &alias_html;
+ exit;
+ }
+}
+
+sub rm_gb { # Gästebucheintrag entfernen
+ open(GB,"<data/user/gbooks/$alias");
+ my @gbfile = <GB>;
+ close GB;
+ my @newgbfile = ();
+ for ($i=0; $i <= $#gbfile; $i++) {
+ push(@newgbfile,$gbfile[$i]) if ($i != $id);
+ }
+ open(GB,">data/user/gbooks/$alias");
+ print GB @newgbfile;
+ close GB;
+ &alias_html("rm_ok");
+}
+
+sub list_alias_html { # Liste aller Benutzer
+ &start_html("Alle Benutzer");
+ opendir(REGISTERED,"data/user/options");
+ my @users = readdir(REGISTERED);
+ closedir(REGISTERED);
+ my @liste = sort(@users);
+ my $nr = $#users-1;
+print <<END;
+ <div>
+ Es sind z.Z. genau $nr Benutzernamen in der Datenbank vorhanden! (Sortiert nach #, A-Z, a-z)
+ </div>
+ <hr>
+ <div>
+END
+ foreach(@liste) {
+ if (-f "data/user/options/$_") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid" },
+ "$_"),
+ " ";
+ }
+ }
+print <<END;
+ </div>
+</body>
+</html>
+END
+}
+
+sub alias_html { # Anzeigen eines Benutzerprofils
+ my $message = $_[0];
+ open(COUNTS,"<data/user/counts/$tmp");
+ local $counter = <COUNTS>;
+ close COUNTS;
+ $counter++;
+ open(COUNTS,">data/user/counts/$tmp");
+ print COUNTS $counter;
+ close COUNTS;
+ &start_html($tmp);
+print <<END;
+<div>
+ <a href="htdocs.pl?var=werda_html&alias=$alias&tmpid=$tmpid">Hier</a>
+ gehts zur Gesamtübersicht !
+</div>
+<hr>
+END
+if ($message eq "rm_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Der von Dir gewählte Eintrag wurde erfolgreich gelöscht.
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </u>
+ einen Text und poste
+ <u>dann</u>
+ !
+ <hr>
+END
+}
+ open(PROFILE,"<data/user/profiles/$tmp");
+ @data = <PROFILE>;
+ close PROFILE;
+print <<END;
+ <div>
+ Dieses Profil wurde insgesamt schon $counter mal aufgerufen !
+ <br><br>Alias: $tmp
+ <br><br>Nachname: $data[0]
+ <br><br>Vorname: $data[1]
+ <br><br>Alter: $data[2]
+ <br><br>Wohnort: $data[3]
+ <br><br>E-Mail:
+ <a href="mailto:$data[4]">$data[4]</a>
+ <br><br>ICQ-Nummer: $data[5]
+ <br><br>Homepage: <a href="$data[6]" target="_new">$data[6]</a>
+ <br><br>Weiteres:<br>$data[7]
+ <hr>
+ Hier kannst Du $tmp eine Nachricht hinterlassen!
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input type="text" size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+if (-e "data/user/gbooks/$tmp") {
+ open (DATEI,"<data/user/gbooks/$tmp") || &error("Konnte data/user/gbooks/$tmp nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ my $nr = 1;
+ if ($alias ne $tmp) {
+ foreach(@datei) {
+ print "<br>Eintrag # $nr: $_";
+ $nr++;
+ }
+ } else {
+print <<END;
+ <table>
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="rm_gb_alias">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="$tmp">
+END
+for($i=0; $i <= $#datei; $i++) {
+print <<END;
+ <tr>
+ <td>
+ <input type="radio" name="id" value="$i">
+ </td>
+ <td>
+ <div class=q>
+ <br>
+ Eintrag # $nr:
+ $datei[$i]
+ </div>
+ </td>
+ </tr>
+END
+$nr++;
+}
+print <<END;
+ </table>
+ <table>
+ <tr>
+ <td>
+ <font color=ffffff>
+ <input type="submit" value="Markierten Eintrag löschen">
+ </font>
+ </td>
+ <td>
+ <font color=ffffff>
+ <input type="reset" value="Markierung rückgängig machen">
+ </font>
+ </td>
+ </tr>
+ </table>
+ </form>
+END
+}
+}
+ print
+ $q->end_html;
+}
+
+sub edit_html { # Chat-Optionen / Benutzerprofil editieren
+ my ($method,$message) = @_;
+ &start_html("Benutzerprofil ändern");
+ if ($method eq "edit_options_html") {
+ open(DATEI,"<data/user/options/$alias");
+ } elsif ($method eq "edit_profile_html") {
+ open(DATEI,"<data/user/profiles/$alias");
+ }
+ @data = <DATEI>;
+ close DATEI;
+ foreach(@data) {
+ chomp $_;
+ }
+ if ($method eq "edit_options_html") {
+ if ($message eq "edit_options_ok") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat die Chateinstellungen geändert ...</font></i>");
+print <<END;
+<script language="JavaScript">
+ open("main.pl?var=change_colors&alias=$alias&room=$room&col=$col&secol=$secol&tmpid=$tmpid","reload");
+</script>
+<div class=b>
+ Hinweis:
+</div>
+<div>
+ Du hast soeben Deine Chat-Optionen erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren. Um
+ weiterzuchatten einfach Fenster schliessen!
+</div>
+<hr>
+END
+ } elsif ($message eq "edit_pw_wrong") {
+print <<END;
+<div class=b>
+ ACHTUNG!
+</div>
+<div>
+ Du hast soeben versucht, dein Passwort zu ändern. Jedoch stimmte die Erste Eingabe nicht mit der Zweiten überein.
+ Bitte versuch es erneuert ...
+</div>
+<hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Deine Chat-Optionen editieren!" ),
+ $q->hr;
+ }
+print <<END;
+<script lang="javascript" type="text/javascript">
+<!--
+
+function radioWert(rObj) {
+ for (var i=0; i<rObj.length; i++) if (rObj[i].checked) return rObj[i].value;
+ return false;
+}
+
+function insertcode( code ) {
+ document.optionen.elements[radioWert(document.optionen.eingabe)].value = code;
+}
+
+//-->
+</script>
+
+<form name="optionen" action="main2.pl">
+ <input type="hidden" name="var" value="edit_options">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Passwort
+ <font color=ffa500>
+ (Gut merken !!)
+ </font>
+ <br>
+ <input type="password" name="id" value="$data[0]">
+ </div>
+ </td>
+ <td width=20>
+ </td>
+ <td>
+ <div>
+ Geb hier das Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp" value="$data[0]">
+ </div>
+ </td>
+ </tr>
+ </table>
+ <hr>
+ <div>Einstellungen für den Nachrichten-Verlauf</div>
+ <table>
+ <tr>
+ <td>
+ <br>
+ <div>Anzahl der Nachrichten im Verlauf (Standart = 10)</div>
+ <font color=ffffff>
+ <select name="maxVerlauf" size="1">
+ <option value="$data[3]">$data[3]
+END
+for($i=1;$i<=50;$i++) {
+ print "<option value=\"$i\">$i";
+}
+print<<END;
+ </select>
+ </font>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <br>
+<div>Wie sollen die Nachrichten im Verlauf angeordnet sein?</div>
+ <font color=ffffff>
+ <select name="verlaufOrder" size="1">
+ <option value="$data[4]">Bisherige Einstellung ($data[4])
+ <option value="0">Neue Verlaufnachrichten oben (0)
+ <option value="1">Neue Verlaufnachrichten unten (1)
+ </select>
+ </font>
+ </td>
+ </tr>
+ </table>
+<br>
+ <div>PS: Einstellungen des Nachrichten-Verlaufs werden erst nach einem Neueinloggen aktualisiert.</div>
+ <hr>
+ <table>
+ <tr>
+ <td>
+ <div>
+ <input type="radio" name="eingabe" value="col" checked>
+ Auswahl von Farbe 1
+ <br>
+ (Farbe Deines Nicks):
+ <br>
+ <input name="col" size="6" maxlength="6" value="$data[1]">
+ </div>
+ </td>
+ <td width=20>
+ </td>
+ <td>
+ <div>
+ <input type="radio" name="eingabe" value="secol">
+ Auswahl von Farbe 2
+ <br>
+ (Farbe Deiner Nachrichten):
+ <br>
+ <input name="secol" size="6" maxlength="6" value="$data[2]">
+ </div>
+ </td>
+ </tr>
+ </table>
+<br>
+ <div>
+ Beliebige Auswahl markieren und Farbe wählen. Um Deine Optionen abzuspeichern,
+ auf "Daten ändern" klicken!
+ </div>
+ <br>
+END
+ open(COLORS,"<colors.sno");
+ @colors = <COLORS>;
+ close COLORS;
+ print @colors;
+ } elsif ($method eq "edit_profile_html") {
+ if ($message eq "edit_profile_ok") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias hat das Profil geändert ...</font></i>");
+print <<END;
+ <div class=b>
+ Hinweis:
+ </div>
+ <div>
+ Du hast soeben Dein Profil erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren:
+ <hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Dein Profil editieren!" ),
+ $q->hr;
+ }
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="edit_profile">
+ <div>
+ Dein Nachname:
+ <br>
+ <input name="nachname" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ Dein Vorname:
+ <br>
+ <input name="vorname" value="$data[1]">
+ </div>
+ <br>
+ <div>
+ Dein Alter:
+ <br>
+ <input name="alter" value="$data[2]">
+ </div>
+ <br>
+ <div>
+ Dein Wohnort:
+ <br>
+ <input name="wohnort" value="$data[3]">
+ </div>
+ <br>
+ <div>
+ Deine E-Mail Adresse:
+ <br>
+ <input name="email" value="$data[4]">
+ </div>
+ <br>
+ <div>
+ Deine ICQ-Nummer:
+ <br>
+ <input name="icq" value="$data[5]">
+ </div>
+ <br>
+ <div>
+ Deine Homepage:
+ <br>
+ <input name="homepage" value="$data[6]">
+ </div>
+ <br>
+ <div>
+ Weiteres:
+ <br>
+ <textarea rows="5" cols="40"name="weiteres" wrap="virtual">$data[7]</textarea>
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <font color=ffffff>
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="room" value="$room">
+ <input type="submit" value="Daten ändern ...">
+ </font>
+ </form>
+</body>
+</html>
+END
+}
+
+
+sub edit { # Benutzerprofil od. Chat-Optionen abspeichern
+ my $method = $_[0];
+ &zeit;
+ if ($method eq "edit_profile") {
+ my $url = $q->param('homepage');
+ $url =~ s#^[http://]*##g;
+ open(PROFILE,">data/user/profiles/$alias");
+ print PROFILE $q->param('nachname')."\n".$q->param('vorname')."\n".$q->param('alter')."\n".$q->param('wohnort')."\n".$q->param('email')."\n".$q->param('icq')."\n"."http://$url\n".$q->param('weiteres');
+ close PROFILE;
+ &edit_html("edit_profile_html","edit_profile_ok");
+ } elsif ($method eq "edit_options") {
+ if ($id ne $tmp) {
+ &edit_html("edit_options_html","edit_pw_wrong");
+ exit;
+ }
+ open(OPTIONS,">data/user/options/$alias");
+ print OPTIONS $id."\n".$col."\n".$secol."\n".$q->param("maxVerlauf")."\n".$q->param("verlaufOrder");
+ close OPTIONS;
+ &edit_html("edit_options_html","edit_options_ok");
+ }
+} \ No newline at end of file
diff --git a/0.6.0/online.pl b/0.6.0/online.pl
new file mode 100644
index 0000000..0380293
--- /dev/null
+++ b/0.6.0/online.pl
@@ -0,0 +1,138 @@
+#!/usr/bin/perl
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print $q->header();
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+&secure_checkid($alias);
+$room = $q->param("room");
+
+open(DATEI,"<data/online/rstat/$room.away");
+ my @datei = <DATEI>;
+close DATEI;
+foreach(@datei) {
+ push @away,split(/<; /);
+}
+
+#my %away = &prove_away($alias,$room,"return_list");
+
+#print "<font color=red>das ist ein test: ";
+#for ($i=0;$i<=$#away;$i+=2) {
+# print "$away[$i]<br>";
+# }
+#print "</font>";
+
+for ($i=0;$i<=$#away;$i+=2) {
+ goto DONOTCOUNT if ($away[$i] eq $alias);
+}
+
+open(DATEI,"<data/online/users/$alias");
+ my $oldstamp = <DATEI>;
+close DATEI;
+if ($oldstamp > (time - 40)) {
+ open(DATEI,"<data/user/counts/$alias.online");
+ my $online = <DATEI>;
+ close DATEI;
+ my $total = (time-$oldstamp+$online);
+ open DATEI,">data/user/counts/$alias.online";
+ print DATEI $total;
+ close DATEI;
+}
+DONOTCOUNT:
+
+unless (-d "data/online/rooms/$room") {
+ mkdir "data/online/rooms/$room", 0777;
+}
+unless (-f "data/online/rstat/$room") {
+ open(DATEI,">data/online/rstat/$room"); # Raumbesetzerstatus setzen
+ print DATEI "0\n\n$alias\n";
+ close DATEI;
+}
+
+open(DATEI,">data/online/users/$alias");
+ print DATEI time;
+close DATEI;
+open(DATEI,">data/online/rooms/$room/$alias");
+ print DATEI time;
+close DATEI;
+
+open(DATEI,"<data/online/prove");
+ my $provetime = <DATEI>;
+close DATEI;
+&check_online if ($provetime < (time - 30));
+
+print<<HEADER;
+<html>
+ <head>
+ <meta http-equiv="refresh" content="20" URL="online.pl?room=$room&alias=$alias&tmpid=$tmpid">
+ <style type="text/css">
+ a { font-family: arial; font-size:11px; color: #ffffef; }
+ a:hover { color: #ffffff; }
+ </style>
+ <style type="text/css" media="all">
+ a { text-decoration: none; }
+ a:hover { text-decoration:underline; }
+ </style>
+ </head>
+ <body bgcolor="#000000">
+HEADER
+
+opendir(ROOM,"data/online/rooms/".$room);
+ my @room = sort(readdir(ROOM));
+closedir(ROOM);
+
+my $chatter = $#room-1;
+my @besetzer = &prove_besetzer(undef,$room,"return_list");
+
+open WA, "<data/wa";
+ my @wa = <WA>;
+close WA;
+open OW, "<data/ow";
+ my @ow = <OW>;
+close OW;
+
+print "<font size='1' color='ffffff' face='arial'>$room ($chatter):</font><table>";
+
+foreach $online (@room) {
+ if (-f "data/online/rooms/$room/$online") {
+ for ($i=0;$i<=$#away;$i+=2) {
+ chomp $away[$i+1];
+ if ($away[$i] eq $online) {
+ my $away = $away[$i+1];
+ print "<tr><td><img title='$away' alt='$away' src='$gfxpath/away.gif'></td>";
+ goto WEITER;
+ }
+ }
+ foreach(@besetzer) {
+ chomp;
+ if ($_ eq $online) {
+ print "<tr><td><img title='Raumbesetzer' alt='Raumbesetzer' src='$gfxpath/rb.gif'></td>";
+ goto WEITER;
+ }
+ }
+ foreach(@wa) {
+ chomp;
+ if ($_ eq $online) {
+ print "<tr><td><img title='W&auml;chter' alt='W&auml;chter' src='$gfxpath/wa.gif'></td>";
+ goto WEITER;
+ }
+ }
+ foreach(@ow) {
+ chomp;
+ if ($_ eq $online) {
+ print "<tr><td><img title='Oberw&auml;chter' alt='Oberw&auml;chter' src='$gfxpath/ow.gif'></td>";
+ goto WEITER;
+ }
+ }
+ print "<tr><td></td>";
+WEITER:
+ print "<td><a href='main2.pl?var=alias_html&alias=$alias&tmp=$online&tmpid=$tmpid' target='$online'>$online</a></td></tr>";
+ }
+}
+
+print "</table>", $q->end_html;
diff --git a/0.6.0/ow.gif b/0.6.0/ow.gif
new file mode 100644
index 0000000..c2a5c2a
--- /dev/null
+++ b/0.6.0/ow.gif
Binary files differ
diff --git a/0.6.0/push.pl b/0.6.0/push.pl
new file mode 100644
index 0000000..ebff406
--- /dev/null
+++ b/0.6.0/push.pl
@@ -0,0 +1,120 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+#CGI->compile(':all');
+$q = new CGI;
+print $q->header;
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+
+{
+ open(IDENT,"<data/online/ident/$alias");
+ my @ident = <IDENT>;
+ close IDENT;
+ if ($ident[1] ne $tmpid) {
+ print $q->div( "Error: (Falsche TmpID in push.pl!)" ),
+ $q->end_html;
+ open(ERROR,">>data/error");
+ print ERROR "$alias $tmpid $$ ".time." (Falsche TmpID in push.pl!) \n";
+ close ERROR;
+ exit 0;
+ }
+}
+
+$room = $q->param("room");
+
+my $pid = $$;
+$| = 1;
+
+print <<END;
+<html>
+ <head>
+<script language="JavaScript">
+<!--
+// Scroll-Routine von Anklepper (http://www.anklepper.de)
+// speziell für yChat (http://www.yChat.de), Copyright 2000
+scrolling = true;
+moves_steps = 4;
+moves_interval = 4;
+function moves()
+{
+ if( scrolling != false )
+ window.scrollBy( 0, moves_steps );
+ window.setTimeout( "moves()", moves_interval );
+}
+moves();
+//-->
+</script>
+</head>
+<body bgcolor=000000 link=FFFFFF alink=FFFFEF vlink=FFFFEF>
+<font size=1 color=ffffff face=arial>loading chat-engine @ PID: $pid...</font><br>
+END
+sleep 1;
+print "<font size=1 color=ffffff face=arial>loading in progress ...</font><br>";
+sleep 1;
+print "<font size=1 color=ffffff face=arial><b>$alias</b>, welcome to <b>yChat</b>! :-)</font><br>";
+
+
+if (-f "data/user/memos/$alias") {
+ open(MEMOS,"<data/user/memos/$alias");
+ my $memos = <MEMOS>;
+ close MEMOS;
+ print $memos;
+ unlink("data/user/memos/$alias");
+}
+
+my $startime,$change_room,@flood;
+OPENMSGFILE:
+$change_room = 0;
+$startime = time;
+
+if (-e "data/msgs/$room") {
+ open(MSGFILE,"<data/msgs/$room");
+ unless (-d "data/online/pids") {
+ mkdir "data/online/pids", 0777;
+ } unless (-d "data/online/pids/$room") {
+ mkdir "data/online/pids/$room", 0777;
+ }
+ open(PID,">data/online/pids/$room/$pid");
+ print PID time;
+ close PID;
+} else {
+ sleep 1;
+ goto OPENMSGFILE;
+}
+
+&sendmsgs;
+while (-f "data/online/users/$alias") {
+ local $SIG{USR1} = \&sendmsgs;
+ goto OPENMSGFILE if ($change_room == 1);
+ sleep 15;
+ print "\n";
+}
+
+sub sendmsgs {
+ for ($curpos = tell(MSGFILE); <MSGFILE>; $curpos = tell(MSGFILE)) {
+ my ($address, $stamp, $command, $action, $message) = split(/<;/, $_);
+ if ($address eq "!" || $address eq $alias) {
+ if ($stamp > $startime) {
+ if ($command eq "cr") {
+ unlink("data/online/pids/$room/$pid");
+ $room = $action;
+ close MSGFILE;
+ $change_room = 1;
+ }
+ print "$message<br>\n" if ($change_room != 1);
+ push(@flood,$message);
+ if ($flood[0] eq $flood[1] && $flood[0] eq $flood[2] && $flood[0] eq $flood[3]) {
+ print "<i><font color=red> Jemand floodet den Chat !</font></i><br>\n";
+ }
+ shift(@flood) if ($#flood > 2);
+ }
+ }
+ }
+ seek(MSGFILE, $curpos, 0);
+}
+
+unlink("data/online/pids/$room/$pid"); \ No newline at end of file
diff --git a/0.6.0/rb.gif b/0.6.0/rb.gif
new file mode 100644
index 0000000..1187798
--- /dev/null
+++ b/0.6.0/rb.gif
Binary files differ
diff --git a/0.6.0/setup.sh b/0.6.0/setup.sh
new file mode 100644
index 0000000..6b3ef8a
--- /dev/null
+++ b/0.6.0/setup.sh
@@ -0,0 +1,50 @@
+#!/bin/sh
+echo
+echo yChat wird konfiguriert!
+echo
+mkdir data
+chmod 777 data
+mkdir data/logs
+chmod 777 data/logs
+mkdir data/msgs
+chmod 777 data/msgs
+mkdir data/user
+chmod 777 data/user
+mkdir data/user/counts
+chmod 777 data/user/counts
+mkdir data/user/memos
+chmod 777 data/user/memos
+mkdir data/user/options
+chmod 777 data/user/options
+mkdir data/user/profiles
+chmod 777 data/user/profiles
+mkdir data/user/gbooks
+chmod 777 data/user/gbooks
+mkdir data/user/lastlogin
+chmod 777 data/user/lastlogin
+mkdir data/online
+chmod 777 data/online
+mkdir data/online/rooms
+chmod 777 data/online/rooms
+mkdir data/online/pids
+chmod 777 data/online/pids
+mkdir data/online/rstat
+chmod 777 data/online/rstat
+mkdir data/online/users
+chmod 777 data/online/users
+mkdir data/online/ident
+chmod 777 data/online/ident
+chmod 777 data/htdocs/*
+chmod 777 *.pl
+chmod 777 config.pm
+mkdir dokus/
+mv *.txt dokus/
+mkdir ../../htdocs/yChat/
+mv *.gif ../../htdocs/yChat/
+mv *.swf ../../htdocs/yChat/
+
+echo
+echo yChat Setup beendet ...
+echo Created and Copyright by Paul C. Bütow
+echo
+
diff --git a/0.6.0/stat.pl b/0.6.0/stat.pl
new file mode 100644
index 0000000..801f8b6
--- /dev/null
+++ b/0.6.0/stat.pl
@@ -0,0 +1,208 @@
+#!/usr/bin/perl -w
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+
+my $var = $q->param('var');
+my $alias = $q->param('alias');
+my $tmpid = $q->param('tmpid');
+
+print $q->header();
+&start_html("Statistiken");
+print $q->div("yChat Statistiken"), $q->hr,
+ $q->div( $q->a( { -href=>"stat.pl?var=ranking&alias=$alias&tmpid=$tmpid" }, "Rankings"), " | ",
+ $q->a( { -href=>"stat.pl?var=del&alias=$alias&tmpid=$tmpid" }, "Loginstatistiken"), " | ",
+ $q->a( { -href=>"stat.pl?var=stat&alias=$alias&tmpid=$tmpid" }, "DB-Statistik"), " | ",
+ $q->a( { -href=>"stat.pl?var=code&alias=$alias&tmpid=$tmpid" }, "Programmcode"), " | ",
+ $q->a( { -href=>"stat.pl?var=var&alias=$alias&tmpid=$tmpid" }, "Umgebungsvariablen"),), $q->hr;
+
+if ($var eq "ranking") {
+
+ opendir(COUNTS, "data/user/counts");
+ my @counts = readdir(COUNTS);
+ closedir(COUNTS);
+
+ print "<div>";
+
+ my $nr_start = $q->param('start');
+ my $nr_end = $q->param('end');
+ my %online;
+ my $rank;
+ my $nr;
+
+ foreach(@counts) {
+ if(-f "data/user/counts/$_" ) {
+ if (s#.online##g) {
+ open(TOTAL, "<data/user/counts/$_.online");
+ my $total = <TOTAL>;
+ close TOTAL;
+ $online{sprintf("%.2f",($total / 3600))} = $_;
+ }
+ }
+ }
+
+ print "<div>", $q->b("Rankings:"), $q->br,
+ "<table><tr><td><div><b>#:</b></div></td><td><b><div>St.:</div></b></td><td><b><div>Name:</div></b></td></tr>";
+
+ if (!$nr_start) {
+ $nr_start = 1;
+ } if (!$nr_end) {
+ $nr_end = 20;
+ }
+
+ foreach $wert (reverse(sort { $a <=> $b } keys %online)) {
+ $nr++;
+ if ($online{$wert} eq $alias) {
+ $rank = $nr;
+ last if ($nr > $nr_end);
+ }
+ next if ($nr < $nr_start || $nr > $nr_end);
+ print "<tr><td><font color='ffffff' size='1' face='arial'>".$nr."</font></td><td><font color='ffffff' size='1' face='arial'> ".$wert."h </font></td><td> <a href='main2.pl?var=alias_html&alias=$alias&tmp=$online{$wert}&tmpid=$tmpid'><font size='1' face='arial'>$online{$wert}</font></a></td></tr>\n";
+ }
+ print "</table>", $q->hr;
+ $nr_start -= 20; $nr_end -= 20;
+ print "Rankings von <a href='stat.pl?var=ranking&start=$nr_start&end=$nr_end&alias=$alias&tmpid=$tmpid'>$nr_start bis $nr_end</a> anzeigen ...<br>" if ($nr_start > 0);
+ $nr_start += 40; $nr_end += 40;
+ print "Rankings von <a href='stat.pl?var=ranking&start=$nr_start&end=$nr_end&alias=$alias&tmpid=$tmpid'>$nr_start bis $nr_end</a> anzeigen ...",
+ $q->br, $q->br, $q->b("$alias, Du befindest Dich auf Rank $rank</div>");
+
+} elsif ($var eq "del") {
+
+ print "<div>", $q->b("Alte Benutzer l&ouml;schen:"), $q->br,
+ "Benutzer, die sich 1440 Stunden (60 Tage) nicht mehr in das System eingeloggt haben, werden gelöscht.", $q->br, $q->br;
+
+ opendir(USER, "data/user/options");
+ my @user = readdir(USER);
+ closedir(USER);
+ @user = sort(@user);
+
+ my $i = 0;
+ my $j;
+ my $k = 0;
+ my $l = 0;
+ my $full = $q->param('tmp');
+
+ foreach(@user) {
+ if (-f "data/user/lastlogin/$_") {
+ open(LOGIN,"<data/user/lastlogin/$_");
+ my $login = <LOGIN>;
+ close LOGIN;
+ $login = sprintf("%.2f",((time - $login) / 3600));
+ $j++;
+ if (999 < $login && $login < 1440) { # 1440 = 60 Tage
+ $k++;
+ print $q->font( { -color=>"ffa500" }, $q->b( "$j($k) $_ Letztes Login vor: ".$login."h") ), $q->br, "\n" if ($full ne undef);
+ } elsif ($login < 48) {
+ $l++;
+ print $q->font( { -color=>"ffffef" }, $q->b( "$j($l) $_ Letztes Login vor: ".$login."h") ), $q->br, "\n" if ($full ne undef);
+ } elsif ($login < 1440) {
+ print "$j $_ Letztes Login vor: ".$login."h", $q->br, "\n" if ($full ne undef);
+ } else {
+ $k++;
+ &kill($_,$i++,$login);
+ }
+ } elsif (-f "data/user/options/$_") {
+ &kill($_,$i++);
+ }
+ }
+ print $q->hr if ($full ne undef);
+ print "</div>", $q->div( $q->b(
+ "$j Benutzer befinden sich in der Datenbank!", $q->br,
+ $q->font( { -color=>"ffffef" }, "$l Benutzer haben sich innerhalb der letzten 48 Stunden eingeloggt!"), $q->br,
+ $q->font( { -color=>"ffa500" }, "$k Benutzer haben sich &uuml;ber 1000 Stunden nicht mehr eingeloggt!"), $q->br,
+ $q->font( { -color=>"ff0000" }, "$i Benutzer wurden gerade eben gelöscht!") ), $q->br, $q->br,
+ "PS: Jeder registrierte Benutzername wird nur einmal gez&auml;hlt!" );
+ print $q->br, $q->div( "(", $q->a( { -href=>"stat.pl?var=del&tmp=true&alias=$alias&tmpid=$tmpid"}, "Vollst&auml;ndige Ansicht"), ")" ) if ($full eq undef);
+
+} elsif ($var eq "var") {
+
+ print "<div>", $q->b("Server Umgebungsvariablen:"), $q->br, $q->br,
+ "Die Serverumgebungsvariablen k&ouml;nnen nur von Oberw&auml;chtern eingesehen werden!", $q->br, $q->br;
+
+ if (&hierachie($alias) eq "ow") {
+ while(($key,$value) = each(%ENV)) {
+ print "$key = $value\n", $q->br;
+ }
+ }
+
+ print "</div>";
+
+} elsif ($var eq "stat") {
+
+ print $q->div( $q->b("yChat-DB Statistik:") ), $q->br;
+ $files = 0;
+ $size = 0;
+ $directorys = 1;
+ &zaehle("data");
+ $size = sprintf("%.2f", ($size/1048576));
+ print $q->div( "Dateien insgesamt: $files", $q->br, "MB insgesamt: $size", $q->br, "Verzeichnisse insgesamt: $directorys");
+
+ } elsif ($var eq "code") {
+
+ print $q->div( $q->b("yChat Programmcode-Statistik:") ), $q->br;
+
+ my ($zeilen,$size,$bytes,$files);
+
+ opendir(DIR,".");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ $dir = sort(@dir);
+
+ foreach(@dir) {
+ if (/.+[pl]$/ || /.+[pm]$/) {
+ $bytes = (-s);
+ $size += $bytes;
+ open(PL, "<$_");
+ my @pl = <PL>;
+ close PL;
+ local $nr = $#pl+1;
+ $zeilen += $nr;
+ $files++;
+ print $q->div("Datei $files: $nr Zeilen, $bytes Bytes"), $q->br, "\n";
+ }
+ }
+print $q->div( $q->b("Programmcode: $files Dateien, $zeilen Zeilen", $q->br, "Größe: $size Bytes") );
+
+}
+
+print $q->end_html;
+
+sub zaehle {
+ local ($dir,$data) = @_;
+ $dir = "$dir/$data" if ($data ne undef);
+ opendir(DATA,$dir);
+ local @data = readdir(DATA);
+ closedir(DATA);
+ $files2 = 0;
+ foreach(@data) {
+ if (-f "$dir/$_") {
+ $files++;
+ $files2++;
+ $size += (-s "$dir/$_");
+ } elsif (-d "$dir/$_" && $_ ne "." && $_ ne "..") {
+ $directorys++;
+ &zaehle($dir,$_);
+ }
+ }
+}
+
+sub kill {
+ my ($rm,$nr,$login) = @_;
+ $login = "XXXXXX" if ($login eq undef);
+ print $q->font( { -color=>"ff0000" }, $q->b( "$j($nr) $rm Letztes Login vor: ".$login."h (wurde gel&ouml;scht)") ), $q->br, "\n";
+ print "<font size='1'>";
+ print "options " if unlink("data/user/options/$rm");
+ print "profiles " if unlink("data/user/profiles/$rm");
+ print "gbooks " if unlink("data/user/gbooks/$rm");
+ print "counts " if unlink("data/user/counts/$rm");
+ print "counts.online " if unlink("data/user/counts/".$rm.".online");
+ print "lastlogin " if unlink("data/user/lastlogin/$rm");
+ print "memos" if unlink("data/user/memos/$rm");
+ print "</font>", $q->hr, "\n";
+ &zeit;
+ open(DEL, ">>data/kill");
+ print DEL "($day.$month.$year $hours:$min:$sec) $rm wurde automatisch gekillt [$alias]\n";
+ close DEL;
+} \ No newline at end of file
diff --git a/0.6.0/wa.gif b/0.6.0/wa.gif
new file mode 100644
index 0000000..2b1ba45
--- /dev/null
+++ b/0.6.0/wa.gif
Binary files differ
diff --git a/0.6.0/y.gif b/0.6.0/y.gif
new file mode 100644
index 0000000..356175d
--- /dev/null
+++ b/0.6.0/y.gif
Binary files differ
diff --git a/0.6.0/yIntro.swf b/0.6.0/yIntro.swf
new file mode 100644
index 0000000..d592826
--- /dev/null
+++ b/0.6.0/yIntro.swf
Binary files differ
diff --git a/0.6.0/ySymbol.swf b/0.6.0/ySymbol.swf
new file mode 100644
index 0000000..2b899bb
--- /dev/null
+++ b/0.6.0/ySymbol.swf
Binary files differ
diff --git a/0.6.0/y_.gif b/0.6.0/y_.gif
new file mode 100644
index 0000000..f8b6ee5
--- /dev/null
+++ b/0.6.0/y_.gif
Binary files differ
diff --git a/0.6.1/CREDITS.txt b/0.6.1/CREDITS.txt
new file mode 100644
index 0000000..84ec216
--- /dev/null
+++ b/0.6.1/CREDITS.txt
@@ -0,0 +1,33 @@
+########################### yChat.de CREDITS ################################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+Vielen Dank an alle Personen, dir mit geholfen haben ( und immernoch helfen )
+yChat besser zu machen:
+
+ - Andreas Buchwald aka Anklepper, für ...
+ ... die Programmierung des "Nach-UntenScroll-JavaScripts", des
+ "Nachrichten-Verlauf-JavaScripts" im Texteingabeframe.
+ ... die technische Umsetzung, daß sich das Inputframe bei jedem
+ Textposting nicht wieder reloadet.
+ ... ein nettes JavaScript, welches erlaubt, Formularwerte
+ frameübergreifend zu ändern.
+ ... die Erstellung der Flashanimationen.
+ ... die Programmierung der Auto-Away- und der Auto-Logout Funktion.
+ ... die Optimierung der Statusgrafiken in der Onlineliste.
+ ( www.anklepper.de ).
+
+ - Dave aka Truhe, für ...
+ ... die Erstellung der Farbtabelle unter Chatoptionen inkl.
+ Auswähl-JavaScript!
+ ... die Erstellung einiger CSS.
+ ... die Unterstützung der Umsetzung der Auto-Away- und Auto-Logout
+ Funktion.
+ ... die Erstellung der "Chatiquette".
+ ... einige Bugfixes in JavaScript-Codes.
+ ( maligree.yi.org )
+
+ - Dommi für die Erstellung der Away-Grafik. Diese wurde jedoch nachträglich
+ von mir verfärbt :-)
+
+ - Larry Wall, für die Erfindung von Perl ! \ No newline at end of file
diff --git a/0.6.1/README.txt b/0.6.1/README.txt
new file mode 100644
index 0000000..b67f15e
--- /dev/null
+++ b/0.6.1/README.txt
@@ -0,0 +1,24 @@
+############################## yChat.de README ##############################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+Allgemeine Bedingungen bezgl. yChat:
+
+ - Das yChat-System darf ohne Erleubnis des Autors nicht auf irgendeiner Art
+ und Weise weitergegeben- oder eingesetzt werden.
+
+ - Wird das yChat-System eingesetzt, so darf es manipuliert werden, soweit
+ die Copyright-Hinweise des Autors, die Versionsbezeichnung und der Link
+ auf der Startseite nach www.home.yChat.de unverändert bleibt.
+ Ansonsten darf der gesamte Code manipuliert werden.
+
+ - Wird das yChat-System erlaubter Weise manipuliert, so muß das veränderte
+ Skript auf Anforderung an den Autor weitergegeben werden. Dieser darf
+ die Veränderungen in das Standard-yChat-System integrieren.
+
+ - Wird das yChat-System eingesetzt, su muß dem Autor die Location bzw. die
+ URL bekanntgegeben werden. Diese mit einer URL wwX.yChat.de verlinkt.
+ Wobei X für die Nummer des jew. Servers steht.
+
+ - Es ist verboten, Sourcecode aus dem yChat-System zu kopieren und
+ für andere, nicht von yChat abhängige Perl-Programme einzusetzen. \ No newline at end of file
diff --git a/0.6.1/SETUP.txt b/0.6.1/SETUP.txt
new file mode 100644
index 0000000..c3c8f08
--- /dev/null
+++ b/0.6.1/SETUP.txt
@@ -0,0 +1,146 @@
+############################## yChat.de SETUP ###############################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+yChat findest Du im Internet unter der Adresse www.yChat.de. Bei Kritik,
+Anregungen oder Fragen bitte in das dort vorhandene Board posten oder eine
+E-Mail an die oben stehende Adresse senden. Ich bemühe mich, yChat so gut wie
+möglich zu machen und bin über Ratschläge immer sehr erfreut :-) ...
+
+Die Installation kann auf Unix-Systemen voll automatisch duchgeführt werden.
+Allerdings ist dafür ein Telnet-Zugang notwendig. Kopiere alle vorhandenen
+Dateien in das Verzeichnis cgi-bin/yChat und führe dann das Shellskript
+setup.sh mit dem Befehl ./setup.sh aus. Alle Verzeichnisse werden
+automatisch erstellt. Dies wurde allerdings nur auf SuSE Linux Systemen
+mit root-Zugriff getestet. Solltest Du ein anderes System verwenden oder
+den Chat auf einen virtuellen Webserver installieren wollen, dann mußt Du
+unter Umständen das Verzeichnis "../../htdocs/yChat" nach "../../yChat"
+in der setup.sh umbenennen. Ansonsten werden die dazugehörigen Grafikdateien
+falsch oder garnicht kopiert.
+
+Wenn Du keinen Telnet-Zugang hast, kannst Du hier die Verzeichnisse manuell
+einrichten:
+
+Folgende Basis-Dateien sind im Chat enthalten und müssen in das cgi-bin
+Verzeichnis kopiert werden. Z.B. nach ./cgi-bin/yChat/:
+
+config.pm => Configurationsdatei ("Shared subs")
+htdocs.pl => Generiert dynamische HTML-Inhalte
+index.pl => Startskript (Registrierung, Login, Chatframeset)
+input.pl => Skript für das Chateingabeframe
+main.pl => Hauptskript (Alle Hauptfunktionen des Chats)
+main2.pl => Skript für editieren der Benutzerdaten etc
+online.pl => Anzeige und Überprüfung der eingelogten Benutzer
+push.pl => Server-Push-Routine
+setup.sh => Dient zur automatischen Einrichtung des Chats
+stat.pl => Erstellt diverse Statistiken
+README.txt => Beinhaltet wichtige Informationen
+UPDATES.txt => Updateliste der verschiedenen Versionen
+CREDITS.txt => Personen, die geolfen haben yChat zu proggen
+SETUP.txt => Dieses Dokument
+chatiq.sno => Datei beinhaltet die Chatiquette
+colors.sno => Datei beinhaltet alle Farben in hex. für die Chatoptionen
+help.sno => Datei beinhaltet alle Chatbefehle
+
+Folgende Verzeichnisse müssen erstellt werden (chmod 777 sollte
+funktionieren):
+
+- Hier befinden sich alle für den Chat notwenidgen Daten:
+ ./cgi-bin/yChat/data/*
+
+- Hier befinden sich alle Logdateien, die vom Chat erstellt werden:
+ ./cgi-bin/yChat/data/logs/*
+
+- Hier befinden sich die Message-Dateien der eingelogten Benutzer:
+ ./cgi-bin/yChat/data/msgs/*
+
+- Hier befinden sich alle Daten der registrierten Benutzer:
+ ./cgi-bin/yChat/data/user/*
+
+- Hier wird abgespeichert, wie oft ein Benutzerprofil insgesant schon
+ aufgerufen wurde und wie lange die Chatter schon online waren:
+ ./cgi-bin/yChat/data/user/counts/*
+
+- Hier werden alle Memos abgespeichert.
+ ./cgi-bin/yChat/data/user/memos/*
+
+- Hier befinden sich alle Chat-Optionen und Passwörter der registrierten
+ Benutzer:
+ ./cgi-bin/yChat/data/user/options/*
+
+- Hier befinden sich alle Benutzerprofile der Benutzer:
+ ./cgi-bin/yChat/data/user/profiles/*
+
+- Hier befinden sich alle Gästebucheinträge der Benutzer:
+ ./cgi-bin/yChat/data/user/gbooks/*
+
+- Hier wird abgespeichert, wann der der jew. benutzer zum letzten mal das
+ System betreten hat.
+ ./cgi-bin/yChat/data/user/lastlogin/*
+
+- Hier befinden sich alle Daten zu den aktuellen Chaträumen und User die
+ online sind
+ ./cgi-bin/yChat/data/online/*
+
+- Verzeichnis für die Raumstatusdateien. Hier wird abgespeichert:
+ Raumbesetzer, Away (inkl. Away-Nachricht)und das Raumthema.
+ ./cgi-bin/yChat/data/online/rstat/*
+
+ - Hier befinden sich die Chatter, die sich in den jew. Räumen befinden. Die
+ Verzeichnisse der Räume werden automatisch erstellt.
+ ./cgi-bin/yChat/data/online/rooms/*
+
+- Hier befinden sich alle PIDs (Process IDs) der Chatter in den jew. Räumen.
+ ./cgi-bin/yChat/data/online/pids/*
+
+- Hier befinden sich alle Chatter, die sich z.Z. im System befinden
+ ./cgi-bin/yChat/data/online/users/*
+
+- Hier befinden sich alle IP-Nummern und TempIDs der eingeloggten Chatter
+ ./cgi-bin/yChat/data/online/ident/*
+
+ - Hier befinden sichTempIDs der eingeloggten Chatter
+ ./cgi-bin/yChat/data/online/tmpid/*
+
+Alle Grafik- und Multimediadateien (*.gif, *.jpg, *.swf) sollten in ein
+nicht-CGI-BIN-Verzeichnis
+ kopiert werden. Z.B. nach ./yChat/.
+
+Zum schluß sollte die config.pm-Datei nach wünschen editiert werden.
+Allerdings sollten die Copyright Hinweise und die Versionsnummern nicht
+manipuliert werden.
+
+Jetzt einfach die Datei index.pl vom Browser ausführen lassen :-)
+
+
+Im Folgendem werde ich ein wenig auf die im yChat-Sourcecode oft verwendeten .
+Variablen eingehen:
+
+ $var => Sagt dem Skript, wie es gestartet werden soll.
+ $alias => Teilt dem Skript den Benutzername mit.
+ $tmpid => Beim einloggen in den Chat wird für den Benutzer eine
+ temporäre ID generiert. Diese wird so wohl in der Variable
+ $tmpid als auch in eine Datei geschrieben. Handelt der
+ Benutzer, so wird vom Skript die Variable $tmpid mit dem
+ Eintrag in der Datei verglichen. Sind beide Werte
+ identisch, dann wird die Handlung des Benutzers
+ ausgeführt. Stimmen die Werte nicht überein, dann wird
+ die Fehlermeldung, daß der Benutzer die falsche $tmpid hat
+ um mit $alias zu handeln,ausgegeben und das Skript beendet
+ sich. Dies ist eine Sicherheitsmaßnahme welche verbietet,
+ mit fremden Benutzernamen im System zu handeln.
+ $room => Sagt dem Skript, wie der aktuelle Raumname lautet.
+ $col => Sagt dem Skript, wie die aktuelle Chatfarbe des Nicks von
+ $alias lautet.
+ $seccol => Sagt dem Skript, wie die aktuelle Chatfarbe der Schrift von
+ $alias lautet.
+ $msg => Beinhaltet den von $alias zu postenden Text im Chat.
+ Hiervon wird auch in den Benutzergästebüchern und im
+ Benutzerboard Gebrauch gemacht.
+ $whisper => Beinhaltet den Benutzernamen, zu dem $alias zuletzt
+ geflüstert hat.
+ $id und $tmp => Temporäre Variablen zwecks Übermittlung diverser Daten.
+ $pw => Wird im Skript index.pl verwendet um das Zugangspassword
+ zu übermitteln.
+
+Viel Spaß beim Chatten ... \ No newline at end of file
diff --git a/0.6.1/TODO.txt b/0.6.1/TODO.txt
new file mode 100644
index 0000000..4538bea
--- /dev/null
+++ b/0.6.1/TODO.txt
@@ -0,0 +1,32 @@
+############################## yChat.de TODO ################################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+Folgende Funktionen werden demnächst evtl. in yChat integriert:
+
+ - OOP bei den HTML-Eingabeformularen und dem Menü.
+
+ - Kein CGI.pm im main.pl und config.pm.
+
+ - Die Schlucht (Ein Raum wo Chatter hineingeworfen werden,
+ die sich nicht benehmen und noch nicht aus dem Chat
+ katapultiert werden sollen).
+
+ - IP-Adressen ver-/entbannen.
+
+ - E-Mail zusendung bei verlorenem Passwort.
+
+ - Unter "Benutzer" sollen Chatter über eine Eingabemaske nach dem
+ Anfangsbuchstaben gesucht werden können (vergl. Kilahu).
+
+ - Linux- und Windows-yChat-Client soll programmiert werden. Mit diesem läßt
+ sich dann im yChat chatten, ohne sich über http://www.yChat.de eingelogt zu
+ haben. Der Client soll gleicheitig auch als Messenger (ICQ-Like) fungieren
+ können (yChat-Messenger bzw. yCM).
+
+ - Der Cybarkeeper (künstlich intilligenter Chatroboter, der
+ sich im Hauptraum Cyberbar aufhält, virtuelle Drinks verteilt
+ und von Real-Chattern übernommen werden kann. (Zukunftsmusik)
+
+Für weitere Vorschläge bitte in das yChat-Board unter www.yChat.de
+texten oder eine E-Mail an mail@paulbuetow.de :-) \ No newline at end of file
diff --git a/0.6.1/UPDATES.txt b/0.6.1/UPDATES.txt
new file mode 100644
index 0000000..ded826d
--- /dev/null
+++ b/0.6.1/UPDATES.txt
@@ -0,0 +1,268 @@
+########################### yChat.de UPDATE LIST ###########################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+Hier sind alle Erneuerungen der Versionen dokumentiert:
+
+Update von 0.6.0 auf 0.6.1 (28.02.01)
+ - Alternativ zu "/msg Alias Nachricht" und "/ Nachricht" kann man
+ nun mit "/Alias Nachricht" auch nachrichten flüstern. Dies geht
+ allerdings nur dann, wenn Alias nicht gleich einem Chatbefehl ist!
+ - Wächter können keine verschlossenen Räume mehr betreten.
+ - Registriert sich ein neuer Chatter und hat noch keine feste Farbe
+ deffiniert, dann werden diese zufällig Generiert.
+ - Wird bei dem Befehl "/col" keine Farbe mit angegeben, dann werden
+ zufällige Chatfarben generiert!
+ - In der "config.pm" wurde die zusätliche Variable $admin
+ hinzugefügt. Sie beinhaltet den Alias vom Chatadministrator.
+ - Neue Administratorbefehle.
+ - Das Verzeichnis "data/online/tmpid" wurde angelegt. Hier befinden
+ sich alle aktuellen Temp-IDs. Die IDs werden nun schneller und
+ sicherer auf Richtigkeit überprüft.
+ - Temp-IDs können nun auch die Zeichen "." und "-" beinhalten.
+ - Raumnamen dürfen keine Spezialcharackter mehr beinhalten!
+
+
+Update von 0.4.9 auf 0.6.0 (22.02.01)
+ - Auf der Startseite wird angezeigt, wer alles eingeloggt ist.
+ - Das Skript 'online.pl' wurde komplett überarbeitet.
+ - Viele Programmteile des gesamten Systems wurden überarbeitet und
+ optimiert.
+ - Der Chat hat den neuen Menüpunkt "Chatiquette" bekommen, dort
+ stehen die wichtigsten Verhaltensregeln für Chatter.
+ - Oberwächter können in der "Statistik" die Serverumgebungsvariablen
+ einsehen.
+ - Erweiterung der Errorlogfunktion.
+ - Neue Befehle: mit "/banip Alias" wird ie IP-Nummer von Alias aus
+ dem Chat verbannt. Mit "/rbanip ip://x.x.x.x" wird diese IP-Nummer
+ entbannt. Mir "/rban ip://x.x.x.x" läßt sich eine verbannte
+ IP-Nummer zwar auch entbannen, diese wird jedoch allen Chattern
+ offen präsentiert. Die verbannten IP-Nummern sind mit dem bisher
+ bekannten Befehl "/ban" einzusehen. Die Liste der verbannten
+ IP-Nummern befindet sich in der Datei "data/ban".
+ - Die Liste der Chatbefehle wurde übersichtlicher gemacht.
+ - Noch zufälligere TempIDs.
+ - Bei "/kill Alias" wird Alias auch aus der Datei "data/ban"
+ entfernt.
+
+Update von 0.4.8 auf 0.4.9 (11.02.01)
+ - "/online Alias" zeigt die Onlinezeit in Stunden, nicht mehr in
+ Minuten an.
+ - Hinzufügung des Statistikskripts "stat.pl" unter dem Menüpunkt
+ "Statistik". Das Top 40 - PHP Skript wurde nicht mehr benötigt und
+ gelöscht.
+ - Neue Befehle: /me/ und /m/ (Müssen inmitten des Textes eingegeben
+ werden.)
+ - Wird ein Benutzer aus dem Chat gekillt, so wird dies in der Datei
+ "data/kill" protokolloert.
+ - In der main.pl wird die Datei "config.pm" per "require" nur noch
+ in das Dokument eingefügt, wenn es notwendig ist.
+ - In der Onlineliste neben dem Raumnamen steht nun, wieviele Benutzer
+ sich im aktuellen Raum befinden. Ausserdem wird in der Onlineliste
+ angezeigt, ob ein Benutzer abgemeldet ist oder nicht und welche
+ Rechte er hat. Die Onlineliste ist nun Alphabetisch sortiert.
+ - Wird das Profil geändert und das http:// bei der Homepage-Adresse
+ vergessen, so wird dies automatisch hinzugefügt.
+ - Viele Bugfixes.
+
+Update von 0.4.7 auf 0.4.8 (26.01.01)
+ - Top 20 Ranking Liste in PHP4.
+ - Überarbeitung des Flash-Intros.
+ - PIDs für die Signalhandler werden zuverlässiger abgespeichert und
+ ggf. wieder gelöscht.
+ - Das push.pl-Skript (endlosschleife) benötigt nun nurnoch halb so
+ viel Speicher beim Ausführen. Die Datei config.pm wird nicht mehr
+ mit "require config;" eingebunden.
+ - Benutzernamen dürfen maximal nurnoch 15 Zeichen lang sein.
+ - Chatnachrichten dürfen maximal nurnoch 300 Zeichen lang sein.
+ - Wenn ein Benutzer eine Nachricht textet, überprüft das System, ob
+ derjenige sich auch wirklich im jew. Raum befindet.
+ - In den Chatoptionen kann man zusätzliche Einstellungen vornehmen:
+ 1.) Anzahl der Nachrichten im Nachrichten-Verlauf
+ 2.) Anordnung der Nachrichten im Nachrichten-Verlauf.
+ Neueinstellungen dieser Optionen werden erst nach einem
+ Neueinloggen aktiv.
+ - Die Error-Logdatei "data/error" wurde erweitert.
+
+Update von 0.4.6 auf 0.4.7 (20.01.01)
+ - Auto-Away: Ist ein Chatter 5 Minuten inaktiv, dann erscheint im
+ aktuellen Raum die Nachricht "Alias wurde vom System
+ abgemeldet ..." . Bei Wiederaufnahme des Chats, meldet sich Alias
+ wieder zurück.
+ - Auto-Logout: Ist ein Chatter 20 Minuten inaktiv, dann wird dieser
+ aus dem System automatisch ausgelogt.
+ - Neue CSS für die Formulareingabefelder und dem Chat-Menü.
+ (Funktioniert allerdings nicht mit NN4.x, hier werden alle
+ Formulareingabefelder ohne CSS-Definitionen angezeigt.)
+
+Update von 0.4.5 auf 0.4.6 (18.01.01)
+ - Verbesserung: Beim Posten einer neuen Chatnachricht wird sogleich
+ ein Signal an alle laufenden Chatprozesse (PIDs) gesendet, so daß
+ diese aufgefordert werden, aus der Nachrichtendatei die neuen
+ Zeilen einzulesen. Das Push-Skript (push.pl) muß so nicht jede
+ Sekunde prüfen, ob neue Nachrichten da sind, da es diese
+ Information über das Signal erhält. Das Push-Skript verbraucht nun
+ weniger Prozessorleistung, da es jetzt 15 Sekunden lang
+ "dauerschläft" (sleep 15;), lediglich einen <!--PING--> versendet
+ und dann weiter schläft usw. Beendet sich push.pl, oder wird ein
+ Raum gewechselt, dann wird auch die PID aus der PID-Liste des
+ aktuellen Raums gelöscht und ggf. neu geschrieben.
+ Die Dateien "./data/online/pids/*" beinhalten alle aktuellen PIDs,
+ wobei * der jew. Raum ist.
+
+Update von 0.4.4 auf 0.4.5 (16.01.01)
+ - Jeder Chatraum hat nun eine globale Nachrichtendatei. Bisher
+ existierte für jeden Chatter enzelnd eine. Die Nachrichten werden
+ nun schneller gepostet.
+ - Neue Wächterbefehle:
+ "/st Raum Thema" ermöglicht das Ändern das Themas eines anderen
+ Raums.
+ "/sl Raum" ermöglicht das auf- und absperren eines anderen Raums.
+ - Nur noch Oberwächter können die Chatlogs lesen.
+ - Referenzierung der Variable $msg in main.pl.
+ - Flashanimationen.
+
+Update von 0.4.3 auf 0.4.4 (04.01.01)
+ - Optimiertung aller Chatbefehle.
+ - Neuer WÄ-Befehl: Mit "/ss Raum Nachricht" wird aus dem aktuellen
+ Raum heraus in den angegebenen Raum eine beliebige Nachricht
+ gerufen.
+ - Das Skript main.pl wurde in zwei verschiedene Skripts unterteilt:
+ main.pl => Beinhaltet hauptsächlich die Chatbefehle
+ input.pl => Beinhaltet das zu generierende Chateingabeframe.
+ - Das Chateingabeframe wird nun nie wieder reloadet. (Dies geschah
+ bisher noch nach Ausführung der Befehle /col /j /ju /msg und nach
+ Änderung der Chateinstellungen und erwies sich als recht nervige
+ Angelegenheit.) JavaScript macht es möglich.
+ - Überarbeitung und Erweiterung der Dokudateien.
+
+Update von 0.4.2 auf 0.4.3 (30.12.2k)
+ - Optimierung der Zuweisung der Variabeln im Programmcode:
+ Variablen werden nun wirklich nur deffiniert, wenn diese auch
+ erforderlich sind.
+ - Komplette Neuprogrammierung diverser Subs (nun leistungsfähiger)
+ - Bei Aufrug der Login-Seite wird der gesamte Chat auf leerstehende
+ Räume und "alte" Chatter überprüft und ggf. entfernt.
+ - Verbesserung diverser JavaScript-Codes.
+ - Editiert ein Benutzer sein Profil, so wird dies mit der Meldung
+ "Alias hat sein Profil geändert ..." bekanntgegeben.
+ - Mit "/t" ohne weiteren Text erscheint die Nachricht "Alias hat das
+ Thema des Raums gelöscht ..."
+ - Hinzufügung diverser Administratorbefehle: "/pw Alias" zeigt
+ Zugangspassword von Alias an. "/ow Alias" ernennt Alias zum OW.
+ "/row Alias" entzieht Alias die OW-Rechte.
+
+Update von 0.4.1 auf 0.4.2 (25.12.2k)
+ - Im Texteingabeformular werden nun per JavaScript die letzten 10
+ Postings zwischengespeichert und können per Drop-Down-Menü
+ wieder in das Submittextfeld geladen werden um erneuert getextet
+ zu werden.
+ - Neues Design.
+ - Diverse Dateien wurden umbenannt:
+ INSTALL.txt -> SETUP.txt
+ LIESMICH.txt -> README.txt
+ - Die Datei CREDITS.txt wurde angelegt und somit auch die URL
+ www.credits.yChat.de.
+
+Update von 0.4.0 auf 0.4.1 (22.12.2k)
+ - Design wurde geändert.
+ - Unter "Optionen" ist nun eine komplette Farbtabelle eingebaut.
+ - Folgende Oberwächterbefehle wurden nun auch für normale Wächter
+ freigegeben: /ip /ban /rban.
+
+Update von 0.2.6 auf 0.4.0 (19.12.2k)
+ - Der berüchtigte "IP-Bug" wurde beseitigt! Und zwar wurden TempIDs
+ eingeführt => Eine dauerhafte Überprüfung der Benutzer-IP-Nummer
+ ist also nicht mehr notwendig.
+ - Die totale Chat-Online-Zeit wird protokolliert und kann jew. mit
+ "/online Alias" aufgerufen werden. Die Onlinezeit wird alle 20 Sek.
+ aktualisiert.
+ - Neue Befehle: "/seen Alias" zeigt an, vor wieviel St. sich Alias
+ zuletzt in das System eingelogt hat. Der Befehle "/rmgb" entfernt
+ alle Einträge des eigenen Benutzergästebuchs im Profil.
+
+Update von 0.2.5 auf 0.2.6 (17.12.2k)
+ - Das Eingabeframe reloaded sich nicht mehr nach jedem Posting.
+ Vielen Dank an Truhe aka Dave und Klepper aka Andreas Buchwald!
+ Bei den Chatbefehlen /col /away /j und /ju muß sich das
+ Eingabeframe weiterhin reloaden.
+ - Der Befehl // wurde entfernt. Dieser war nicht mehr erforderlich.
+ weil Nachrichten werden nur noch sehr selten verschluckt. Dieser
+ Chatbefehl postete die letzte Nachricht nocheinmal.
+ - Neuer Befehl: mit "/memo Alias hier der Text" hinterläßt man
+ Alias eine Memo. Logt sich Alias in den Chat ein, dann erhält
+ er diese sofort. Dafür wurde das Verzeichnis ".data/user/memos/"
+ angelegt.
+ - Programmcode wurde ein wenig optimiert.
+ - Das Design wurde ein wenig geändert.
+ - Beseitigung diverser Bugs.
+
+Update von 0.2.4 auf 0.2.5 (15.12.2k)
+ - Derjenige, der einen Raum zuerst betritt, hat Raumbesetzerrechte.
+ - Raumbesetzer, Wächter und Oberwächte können weitere Raumbesetzer
+ bestimmen. Diese können Raumbeseter auch wieder degradieren.
+ - Raumbesetzer, Wächter und Oberwächter können dem aktuellen Raum
+ auf/absperren und Themen geben. Wächter und Oberwächter können
+ abgesperrte Räume betreten.
+ - Das Verzeichnis ".data/htdocs" wurde entfernt. Die Datei help_html
+ heist nun help.sno und befindet sich im yChat-Hauptverzeichnis.
+ - Das Verzeichnis ".data/user/lastlogin" wurde hinzugefügt. Hier
+ wird beim erfolgreichen Einloggen ein "Timestamp" gesetzt. Später
+ sollen Oberwächter "veraltete" Benutzer entfernen können.
+ - Neuer Oberwächterbefehl: "/kill Alias" entfernt Alias ganz und gar
+ vom System. Oberwächter und Wächter können nicht entfernt werden.
+ - Perl-Cache wurde im gesamten System komplett deaktiviert ( Weniger
+ Ladezeiten der HTML-Dokumente ).
+ - Nur Nachrichten aus dem Raum "Cyberbar" werden gelogt.
+ Selbsterstellte Räume werden nichtmehr gelogt. Viele Logfunktionen
+ wurden entfernt (weniger Serverbalast).
+ - Beseitigung einiger kleinen Bugs.
+ - Unter "Optionen" im Chat wir die Farbe nun mit einem Drop-Down-Menü
+ ausgewählt ( Vielen dank an Michi aka Snoopy ).
+ - Auf der Startseite wird nun angezeigt wieviele Benutzer eingelogt
+ sind. Ist keiner eingelogt, dann wird das System "aufgeräumt". D.h.
+ Dateien die nicht mehr gebraucht werden und noch nicht gelöscht
+ wurden werden entfernt ( z.B. Nachrichtendateien der einzelnen
+ Chatter und die Dateien die die IP-Nummern der eingelogten Benutzer
+ beinhalteten usw.).
+ - Hunzufügung einer TODO-Liste. Hier sind mehrere Funktionen
+ vermerkt, die in späteren yChat-Versionen eingebaut werden sollen.
+ (www.todo.yChat.de oder TODO.txt).
+
+Update von 0.2.3 auf 0.2.4 (30.11.2k)
+ - Optimierung bzw. Verbesserung der Push-Routine push.pl.
+ - Server-Ping wurde von 2-Pings-per-Minute auf 4 erhöht.
+ - yChat-Banner wurde erstellt und ist unter
+ documents.yChat.de/yBanner.jpg vorzufinden.
+ - Unter der URL servers.yChat.de wurde eine Serverliste angelegt,
+ welche anzeigt wo yChat-Systeme laufen.
+ - Des weiteren wurden die URLs updates.yChat.de, install.yChat.de
+ und liesmich.yChat.de eingerichtet.
+ - Die Menüpunkte wurden zusammengefaßt, damit sie unter einer
+ Auflösung von 800x600 nur eine Zeile belegen.
+ - Einige Bugs wurden entfernt.
+
+Update von 0.2.2 auf 0.2.3 (25.11.2k)
+ - Smooth scrolling JavaScript ( Vielen Dank an Andreas Buchwald ).
+ - "IP#-Fehler" wurde so gut wie beseitigt.
+ - Aufrufe der einzelnen Benutzerprofile wird gezählt und angezeigt.
+ Diese werden in data/user/counts/* gespeichert.
+ - Automatische Einrichtung des Chats mit setup.sh und Telnet.
+ - Menüpunkt "Dein Profil" wurde entfernt da eigenes Profil auch
+ stets über die Onlineliste aufgerufen werden kann.
+
+Update von 0.2.1 auf 0.2.2 (23.11.2k)
+ - Einige Bugs wurden entfernt.
+ - Geschwindigkeit des Chats wurde optimiert.
+ - Eine Liste aller eingelogten Benutzer erscheint am Rand. Hierfür
+ wurde die Datei online.pl eingeführt. Sie aktuallisiert sich alle
+ 20 Sekunden.
+ - Die UPDATES.txt wurde eingeführt.
+
+Update von 0.2.0 auf 0.2.1
+ - Einige Bugs wurden entfernt.
+ - Die IP# der eingelogten Benutzer werden nun anders verwaltet.
+
+Update von Alpha XVIII auf 0.2.0
+ - Die Handhabung der eingelogten Benutzer im System wurde komplett neu
+ überarbeitet.
+ - Neue Versionsnumern wurden eingeführt. \ No newline at end of file
diff --git a/0.6.1/away.gif b/0.6.1/away.gif
new file mode 100644
index 0000000..10d460b
--- /dev/null
+++ b/0.6.1/away.gif
Binary files differ
diff --git a/0.6.1/chatiq.sno b/0.6.1/chatiq.sno
new file mode 100644
index 0000000..3360499
--- /dev/null
+++ b/0.6.1/chatiq.sno
@@ -0,0 +1 @@
+<div><h2>Chatiquette</h2></div> <hr><div> Hier einige Grundlagen ...</div> <style type="text/css"> li { color: #ffffff } </style> <ul><li><div> Vergiss nie, dass am anderen Ende auch nur Menschen sitzen. Diese m&ouml;gen es gar nicht, angep&ouml;belt, beleidigt oder in sonstiger Weise angegriffen zu werden. </div></li> <li><div> St&ouml;rend ist auch immer, wenn ein privater Streit im Chat ausgetragen wird. Tragt eure privaten Sachen ausserhalb des Chats aus.<br>Selbst wenn es nur Spass ist - weiss der Rest im Chat das? </div></li> <li><div> Dauergeschrei f&auml;llt auch immer wieder st&ouml;rend auf. Was in Grossbuchstaben geschrieben wird, wird als Schreien bezeichnet. </div></li> <li><div> Unsere ganz besonderen Spezialisten wollen auch immer wieder rausfliegen. Um das zu erreichen, senden sie die ganze Zeit Unsinn. </div></li> <li><div> Diskussionen sind dagegen kein Problem. Daf&uuml;r ist ein Chat ja da. Sobald allerdings das Thema der Diskussion zu sehr entgleist, sollte die Diskussion in einen etwas weniger &ouml;ffentlichen Raum verlegt werden. </div></li> </ul><div> Daraus ergeben sich folgende Regeln: </div><ul> <li><div> keinen beleidigenden Wortschatz verwenden </div></li> <li><div> obz&ouml;ner und verfassungsfeindlicher Wortschatz f&auml;llt auch weg </div></li> <li><div> streitet euch woanders oder in einem privaten Raum </div></li> <li><div> schreit nich so viel </div></li> <li><div> schreibt keinen Unsinn, der so aussieht, als ob eure Katze über die Tastatur gelaufen ist </div></li> <li><div> schreibt nicht zu schnell hintereinander, besonders nicht dasselbe </div></li> <li><div> verlagert die Diskussion, wenn sich jemand gest&ouml;rt f&uuml;hlt </div></li> <li><div> Diese Liste ist nicht vollst&auml;ndig. Mit dem gesunden Menschenverstand sollte es eigentlich m&ouml;glich sein, sich die nicht aufgef&uuml;hrten Punkte zu denken. </div></li> </ul><div> So - nach den ganzen "lass-es-bessers" noch ein paar &Uuml;berlebenstips: </div><ul> <li><div> beachte die oben stehenden Punkte ;-) </div></li> <li><div> es macht sich immer gut, beim Reinkommen mal zu gr&uuml;ssen </div></li> <li><div> warte nicht, bis man/frau dich anspricht - werde selbst aktiv und gib deinen Senf dazu </div></li> <li><div> es gibt meist kein allgemein anerkanntes Gespr&auml;chsthema - lies dich einfach rein </div></li> <li><div> die frage &quot;wer will chatten&quot; ist eigentlich &uuml;berfl&uuml;ssig in einem Chat (wir warten doch alle nur aufs Ufo ;-) </div></li> <li><div> fang nich sofort mit den W-Fragen (woher, wie alt, weiblich oder männlich?) an - es st&ouml;rt einige Leute </div></li></ul> <div> Problematisch f&uuml;r die W&auml;chter und Oberw&auml;chter ist: </div><ul> <li><div> &quot;der nervt mich - schmeiss den mal raus&quot; ist oft nicht nachvollziehbar, weil der W&Auml; oder OW die Vorgeschichte - die vielleicht ausserhalb des yChat stattgefunden hat - nicht kennt oder keinen Beweis daf&uuml;r hat. </div></li></ul> <hr> <div><h2> Richtlinien f&uuml;r den gestressten W&Auml; und OW: </h2></div> <ul><li><div> Du hast die Macht - aber mi&szlig;brauche sie nicht! </div></li> <li><div> Leute, die ganz offensichtlich st&ouml;ren wollen und dabei den Chatbetrieb massiv behindern, sofort rausschmeissen! Kriterien dazu: </div> <ul><li><div> Fluten des Chats </div></li><li><div> Wiederholung von Parolen </div></li><li><div> Exzessive Nutzung von zuf&auml;lligen Buchstaben-/Zeichenfolgen </div></li> <li><div> usw... </div></li></ul> </li> <li><div> Bei den anderen vorher noch eine Warnung aussprechen... </div></li> <li><div> Nicht vergessen: auch f&uuml;r euch gelten die oben aufgef&uuml;hrten Regeln! </div></li> <li><div> Vergabe von Raumbesetzer- und W&auml;chterrechten:<br> (dies gilt f&uuml;r RB-Vergabe in der Cyberbar, W&Auml; allgemein) </div> <ul> <li><div> Um RB oder W&Auml; betteln wird schon mal gar nicht beachtet. </div></li> <li><div> Wer W&Auml; wird, soll sichs verdienen - z.B. durch h&auml;ufiges Helfen bei Neulingen. </div></li> <li><div> Ein W&Auml; sollte schon &ouml;fter im Chat sein. </div></li> <li><div> Oberw&auml;chter zu werden ist sehr schwierig. Frag gar nicht erst danach ;-) </div></li> </ul> </ul><div> Wer meint, von einem W&auml;chter oder Oberw&auml;chter ungerecht behandelt worden zu sein (z.B. weil dieser wegen persönlichen Streitigkeiten rausschmeisst), richte seine Klage an einen Oberw&auml;chter oder direkt an den obersten Boss: Snooper (<a href="mailto:admin@ychat.de">admin@ychat.de</a>). </div> \ No newline at end of file
diff --git a/0.6.1/colors.sno b/0.6.1/colors.sno
new file mode 100644
index 0000000..3640b9e
--- /dev/null
+++ b/0.6.1/colors.sno
@@ -0,0 +1,290 @@
+ <table cellspacing=0 cellpadding=5 border=0>
+ <tr>
+ <td bgcolor="000000"><span style="color:#FFFFFF; text-decoration:line-through;">000000</span></td>
+ <td bgcolor="000033"><span style="color:#FFFFFF; text-decoration:line-through;">000033</span></td>
+ <td bgcolor="000066"><span style="color:#FFFFFF; text-decoration:line-through;">000066</span></td>
+ <td bgcolor="000099"><span style="color:#FFFFFF; text-decoration:line-through;">000099</span></td>
+ <td bgcolor="0000CC"><span style="color:#FFFFFF; text-decoration:line-through;">0000CC</span></td>
+ <td bgcolor="0000FF"><a href="javascript:insertcode('0000FF');" style="color:#FFFFFF;">0000FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="003300"><span style="color:#FFFFFF; text-decoration:line-through;">003300</span></td>
+ <td bgcolor="003333"><span style="color:#FFFFFF; text-decoration:line-through;">003333</span></td>
+ <td bgcolor="003366"><span style="color:#FFFFFF; text-decoration:line-through;">003366</span></td>
+ <td bgcolor="003399"><a href="javascript:insertcode('003399');" style="color:#FFFFFF;">003399</a></td>
+ <td bgcolor="0033CC"><a href="javascript:insertcode('0033CC');" style="color:#FFFFFF;">0033CC</a></td>
+ <td bgcolor="0033FF"><a href="javascript:insertcode('0033FF');" style="color:#FFFFFF;">0033FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="006600"><span style="color:#FFFFFF; text-decoration:line-through;">006600</span></td>
+ <td bgcolor="006633"><span style="color:#FFFFFF; text-decoration:line-through;">006633</span></td>
+ <td bgcolor="006666"><a href="javascript:insertcode('006666');" style="color:#FFFFFF;">006666</a></td>
+ <td bgcolor="006699"><a href="javascript:insertcode('006699');" style="color:#FFFFFF;">006699</a></td>
+ <td bgcolor="0066CC"><a href="javascript:insertcode('0066CC');" style="color:#FFFFFF;">0066CC</a></td>
+ <td bgcolor="0066FF"><a href="javascript:insertcode('0066FF');" style="color:#FFFFFF;">0066FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="009900"><a href="javascript:insertcode('009900');" style="color:#FFFFFF;">009900</a></td>
+ <td bgcolor="009933"><a href="javascript:insertcode('009933');" style="color:#FFFFFF;">009933</a></td>
+ <td bgcolor="009966"><a href="javascript:insertcode('009966');" style="color:#FFFFFF;">009966</a></td>
+ <td bgcolor="009999"><a href="javascript:insertcode('009999');" style="color:#FFFFFF;">009999</a></td>
+ <td bgcolor="0099CC"><a href="javascript:insertcode('0099CC');" style="color:#FFFFFF;">0099CC</a></td>
+ <td bgcolor="0099FF"><a href="javascript:insertcode('0099FF');" style="color:#FFFFFF;">0099FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00CC00"><a href="javascript:insertcode('00CC00');" style="color:#000000;">00CC00</a></td>
+ <td bgcolor="00CC33"><a href="javascript:insertcode('00CC33');" style="color:#000000;">00CC33</a></td>
+ <td bgcolor="00CC66"><a href="javascript:insertcode('00CC66');" style="color:#000000;">00CC66</a></td>
+ <td bgcolor="00CC99"><a href="javascript:insertcode('00CC99');" style="color:#000000;">00CC99</a></td>
+ <td bgcolor="00CCCC"><a href="javascript:insertcode('00CCCC');" style="color:#000000;">00CCCC</a></td>
+ <td bgcolor="00CCFF"><a href="javascript:insertcode('00CCFF');" style="color:#000000;">00CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00FF00"><a href="javascript:insertcode('00FF00');" style="color:#000000;">00FF00</a></td>
+ <td bgcolor="00FF33"><a href="javascript:insertcode('00FF33');" style="color:#000000;">00FF33</a></td>
+ <td bgcolor="00FF66"><a href="javascript:insertcode('00FF66');" style="color:#000000;">00FF66</a></td>
+ <td bgcolor="00FF99"><a href="javascript:insertcode('00FF99');" style="color:#000000;">00FF99</a></td>
+ <td bgcolor="00FFCC"><a href="javascript:insertcode('00FFCC');" style="color:#000000;">00FFCC</a></td>
+ <td bgcolor="00FFFF"><a href="javascript:insertcode('00FFFF');" style="color:#000000;">00FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="330000"><span style="color:#FFFFFF; text-decoration:line-through;">330000</span></td>
+ <td bgcolor="330033"><span style="color:#FFFFFF; text-decoration:line-through;">330033</span></td>
+ <td bgcolor="330066"><span style="color:#FFFFFF; text-decoration:line-through;">330066</span></td>
+ <td bgcolor="330099"><a href="javascript:insertcode('330099');" style="color:#FFFFFF;">330099</a></td>
+ <td bgcolor="3300CC"><a href="javascript:insertcode('3300CC');" style="color:#FFFFFF;">3300CC</a></td>
+ <td bgcolor="3300FF"><a href="javascript:insertcode('3300FF');" style="color:#FFFFFF;">3300FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="333300"><span style="color:#FFFFFF; text-decoration:line-through;">333300</span></td>
+ <td bgcolor="333333"><span style="color:#FFFFFF; text-decoration:line-through;">333333</span></td>
+ <td bgcolor="333366"><a href="javascript:insertcode('333366');" style="color:#FFFFFF;">333366</a></td>
+ <td bgcolor="333399"><a href="javascript:insertcode('333399');" style="color:#FFFFFF;">333399</a></td>
+ <td bgcolor="3333CC"><a href="javascript:insertcode('3333CC');" style="color:#FFFFFF;">3333CC</a></td>
+ <td bgcolor="3333FF"><a href="javascript:insertcode('3333FF');" style="color:#FFFFFF;">3333FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="336600"><a href="javascript:insertcode('336600');" style="color:#FFFFFF;">336600</a></td>
+ <td bgcolor="336633"><a href="javascript:insertcode('336633');" style="color:#FFFFFF;">336633</a></td>
+ <td bgcolor="336666"><a href="javascript:insertcode('336666');" style="color:#FFFFFF;">336666</a></td>
+ <td bgcolor="336699"><a href="javascript:insertcode('336699');" style="color:#FFFFFF;">336699</a></td>
+ <td bgcolor="3366CC"><a href="javascript:insertcode('3366CC');" style="color:#FFFFFF;">3366CC</a></td>
+ <td bgcolor="3366FF"><a href="javascript:insertcode('3366FF');" style="color:#FFFFFF;">3366FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="339900"><a href="javascript:insertcode('339900');" style="color:#FFFFFF;">339900</a></td>
+ <td bgcolor="339933"><a href="javascript:insertcode('339933');" style="color:#FFFFFF;">339933</a></td>
+ <td bgcolor="339966"><a href="javascript:insertcode('339966');" style="color:#FFFFFF;">339966</a></td>
+ <td bgcolor="339999"><a href="javascript:insertcode('339999');" style="color:#FFFFFF;">339999</a></td>
+ <td bgcolor="3399CC"><a href="javascript:insertcode('3399CC');" style="color:#FFFFFF;">3399CC</a></td>
+ <td bgcolor="3399FF"><a href="javascript:insertcode('3399FF');" style="color:#FFFFFF;">3399FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33CC00"><a href="javascript:insertcode('33CC00');" style="color:#000000;">33CC00</a></td>
+ <td bgcolor="33CC33"><a href="javascript:insertcode('33CC33');" style="color:#000000;">33CC33</a></td>
+ <td bgcolor="33CC66"><a href="javascript:insertcode('33CC66');" style="color:#000000;">33CC66</a></td>
+ <td bgcolor="33CC99"><a href="javascript:insertcode('33CC99');" style="color:#000000;">33CC99</a></td>
+ <td bgcolor="33CCCC"><a href="javascript:insertcode('33CCCC');" style="color:#000000;">33CCCC</a></td>
+ <td bgcolor="33CCFF"><a href="javascript:insertcode('33CCFF');" style="color:#000000;">33CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33FF00"><a href="javascript:insertcode('33FF00');" style="color:#000000;">33FF00</a></td>
+ <td bgcolor="33FF33"><a href="javascript:insertcode('33FF33');" style="color:#000000;">33FF33</a></td>
+ <td bgcolor="33FF66"><a href="javascript:insertcode('33FF66');" style="color:#000000;">33FF66</a></td>
+ <td bgcolor="33FF99"><a href="javascript:insertcode('33FF99');" style="color:#000000;">33FF99</a></td>
+ <td bgcolor="33FFCC"><a href="javascript:insertcode('33FFCC');" style="color:#000000;">33FFCC</a></td>
+ <td bgcolor="33FFFF"><a href="javascript:insertcode('33FFFF');" style="color:#000000;">33FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="660000"><span style="color:#FFFFFF; text-decoration:line-through;">660000</span></td>
+ <td bgcolor="660033"><span style="color:#FFFFFF; text-decoration:line-through;">660033</span></td>
+ <td bgcolor="660066"><a href="javascript:insertcode('660066');" style="color:#FFFFFF;">660066</a></td>
+ <td bgcolor="660099"><a href="javascript:insertcode('660099');" style="color:#FFFFFF;">660099</a></td>
+ <td bgcolor="6600CC"><a href="javascript:insertcode('6600CC');" style="color:#FFFFFF;">6600CC</a></td>
+ <td bgcolor="6600FF"><a href="javascript:insertcode('6600FF');" style="color:#FFFFFF;">6600FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="663300"><a href="javascript:insertcode('663300');" style="color:#FFFFFF;">663300</a></td>
+ <td bgcolor="663333"><a href="javascript:insertcode('663333');" style="color:#FFFFFF;">663333</a></td>
+ <td bgcolor="663366"><a href="javascript:insertcode('663366');" style="color:#FFFFFF;">663366</a></td>
+ <td bgcolor="663399"><a href="javascript:insertcode('663399');" style="color:#FFFFFF;">663399</a></td>
+ <td bgcolor="6633CC"><a href="javascript:insertcode('6633CC');" style="color:#FFFFFF;">6633CC</a></td>
+ <td bgcolor="6633FF"><a href="javascript:insertcode('6633FF');" style="color:#FFFFFF;">6633FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="666600"><a href="javascript:insertcode('666600');" style="color:#FFFFFF;">666600</a></td>
+ <td bgcolor="666633"><a href="javascript:insertcode('666633');" style="color:#FFFFFF;">666633</a></td>
+ <td bgcolor="666666"><a href="javascript:insertcode('666666');" style="color:#FFFFFF;">666666</a></td>
+ <td bgcolor="666699"><a href="javascript:insertcode('666699');" style="color:#FFFFFF;">666699</a></td>
+ <td bgcolor="6666CC"><a href="javascript:insertcode('6666CC');" style="color:#FFFFFF;">6666CC</a></td>
+ <td bgcolor="6666FF"><a href="javascript:insertcode('6666FF');" style="color:#FFFFFF;">6666FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="669900"><a href="javascript:insertcode('669900');" style="color:#000000;">669900</a></td>
+ <td bgcolor="669933"><a href="javascript:insertcode('669933');" style="color:#000000;">669933</a></td>
+ <td bgcolor="669966"><a href="javascript:insertcode('669966');" style="color:#000000;">669966</a></td>
+ <td bgcolor="669999"><a href="javascript:insertcode('669999');" style="color:#000000;">669999</a></td>
+ <td bgcolor="6699CC"><a href="javascript:insertcode('6699CC');" style="color:#000000;">6699CC</a></td>
+ <td bgcolor="6699FF"><a href="javascript:insertcode('6699FF');" style="color:#000000;">6699FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66CC00"><a href="javascript:insertcode('66CC00');" style="color:#000000;">66CC00</a></td>
+ <td bgcolor="66CC33"><a href="javascript:insertcode('66CC33');" style="color:#000000;">66CC33</a></td>
+ <td bgcolor="66CC66"><a href="javascript:insertcode('66CC66');" style="color:#000000;">66CC66</a></td>
+ <td bgcolor="66CC99"><a href="javascript:insertcode('66CC99');" style="color:#000000;">66CC99</a></td>
+ <td bgcolor="66CCCC"><a href="javascript:insertcode('66CCCC');" style="color:#000000;">66CCCC</a></td>
+ <td bgcolor="66CCFF"><a href="javascript:insertcode('66CCFF');" style="color:#000000;">66CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66FF00"><a href="javascript:insertcode('66FF00');" style="color:#000000;">66FF00</a></td>
+ <td bgcolor="66FF33"><a href="javascript:insertcode('66FF33');" style="color:#000000;">66FF33</a></td>
+ <td bgcolor="66FF66"><a href="javascript:insertcode('66FF66');" style="color:#000000;">66FF66</a></td>
+ <td bgcolor="66FF99"><a href="javascript:insertcode('66FF99');" style="color:#000000;">66FF99</a></td>
+ <td bgcolor="66FFCC"><a href="javascript:insertcode('66FFCC');" style="color:#000000;">66FFCC</a></td>
+ <td bgcolor="66FFFF"><a href="javascript:insertcode('66FFFF');" style="color:#000000;">66FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="990000"><a href="javascript:insertcode('990000');" style="color:#FFFFFF;">990000</a></td>
+ <td bgcolor="990033"><a href="javascript:insertcode('990033');" style="color:#FFFFFF;">990033</a></td>
+ <td bgcolor="990066"><a href="javascript:insertcode('990066');" style="color:#FFFFFF;">990066</a></td>
+ <td bgcolor="990099"><a href="javascript:insertcode('990099');" style="color:#FFFFFF;">990099</a></td>
+ <td bgcolor="9900CC"><a href="javascript:insertcode('9900CC');" style="color:#FFFFFF;">9900CC</a></td>
+ <td bgcolor="9900FF"><a href="javascript:insertcode('9900FF');" style="color:#FFFFFF;">9900FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="993300"><a href="javascript:insertcode('993300');" style="color:#FFFFFF;">993300</a></td>
+ <td bgcolor="993333"><a href="javascript:insertcode('993333');" style="color:#FFFFFF;">993333</a></td>
+ <td bgcolor="993366"><a href="javascript:insertcode('993366');" style="color:#FFFFFF;">993366</a></td>
+ <td bgcolor="993399"><a href="javascript:insertcode('993399');" style="color:#FFFFFF;">993399</a></td>
+ <td bgcolor="9933CC"><a href="javascript:insertcode('9933CC');" style="color:#FFFFFF;">9933CC</a></td>
+ <td bgcolor="9933FF"><a href="javascript:insertcode('9933FF');" style="color:#FFFFFF;">9933FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="996600"><a href="javascript:insertcode('996600');" style="color:#FFFFFF;">996600</a></td>
+ <td bgcolor="996633"><a href="javascript:insertcode('996633');" style="color:#FFFFFF;">996633</a></td>
+ <td bgcolor="996666"><a href="javascript:insertcode('996666');" style="color:#FFFFFF;">996666</a></td>
+ <td bgcolor="996699"><a href="javascript:insertcode('996699');" style="color:#FFFFFF;">996699</a></td>
+ <td bgcolor="9966CC"><a href="javascript:insertcode('9966CC');" style="color:#FFFFFF;">9966CC</a></td>
+ <td bgcolor="9966FF"><a href="javascript:insertcode('9966FF');" style="color:#FFFFFF;">9966FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="999900"><a href="javascript:insertcode('999900');" style="color:#000000;">999900</a></td>
+ <td bgcolor="999933"><a href="javascript:insertcode('999933');" style="color:#000000;">999933</a></td>
+ <td bgcolor="999966"><a href="javascript:insertcode('999966');" style="color:#000000;">999966</a></td>
+ <td bgcolor="999999"><a href="javascript:insertcode('999999');" style="color:#000000;">999999</a></td>
+ <td bgcolor="9999CC"><a href="javascript:insertcode('9999CC');" style="color:#000000;">9999CC</a></td>
+ <td bgcolor="9999FF"><a href="javascript:insertcode('9999FF');" style="color:#000000;">9999FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99CC00"><a href="javascript:insertcode('99CC00');" style="color:#000000;">99CC00</a></td>
+ <td bgcolor="99CC33"><a href="javascript:insertcode('99CC33');" style="color:#000000;">99CC33</a></td>
+ <td bgcolor="99CC66"><a href="javascript:insertcode('99CC66');" style="color:#000000;">99CC66</a></td>
+ <td bgcolor="99CC99"><a href="javascript:insertcode('99CC99');" style="color:#000000;">99CC99</a></td>
+ <td bgcolor="99CCCC"><a href="javascript:insertcode('99CCCC');" style="color:#000000;">99CCCC</a></td>
+ <td bgcolor="99CCFF"><a href="javascript:insertcode('99CCFF');" style="color:#000000;">99CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99FF00"><a href="javascript:insertcode('99FF00');" style="color:#000000;">99FF00</a></td>
+ <td bgcolor="99FF33"><a href="javascript:insertcode('99FF33');" style="color:#000000;">99FF33</a></td>
+ <td bgcolor="99FF66"><a href="javascript:insertcode('99FF66');" style="color:#000000;">99FF66</a></td>
+ <td bgcolor="99FF99"><a href="javascript:insertcode('99FF99');" style="color:#000000;">99FF99</a></td>
+ <td bgcolor="99FFCC"><a href="javascript:insertcode('99FFCC');" style="color:#000000;">99FFCC</a></td>
+ <td bgcolor="99FFFF"><a href="javascript:insertcode('99FFFF');" style="color:#000000;">99FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC0000"><a href="javascript:insertcode('CC0000');" style="color:#FFFFFF;">CC0000</a></td>
+ <td bgcolor="CC0033"><a href="javascript:insertcode('CC0033');" style="color:#FFFFFF;">CC0033</a></td>
+ <td bgcolor="CC0066"><a href="javascript:insertcode('CC0066');" style="color:#FFFFFF;">CC0066</a></td>
+ <td bgcolor="CC0099"><a href="javascript:insertcode('CC0099');" style="color:#FFFFFF;">CC0099</a></td>
+ <td bgcolor="CC00CC"><a href="javascript:insertcode('CC00CC');" style="color:#FFFFFF;">CC00CC</a></td>
+ <td bgcolor="CC00FF"><a href="javascript:insertcode('CC00FF');" style="color:#FFFFFF;">CC00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC3300"><a href="javascript:insertcode('CC3300');" style="color:#FFFFFF;">CC3300</a></td>
+ <td bgcolor="CC3333"><a href="javascript:insertcode('CC3333');" style="color:#FFFFFF;">CC3333</a></td>
+ <td bgcolor="CC3366"><a href="javascript:insertcode('CC3366');" style="color:#FFFFFF;">CC3366</a></td>
+ <td bgcolor="CC3399"><a href="javascript:insertcode('CC3399');" style="color:#FFFFFF;">CC3399</a></td>
+ <td bgcolor="CC33CC"><a href="javascript:insertcode('CC33CC');" style="color:#FFFFFF;">CC33CC</a></td>
+ <td bgcolor="CC33FF"><a href="javascript:insertcode('CC33FF');" style="color:#FFFFFF;">CC33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC6600"><a href="javascript:insertcode('CC6600');" style="color:#000000;">CC6600</a></td>
+ <td bgcolor="CC6633"><a href="javascript:insertcode('CC6633');" style="color:#000000;">CC6633</a></td>
+ <td bgcolor="CC6666"><a href="javascript:insertcode('CC6666');" style="color:#000000;">CC6666</a></td>
+ <td bgcolor="CC6699"><a href="javascript:insertcode('CC6699');" style="color:#000000;">CC6699</a></td>
+ <td bgcolor="CC66CC"><a href="javascript:insertcode('CC66CC');" style="color:#000000;">CC66CC</a></td>
+ <td bgcolor="CC66FF"><a href="javascript:insertcode('CC66FF');" style="color:#000000;">CC66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC9900"><a href="javascript:insertcode('CC9900');" style="color:#000000;">CC9900</a></td>
+ <td bgcolor="CC9933"><a href="javascript:insertcode('CC9933');" style="color:#000000;">CC9933</a></td>
+ <td bgcolor="CC9966"><a href="javascript:insertcode('CC9966');" style="color:#000000;">CC9966</a></td>
+ <td bgcolor="CC9999"><a href="javascript:insertcode('CC9999');" style="color:#000000;">CC9999</a></td>
+ <td bgcolor="CC99CC"><a href="javascript:insertcode('CC99CC');" style="color:#000000;">CC99CC</a></td>
+ <td bgcolor="CC99FF"><a href="javascript:insertcode('CC99FF');" style="color:#000000;">CC99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCCC00"><a href="javascript:insertcode('CCCC00');" style="color:#000000;">CCCC00</a></td>
+ <td bgcolor="CCCC33"><a href="javascript:insertcode('CCCC33');" style="color:#000000;">CCCC33</a></td>
+ <td bgcolor="CCCC66"><a href="javascript:insertcode('CCCC66');" style="color:#000000;">CCCC66</a></td>
+ <td bgcolor="CCCC99"><a href="javascript:insertcode('CCCC99');" style="color:#000000;">CCCC99</a></td>
+ <td bgcolor="CCCCCC"><a href="javascript:insertcode('CCCCCC');" style="color:#000000;">CCCCCC</a></td>
+ <td bgcolor="CCCCFF"><a href="javascript:insertcode('CCCCFF');" style="color:#000000;">CCCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCFF00"><a href="javascript:insertcode('CCFF00');" style="color:#000000;">CCFF00</a></td>
+ <td bgcolor="CCFF33"><a href="javascript:insertcode('CCFF33');" style="color:#000000;">CCFF33</a></td>
+ <td bgcolor="CCFF66"><a href="javascript:insertcode('CCFF66');" style="color:#000000;">CCFF66</a></td>
+ <td bgcolor="CCFF99"><a href="javascript:insertcode('CCFF99');" style="color:#000000;">CCFF99</a></td>
+ <td bgcolor="CCFFCC"><a href="javascript:insertcode('CCFFCC');" style="color:#000000;">CCFFCC</a></td>
+ <td bgcolor="CCFFFF"><a href="javascript:insertcode('CCFFFF');" style="color:#000000;">CCFFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF0000"><a href="javascript:insertcode('FF0000');" style="color:#FFFFFF;">FF0000</a></td>
+ <td bgcolor="FF0033"><a href="javascript:insertcode('FF0033');" style="color:#FFFFFF;">FF0033</a></td>
+ <td bgcolor="FF0066"><a href="javascript:insertcode('FF0066');" style="color:#FFFFFF;">FF0066</a></td>
+ <td bgcolor="FF0099"><a href="javascript:insertcode('FF0099');" style="color:#FFFFFF;">FF0099</a></td>
+ <td bgcolor="FF00CC"><a href="javascript:insertcode('FF00CC');" style="color:#FFFFFF;">FF00CC</a></td>
+ <td bgcolor="FF00FF"><a href="javascript:insertcode('FF00FF');" style="color:#FFFFFF;">FF00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF3300"><a href="javascript:insertcode('FF3300');" style="color:#FFFFFF;">FF3300</a></td>
+ <td bgcolor="FF3333"><a href="javascript:insertcode('FF3333');" style="color:#FFFFFF;">FF3333</a></td>
+ <td bgcolor="FF3366"><a href="javascript:insertcode('FF3366');" style="color:#FFFFFF;">FF3366</a></td>
+ <td bgcolor="FF3399"><a href="javascript:insertcode('FF3399');" style="color:#FFFFFF;">FF3399</a></td>
+ <td bgcolor="FF33CC"><a href="javascript:insertcode('FF33CC');" style="color:#FFFFFF;">FF33CC</a></td>
+ <td bgcolor="FF33FF"><a href="javascript:insertcode('FF33FF');" style="color:#FFFFFF;">FF33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF6600"><a href="javascript:insertcode('FF6600');" style="color:#000000;">FF6600</a></td>
+ <td bgcolor="FF6633"><a href="javascript:insertcode('FF6633');" style="color:#000000;">FF6633</a></td>
+ <td bgcolor="FF6666"><a href="javascript:insertcode('FF6666');" style="color:#000000;">FF6666</a></td>
+ <td bgcolor="FF6699"><a href="javascript:insertcode('FF6699');" style="color:#000000;">FF6699</a></td>
+ <td bgcolor="FF66CC"><a href="javascript:insertcode('FF66CC');" style="color:#000000;">FF66CC</a></td>
+ <td bgcolor="FF66FF"><a href="javascript:insertcode('FF66FF');" style="color:#000000;">FF66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF9900"><a href="javascript:insertcode('FF9900');" style="color:#000000;">FF9900</a></td>
+ <td bgcolor="FF9933"><a href="javascript:insertcode('FF9933');" style="color:#000000;">FF9933</a></td>
+ <td bgcolor="FF9966"><a href="javascript:insertcode('FF9966');" style="color:#000000;">FF9966</a></td>
+ <td bgcolor="FF9999"><a href="javascript:insertcode('FF9999');" style="color:#000000;">FF9999</a></td>
+ <td bgcolor="FF99CC"><a href="javascript:insertcode('FF99CC');" style="color:#000000;">FF99CC</a></td>
+ <td bgcolor="FF99FF"><a href="javascript:insertcode('FF99FF');" style="color:#000000;">FF99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFCC00"><a href="javascript:insertcode('FFCC00');" style="color:#000000;">FFCC00</a></td>
+ <td bgcolor="FFCC33"><a href="javascript:insertcode('FFCC33');" style="color:#000000;">FFCC33</a></td>
+ <td bgcolor="FFCC66"><a href="javascript:insertcode('FFCC66');" style="color:#000000;">FFCC66</a></td>
+ <td bgcolor="FFCC99"><a href="javascript:insertcode('FFCC99');" style="color:#000000;">FFCC99</a></td>
+ <td bgcolor="FFCCCC"><a href="javascript:insertcode('FFCCCC');" style="color:#000000;">FFCCCC</a></td>
+ <td bgcolor="FFCCFF"><a href="javascript:insertcode('FFCCFF');" style="color:#000000;">FFCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFFF00"><a href="javascript:insertcode('FFFF00');" style="color:#000000;">FFFF00</a></td>
+ <td bgcolor="FFFF33"><a href="javascript:insertcode('FFFF33');" style="color:#000000;">FFFF33</a></td>
+ <td bgcolor="FFFF66"><a href="javascript:insertcode('FFFF66');" style="color:#000000;">FFFF66</a></td>
+ <td bgcolor="FFFF99"><a href="javascript:insertcode('FFFF99');" style="color:#000000;">FFFF99</a></td>
+ <td bgcolor="FFFFCC"><a href="javascript:insertcode('FFFFCC');" style="color:#000000;">FFFFCC</a></td>
+ <td bgcolor="FFFFFF"><a href="javascript:insertcode('FFFFFF');" style="color:#000000;">FFFFFF</a></td>
+ </tr>
+</table> \ No newline at end of file
diff --git a/0.6.1/config.pm b/0.6.1/config.pm
new file mode 100644
index 0000000..6a7662c
--- /dev/null
+++ b/0.6.1/config.pm
@@ -0,0 +1,329 @@
+# yChat - Copyright by Paul C. Bütow
+
+########################### Dieser Teil bestimmt die Standart-Variabeln.
+##STANDART-CONFIGURATION:## (CSS, Farben, Version etc.)
+###########################
+$admin = "Snooper";
+$datum = "28.02.01";
+$version = "0.6.1";
+$title = "yChat [$version]";
+$gfxpath = "../../yChat";
+$style = <<ENDCSS;
+<style type="text/css">
+ body { background-color: #005146 }
+ body.blank { background-color: #000000 }
+ body.online { background-color: #000000 }
+ div { font-family: arial, geneva, verdana, helvetiva; font-size: 12px; color: #ffffff }
+ div.b { font-weight: bold; color: #ffa500 }
+ a { color: #ffffef; }
+ a:hover { color: #ffffff; }
+ p { font-family:verdana, arial, geneva, helvetica, sans-serif; color:#FFFFFF; font-size:12px; }
+</style>
+<style type="text/css" media="all">
+ a { text-decoration: none; }
+ a:hover { text-decoration:underline; }
+ input { border:2px solid #000000; font-size:12px; color:#000000; background-color: #ffffff; height:23px; padding:2px;}
+ select { border:2px solid #000000; font-family:arial, verdana, helvetica; font-size:11px; color:#000000; height:21px; padding:2px;}
+</style>
+ENDCSS
+
+############### Dieser TeFil enthält Programmcode, der an verschiedenen
+##SHARED-SUBS## Stellen ausgeführt werden muß und jedem Skript zur
+############### Verfügung steht.
+
+sub printfile { # Liest eine externe Datei ein und gibt sie mit print aus
+ my ($file2print,$pagetitle,$bodyclass) = @_;
+ if ($pagetitle ne "") {
+ &start_html($pagetitle,$bodyclass);
+ }
+ open(FILE2PRINT,"<$file2print");
+ while(<FILE2PRINT>) {
+ print "$_\n";
+ }
+ close FILE2PRINT;
+}
+
+sub start_html { # Der HEADER einer HTML-Datei
+ print "<html><head><title>$title - $_[0]</title>$_[2]$style</head>";
+ if ($_[1] eq "start") {
+ print "<body onload=\"document.login.alias.focus();\">";
+ } elsif ($_[1] ne "") {
+ print "<body class=$_[1]>";
+ } else {
+ print "<body>";
+ }
+}
+
+sub post { # Öffentliche Nachricht posten.
+ my ($room,$msg2post,$secroom) = @_;
+ my @rooms = $room;
+ @rooms = ($room,$secroom) if ($room ne $secroom);
+ foreach $raum (@rooms) {
+ open(MSGFILE,">>data/msgs/$raum");
+ print MSGFILE "!<;".time."<;!<;!<;$msg2post<;\n";
+ close MSGFILE;
+ opendir(PID,"data/online/pids/$raum");
+ my @pids = readdir(PID);
+ closedir(PID);
+ foreach(@pids) {
+ if (-f "data/online/pids/$raum/$_") {
+ kill USR1 => $_;
+ }
+ }
+ }
+ &log($msg2post) if ($room eq "Cyberbar");
+}
+
+sub post_prv { # Private Nachricht posten (flüstern).
+ my ($alias2post,$msg2post) = @_;
+ opendir(DIR,"data/online/rooms");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach $raum (@dir) {
+ opendir(DIR,"data/online/rooms/$raum");
+ my @chatter = readdir(DIR);
+ closedir(DIR);
+ foreach $chatter (@chatter) {
+ if ($chatter eq $alias2post) {
+ open(MSGFILE,">>data/msgs/$raum");
+ print MSGFILE "$alias2post<;".time."<;!<;!<;$msg2post<;\n";
+ close MSGFILE;
+ opendir(PID,"data/online/pids/$raum");
+ my @pids = readdir(PID);
+ closedir(PID);
+ foreach(@pids) {
+ if (-f "data/online/pids/$raum/$_") {
+ kill USR1 => $_;
+ }
+ }
+ goto ENDPRV;
+ }
+ }
+ }
+ENDPRV:
+}
+
+sub log { # Protokollieren der Nachrichten etc.
+ my $msg2log = $_[0];
+ my $js;
+ &zeit;
+ ($msg2log,$js) = split(/<script/, $msg2log);
+ open(LOG,">>data/logs/$day.$month.$year");
+ print LOG "<br><font color=ffffef><i>($hours:$min:$sec)</i></font> $msg2log\n";
+ close LOG;
+}
+
+sub zeit { # Aktuelles Datum und Uhrzeit bestimmen.
+ ($sec, $min, $hours, $day, $month, $year) = (localtime)[0..5];
+ $month += 1;
+ $hours = "0".$hours if ($hours < 10);
+ $min = "0".$min if ($min < 10);
+ $sec = "0".$sec if ($sec < 10);
+ $day = "0".$day if ($day < 10);
+ $month = "0".$month if ($month < 10);
+ $year = $year - 100;
+ if ($year < 10) {
+ $year = "200".$year;
+ } else {
+ $year = "20".$year;
+ }
+}
+
+sub error { # Error-Ausgabe.
+ my $error_msg = $_[0];
+ &start_html( "Error: ($error_msg)" );
+ print $q->div( "Error: ($error_msg)" ),
+ $q->end_html;
+ open(ERROR,">>data/error");
+ flock(ERROR, 2);
+ print ERROR "Alias: $alias TempID: $tmpid File. $0 PID: $$ Time: ".time." Message: $error_msg \n";
+ close ERROR;
+ exit 0;
+}
+
+sub check_online { # Auf alte Räume und Chatter prüfen und ggf. entfernen.
+ open(PROVE,">data/online/prove");
+ print PROVE time;
+ close PROVE;
+ opendir(RAUMDIR, "data/online/rooms");
+ my @raumdir = readdir(RAUMDIR);
+ closedir(RAUMDIR);
+ foreach $raum (@raumdir) {
+ opendir(BENUTZERDIR, "data/online/rooms/$raum");
+ my @benutzerdir = readdir(BENUTZERDIR);
+ closedir(BENUTZERDIR);
+ my $raumleer= 1;
+ foreach $benutzer (@benutzerdir) {
+ if (-f "data/online/rooms/$raum/$benutzer") {
+ $raumleer = 0;
+ open (BENUTZER,"<data/online/rooms/$raum/$benutzer");
+ my $benutzerstamp = <BENUTZER>;
+ close BENUTZER;
+ if ($benutzerstamp < (time - 40)) {
+ unlink("data/online/$raum/$benutzer");
+ open (BENUTZER2,"<data/online/users/$benutzer");
+ my $benutzerstamp2 = <BENUTZER2>;
+ close BENUTZER2;
+ if ($benutzerstamp2 < (time - 40)) {
+ if ($benutzer ne $alias) {
+ &rm_alias($benutzer,$raum);
+ } else {
+ unlink("data/online/rooms/$raum/$benutzer");
+ }
+ &zeit;
+ &post($raum,"<i><font color=ffffff>($hours:$min:$sec) $benutzer hat den Chat verlassen ... </font></i>");
+ }
+ }
+ }
+ }
+ opendir(PIDS,"data/online/pids/$raum");
+ my @pids = readdir(PIDS);
+ closedir(PIDS);
+ if ($raumleer == 1) { # Falls Raum leer ist => entf.
+ rmdir("data/online/rooms/$raum");
+ unlink("data/online/rstat/$raum");
+ unlink("data/online/rstat/$raum.away");
+ unlink("data/msgs/$raum");
+ foreach(@pids) {
+ if (-f "data/online/pids/$raum/$_") {
+ unlink("data/online/pids/$raum/$_");
+ }
+ }
+ rmdir("data/online/pids/$raum");
+ } else {
+ foreach(@pids) {
+ unless (kill 0 => $_) {
+ unlink("data/online/pids/$room/$_");
+ }
+ }
+ }
+ }
+}
+
+sub rm_alias { # Falls Benutzer offline gegangen ist
+ my($benutzer,$raum) = @_;
+ unlink("data/online/rooms/$raum/$benutzer");
+ unlink("data/online/users/$benutzer");
+ opendir TMPID, "data/online/tmpid";
+ my @tmpid = readdir(TMPID);
+ close(TMPID);
+ foreach(@tmpid) {
+ unlink("data/online/tmpid/$_") if (/^$benutzer\..+$/);
+ }
+ unlink("data/online/ident/$benutzer");
+ &rm_rstat($benutzer,$raum);
+}
+
+sub rm_rstat { # Benutzer als Raumbesetzer austragen
+ my ($r_alias,$rstatroom) = @_;
+ open (RSTAT,"<data/online/rstat/$rstatroom");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ my @rstat2 = ($rstat[0],$rstat[1]);
+ for ($i=2;$i<=$#rstat;$i++) {
+ chomp($rstat[$i]);
+ push(@rstat2,$rstat[$i]."\n") if ($rstat[$i] ne $r_alias);
+ }
+ open (RSTAT,">data/online/rstat/$rstatroom");
+ flock(RSTAT, 2);
+ print RSTAT @rstat2;
+ close RSTAT;
+}
+
+sub rm_away { # Benutzer als Raumbesetzer austragen
+ my ($a_alias,$rstatroom) = @_;
+ open (AWAY,"<data/online/rstat/$rstatroom.away");
+ my @away = <AWAY>;
+ close AWAY;
+ my @away2;
+ foreach (@away) {
+ my @split = split(/<;/);
+ push(@away2, $_) if ($a_alias ne $split[0]);
+ }
+ open (AWAY,">data/online/rstat/$rstatroom.away");
+ print AWAY @away2;
+ close AWAY;
+}
+
+sub secure_checkid { # TmpID überprüfen
+ my ($alias2check) = $_[0];
+ unless (-f "data/online/tmpid/$alias.$tmpid") {
+ &error("Falsche TempID!");
+ }
+}
+
+sub hierachie { # Chatter nach SU überprüfen.
+ open WA, "<data/wa";
+ my @was = <WA>;
+ close WA;
+ foreach(@was) {
+ chomp;
+ if ($_ eq $_[0]) {
+ return "wa";
+ }
+ }
+ open OW, "<data/ow";
+ my @ows = <OW>;
+ close OW;
+ foreach(@ows) {
+ chomp;
+ if ($_ eq $_[0]) {
+ return "ow";
+ }
+ }
+}
+
+sub prove_besetzer { # Prüfen, ob Benutzer Raumbesetzerrechte hat
+ my ($alias,$room,$method) = @_;
+ open DATEI,"<data/online/rstat/$room";
+ my @rstat = <DATEI>;
+ close DATEI;
+ if ($method eq "return_list") {
+ my @value;
+ for($i=2;$i<=$#rstat;$i++) {
+ push @value,$rstat[$i];
+ }
+ return @value;
+ }
+ for($i=2;$i<=$#rstat;$i++) {
+ chomp($rstat[$i]);
+ if ($rstat[$i] eq $alias) {
+ return 1;
+ }
+ }
+}
+
+sub prove_away { # Prüfen, ob Benutzer abgemeldet ist
+ my ($a_alias,$room,$method) = @_;
+ open(DATEI,"<data/online/rstat/$room.away");
+ @away = <DATEI>;
+ close DATEI;
+ if ($method eq "return_list") {
+ my $away2;
+ foreach(@away) {
+ push @away2,split(/<; /);
+ }
+ return @away2;
+ }
+ my $alias, $away;
+ foreach(@away) {
+ if (/^$a_alias.*/) {
+ ($alias,$away) = split(/<; /);
+ chomp($away);
+ return $away;
+ }
+ }
+}
+
+sub random_color {
+ my @digit = ("F","C","A","B",5..9);
+ my $dig1 = rand(@digit);
+ my $dig2 = rand(@digit);
+ my $dig3 = rand(@digit);
+ my $dig4 = rand(@digit);
+ my $dig5 = rand(@digit);
+ my $dig6 = rand(@digit);
+ return $digit[$dig1].$digit[$dig2].$digit[$dig3].$digit[$dig4].$digit[$dig5].$digit[$dig6];
+}
+
+# sub debug { open DEBUG,">data/debug"; while(@_) { chomp; print DEBUG "$_\n"; } close DEBUG;} \ No newline at end of file
diff --git a/0.6.1/help.sno b/0.6.1/help.sno
new file mode 100644
index 0000000..9fd4250
--- /dev/null
+++ b/0.6.1/help.sno
@@ -0,0 +1,60 @@
+<div>
+ Alle Chat-Befehle:
+</div>
+<hr>
+<table border=1>
+<tr><th><div>SU</div></th><th><div>Befehl</div></th><th><div>Beschreibung</div></th></tr>
+<tr><td><div>NC</div></td><td><div>/about</div></td><td><div>Zeigt aktuelle Version und andere Infos der Community an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/away <font color=red>Nachricht</font></div></td><td><div>Abmelden mit einer<font color=red>Abmeldenachricht</font></div></td></tr>
+<tr><td><div>NC</div></td><td><div>/clear</div></td><td><div>Bildschirm wird gelöscht</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/col <font color=red>XXXXXX</font> <font color=ffa500>XXXXXX</font></div></td><td><div>Farbe/n (<font color=red>Namensfarbe</font> / <font color=ffa500>Textfarbe</font>) wechseln. Angabe in Hexadezimal. Wird gar keine Farbe angegeben, dann wird eine zufällige generiert!</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/date</div></td><td><div>Zeigt aktuelles Datum und Urzeit an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/j <font color=red>Raumname</font></div></td><td><div>Raum wechseln/erstellen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ju <font color=red>Alias</font></div></td><td><div>In den Raum wechseln/folgen, wo sich <font color=red>Alias</font> befindet.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/m <font color=red>Aktion</font></div></td><td><div>Handeln mit 2 Farben</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/me <font color=red>Aktion</font></div></td><td><div>Handeln mit einer Farbe</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/memo <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine <font color=ffa500>Memonachricht</font> hinterlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/msg <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine private <font color=ffa500>Nachricht</font> flüstern</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ <font color=ffa500>Nachricht</font></div></td><td><div>Eine private <font color=ffa500>Nachricht</font> demjenigen flüstern, dem zuletzt eine geflüstert wurde</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/online <font color=red>Alias</font></div></td><td><div>Zeigt Onlineminuten von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/q</div></td><td><div>Chat verlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/rmgb</div></td><td><div>Das eigene Gästebuch komplett weglöschen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/s <font color=red>Nachricht</font></div></td><td><div><font color=red>Nachricht</font> schreien</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/seen <font color=red>Alias</font></div></td><td><div>Zeigt an, vor wieviel Stunden sich <font color=red>Nachricht</font> zum letzten Mal in das System eingelogt hat</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/w</div></td><td><div>Zeigt an, wer sich im aktuellen Raum befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc <font color=red>Raum</font></div></td><td><div>Zeigt an, wer sich im <font color=red>Raum</font> befindet. Wird kein Raum angegeben, dann wird ledeglich angezeigt, wer sich im System befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc/</div></td><td><div>Zeigt alle offenen Räume und deren Chatter an</div></td></tr>
+<tr><td><div>NC</div></td><td> <div>/wj <font color=red>Alias</font></div></td><td><div>Zeigt an, in welchen Raum sich <font color=red>Alias</font> befindet</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/l</div></td><td><div>Der aktuelle Raum wird ab- bzw. aufgesperrt</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/rsu <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> die Raumbesetzerrechte entnehmen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/su <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Raumbesetzer ernennen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/t <font color=red>Thema</font></div></td><td><div>Dem aktuellen Raum wird ein <font color=red>Thema</font> gegeben</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban</div></td><td><div>Zeigt alle verbannten Benutzer an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> verbannen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/rban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> "entbannen"</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ip <font color=red>Alias</font></div></td><td><div>Zeigt die IP-Nummer von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/k <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird aus dem Chat katapultiert!</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/sl <font color=red>Raum</font></div></td><td><div>Einen anderen <font color=ffa500>Raum</font> absperren</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ss <font color=red>Raum</font> <font color=ffa500>Nachricht</font></div></td><td><div>Eine <font color=ffa500>Nachricht</font> in <font color=red>Raum</font> hinüber rufen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/st <font color=red>Raum</font> <font color=ffa500>Thema</font></div></td><td><div>Einem anderen <font color=ffa500>Raum</font> ein <font color=ffa500>Thema</font > geben</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/banip <font color=red>Alias</font></div></td><td><div>Die IP-Nummer von <font color=red>Alias</font> verbannen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/rbanip ip://<font color=red>x.x.x.x</font></div></td><td><div>Die IP-Nummer <font color=red>x.x.x.x</font> "entbannen"</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/kill <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird ganz und gar aus dem System entfernt</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/wa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Wächter ernennen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/rwa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom Wächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/sys <font color=red>Nachricht</font></div></td><td><div>Systemnachricht schreiben. (Erscheint in allen existierenden Räumen)</div></td></tr>
+</table><hr>
+<div>
+ Zur Erklärung: NC steht für "Normale Chatter", RB für "Raumbesetzer", WÄ für "Wächter" und OW für "Oberwächter".
+ Obrige Befehle können nur von der/den jeweiligen Benutzergruppe/n werden.<br><br>
+ Allerdings gibt es folgendes zu beachten: Oberwächter verfügen über alle Chatbefehle. Normale Wächter über alle Chatbefehle, außer über die der Oberwächter.
+ Raumbesetzer können nur Raumbesetzerbefehle und die Befehle der normalen Chatter durchführen. Normale Chatter haben ledeglich die Standardbefehle zu verwenden.<br><br>
+ Weitere Besonderheiten der Wächter und Oberwächter:<br><br>
+ Wächter und Oberwächter können ....<br>
+ ... abgesperrte Chaträume problemlos betreten.<br>
+ ... nicht gekickt, verbannt oder gekillt werden.<br><br>
+ Nur Oberwächer können Logdateien der Cyberbar lesen!<br><br>
+ Oberwächter ernennt nur der Systemadministrator!
+</div>
+</body>
+</html> \ No newline at end of file
diff --git a/0.6.1/htdocs.pl b/0.6.1/htdocs.pl
new file mode 100644
index 0000000..b740331
--- /dev/null
+++ b/0.6.1/htdocs.pl
@@ -0,0 +1,246 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print $q->header;
+
+$var = $q->param("var");
+
+if ($var eq "help_html") {
+ &printfile("help.sno","Alle Chatbefehle");
+} elsif ($var eq "logo_html") {
+ &start_html("Logo");
+print<<END;
+<layer top=-3 left=0><div style="position:absolute; top:5; left:10">
+<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
+ codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0"
+ WIDTH=48 HEIGHT=48>
+ <PARAM NAME=movie VALUE="$gfxpath/ySymbol.swf">
+ <PARAM NAME=loop VALUE=false>
+ <PARAM NAME=menu VALUE=false>
+ <PARAM NAME=quality VALUE=high>
+ <PARAM NAME=scale VALUE=noborder>
+ <PARAM NAME=wmode VALUE=opaque>
+ <PARAM NAME=bgcolor VALUE=#005146>
+ <EMBED src="$gfxpath/ySymbol.swf" loop=false menu=false quality=high scale=noborder wmode=opaque bgcolor=#005146
+ WIDTH=48 HEIGHT=48 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED>
+</OBJECT>
+</div></layer>
+END
+print $q->end_html;
+} elsif ($var eq "menu_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ $tmp = $q->param("tmp");
+ &menu_html;
+} elsif ($var eq "werda_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &werda_html;
+} elsif ($var eq "logs_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ &logs_html;
+} elsif ($var eq "view_logs_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $tmp = $q->param("tmp");
+ &secure_checkid($alias);
+ if (&hierachie($alias) eq "ow") {
+ &printfile($tmp,"Logdatei","blank");
+ }
+} elsif ($var eq "superuser_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ &superuser_html;
+} elsif ($var eq "chatiquette_html") {
+ &printfile("chatiq.sno","Chatiquette");
+ print $q->end_html;
+} else {
+ print
+ $q->start_html(-bgcolor=>"000000"),
+ $q->end_html;
+}
+
+sub menu_html {
+if ($tmp eq "quit") {
+ &start_html("Quit","blank","<script language=\"JavaScript\">open(\"index.pl?tmp=quit\",\"_top\");</script>");
+ print $q->end_html;
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffffff>$alias verläßt den Chat ... </font></i>");
+ sleep 2;
+ &rm_alias($alias,$room);
+ exit;
+}
+ENDJS
+ &start_html("Menü","blank");
+print <<END;
+<script language="JavaScript">
+function fenster(fenster,target) {
+ open(fenster,target,"width=500,height=500,screenX=100,screenY=100,scrollbars");
+}
+</script>
+<font size=2 face=verdana><p>
+ <a href='javascript:fenster("htdocs.pl?var=werda_html&alias=$alias&room=$room&col=$col&secol=$secol&tmp=$tmp&tmpid=$tmpid","weristda")'>Wer ist da?</a>
+ <a href='javascript:fenster("main2.pl?var=edit_profile_html&alias=$alias&tmpid=$tmpid&room=$room","ProfilAendern")'>Profil ändern</a>
+ <a href='javascript:fenster("main2.pl?var=edit_options_html&alias=$alias&tmpid=$tmpid&room=$room","Optionen")'>Optionen</a>
+ <a href='javascript:fenster("main2.pl?var=list_alias_html&alias=$alias&tmpid=$tmpid","Benutzerliste")'>Benutzer</a>
+ <a href='javascript:fenster("htdocs.pl?var=help_html&tmpid=$tmpid","Befehle")'>Befehle</a>
+ <a href='javascript:fenster("main2.pl?var=gb_html&alias=$alias&tmpid=$tmpid","Board")'>Board</a><br>
+ <a href='javascript:fenster("htdocs.pl?var=superuser_html&alias=$alias&tmpid=$tmpid","Superuser")'>Superuser</a>
+ <a href='javascript:fenster("htdocs.pl?var=logs_html&alias=$alias&tmpid=$tmpid","Logdateien")'>Logs</a>
+ <a href='javascript:fenster("stat.pl?&alias=$alias&tmpid=$tmpid","Statistik")'>Statistik</a>
+ <a href='javascript:fenster("htdocs.pl?var=chatiquette_html","Chatiquette")'>Chatiquette</a>
+ <a href="http://www.home.yChat.de" target="Home">Home</a>
+ <a href="http://www.credits.yChat.de" target="Credits">Credits</a>
+ <a href="htdocs.pl?alias=$alias&var=menu_html&room=$room&tmpid=$tmpid&tmp=quit">Verlassen</a>
+</p></font>
+</body>
+</html>
+END
+}
+
+sub werda_html { # Anzeige, wer eingelogt ist.
+ &start_html("Wer ist da?");
+ print <<END;
+<div>
+ $alias, schön daß Du hier bist :-)
+</div>
+<hr>
+<div>
+ Folgende Personen befinden sich im Chat:
+</div>
+<br>
+<div>
+END
+ opendir(ROOMDIRS,"data/online/rooms");
+ local @roomdirs = readdir(ROOMDIRS);
+ close(ROOMDIRS);
+ foreach(@roomdirs) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ my $room = $_;
+ open(RSTAT,"<data/online/rstat/$room");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ opendir(ROOMDIR,"data/online/rooms/$room");
+ my @roomdir = readdir(ROOMDIR);
+ close(ROOMDIR);
+ local $nr = $#roomdir-1;
+ print $q->b( $_ ),
+ " $door ($nr) Raumthema: $rstat[1]",
+ $q->br;
+ foreach(@roomdir) {
+ if ($_ ne ".." && $_ ne ".") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid" }, "$_"), " ";
+ }
+ }
+ print $q->br, $q->br;
+ }
+ }
+ print
+ "</div>",
+ $q->end_html;
+}
+
+sub logs_html {
+ &start_html("Logdateien");
+ print <<END;
+<div>
+ Hier befinden sich alle Logdateien
+</div>
+<hr>
+END
+ if (&hierachie($alias) eq "ow") {
+ print $q->div( "Folgende Logdateien des Raumes \"Cyberbar\" können nur von Oberwächtern gelesen werden (Sortiert nach A-Z, a-z):" ),
+ $q->br;
+ opendir(LOGS,"data/logs");
+ local @logs = readdir(LOGS);
+ closedir(LOGS);
+ local @sortedir = sort(@logs);
+ foreach(@sortedir) {
+ if (-f "data/logs/$_") {
+ print $q->a( { -href=>"htdocs.pl?alias=$alias&var=view_logs_html&tmp=data/logs/$_&tmpid=$tmpid",
+ -target=>"_new" },
+ "$_" ),
+ " ";
+ }
+ }
+ } else {
+ print $q->div( "Logdateien können nur von Oberwächtern (OW) gelesen werden. Du bist jedoch ein Wächter (WÄ) oder ein",
+ "\"Normaler Chatter\". Oberwächter können alles nachlesen, was öffentlich im Raum \"Cyberbar\" gechattet wurde." ),
+ $q->hr;
+ &printfile("data/htdocs/logs_html");
+ }
+ print
+ $q->end_html;
+}
+
+sub superuser_html { # Zeigt an, wer Superuser ist
+ start_html("Superuser");
+ print "<div>Hallo $alias. Du bist als ";
+ if (hierachie($alias) eq "ow") {
+ print
+ $q->b( "Oberwächter" ),
+ " (OW) eingetragen.</div>",
+ $q->hr;
+ } elsif (hierachie($alias) eq "wa") {
+ print
+ $q->b( "Wächter" ),
+ " (WÄ) eingetragen.</div>",
+ $q->hr;
+ } else {
+ print
+ $q->b( "normaler Chatter" ),
+ " (NC) eingetragen.</div>",
+ $q->hr;
+ }
+
+ open WA, "<data/wa";
+ my @was = <WA>;
+ close WA;
+ open OW, "<data/ow";
+ my @ows = <OW>;
+ close OW;
+
+ my $nrow = $#ows+1;
+ print
+ "<div>",
+ $q->b( "OW" ),
+ "s ($nrow Stück)";
+ foreach(@ows) {
+ print
+ $q->font( { -color=>"ffa500" },
+ " ".$_);
+ }
+ my $nrwa = $#was+1;
+ print
+ "</div>",
+ $q->hr,
+ "<div>",
+ $q->b( "WÄ" ),
+ "s ($nrwa Stück)";
+ foreach(@was) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+print <<END;
+<hr>
+ Die jeweiligen Fähigkeiten der Oberwächter (OW) und der Wächter (WÄ) sind unter
+ "<a href="htdocs.pl?var=help_html">Chat-Befehle</a>"
+ dokumentiert.
+</div>
+</body>
+</html>
+END
+} \ No newline at end of file
diff --git a/0.6.1/index.pl b/0.6.1/index.pl
new file mode 100644
index 0000000..4713008
--- /dev/null
+++ b/0.6.1/index.pl
@@ -0,0 +1,474 @@
+#!/usr/bin/perl
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print $q->header;
+
+$var = $q->param("var");
+$alias = $q->param("alias");
+$pw = $q->param("pw");
+$tmp = $q->param("tmp");
+
+if ($var eq "create_alias_html") {
+ &create_alias_html;
+} elsif ($var eq "create_alias") {
+ &create_alias;
+} elsif ($var eq "login_html") {
+ &login_html;
+} elsif ($var eq "chatiquette_html") {
+ &chatiquette_html;
+} elsif ($alias eq "") {
+ &login_html;
+} else {
+ &checklogin;
+}
+
+sub login_html { # Erste Startseite
+&check_online;
+local $counter = undef;
+open(COUNT,"<data/count");
+ $counter = <COUNT>;
+close COUNT;
+$counter++;
+open(COUNT,">data/count");
+ flock(COUNT, 2);
+ print COUNT $counter;
+close COUNT;
+opendir(USERS,"data/online/users");
+ my @users = readdir(USERS);
+closedir(USERS);
+opendir(REGISTRED,"data/user/options");
+ local @registred = readdir(REGISTRED);
+closedir(REGISTRED);
+local ($logtin,$users) = ($#users-1,$#registred-1);
+&start_html("Created & Copyright by Paul C. Bütow","start");
+print <<END;
+ <center>
+ <table width=500>
+ <tr>
+ <td>
+ <center>
+ <table>
+ <tr>
+ <td>
+ <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0" WIDTH=240 HEIGHT=240>
+ <param name=movie value="$gfxpath/yIntro.swf">
+ <param name=loop value=false>
+ <param name=menu value=false>
+ <param name=quality value=high>
+ <param name=scale value=noborder>
+ <param name=wmode value=opaque>
+ <param name=bgcolor value=#005146>
+ <embed src="$gfxpath/yIntro.swf" loop=false menu=false quality=high scale=noborder wmode=opaque bgcolor=#005146 WIDTH=240 HEIGHT=240 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED>
+ </object>
+ </td>
+ <td>
+ <div>
+ yChat: Version $version
+ <br><br>
+ Letztes Update: $datum
+ <br><br>
+ Seitenaufrufe: $counter
+ <br><br>
+ Benutzer registriert: $users
+ <br><br>
+ Benutzer online: $logtin
+ <br><br>
+ Webmaster: <a href="mailto:mail\@paulbuetow.de">Paul C. Bütow</a>
+ <br><br>
+ yChat-HP: <a href="http://www.home.yChat.de">home.yChat.de</a>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </center>
+ </div>
+ <br>
+ <br>
+END
+ if ($tmp eq "true") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Wahrscheinlich existiert Dein Alias "$alias" nicht,
+ <br>
+ Du hast Dich verschrieben oder das Passwort ist falsch.
+ <br>
+ Versuch es erneuert !
+ </div>
+END
+ } elsif ($tmp eq "quit") {
+print <<END;
+ <div>
+ Du hast soeben den Chat verlassen.
+ <br>
+ Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ } elsif ($tmp eq "autologout") {
+print <<END;
+ <div>
+ Du wurdest automatisch aus dem Chat ausgeloggt. Grund: Du warst 20 Minuten inaktiv.
+ <br>
+ Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ } elsif ($tmp eq "banned") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wurdest aus dem Chat verbannt!!!
+ <br>
+ Z.z. kannst Du Dich leider nicht in den Chat einloggen.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($tmp eq "kick") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wurdest soeben aus dem Chat katapultiert!
+ <br>
+ Schlechtes Verhalten mag die Ursache hierfür sein.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($var eq "create_alias") {
+print "<div>Du hast sich soeben in die Datenbank eingetragen. Einfach auf \"Los Geht's\" klicken :-)</div>";
+ } else {
+print <<END;
+ <div>
+ Herzlich willkommen!
+ <br>
+ Einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <form name="login" action="index.pl" method="post">
+ <input type="hidden" name="tmp" value="true">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Alias:
+ <br>
+ <input name="alias" value="$alias">
+ </div>
+ </td>
+ <td>
+ <div>
+ Dein Passwort:
+ <br>
+ <input type="password" name="pw" value="$pw">
+ </div>
+ </td>
+ </tr>
+ </table>
+ <br>
+ <br>
+ <div>
+ Solltest Du noch keinen Nick besitzen, dann auf "Registrieren" klicken!
+ </div>
+ <br>
+ <table>
+ <tr>
+ <td>
+ <font color="ffffff">
+ <input type="submit" value="Los geht's!">
+ </font>
+ </form>
+ </td>
+ <td>
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias_html">
+ <font color="ffffff">
+ <input type="submit" value="Registrieren">
+ </font>
+ </form>
+ </td>
+ </tr>
+ </table>
+ <hr>
+END
+if ($logtin > 0) {
+ print "<div>Folgende Personen sind eingeloggt:<br><font size='1'>";
+ foreach(@users) {
+ print "$_ " if (-f "data/online/users/$_");
+ }
+ print "</font></div>";
+}
+print<<END;
+ </td>
+ </tr>
+ </table>
+ </center>
+</body>
+</html>
+END
+ if (-d "data/online/rooms") {
+ } else {
+ mkdir "data/online/rooms", 0777;
+ }
+}
+
+
+sub chatiquette_html {
+&start_html("Registration");
+print <<END;
+ <center>
+ <table width=500>
+ <tr>
+ <td>
+END
+open CHATIQ, "chatiq.sno";
+ foreach(<CHATIQ>) {
+ last if (/^\n+$/);
+ print $_;
+ }
+WEITER:
+close CHATIQ;
+print<<END;
+ </td>
+ </tr>
+ </table>
+ </center>
+</body>
+</html>
+END
+}
+
+sub create_alias_html { # HTML-Form für Erstellung eines neuen Benutzers.
+my $reload = $_[0];
+&start_html("Registration");
+print <<END;
+ <center>
+ <table width=500>
+ <tr>
+ <td>
+END
+ if ($reload eq "alias_exists") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Der von Dir gewählte Benutzername "$alias" existiert in unserer Datenbank bereits. Bitte versuch es erneuert mit
+ einem anderen Benutzernamen !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "pw_wrong") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Deine beiden Passworteingaben stimmen nicht überein. Bitte geb das Passwort erneuert an um sicherzugehen, daß
+ kein falsches Passwort abgespeichert wird !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "alias_prohibited") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein gewählter Benutername "$alias" enthält illegale Zeichen. Bitte versuch einen anderen Benutzernamen!
+ </div>
+ <hr>
+END
+} elsif ($reload eq "alias_length") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein gewählter Benutername "$alias" enthält zu viele Zeichen. Es sind maximal 15 Zeichen erlaubt!!
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Hier kannst Du Dich registrieren. Bitte beachte, daß die Passworteingabefelder übereinstimmen!
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias">
+ <div>
+ Dein Alias:
+ <font color="ffa500">
+ (Muß angegeben werden)
+ </font>
+ <br>
+ <input name="alias" VALUE="$alias">
+ </div>
+ <br>
+ <div>
+ Dein gewünschtes Passwort:
+ <br>
+ <input type="password" name="pw" value="$pw">
+ </div>
+ <br>
+ <div>
+ Geb hier Dein Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp">
+ </div>
+ <br>
+ <font color=ffffff>
+ <input type="submit" value="Registrieren">
+ </font>
+ <br>
+ </form>
+ <hr>
+ <div>
+ Um den Chat zu betreten müssen die Daten nach der Registration auf der Startseite erneuert bestätigt werden !
+ </div>
+ </td>
+ </tr>
+ </table>
+</center>
+</body>
+</html>
+END
+}
+
+sub checklogin { # Überprüfen, ob die Login-Daten korrekt sind.
+ my $lognotexists = "true";
+ opendir(USERDIR,"data/user/options");
+ my @userdir = readdir(USERDIR);
+ closedir(USERDIR);
+ foreach $user (@userdir) {
+ if ($user eq $alias) {
+ open(OPTIONS,"<data/user/options/$alias");
+ my @options = <OPTIONS>;
+ close OPTIONS;
+ foreach(@options) {
+ chomp $_;
+ }
+ if ($options[0] eq $pw) {
+ open(BAN,"<data/ban");
+ my @ban = <BAN>;
+ close BAN;
+ foreach(@ban) {
+ chomp;
+ if ($_ eq "$alias" || $_ eq "ip://".$ENV{'REMOTE_ADDR'}) {
+ $tmp = "banned";
+ &login_html;
+ exit 0;
+ }
+ }
+ if ($options[1] eq undef) { $col = &random_color;}
+ else { $col = $options[1]; }
+ if ($options[2] eq undef) { $secol = &random_color;}
+ else { $secol = $options[2];}
+ if ($options[3] eq undef) { $maxVerlauf = "10";}
+ else { $maxVerlauf = $options[3];}
+ if ($options[4] eq undef) { $verlaufOrder = "1";}
+ else {$verlaufOrder = $options[4];}
+ my @digit = (A..Z, a..z, 0..9, "-", ".");
+ my $num1 = rand(@digit);
+ my $num2 = rand(@digit);
+ my $num3 = rand(@digit);
+ my $num4 = rand(@digit);
+ my $num5 = rand(@digit);
+ my $num6 = rand(@digit);
+ my $num7 = rand(@digit);
+ my $num8 = rand(@digit);
+ my $num9 = rand(@digit);
+ my $num10 = rand(@digit);
+ $tmpid = $digit[$num1].$digit[$num2].$digit[$num3].$digit[$num4].$digit[$num5].$digit[$num6].$digit[$num7].$digit[$num8].$digit[$num9].$digit[$num10];
+ open TMPID, ">data/online/tmpid/$alias.$tmpid";
+ print TMPID $alias;
+ close TMPID;
+ open IDENT, ">data/online/ident/$alias" ;
+ print IDENT "$ENV{'REMOTE_ADDR'}\n$tmpid\n$ENV{'HTTP_USER_AGENT'}";
+ close IDENT;
+ open LASTLOGIN, ">data/user/lastlogin/$alias";
+ print LASTLOGIN time;
+ close LASTLOGIN;
+ &frameset_html;
+ exit 0;
+ } else {
+ $lognotexists = "false";
+ }
+ }
+ }
+ &login_html; # Falls Login-Daten inkorrekt sind, zurück zur Startseite.
+}
+
+sub create_alias { # Erstellung eines neuen Benutzers.
+ if ($alias =~ /\W/ || $alias eq "") {
+ goto CREATE if ($alias =~ /[-]/ && $alias !~ /\W/);
+ &create_alias_html("alias_prohibited");;
+ exit 0;
+ } elsif ($pw ne $tmp) {
+ &create_alias_html("pw_wrong");
+ exit 0;
+ } elsif (length($alias) >= 15) {
+ &create_alias_html("alias_length");
+ exit 0;
+ }
+CREATE:
+ opendir(USERDIR,"data/user/options");
+ my @user = readdir(USERDIR);
+ close USERDIR;
+ foreach $user (@user) {
+ if ($user eq $alias) {
+ &create_alias_html("alias_exists");
+ exit;
+ }
+ }
+ open(OPTIONS,">data/user/options/$alias");
+ print OPTIONS $pw."\n";
+ close OPTIONS;
+ local $number = $#user;
+ &zeit;
+ &post("Cyberbar","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffffff>$alias [$number] hat sich soeben als neuer Benutzer registriert :-) ...</font></i>");
+ &login_html;
+}
+
+sub frameset_html {
+print <<END;
+<html>
+ <head>
+ <title>
+ $title - Powered by CXG - Chatters of the next generation
+ </title>
+ </head>
+<frameset border=0 frameborder=0 framespacing=0 cols="130,*">
+ <frameset border=0 frameborder=0 framespacing=0 rows="300,*,55">
+ <frame name="online" src="online.pl?room=Cyberbar&alias=$alias&tmpid=$tmpid">
+ <frame src="htdocs.pl">
+ <frameset border=0 frameborder=0 framespacing=0 cols="70,*">
+ <frame name="logo" src="htdocs.pl?var=logo_html" scrolling="no">
+ <frame name="reload" src="htdocs.pl" scrolling="no">
+ </frameset>
+ </frameset>
+ <frameset border=0 frameborder=0 framespacing=0 rows="60,*,55">
+ <frame name="menu" src="htdocs.pl?alias=$alias&var=menu_html&room=Cyberbar&col=$col&secol=$secol&tmpid=$tmpid" scrolling="no">
+ <frame name='main' src='push.pl?room=Cyberbar&alias=$alias&tmpid=$tmpid'>
+ <frame name="input" src="input.pl?alias=$alias&room=Cyberbar&col=$col&secol=$secol&tmp=login&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder" scrolling="no">
+ </frameset>
+</frameset>
+</html>
+END
+} \ No newline at end of file
diff --git a/0.6.1/input.pl b/0.6.1/input.pl
new file mode 100644
index 0000000..55007eb
--- /dev/null
+++ b/0.6.1/input.pl
@@ -0,0 +1,201 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print
+ $q->header();
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+#&secure_checkid($alias);
+$room = $q->param("room");
+$col = $q->param("col");
+$secol = $q->param("secol");
+$tmp = $q->param("tmp");
+$whisper = $q->param("whisper");
+$maxVerlauf = $q->param("maxVerlauf");
+$verlaufOrder = $q->param("verlaufOrder");
+
+if ($maxVerlauf eq undef) { $maxVerlauf = "10";}
+if ($verlaufOrder eq undef) { $verlaufOrder = "1";}
+
+if ($tmp eq "login") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias hat den Chat betreten ...</font></i>");
+}
+
+print <<END;
+<html>
+<head>
+<script language="JavaScript"><!--
+
+// Einstellungsvariablen
+maxVerlauf = $maxVerlauf; // Anzahl der Einträge des Verlaufs
+maxPreview = 20; // Zeichenlänge der Verlaufsvorschau
+verlaufOrder = $verlaufOrder; // Neue Nachrichten von: 0=oben, 1=unten
+//autoAwayTimeout = 20; // Sekunden, nach denen der User 'Away' gesetzt wird
+//autoQuitTimeout = 40; // Sekunden, nach denen der User den Chat verlässt
+autoAwayTimeout = 300; // Sekunden, nach denen der User 'Away' gesetzt wird
+autoQuitTimeout = 1200; // Sekunden, nach denen der User den Chat verlässt
+
+// Interne Variablen
+userNotFocused = false; // Wenn User nicht schreibt
+userAway = false; // Wenn User automatisch auf 'Away' gesetzt ist
+userAwayTime = 0; // Sekunden, die User 'Away' ist
+fullVerlauf = new Array( maxVerlauf ); // Verlaufspuffer
+
+function delout()
+{
+ addVerlauf (document.inf.msg.value); // Dem Verlauf eine Nachricht anhängen
+ document.inf.msg.focus(); // Fukus in das Eingabeform
+ document.inf.msg.select(); // Text im Eigabeform markieren
+ document.inf.submit(); // Formular absenden
+ return false; // Abbrechen, damit das Frame nicht neu geladen wird
+}
+
+function CheckAuswahl()
+{
+ id=document.verlaufform.verlauf.selectedIndex; // ID des ausgewählten Feldes
+
+ if (fullVerlauf[id-1] != null) // Nur, wenn das Feld nicht leer ist
+ {
+ document.inf.msg.value = fullVerlauf[id-1]; // Eintrag ins Textfeld
+ }
+
+ document.verlaufform.verlauf.selectedIndex = 0; // Ersten Eintrag (Überschrift) auswählen
+ document.inf.msg.focus(); // Eingabefeld fokusieren
+
+ return true;
+}
+
+function addVerlauf (msg)
+{
+ if (msg == "") // Falls msg leer
+ return false; // Aufruf ignorieren
+
+ if (verlaufOrder) // neue Nachrichten von unten
+ {
+ for (i=0; i<(maxVerlauf-1); i++) // Alle Einträge einen aufrutschen
+ {
+ document.verlaufform.verlauf.options[i+1].text = document.verlaufform.verlauf.options[i+2].text;
+ fullVerlauf[i] = fullVerlauf[i+1];
+ }
+ }
+ else // neue Nachrichten von oben
+ {
+ for (i=(maxVerlauf-2); i>=0; i--) // Alle Einträge einen aufrutschen
+ {
+ document.verlaufform.verlauf.options[i+2].text = document.verlaufform.verlauf.options[i+1].text;
+ fullVerlauf[i+1] = fullVerlauf[i];
+ }
+ }
+
+ if (msg.length > maxPreview) // Vorschau zuschneiden
+ pre = msg.slice(0, maxPreview-3) + "...";
+ else
+ pre = msg;
+
+ if (verlaufOrder) // pos = Position des neuen Eintrags
+ pos = maxVerlauf-1;
+ else
+ pos = 0
+
+ document.verlaufform.verlauf.options[pos+1].text = pre; // Neue Vorschau anfügen
+ fullVerlauf[pos] = msg; // Neuen Eintrag an den Verlauf anfügen
+
+// document.verlaufform.verlauf.selectedIndex = maxVerlauf; // Fokus auf den letzten Eintrag
+ document.verlaufform.verlauf.selectedIndex = 0; // Fokus auf den ersten Eintrag (Überschrift)
+}
+
+function msgBlur()
+{
+ userNotFocused = true;
+ userAwayTime = 0;
+ userAway = false;
+}
+
+function msgFocus()
+{
+ userNotFocused = false;
+ if (userAway) // Wird ausgeführt, falls User 'Away' war
+ {
+ ; // nop
+ }
+ userAwayTime = 0;
+ userAway = false;
+}
+
+function checkInterval()
+{
+// status = "userNotFocused=" + userNotFocused + "; userAway=" + userAway + "; userAwayTime=" + userAwayTime + ""; // Debug
+ if (userNotFocused)
+ {
+ userAwayTime += 5; // Addiere 5, da nur alle 5Sek ausgeführt
+ if (!userAway)
+ {
+ if (autoAwayTimeout < userAwayTime) // Falls Zeit abgelaufen
+ {
+ if (document.inf.tmp.value != "away")
+ open ("mail.pl?alias=$alias&tmpid=$tmpid&msg=/away&col=$col&room=$room&tmp=autoaway","reload"); // 'Away' setzen
+ userAway = true;
+ }
+ }
+ else
+ {
+ if (autoQuitTimeout < userAwayTime) // Falls Zeit abgelaufen
+ {
+ open ("mail.pl?alias=$alias&tmpid=$tmpid&msg=/q&room=$room&tmp=autologout","reload"); // Chat beenden
+ }
+ }
+ }
+
+ window.setTimeout("checkInterval()",5000); // In 5 Sekunden wieder aufrufen
+}
+
+function initFrame()
+{
+ window.setTimeout("checkInterval()",5000); // In 5 Sekunden aufrufen
+ document.inf.msg.focus(); // Eingabefeld fokusieren
+}
+//-->
+</script>
+$style
+</head>
+<body class="blank" onload="initFrame();">
+ <div align="left">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td>
+ <form name="inf" target="reload" action="main.pl" onsubmit="return delout();">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="room" value="$room">
+ <input type="hidden" name="col" value="$col">
+ <input type="hidden" name="secol" value="$secol">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="whisper" value="$whisper">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input size="50" maxlength="300" name="msg" onBlur="msgBlur();" onFocus="msgFocus();">
+ </form>
+ </td>
+ <td><form name="verlaufform">
+ <script language="JavaScript"><!--
+ document.write("<select size='1' name='verlauf' size='40' onChange='CheckAuswahl();'>");
+ document.write("<option value>- Nachrichten-Verlauf -</option>");
+ for(i=0; i<maxVerlauf; i++) // Leere Verlaufsfelder generieren
+ document.write("<option value>(leer)</option>");
+ document.write("</select>");
+ //-->
+ </script>
+ </form>
+ </td>
+ </tr>
+ </table>
+ </div>
+</body>
+</html>
+END
+
+&rm_away($alias,$room); \ No newline at end of file
diff --git a/0.6.1/main.pl b/0.6.1/main.pl
new file mode 100644
index 0000000..09bdb06
--- /dev/null
+++ b/0.6.1/main.pl
@@ -0,0 +1,951 @@
+#!/usr/bin/perl
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+print $q->header();
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+
+{
+ unless (-f "data/online/tmpid/$alias.$tmpid") {
+ require config;
+ &error("Falsche TempID !");
+ }
+}
+
+$room = $q->param("room");
+$tmp = $q->param("tmp");
+
+#if ($room ne "Wired") {
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ $rmsg = \$q->param("msg");
+#} else {
+# require config;
+# $msg = $q->param("msg");
+# $rmsg = \$msg;
+# $col = &random_color;
+# $secol = &random_color;
+#}
+
+unless (-e "data/online/rooms/$room/$alias") {
+ require config;
+ &post_prv($alias,"<font color=ffffff>Du befindest Dich nicht im Raum \"<font color=ffa500>$room</font>\" und kannst dort auch keine Nachrichten posten!</font>");
+ &reload_html;
+} elsif (length($$rmsg) > 300) {
+ require config;
+ &post_prv($alias,"<font color=ffffff>Deine Nachricht enthält zu viele Zeichen. Maximal sind 300 Zeichen erlaubt.</font>");
+ &reload_html;
+}
+
+if ($tmp eq "away") {
+ require config;
+ &rm_away($alias,$room);
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias hat sich zurück gemeldet ... </font></i><script language='JavaScript'>parent.online.location.reload();</script>");
+}
+
+if ($q->param('var') eq "change_colors") {
+ &reload_html("change_colors")
+}
+
+$$rmsg =~ s#<#&lt\;#g;
+
+if (substr($$rmsg,0,1) ne "/") {
+ open MSGFILE,">>data/msgs/$room";
+ unless ($$rmsg =~ s#/me/#<i>$alias</i>#g || $$rmsg =~ s#/m/#<i><font color=$col>$alias</font></i>#g) {
+ print MSGFILE "!<;".time."<;!<;!<;<b><font color=$col>$alias: <font color=$secol>$$rmsg</font></font></b><;\n";
+ } else {
+ $$rmsg =~ s#/me/#<i>$alias</i>#g;
+ $$rmsg =~ s#/m/#<i><font color=$col>$alias</font></i>#g;
+ print MSGFILE "!<;".time."<;!<;!<;<b><font color=$secol>$$rmsg</font></font></b><;\n";
+ }
+ close MSGFILE;
+ opendir PID,"data/online/pids/$room";
+ my @pids = readdir(PID);
+ closedir(PID);
+ foreach(@pids) {
+ if (-f "data/online/pids/$room/$_") {
+ kill USR1 => $_;
+ }
+ }
+ require config;
+ &log("<b><font color=$col>$alias: <font color=$secol>$$rmsg</font></font></b>") if ($room eq "Cyberbar");
+ &reload_html;
+} else {
+ require config;
+ &cmd($$rmsg);
+}
+
+sub reload_html { # Wird neugeladen, wenn eine Nachricht getextet wird!
+ my ($action,$whisper) = @_;
+ print "<html><head><script language='JavaScript'>";
+ if ($action eq "change_room") {
+ print "open('online.pl?alias=$alias&room=$room&tmpid=$tmpid','online');";
+ print "parent.input.document.inf.room.value = '$room';";
+ print "open('htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol&tmpid=$tmpid','menu');";
+ } elsif ($action eq "change_colors") {
+ print "parent.input.document.inf.col.value = '$col';";
+ print "parent.input.document.inf.secol.value = '$secol';";
+ print "open('htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol&tmpid=$tmpid','menu');";
+ } elsif ($action eq "whisper") {
+ print "parent.input.document.inf.whisper.value = '$whisper';";
+ } elsif ($action eq "away") {
+ print "parent.input.document.inf.tmp.value = 'away';";
+ } elsif ($action eq "quit" && $tmp eq "autologout") {
+ print "open('index.pl?tmp=autologout','_top');";
+ &rm_alias($alias,$room);
+ } elsif ($action eq "quit") {
+ print "open('index.pl?tmp=quit','_top');";
+ &rm_alias($alias,$room);
+ }
+ print "parent.input.document.inf.tmp.value = 'notaway';" if ($tmp eq "away");
+ print "</script></head><body bgcolor='$col'>";
+ print $q->end_html;
+ exit 0;
+}
+
+sub change_room { # Den Chat-Raum wechseln
+ my ($method,$newroom,$oldroom,$alias2follow) = @_;
+ open RSTAT, "<data/online/rstat/$newroom"; #Überprüfen, ob Alias Raum betreten darf
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ if ($rstat[0] eq "1\n") {
+ unless (&hierachie($alias) eq "ow") {
+ &post_prv($alias,"<font size=2 color=ffffff>Der Raum \"<font color=ffa500>$newroom</font>\" ist leider abgesperrt!</font>");
+ &reload_html;
+ }
+ }
+ open MSGFILE,">>data/msgs/$room";
+ print MSGFILE "$alias<;".time."<;cr<;$newroom<;!<;\n";
+ close MSGFILE;
+ $room = $oldroom;
+ my $tmpstamp = time+5;
+ &zeit;
+ if ($method eq "j") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias wechselt in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias kommt aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ open MSGFILE,">>data/msgs/$room";
+ print MSGFILE "$alias<;$tmpstamp<;!<;!<;<i><font color=ffffff>($hours:$min:$sec) Du wechselst aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i><;\n";
+ close MSGFILE;
+ } elsif ($method eq "ju") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias folgt \"$alias2follow\" in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias kommt aus dem Raum \"$oldroom\" und folgt \"$alias2follow\" herein nach \"$newroom\" ...</font></i>");
+ open(MSGFILE,">>data/msgs/$room");
+ flock(MSGFILE, 2);
+ print MSGFILE "$alias<;$tmpstamp<;!<;!<;<i><font color=ffffff>($hours:$min:$sec) Du folgst \"$alias2follow\" aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i><;\n";
+ close MSGFILE;
+ }
+ unlink("data/online/rooms/$oldroom/$alias");
+ &rm_rstat($alias,$oldroom);
+ &check_online;
+ opendir(PID,"data/online/pids/$raum");
+ my @pids = readdir(PID);
+ closedir(PID);
+ foreach(@pids) {
+ if (-f "data/online/pids/$raum/$_") {
+ kill USR1 => $_;
+ }
+ }
+}
+
+sub cmd { # Alle Chatbefehle, die über input_html eingegeben werden können.
+ $_[0] = $_[0]." ";
+ $_[0] = substr($_[0], 1, length($_[0])-1);
+ my @cmd = split(/ /, $_[0]);
+ my $cmd = substr($_[0],0 , index($_[0], " "));
+#############>- NORMALE CHATBEFEHLE ( Alphabetisch sortiert ) -<
+#############>- INFORMATIONEN ÜBER DAS SYSTEM AUSGEBEN -<
+ if ($cmd eq "about") {
+ &post_prv("$alias","<font color=ffffff>Aktuelle Version ist $title und wurde am $datum aktuallisiert. Programmiert von Paul C. Bütow (2000 - 2001).</font>");
+ &reload_html;
+#############>- ABMELDEN MIT 'AWAY-NACHRICHT' -<
+ } elsif ($cmd eq "away") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $away_msg = $away_msg." ".$cmd[$i];
+ }
+ &zeit;
+ my $js = "<script language='JavaScript'>parent.online.location.reload();</script>";
+ if ($tmp ne "autoaway") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias meldet sich ab (<font color=ffa500>$away_msg</font> ) ...</i></font>$js");
+ } else {
+ $away_msg = " $alias wurde vom System abgemeldet ...";
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)$away_msg</i></font>$js");
+ }
+ open AWAY,">>data/online/rstat/$room.away";
+ flock AWAY, 2;
+ print AWAY "$alias<;$away_msg\n";
+ close AWAY;
+ &reload_html("away");
+#############>- EIGENEN CHATBILDSCHIRM LÖSCHEN -<
+ } elsif ($cmd eq "clear") {
+ &post_prv($alias,"<script language='JavaScript'>window.open('push.pl?alias=$alias&room=$room&var=clear_screen&tmpid=$tmpid','main');</script>");
+ &reload_html;
+#############>- FARBEN WECHSELN -<
+ } elsif ($cmd eq "col") {
+ if ($cmd[1] ne undef) {
+ $col = $cmd[1];
+ my $tmpsecol = $cmd[2];
+ if ($tmpsecol eq "") {
+ $secol = $col
+ } else {
+ $secol = $tmpsecol;
+ }
+ } else {
+ $col = &random_color;
+ $secol = &random_color;
+ }
+ open OPTIONS,"<data/user/options/$alias";
+ my @options = <OPTIONS>;
+ close OPTIONS;
+ open OPTIONS,">data/user/options/$alias";
+ print OPTIONS $options[0]."".$col."\n".$secol;
+ close OPTIONS;
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat die Farbe gewechselt ...</font></i>");
+ &reload_html("change_colors");
+#############>- AKTUELLES DATUM UND URZEIT AUSGEBEN -<
+ } elsif ($cmd eq "date") {
+ &zeit;
+ &post_prv("$alias","<font color=ffffff>Heute ist der $day.$month. Jahr $year. Es ist genau $hours:$min Uhr und $sec Sekunden.</font>");
+ &reload_html;
+#############>- EINEN NEUEN RAUM ERSTELLEN BZW. IN EINEN BESTEHENDEN RAUM WECHSELN -<
+ } elsif ($cmd eq "j") {
+ if ($cmd[1] =~ /\W/ || $cmd[1] eq "") {
+ &post_prv($alias,"<font color=ffffff>Der Raum <font color=ffa500>$cmd[1]</font> enthält illegale Zeichen!</font>");
+ &reload_html;
+ } else {
+ &change_room("j",$cmd[1],$room);
+ &reload_html("change_room");
+ }
+#############>- HANDELN -<
+ } elsif ($cmd eq "me" || $cmd eq "m") {
+ my $me_msg;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $me_msg = $me_msg." ".$cmd[$i];
+ }
+ $me_msg =~ s#/me/#<i>$alias</i>#g;
+ $me_msg =~ s#/m/#<i><font color=$col>$alias</font></i>#g;
+ if ($cmd eq "m") {
+ &post($room,"<b><font color=$col><i>$alias</i> <font color=$secol>$me_msg</font></font></b>");
+ } else {
+ &post($room,"<b><font color=$col><i>$alias</i> $me_msg</font></b>");
+ }
+ &reload_html;
+#############>- MEMO SCHREIBEN -<
+ } elsif ($cmd eq "memo") {
+ my $alias2memo = $cmd[1];
+ if(-f "data/user/options/$alias2memo") {
+ my $memo_msg;
+ for ($i=2; $i <= $#cmd; $i++) {
+ $memo_msg = $memo_msg." ".$cmd[$i];
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2memo <font color=ffffff>wurde folgende memo erfolgreich hinterlassen: $memo_msg</font></font>");
+ &zeit;
+ open MEMO,">>data/user/memos/$alias2memo";
+ flock MEMO, 2;
+ print MEMO "<font color=ffffff>($day.$month. - $hours:$min:$sec) <font color=ffa500>$alias</font> hat Dir eine Memo hinterlassen: <font color=ffa500>$memo_msg</font></font><br>\n";
+ close MEMO;
+ &reload_html;
+ }
+ &post_prv("$alias","<font color=ffa500>$alias2memo <font color=ffffff>existiert in der Datenbank nicht !</font></font>");
+ &reload_html;
+#############>- TOTALONLINEZEIT VON ALIAS ANZEIGEN -<
+ } elsif ($cmd eq "online") {
+ my $alias2prove= $cmd[1];
+ if (-f "data/user/options/$alias2prove") {
+ open ONLINE,"<data/user/counts/$alias2prove.online";
+ my $online = <ONLINE>;
+ close ONLINE;
+ my $totaltime = sprintf("%.2f",($online / 3600));
+ &post_prv("$alias","<font color=ffa500>$alias2prove <font color=ffffff>war insgesamt schon $totaltime Stunden online!</font></font>");
+ } else {
+ &post_prv("$alias","<font color=ffa500>$alias2prove <font color=ffffff>existiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+ &reload_html;
+#############>- DAS SYSTEM VERLASSEN -<
+ } elsif ($cmd eq "q") {
+ &zeit;
+ if ($tmp ne "autologout") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias loggt sich aus dem Chat aus ... </font></i>");
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias wurde vom System automatisch ausgeloggt ... </font></i>");
+ }
+ &reload_html("quit");
+#############>- DAS EIGENE GÄSTEBUCH LÖSCHEN -<
+ } elsif ($cmd eq "rmgb") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias löscht das eigene Gästebuch ...</font></i>");
+ unlink("data/user/gbooks/$alias");
+ &reload_html;
+#############>- SCHREIEN -<
+ } elsif ($cmd eq "s") {
+ my $msg2scream;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2scream = $msg2scream." ".$cmd[$i];
+ }
+ $msg2scream =~ s#ä#Ä#g; $msg2scream =~ s#ö#Ö#g; $msg2scream =~ s#ü#Ü#g; $msg2scream = "\U$msg2scream";
+ &post($room,"<b><font color=$col><i>$alias schreit:</i> <font color=$secol>$msg2scream</font></font></b>");
+ &reload_html;
+#############>- SEHEN, WANN SICH ALIAS ZUM LETZTEN MAL EINGElOGGT HAT -<
+ } elsif ($cmd eq "seen") {
+ my $alias2prove = $cmd[1];
+ if (-f "data/user/options/$alias2prove") {
+ if (-f "data/user/lastlogin/$alias2prove") {
+ open LASTLOGIN,"<data/user/lastlogin/$alias2prove";
+ my $lastlogin = <LASTLOGIN>;
+ close LASTLOGIN;
+ my $timestamp = sprintf("%.2f",((time() - $lastlogin) / 3600));
+ &post_prv("$alias","<font color=ffa500>$alias2prove <font color=ffffff> hat sich vor $timestamp Stunden zuletzt in das System eingeloggt!</font></font>");
+ } else {
+ &post_prv("$alias","<font color=ffa500>$alias2prove <font color=ffffff> hat sich seit der Einführung dieses Befehls noch nie eingeloggt!</font></font>");
+ }
+ } else {
+ &post_prv("$alias","<font color=ffa500>$alias2prove <font color=ffffff> exsistiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+ &reload_html;
+#############>- ANZEIGEN WER SICH IM AKTUELLEN RAUM BEFINDET -<
+ } elsif ($cmd eq "w") {
+ open RSTAT,"data/online/rstat/$room";
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ chomp($rstat[1]);
+ my $theme = "Raumthema:".$rstat[1] if ($rstat[1] ne undef);
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ my ($is,$nr) = ("t",0);
+ opendir DIR,"data/online/rooms/$room";
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ my $personen;
+ foreach(@dir) {
+ if (-f "data/online/rooms/$room/$_") {
+ $personen = $personen." ".$_;
+ $nr++;
+ }
+ }
+ &post_prv($alias,"<font color=ffffff>Der aktuelle Raum: $room $theme $door ($nr) : <font color=ffa500>$personen</font></font>");
+ &reload_html;
+#############>- ANZEIGEN WER SICH IM SYSTEM BEFINDET -<
+ } elsif ($cmd eq "wc" || $cmd eq "wc/") {
+ my $raum = $cmd[1];
+ my $personen;
+ if ($raum eq "" && $cmd eq "wc") {
+ opendir USERS,"data/online/users";
+ my @users = readdir(USERS);
+ close USERS;
+ foreach(@users) {
+ $personen = $personen." ".$_ if (-f "data/online/users/$_");
+ }
+ my $nr = ($#users-1);
+ my ($nrs,$is) = ("","ist");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "sind";
+ }
+ &post_prv("$alias","<font color=ffffff>$nr Person$nrs $is insgesamt eingeloggt: <font color=ffa500>$personen</font></font>");
+ } elsif ($raum eq "" && $cmd eq "wc/") {
+ my $msg2post;
+ opendir DIR,"data/online/rooms";
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ opendir(DIR,"data/online/rooms/$_");
+ my @dir2 = readdir(DIR);
+ closedir(DIR);
+ open(RSTAT,"<data/online/rstat/$_");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ chomp($rstat[1]);
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ my $nr = $#dir2-1;
+ $msg2post = $msg2post."<tr><td><b><font size=2 color=ffffff>$_ $door ($nr) [".$rstat[1]."]: </font></b></td></tr><tr><td><font size=2 color=ffa500>";
+ foreach $chatter (@dir2) {
+ if (-f "data/online/rooms/$_/$chatter") {
+ $msg2post = $msg2post."$chatter ";
+ }
+ }
+ print "</font></td>";
+ }
+ }
+ &post_prv("$alias","<font color=ffffff>Folgende Räume sind offen:</font><table>$msg2post</table>");
+ } elsif ($raum ne "") {
+ my $personen;
+ opendir(DIR,"data/online/rooms/$raum");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/rooms/$raum/$_");
+ }
+ my ($nr,$is) = (($#dir-1),"t");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "n";
+ }
+ &post_prv($alias,"<font color=ffffff> $nr Person$nrs befinde$is sich im Raum \"$raum\": <font color=ffa500>$personen</font></font>");
+ }
+ &reload_html;
+#############>- ANZEIGEN IN WELCHEN RAUM SICH JMD. BEFINDET BZW. JMD IN EINEN RAUM FOLGEN -<
+ } elsif ($cmd eq "wj" || $cmd eq "ju") {
+ my $alias2search = $cmd[1];
+ opendir ROOMS,"data/online/rooms";
+ my @dir = readdir(ROOMS);
+ closedir(ROOMS);
+ foreach $raum (@dir) {
+ opendir DIR2,"data/online/rooms/$raum";
+ my @dir2 = readdir(DIR2);
+ closedir(DIR2);
+ foreach $user (@dir2) {
+ if (-f "data/online/rooms/$raum/$user" && $user eq $alias2search) {
+ if ($cmd eq "wj") {
+ &post_prv("$alias","<font color=ffa500>$alias2search <font color=ffffff>befindet sich im Raum \"$raum\" !</font></font>");
+ } else {
+ &change_room("ju",$raum,$room,$alias2search);
+ }
+ &reload_html("change_room");
+ }
+ }
+ }
+ &post_prv("$alias","<font color=ffa500>$alias2search <font color=ffffff> ist nicht eingeloggt !</font></font>");
+ &reload_html;
+#############>- RAUMNESETZER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- RAUM ABSCHLIESSEN/AUFSCHLIESSEN -<
+ } elsif ($cmd eq "l") {
+ my $hierachie = &hierachie($alias);
+ if (prove_besetzer($alias,$room) == 1 || $hierachie eq "wa" || $hierachie eq "ow") {
+ open RSTAT, "data/online/rstat/$room";
+ my @r_stat = <RSTAT>;
+ close RSTAT;
+ my $lock = "0\n";
+ &zeit;
+ if ($room eq "Cyberbar" || $room eq "Wired") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias sperrt den Raum ohne Erfolg ab ...</font></i>");
+ } else {
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias sperrt den Raum ab ...</font></i>");
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias sperrt den Raum auf ...</font></i>");
+ }
+ for ($i=1;$i<=$#r_stat;$i++) {
+ $lock = $lock.$r_stat[$i];
+ }
+ open RSTAT,">data/online/rstat/$room";
+ flock RSTAT, 2;
+ print RSTAT $lock;
+ close RSTAT;
+ }
+ &reload_html;
+ }
+#############>- RAUMBESETZER ERNENNEN -<
+ } elsif ($cmd eq "su") {
+ my $hierachie = &hierachie($alias);
+ if (prove_besetzer($alias,$room) == 1 || $hierachie eq "wa" || $hierachie eq "ow") {
+ my $alias2su = $cmd[1];
+ opendir DIR,"data/online/rooms/$room";
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ if ($_ eq $alias2su) {
+ open(DATEI,"<data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ if (prove_besetzer($alias2su,$room) == 1 || &hierachie($alias2su) eq "wa" || &hierachie($alias2su) eq "ow") {
+ &post_prv($alias,"<font color=ffa500>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist bereits RB, WÄ oder OW)</font>");
+ &reload_html;
+ }
+ open RSTAT,">>data/online/rstat/$room";
+ flock(RSTAT, 2);
+ print RSTAT $alias2su."\n";
+ close RSTAT;
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias verleiht \"$alias2su\" Raumbesetzerrechte ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>");
+ &reload_html;
+ }
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist nicht anwesend)</font>");
+ &reload_html;
+ }
+#############>- RAUMBESETZER ENTNENNEN -<
+ } elsif ($cmd eq "rsu") {
+ my $hierachie = &hierachie($alias);
+ if (prove_besetzer($alias,$room) == 1 || $hierachie eq "wa" || $hierachie eq "ow") {
+ my $alias2rsu = $cmd[1];
+ open(DATEI,"<data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ if (prove_besetzer($alias2rsu,$room) == 1) {
+ &rm_rstat($alias2rsu,$room);
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias entzieht \"$alias2rsu\" die Raumbesetzerrechte ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>");
+ } else {
+ &post_prv($alias,"<font color=ffa500>$alias2rsu <font color=ffffff>ist kein Raumbesetzer und kann dieser Status auch nicht aberkannt werden !</font></font>");
+ }
+ &reload_html;
+ }
+#############>- RAUM EIN THEMA GEBEN -<
+ } elsif ($cmd eq "t") {
+ my $hierachie = &hierachie($alias);
+ if (prove_besetzer($alias,$room) == 1 || $hierachie eq "wa" || $hierachie eq "ow") {
+ open RSTAT, "data/online/rstat/$room";
+ my @r_stat = <RSTAT>;
+ close RSTAT;
+ &zeit;
+ my $theme;
+ if ($cmd[1] ne undef) {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $theme = $theme." ".$cmd[$i];
+ }
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias gibt dem Raum das Thema (<font color=ffa500> $theme </font>) ...</font></i>");
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias löscht das Thema des Raums ...</font></i>");
+ }
+ $theme = $r_stat[0].$theme."\n";
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $theme = $theme.$r_stat[$i]."\n";
+ }
+ open RSTAT,">data/online/rstat/$room";
+ print RSTAT $theme;
+ close RSTAT;
+ &reload_html;
+ }
+#############>- SUPERUSER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- ALIAS VERBANNEN -<
+ } elsif ($cmd eq "ban" || $cmd eq "banip") {
+ my $hierachiealias = &hierachie($alias);
+ if ($hierachiealias eq "wa" || $hierachiealias eq "ow") {
+ my $alias2ban = $cmd[1];
+ my $hierachie = &hierachie($alias2ban);
+ open BAN,"<data/ban";
+ my @ban = <BAN>;
+ close BAN;
+ if ($cmd[1] eq undef) {
+ my $nr = @ban;
+ my $banned;
+ foreach(@ban) {
+ chomp($_);
+ $banned .= " $_";
+ }
+ &post_prv("$alias","<font color=ffffff>Folgende Benutzer sind verbannt [$nr]: <font color=ffa500>$banned</font></font>");
+ &reload_html;
+ } elsif (-f "data/user/options/$alias2ban") {
+ if ($hierachie eq "wa") {
+ &post_prv("$alias","<font color=ffa500>$alias2ban <font color=ffffff>ist Wächter und kann nicht verbannt werden!</font></font>");
+ &reload_html;
+ } elsif ($hierachie eq "ow") {
+ &post_prv("$alias","<font color=ffa500>$alias2ban <font color=ffffff>ist Oberwächter und kann nicht verbannt werden!</font></font>");
+ &reload_html;
+ }
+ if ($cmd eq "ban") {
+ if (add_entry($alias2ban,"ban") == 1) {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias verbannt \"$alias2ban\" aus dem Chat ...</font></i>");
+ } else {
+ &post_prv("$alias","<font color=ffa500>$alias2ban <font color=ffffff>ist bereits verbannt!</font></font>");
+ }
+ } elsif ($hierachiealias eq "ow" && $hierachie ne "ow") {
+ if (-f "data/online/ident/$alias2ban") {
+ open DATEI, "<data/online/ident/$alias2ban";
+ my $ipnr = <DATEI>;
+ close DATEI;
+ chomp($ipnr);
+ if (add_entry("ip://$ipnr","ban") == 1) {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias verbannt die IP-Nummer von \"$alias2ban\" aus dem Chat ...</font></i>");
+ } else {
+ &post_prv("$alias","<font color=ffffff>Die IP-Nummer <font color=ffa500>$ipnr</font> von $alias2ban ist bereits verbannt!</font></font>");
+ }
+ &reload_html;
+ } else {
+ &post_prv("$alias","<font color=ffffff>Die IP-Nummer von <font color=ffa500>$alias2ban </font>kann nicht verbannt werden, da Benutzer nicht eingeloggt ist!</font></font>");
+ &reload_html;
+ }
+ } else {
+ goto ENDCMD;
+ }
+ &reload_html;
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2ban $ipnr<font color=ffffff>kann nicht verbannt werden, da Benutzername nicht existiert!</font></font>");
+ &reload_html;
+ }
+#############>- ALIAS ENTBANNEN -<
+ } elsif ($cmd eq "rban" || $cmd eq "rbanip") {
+ my $hierachie = &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $alias2rban = $cmd[1];
+ open(BAN,"<data/ban");
+ @ban = <BAN>;
+ close BAN;
+ foreach $ban (@ban) {
+ if (&rm_entry($alias2rban,"ban") == 1) {
+ if ($alias2rban =~ /ip:/) {
+ &post_prv($alias,"<font color=ffffff>Die IP-Nummer <font color=ffa500>$alias2rban </font>wurde aus der Banliste ausgetragen!</font></font>");
+ } else {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias entbannt \"$alias2rban\" ...</font></i>");
+ }
+ &reload_html;
+ }
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2rban <font color=ffffff>ist nicht verbannt!</font></font>");
+ &reload_html;
+ }
+#############>- IP # VON ALIAS ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "ip") {
+ my $hierachie = &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $alias2prove = $cmd[1];
+ opendir DIR,"data/online/ident";
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ if ($_ eq $alias2prove) {
+ open DATEI, "<data/online/ident/$alias2prove";
+ my $ipnr = <DATEI>;
+ close DATEI;
+ chomp($ipnr);
+ &post_prv("$alias","<font color=ffa500>$_<font color=ffffff> hat die IP-Nummer $ipnr !</font></font>");
+ }
+ }
+ &reload_html;
+ }
+#############>- ALIAS AUS DEM CHAT KATAPULTIEREN -<
+ } elsif ($cmd eq "k") {
+ my $hierachie= &hierachie($alias);
+ if ($hierachie eq "wa" || $hierachie eq "ow") {
+ my $alias2kick = $cmd[1];
+ if (-f "data/online/users/$alias2kick") {
+ opendir DIR,"data/online/rooms";
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach $raum (@dir) {
+ opendir DIR, "data/online/rooms/$raum";
+ my @dir2 = readdir(DIR);
+ closedir(DIR);
+ foreach $chatter (@dir2) {
+ if ($chatter eq $alias2kick) {
+ my $hierachie = &hierachie($alias2kick);
+ if ($hierachie eq "ow") {
+ &post_prv("$alias","<font color=ffa500>$alias2kick <font color=ffffff> ist Oberwächter und kann nicht \"gekickt\" werden !</font></font>");
+ } elsif ($hierachie eq "wa") {
+ &post_prv("$alias","<font color=ffa500>$alias2kick <font color=ffffff> ist Wächter und kann nicht \"gekickt\" werden !</font></font>");
+ } else {
+ &post_prv("$alias2kick","<script language=\"JavaScript\">window.open(\"index.pl?tmp=kick\",\"_top\");</script>");
+ $_ = undef if ($room eq $raum);
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias katapultiert \"$alias2kick\" aus dem Chat ...</font></i>",$raum);
+ rm_alias($alias2kick,$raum);
+ check_online;
+ }
+ &reload_html;
+ }
+ }
+ }
+ }
+ &post_prv("$alias","<font color=ffa500>$alias2kick <font color=ffffff> ist nicht anwesend und kann nicht \"gekickt\" werden !</font></font>");
+ &reload_html;
+ }
+#############>- EINEN BENUTZER AUS DEM SYSTEM LÖSCHEN -<
+ } elsif ($cmd eq "kill") {
+ if (hierachie($alias) eq "ow") {
+ my $alias2kill = $cmd[1];
+ if (-f "data/user/options/$alias2kill") {
+ my $hierachie = &hierachie($alias2kill);
+ if ($hierachie eq "ow") {
+ &post_prv($alias,"<font color=ffa500>$alias2kill</font> <font color=ffffff>ist Oberwächter und kann nicht aus dem System entfernt werden !</font>");
+ } elsif ($hierachie eq "wa") {
+ &post_prv($alias,"<font color=ffa500>$alias2kill</font> <font color=ffffff>ist Wächter und kann nicht aus dem System entfernt werden !</font>");
+ } else {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias killt \"$alias2kill\" ganz und gar aus dem System ...</font></i>");
+ unlink("data/user/options/$alias2kill");
+ unlink("data/user/profiles/$alias2kill");
+ unlink("data/user/gbooks/$alias2kill");
+ unlink("data/user/counts/$alias2kill");
+ unlink("data/user/counts/$alias2kill.online");
+ unlink("data/user/lastlogin/$alias2kill");
+ unlink("data/user/memos/$alias2kill");
+ &rm_entry($alias2kill,"ban");
+ open(DEL, ">>data/kill");
+ print DEL "($day.$month.$year $hours:$min:$sec) $alias2kill wurde von $alias gekillt\n";
+ close DEL;
+ }
+ } else {
+ &post_prv("$alias","<font color=ffa500>$alias2kill <font color=ffffff> existiert nicht in der DB und kann nicht \"gekillt\" werden !</font></font>");
+ }
+ &reload_html;
+ }
+#############>- EINEN ANDEREN RAUM AUF-/ABSPERREN -<
+ } elsif ($cmd eq "sl") {
+ my $hierachie = &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $sl_room = $cmd[1];
+ if (-e "data/online/rooms/$sl_room") {
+ my $lock = "0\n";
+ &zeit;
+ open RSTAT,"<data/online/rstat/$sl_room";
+ my @r_stat = <RSTAT>;
+ close RSTAT;
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias sperrt den Raum \"$sl_room\" von aussen ab ...</font></i>",$sl_room);
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias sperrt den Raum \"$sl_room\" von aussen auf ...</font></i>",$sl_room);
+ }
+ for ($i=1;$i<=$#r_stat;$i++) {
+ $lock = $lock.$r_stat[$i];
+ }
+ open RSTAT,">data/online/rstat/$sl_room";
+ print RSTAT $lock;
+ close RSTAT;
+ } else {
+ &post_prv($alias,"<font color=ffffff>Der Raum <font color=ffa500>$sl_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ }
+#############>- IN EINEN ANDEREN RAUM HINEINRUFEN -<
+ } elsif ($cmd eq "ss") {
+ my $hierachie = &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $ss_room = $cmd[1];
+ if (-e "data/online/rooms/$ss_room") {
+ my $ss_msg;
+ for ($i=2; $i <= $#cmd; $i++) {
+ $ss_msg = $ss_msg." ".$cmd[$i];
+ }
+ my $msg2scream = "\U$ss_msg";
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias ruft in den Raum \"$ss_room\" hinein: <b><font color=$col>$msg2scream</font></b> ...</font></i>",$ss_room);
+ &reload_html;
+ } else {
+ &post_prv($alias,"<font color=ffffff>Der Raum <font color=ffa500>$ss_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ }
+#############>- EINEN ANDEREN RAUM EIN THEMA GEBEN -<
+ } elsif ($cmd eq "st") {
+ my $hierachie = &hierachie($alias);
+ if ($hierachie eq "wa" || $hierachie eq "ow") {
+ my $st_room = $cmd[1];
+ if (-e "data/online/rooms/$st_room") {
+ my $theme;
+ &zeit;
+ if ($cmd[2] ne undef) {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $theme = $theme." ".$cmd[$i];
+ }
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias gibt dem Raum \"$st_room\" das Thema (<font color=ffa500> $theme </font>) ...</font></i>",$st_room);
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias löscht das Thema des Raums \"$st_room\" ...</font></i>",$st_room);
+ }
+ open RSTAT,"<data/online/rstat/$st_room";
+ my @r_stat = <RSTAT>;
+ close RSTAT;
+ $theme = $r_stat[0].$theme."\n";
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $theme = $theme.$r_stat[$i];
+ }
+ open RSTAT,">data/online/rstat/$st_room";
+ print RSTAT $theme;
+ close RSTAT;
+ } else {
+ &post_prv($alias,"<font color=ffffff>Der Raum <font color=ffa500>$st_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ }
+#############>- SYSTEMNACHRICHT IN ALLE BESTEHENDEN RÄUME &postEN -<
+ } elsif ($cmd eq "sys") {
+ my $hierachie = &hierachie($alias);
+ if ($hierachie eq "ow") {
+ my $sys_msg;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $sys_msg = $sys_msg." ".$cmd[$i];
+ }
+ &zeit;
+ $sys_msg = "<i><font color=ffffff>($hours:$min:$sec)</font></i> <b><font size=2 color=red>SYSTEMNACHRICHT</font></b><i><font color=ffffff>: $sys_msg ...</font></i>";
+ opendir(ROOMS,"data/msgs");
+ my @rooms = readdir(ROOMS);
+ close(ROOMS);
+ foreach(@rooms) {
+ &post($_,$sys_msg);
+ }
+ log($sys_msg);
+ &reload_html;
+ }
+#############>- ALIAS ZUM WÄCHTER ERNNENNEN -<
+ } elsif ($cmd eq "wa") {
+ if (hierachie($alias) eq "ow") {
+ if (-f "data/user/options/$cmd[1]") {
+ if (hierachie($cmd[1]) eq "ow") {
+ &post_prv("$alias","<font color=ffa500>$cmd[1] <font color=ffffff>ist bereits als Oberwächter eingetragen. Oberwächter können nicht gleichzeitig Wächter sein!</font></font>");
+ } elsif (!add_entry($cmd[1],"wa")) {
+ &post_prv("$alias","<font color=ffa500>$cmd[1] <font color=ffffff>ist bereits als Wächter eingetragen. Eine erneuerte Eintragung ist nicht möglich!</font></font>")
+ } else {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias ernennt \"$cmd[1]\" zum Wächter ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>");
+ }
+ &reload_html;
+ } else {
+ &post_prv($alias,"<font color=ffa500>$alias2wa <font color=ffffff>kann nicht zum Wächter ernannt werden da Benutzername nicht existiert!</font></font>");
+ }
+ &reload_html;
+ }
+#############>- ALIAS DIE WÄCHTERRECHTE ENTZIEHEN -<
+ } elsif ($cmd eq "rwa") {
+ if (hierachie($alias) eq "ow") {
+ if (&rm_entry($cmd[1],"wa") == 1) {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias hat \"$cmd[1]\" vom Wächter zum normalen Chatter degradiert ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>");
+ } else {
+ &post_prv($alias,"<font color=ffa500>$cmd[1] <font color=ffffff>ist kein Wächter und können die Wächterrechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ }
+#############>- ADMINISTRATORBEFEHLE -<
+ } elsif ($alias eq $admin) {
+#############>- ALIAS ZUM OBERWÄCHTER ERNENNEN -<
+ if ($cmd eq "ow") {
+ if (-f "data/user/options/$cmd[1]") {
+ if (add_entry($cmd[1],"ow") == 1) {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias ernennt \"$cmd[1]\" zum Oberwächter ...</font></i>");
+ } else {
+ &post_prv("$alias","<font color=ffa500>$cmd[1] <font color=ffffff>ist bereits als Oberwächter eingetragen!</font></font>");
+ }
+ } else {
+ &post_prv($alias,"<font color=ffa500>$alias2wa <font color=ffffff>kann nicht zum Wächter ernannt werden da Benutzername nicht existiert!</font></font>");
+ }
+ &reload_html;
+#############>- ALIAS DIE OBERWÄCHTERRECHTE ENTZIEHEN -<
+ } elsif ($cmd eq "row") {
+ if (&rm_entry($cmd[1],"ow") ne undef) {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias hat \"$cmd[1]\" vom Oberwächter zum normalen Chatter degradiert ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>");
+ } else {
+ &post_prv($alias,"<font color=ffa500>$cmd[1] <font color=ffffff>ist kein Oberwächter und können die Rechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+#############>- PASSWORD EINES BENUTZERS ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "pw") {
+ my $pw2show = $cmd[1];
+ if (-f "data/user/options/$pw2show") {
+ open PW,"<data/user/options/$pw2show";
+ my @pw = <PW>;
+ close PW;
+ chomp($pw[0]);
+ &post_prv($alias,"<font color=ffa500>$pw2show <font color=ffffff> hat das Passwort \"$pw[0]\" !</font></font>");
+ &reload_html;
+ }
+ &post_prv($alias,"<font color=ffa500>$pw2show <font color=ffffff> existiert nicht in der Benutzerdatenbank !</font></font>");
+ &reload_html;
+#############>- IDENT-DATEI EINES BENUTZERS ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "id" || $cmd eq "agent") {
+ my $id2show = $cmd[1];
+ if (-f "data/online/ident/$id2show") {
+ open ID,"<data/online/ident/$id2show";
+ my @id = <ID>;
+ close ID;
+ if ($cmd eq "id") {
+ chomp($id[1]);
+ &post_prv($alias,"<font color=ffa500>$id2show <font color=ffffff> hat die Temp-ID \"$id[1]\" !</font></font>");
+ } else {
+ chomp($id[2]);
+ &post_prv($alias,"<font color=ffa500>$id2show <font color=ffffff> verwendet \"$id[2]\" !</font></font>");
+ }
+ &reload_html;
+ }
+ &post_prv($alias,"<font color=ffa500>$id2show <font color=ffffff> ist nicht eingeloggt !</font></font>");
+ &reload_html;
+#############>- SYSTEMMELDUNG posten -<
+ } elsif ($cmd eq "cool") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $msg2post</font></i>");
+ &reload_html;
+#############>- REVERSE -<
+ } elsif ($cmd eq "rev") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ $msg2post = reverse($msg2post);
+ &post($room,"<b><font color=$col>$alias: <font color=$secol>$msg2post</font></font></b>");
+ &reload_html;
+ }
+ }
+ENDCMD:
+#############>- FLÜSTERN ( Auch mit '/' ) -<
+ my ($alias2post,$msg2post,$action);
+ if ($cmd eq "msg") {
+ $alias2post = $cmd[1];
+ for ($i=2; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ $action = "whisper";
+ } elsif ($cmd eq "") {
+ $alias2post = $q->param('whisper');
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ } else {
+ $alias2post = $cmd;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ $action = "whisper";
+ }
+ $msg2post =~ s#/me/#<i>$alias</i>#g;
+ $msg2post =~ s#/m/#<i><font color=$col>$alias</font></i>#g;
+ if (-f "data/online/users/$alias2post") {
+ &post_prv($alias,"<b><font color=$col><i>Zu $alias2post geflüstert:</i> <font color=$secol>$msg2post</font></font></i></b>");
+ &post_prv($alias2post,"<b><font color=$col><i>$alias flüstert:</i> <font color=$secol>$msg2post</font></font></i></b>");
+ &reload_html($action,$alias2post);
+ }
+ &post_prv($alias," <font color=ffffff>Benutzer oder Befehl <font color=ffa500>$alias2post</font> ist nicht anwesend/verfügbar!</font></font>");
+ &reload_html;
+}
+#############>- ENDE DER CHATBEFEHLE -<
+
+sub rm_entry {
+ my ($alias,$file) = @_;
+ open ENTRY, "<data/$file";
+ my @entry = <ENTRY>;
+ close ENTRY;
+ my @new;
+ foreach(@entry) {
+ push @new,$_ if ($alias."\n" ne $_);
+ }
+ if (@entry != @new) {
+ open ENTRY, ">data/$file";
+ flock ENTRY, 2;
+ print ENTRY @new;
+ close ENTRY;
+ return 1;
+ } else {
+ return;
+ }
+}
+
+sub add_entry {
+ my ($alias,$file) = @_;
+ open ENTRY, "<data/$file";
+ my @entry = <ENTRY>;
+ close ENTRY;
+ foreach(@entry) {
+ chomp;
+ if ($alias eq $_) {
+ return;
+ }
+ }
+ open ENTRY, ">>data/$file";
+ flock ENTRY, 2;
+ print ENTRY $alias."\n";
+ close ENTRY;
+ return 1;
+} \ No newline at end of file
diff --git a/0.6.1/main2.pl b/0.6.1/main2.pl
new file mode 100644
index 0000000..812ac24
--- /dev/null
+++ b/0.6.1/main2.pl
@@ -0,0 +1,619 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print $q->header();
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+
+$var = $q->param("var");
+if ($var eq "list_alias_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &list_alias_html;
+} elsif ($var eq "alias_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $tmp = $q->param("tmp");
+ &alias_html;
+} elsif ($var eq "edit_profile_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ &edit_html("edit_profile_html");
+} elsif ($var eq "edit_options_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $room = $q->param("room");
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ &edit_html("edit_options_html");
+} elsif ($var eq "gb_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &gb_html;
+} elsif ($var eq "post_gb") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $msg = $q->param("msg");
+ $tmp = $q->param("tmp");
+ $id = $q->param("id");
+ &post_gb;
+} elsif ($var eq "edit_profile") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ &secure_checkid($alias);
+ &edit("edit_profile");
+} elsif ($var eq "edit_options") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $tmp = $q->param("tmp");
+ $id = $q->param("id");
+ $room = $q->param("room");
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ &edit("edit_options");
+} elsif ($var eq "rm_gb_alias") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $tmp = $q->param("tmp");
+ $id = $q->param("id");
+ &rm_gb;
+} else {
+ &error("Parameter fehlt");
+}
+
+###########################
+##HAUPTTEIL DIESER DATEI:##
+###########################
+
+sub gb_html { # Das Benutzerboard/Gästebuch.
+ my $message = $_[0];
+ &start_html("Benutzerboard");
+if ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </i>
+ einen Text und poste
+ <u>dann</u>
+ !
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Vielen Dank für Deinen Beitrag. Wenn Du willst, kannst Du jetzt gleich noch einen Eintrag posten ...
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Falls Du Anregungen oder Verbesserungsvorschläge für die Community hast, dann poste doch einen kleinen Eintrag :-)
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="guestbook">
+ <input type="hidden" name="id" value="y">
+ <input size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+ if (-e "data/guestbook") {
+ open (DATEI,"<data/guestbook") || &error("Konnte dat/guestbook nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ print
+ $q->div(@datei);
+ }
+ print
+ $q->end_html;
+}
+
+
+sub post_gb { # Wenn etwas in ein Gästebuch eingetragen wird
+ &zeit;
+ if ($msg eq "") {
+ if ($id eq "y") { # Überprüfen, ob Benutzerboard- oder Privatgästebuch
+ &gb_html("post_empty");
+ } else {
+ &alias_html("post_empty");
+ }
+ exit;
+ }
+ $msg =~ s#<#&lt\;#g;
+ my $tmpath = "";
+ if ($id eq "y") {
+ $tmpath = "data/guestbook";
+ } else {
+ $tmpath = "data/user/gbooks/$tmp";
+ }
+ open(GB,"$tmpath");
+ my @gb = <GB>;
+ close GB;
+ pop(@gb) if ($#gb > 99);
+ my @newdatei = "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ push(@newdatei,@gb);
+ open(GB,">$tmpath");
+ print GB @newdatei;
+ close GB;
+ if ($id eq "y") {
+ &gb_html("post_ok");
+ exit;
+ } else {
+ post_prv("$tmp","<font color=ffffff><a href=\"main2.pl?alias=$tmp&var=alias_html&tmp=$alias&tmpid=$tmpid\" target=\"_new\">$alias</a> hat soeben einen Pin in <a href=\"main2.pl?alias=$tmp&var=alias_html&tmp=$tmp&tmpid=$tmpid\" target=\"_new\">Dein Profil</a> gehängt ... </font>");
+ &alias_html;
+ exit;
+ }
+}
+
+sub rm_gb { # Gästebucheintrag entfernen
+ open(GB,"<data/user/gbooks/$alias");
+ my @gbfile = <GB>;
+ close GB;
+ my @newgbfile = ();
+ for ($i=0; $i <= $#gbfile; $i++) {
+ push(@newgbfile,$gbfile[$i]) if ($i != $id);
+ }
+ open(GB,">data/user/gbooks/$alias");
+ print GB @newgbfile;
+ close GB;
+ &alias_html("rm_ok");
+}
+
+sub list_alias_html { # Liste aller Benutzer
+ &start_html("Alle Benutzer");
+ opendir(REGISTERED,"data/user/options");
+ my @users = readdir(REGISTERED);
+ closedir(REGISTERED);
+ my @liste = sort(@users);
+ my $nr = $#users-1;
+print <<END;
+ <div>
+ Es sind z.Z. genau $nr Benutzernamen in der Datenbank vorhanden! (Sortiert nach #, A-Z, a-z)
+ </div>
+ <hr>
+ <div>
+END
+ foreach(@liste) {
+ if (-f "data/user/options/$_") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid" },
+ "$_"),
+ " ";
+ }
+ }
+print <<END;
+ </div>
+</body>
+</html>
+END
+}
+
+sub alias_html { # Anzeigen eines Benutzerprofils
+ my $message = $_[0];
+ open(COUNTS,"<data/user/counts/$tmp");
+ local $counter = <COUNTS>;
+ close COUNTS;
+ $counter++;
+ open(COUNTS,">data/user/counts/$tmp");
+ print COUNTS $counter;
+ close COUNTS;
+ &start_html($tmp);
+print <<END;
+<div>
+ <a href="htdocs.pl?var=werda_html&alias=$alias&tmpid=$tmpid">Hier</a>
+ gehts zur Gesamtübersicht !
+</div>
+<hr>
+END
+if ($message eq "rm_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Der von Dir gewählte Eintrag wurde erfolgreich gelöscht.
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </u>
+ einen Text und poste
+ <u>dann</u>
+ !
+ <hr>
+END
+}
+ open(PROFILE,"<data/user/profiles/$tmp");
+ @data = <PROFILE>;
+ close PROFILE;
+print <<END;
+ <div>
+ Dieses Profil wurde insgesamt schon $counter mal aufgerufen !
+ <br><br>Alias: $tmp
+ <br><br>Nachname: $data[0]
+ <br><br>Vorname: $data[1]
+ <br><br>Alter: $data[2]
+ <br><br>Wohnort: $data[3]
+ <br><br>E-Mail:
+ <a href="mailto:$data[4]">$data[4]</a>
+ <br><br>ICQ-Nummer: $data[5]
+ <br><br>Homepage: <a href="$data[6]" target="_new">$data[6]</a>
+ <br><br>Weiteres:<br>$data[7]
+ <hr>
+ Hier kannst Du $tmp eine Nachricht hinterlassen!
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input type="text" size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+if (-e "data/user/gbooks/$tmp") {
+ open (DATEI,"<data/user/gbooks/$tmp") || &error("Konnte data/user/gbooks/$tmp nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ my $nr = 1;
+ if ($alias ne $tmp) {
+ foreach(@datei) {
+ print "<br>Eintrag # $nr: $_";
+ $nr++;
+ }
+ } else {
+print <<END;
+ <table>
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="rm_gb_alias">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="$tmp">
+END
+for($i=0; $i <= $#datei; $i++) {
+print <<END;
+ <tr>
+ <td>
+ <input type="radio" name="id" value="$i">
+ </td>
+ <td>
+ <div class=q>
+ <br>
+ Eintrag # $nr:
+ $datei[$i]
+ </div>
+ </td>
+ </tr>
+END
+$nr++;
+}
+print <<END;
+ </table>
+ <table>
+ <tr>
+ <td>
+ <font color=ffffff>
+ <input type="submit" value="Markierten Eintrag löschen">
+ </font>
+ </td>
+ <td>
+ <font color=ffffff>
+ <input type="reset" value="Markierung rückgängig machen">
+ </font>
+ </td>
+ </tr>
+ </table>
+ </form>
+END
+}
+}
+ print
+ $q->end_html;
+}
+
+sub edit_html { # Chat-Optionen / Benutzerprofil editieren
+ my ($method,$message) = @_;
+ &start_html("Benutzerprofil ändern");
+ if ($method eq "edit_options_html") {
+ open(DATEI,"<data/user/options/$alias");
+ } elsif ($method eq "edit_profile_html") {
+ open(DATEI,"<data/user/profiles/$alias");
+ }
+ @data = <DATEI>;
+ close DATEI;
+ foreach(@data) {
+ chomp $_;
+ }
+ if ($method eq "edit_options_html") {
+ if ($message eq "edit_options_ok") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat die Chateinstellungen geändert ...</font></i>");
+print <<END;
+<script language="JavaScript">
+ open("main.pl?var=change_colors&alias=$alias&room=$room&col=$col&secol=$secol&tmpid=$tmpid","reload");
+</script>
+<div class=b>
+ Hinweis:
+</div>
+<div>
+ Du hast soeben Deine Chat-Optionen erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren. Um
+ weiterzuchatten einfach Fenster schliessen!
+</div>
+<hr>
+END
+ } elsif ($message eq "edit_pw_wrong") {
+print <<END;
+<div class=b>
+ ACHTUNG!
+</div>
+<div>
+ Du hast soeben versucht, dein Passwort zu ändern. Jedoch stimmte die Erste Eingabe nicht mit der Zweiten überein.
+ Bitte versuch es erneuert ...
+</div>
+<hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Deine Chat-Optionen editieren!" ),
+ $q->hr;
+ }
+print <<END;
+<script lang="javascript" type="text/javascript">
+<!--
+
+function radioWert(rObj) {
+ for (var i=0; i<rObj.length; i++) if (rObj[i].checked) return rObj[i].value;
+ return false;
+}
+
+function insertcode( code ) {
+ document.optionen.elements[radioWert(document.optionen.eingabe)].value = code;
+}
+
+//-->
+</script>
+
+<form name="optionen" action="main2.pl">
+ <input type="hidden" name="var" value="edit_options">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Passwort
+ <font color=ffa500>
+ (Gut merken !!)
+ </font>
+ <br>
+ <input type="password" name="id" value="$data[0]">
+ </div>
+ </td>
+ <td width=20>
+ </td>
+ <td>
+ <div>
+ Geb hier das Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp" value="$data[0]">
+ </div>
+ </td>
+ </tr>
+ </table>
+ <hr>
+ <div>Einstellungen für den Nachrichten-Verlauf</div>
+ <table>
+ <tr>
+ <td>
+ <br>
+ <div>Anzahl der Nachrichten im Verlauf (Standart = 10)</div>
+ <font color=ffffff>
+ <select name="maxVerlauf" size="1">
+ <option value="$data[3]">$data[3]
+END
+for($i=1;$i<=50;$i++) {
+ print "<option value=\"$i\">$i";
+}
+print<<END;
+ </select>
+ </font>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <br>
+<div>Wie sollen die Nachrichten im Verlauf angeordnet sein?</div>
+ <font color=ffffff>
+ <select name="verlaufOrder" size="1">
+ <option value="$data[4]">Bisherige Einstellung ($data[4])
+ <option value="0">Neue Verlaufnachrichten oben (0)
+ <option value="1">Neue Verlaufnachrichten unten (1)
+ </select>
+ </font>
+ </td>
+ </tr>
+ </table>
+<br>
+ <div>PS: Einstellungen des Nachrichten-Verlaufs werden erst nach einem Neueinloggen aktualisiert.</div>
+ <hr>
+ <table>
+ <tr>
+ <td>
+ <div>
+ <input type="radio" name="eingabe" value="col" checked>
+ Auswahl von Farbe 1
+ <br>
+ (Farbe Deines Nicks):
+ <br>
+ <input name="col" size="6" maxlength="6" value="$data[1]">
+ </div>
+ </td>
+ <td width=20>
+ </td>
+ <td>
+ <div>
+ <input type="radio" name="eingabe" value="secol">
+ Auswahl von Farbe 2
+ <br>
+ (Farbe Deiner Nachrichten):
+ <br>
+ <input name="secol" size="6" maxlength="6" value="$data[2]">
+ </div>
+ </td>
+ </tr>
+ </table>
+<br>
+ <div>
+ Beliebige Auswahl markieren und Farbe wählen. Um Deine Optionen abzuspeichern,
+ auf "Daten ändern" klicken!
+ </div>
+ <br>
+END
+ open(COLORS,"<colors.sno");
+ @colors = <COLORS>;
+ close COLORS;
+ print @colors;
+ } elsif ($method eq "edit_profile_html") {
+ if ($message eq "edit_profile_ok") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias hat das Profil geändert ...</font></i>");
+print <<END;
+ <div class=b>
+ Hinweis:
+ </div>
+ <div>
+ Du hast soeben Dein Profil erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren:
+ <hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Dein Profil editieren!" ),
+ $q->hr;
+ }
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="edit_profile">
+ <div>
+ Dein Nachname:
+ <br>
+ <input name="nachname" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ Dein Vorname:
+ <br>
+ <input name="vorname" value="$data[1]">
+ </div>
+ <br>
+ <div>
+ Dein Alter:
+ <br>
+ <input name="alter" value="$data[2]">
+ </div>
+ <br>
+ <div>
+ Dein Wohnort:
+ <br>
+ <input name="wohnort" value="$data[3]">
+ </div>
+ <br>
+ <div>
+ Deine E-Mail Adresse:
+ <br>
+ <input name="email" value="$data[4]">
+ </div>
+ <br>
+ <div>
+ Deine ICQ-Nummer:
+ <br>
+ <input name="icq" value="$data[5]">
+ </div>
+ <br>
+ <div>
+ Deine Homepage:
+ <br>
+ <input name="homepage" value="$data[6]">
+ </div>
+ <br>
+ <div>
+ Weiteres:
+ <br>
+ <textarea rows="5" cols="40"name="weiteres" wrap="virtual">$data[7]</textarea>
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <font color=ffffff>
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="room" value="$room">
+ <input type="submit" value="Daten ändern ...">
+ </font>
+ </form>
+</body>
+</html>
+END
+}
+
+
+sub edit { # Benutzerprofil od. Chat-Optionen abspeichern
+ my $method = $_[0];
+ &zeit;
+ if ($method eq "edit_profile") {
+ my $url = $q->param('homepage');
+ $url =~ s#^[http://]*##g;
+ open(PROFILE,">data/user/profiles/$alias");
+ print PROFILE $q->param('nachname')."\n".$q->param('vorname')."\n".$q->param('alter')."\n".$q->param('wohnort')."\n".$q->param('email')."\n".$q->param('icq')."\n"."http://$url\n".$q->param('weiteres');
+ close PROFILE;
+ &edit_html("edit_profile_html","edit_profile_ok");
+ } elsif ($method eq "edit_options") {
+ if ($id ne $tmp) {
+ &edit_html("edit_options_html","edit_pw_wrong");
+ exit;
+ }
+ open(OPTIONS,">data/user/options/$alias");
+ print OPTIONS $id."\n".$col."\n".$secol."\n".$q->param("maxVerlauf")."\n".$q->param("verlaufOrder");
+ close OPTIONS;
+ &edit_html("edit_options_html","edit_options_ok");
+ }
+} \ No newline at end of file
diff --git a/0.6.1/online.pl b/0.6.1/online.pl
new file mode 100644
index 0000000..20a6ef8
--- /dev/null
+++ b/0.6.1/online.pl
@@ -0,0 +1,125 @@
+#!/usr/bin/perl
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print $q->header();
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+&secure_checkid($alias);
+$room = $q->param("room");
+
+my @away = &prove_away($alias,$room,"return_list");
+
+for ($i=0;$i<=$#away;$i+=2) {
+ goto DONOTCOUNT if ($away[$i] eq $alias);
+}
+
+open(DATEI,"<data/online/users/$alias");
+ my $oldstamp = <DATEI>;
+close DATEI;
+if ($oldstamp > (time - 40)) {
+ open(DATEI,"<data/user/counts/$alias.online");
+ my $online = <DATEI>;
+ close DATEI;
+ my $total = (time-$oldstamp+$online);
+ open DATEI,">data/user/counts/$alias.online";
+ print DATEI $total;
+ close DATEI;
+}
+DONOTCOUNT:
+
+unless (-d "data/online/rooms/$room") {
+ mkdir "data/online/rooms/$room", 0777;
+}
+unless (-f "data/online/rstat/$room") {
+ open(DATEI,">data/online/rstat/$room"); # Raumbesetzerstatus setzen
+ print DATEI "0\n\n$alias\n";
+ close DATEI;
+}
+
+open(DATEI,">data/online/users/$alias");
+ print DATEI time;
+close DATEI;
+open(DATEI,">data/online/rooms/$room/$alias");
+ print DATEI time;
+close DATEI;
+
+open(DATEI,"<data/online/prove");
+ my $provetime = <DATEI>;
+close DATEI;
+&check_online if ($provetime < (time - 30));
+
+print<<HEADER;
+<html>
+ <head>
+ <meta http-equiv="refresh" content="20" URL="online.pl?room=$room&alias=$alias&tmpid=$tmpid">
+ <style type="text/css">
+ a { font-family: arial; font-size:11px; color: #ffffef; }
+ a:hover { color: #ffffff; }
+ </style>
+ <style type="text/css" media="all">
+ a { text-decoration: none; }
+ a:hover { text-decoration:underline; }
+ </style>
+ </head>
+ <body bgcolor="#000000">
+HEADER
+
+opendir(ROOM,"data/online/rooms/".$room);
+ my @room = sort(readdir(ROOM));
+closedir(ROOM);
+
+my $chatter = $#room-1;
+my @besetzer = &prove_besetzer(undef,$room,"return_list");
+
+open WA, "<data/wa";
+ my @wa = <WA>;
+close WA;
+open OW, "<data/ow";
+ my @ow = <OW>;
+close OW;
+
+print "<font size='1' color='ffffff' face='arial'>$room ($chatter):</font><table>";
+
+foreach $online (@room) {
+ if (-f "data/online/rooms/$room/$online") {
+ for ($i=0;$i<=$#away;$i+=2) {
+ chomp $away[$i+1];
+ if ($away[$i] eq $online) {
+ my $away = $away[$i+1];
+ print "<tr><td><img title='$away' alt='$away' src='$gfxpath/away.gif'></td>";
+ goto WEITER;
+ }
+ }
+ foreach(@ow) {
+ chomp;
+ if ($_ eq $online) {
+ print "<tr><td><img title='Oberw&auml;chter' alt='Oberw&auml;chter' src='$gfxpath/ow.gif'></td>";
+ goto WEITER;
+ }
+ }
+ foreach(@wa) {
+ chomp;
+ if ($_ eq $online) {
+ print "<tr><td><img title='W&auml;chter' alt='W&auml;chter' src='$gfxpath/wa.gif'></td>";
+ goto WEITER;
+ }
+ }
+ foreach(@besetzer) {
+ chomp;
+ if ($_ eq $online) {
+ print "<tr><td><img title='Raumbesetzer' alt='Raumbesetzer' src='$gfxpath/rb.gif'></td>";
+ goto WEITER;
+ }
+ }
+ print "<tr><td></td>";
+WEITER:
+ print "<td><a href='main2.pl?var=alias_html&alias=$alias&tmp=$online&tmpid=$tmpid' target='$online'>$online</a></td></tr>";
+ }
+}
+
+print "</table>", $q->end_html; \ No newline at end of file
diff --git a/0.6.1/ow.gif b/0.6.1/ow.gif
new file mode 100644
index 0000000..b30e8f9
--- /dev/null
+++ b/0.6.1/ow.gif
Binary files differ
diff --git a/0.6.1/push.pl b/0.6.1/push.pl
new file mode 100644
index 0000000..5ca59cd
--- /dev/null
+++ b/0.6.1/push.pl
@@ -0,0 +1,112 @@
+#!/usr/bin/perl
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+print $q->header;
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+
+{
+ unless (-f "data/online/tmpid/$alias.$tmpid") {
+ require config;
+ &error("Falsche TempID !");
+ }
+}
+
+$room = $q->param("room");
+
+my $pid = $$;
+$| = 1;
+
+print <<END;
+<html>
+ <head>
+<script language="JavaScript">
+<!--
+// Scroll-Routine von Anklepper (http://www.anklepper.de)
+// speziell für yChat (http://www.yChat.de), Copyright 2000
+scrolling = true;
+moves_steps = 4;
+moves_interval = 4;
+function moves()
+{
+ if( scrolling != false )
+ window.scrollBy( 0, moves_steps );
+ window.setTimeout( "moves()", moves_interval );
+}
+moves();
+//-->
+</script>
+</head>
+<body bgcolor=000000 link=FFFFFF alink=FFFFEF vlink=FFFFEF>
+<font size=1 color=ffffff face=arial>loading chat-engine ...</font><br>
+END
+sleep 1;
+print "<font size=1 color=ffffff face=arial>loading in progress ...</font><br>";
+sleep 1;
+print "<font size=1 color=ffffff face=arial><b>$alias</b>, welcome to <b>yChat</b>! :-)</font><br>";
+
+
+if (-f "data/user/memos/$alias") {
+ open(MEMOS,"<data/user/memos/$alias");
+ my $memos = <MEMOS>;
+ close MEMOS;
+ print $memos;
+ unlink("data/user/memos/$alias");
+}
+
+my $startime,$change_room,@flood;
+OPENMSGFILE:
+$change_room = 0;
+$startime = time;
+
+if (-e "data/msgs/$room") {
+ open(MSGFILE,"<data/msgs/$room");
+ unless (-d "data/online/pids") {
+ mkdir "data/online/pids", 0777;
+ } unless (-d "data/online/pids/$room") {
+ mkdir "data/online/pids/$room", 0777;
+ }
+ open(PID,">data/online/pids/$room/$pid");
+ print PID time;
+ close PID;
+} else {
+ sleep 1;
+ goto OPENMSGFILE;
+}
+
+&sendmsgs;
+while (-f "data/online/users/$alias") {
+ local $SIG{USR1} = \&sendmsgs;
+ goto OPENMSGFILE if ($change_room == 1);
+ sleep 15;
+ print "\n";
+}
+
+sub sendmsgs {
+ for ($curpos = tell(MSGFILE); <MSGFILE>; $curpos = tell(MSGFILE)) {
+ my ($address, $stamp, $command, $action, $message) = split(/<;/, $_);
+ if ($address eq "!" || $address eq $alias) {
+ if ($stamp > $startime) {
+ if ($command eq "cr") {
+ unlink("data/online/pids/$room/$pid");
+ $room = $action;
+ close MSGFILE;
+ $change_room = 1;
+ }
+ print "$message<br>\n" if ($change_room != 1);
+ push(@flood,$message);
+ if ($flood[0] eq $flood[1] && $flood[0] eq $flood[2] && $flood[0] eq $flood[3]) {
+ print "<i><font color=red> Jemand floodet den Chat !</font></i><br>\n";
+ }
+ shift(@flood) if ($#flood > 2);
+ }
+ }
+ }
+ seek(MSGFILE, $curpos, 0);
+}
+
+unlink("data/online/pids/$room/$pid"); \ No newline at end of file
diff --git a/0.6.1/rb.gif b/0.6.1/rb.gif
new file mode 100644
index 0000000..321341c
--- /dev/null
+++ b/0.6.1/rb.gif
Binary files differ
diff --git a/0.6.1/setup.sh b/0.6.1/setup.sh
new file mode 100644
index 0000000..cee5a24
--- /dev/null
+++ b/0.6.1/setup.sh
@@ -0,0 +1,51 @@
+#!/bin/sh
+echo
+echo yChat wird konfiguriert!
+echo
+mkdir data
+chmod 777 data
+mkdir data/logs
+chmod 777 data/logs
+mkdir data/msgs
+chmod 777 data/msgs
+mkdir data/user
+chmod 777 data/user
+mkdir data/user/counts
+chmod 777 data/user/counts
+mkdir data/user/memos
+chmod 777 data/user/memos
+mkdir data/user/options
+chmod 777 data/user/options
+mkdir data/user/profiles
+chmod 777 data/user/profiles
+mkdir data/user/gbooks
+chmod 777 data/user/gbooks
+mkdir data/user/lastlogin
+chmod 777 data/user/lastlogin
+mkdir data/online
+chmod 777 data/online
+mkdir data/online/rooms
+chmod 777 data/online/rooms
+mkdir data/online/pids
+chmod 777 data/online/pids
+mkdir data/online/rstat
+chmod 777 data/online/rstat
+mkdir data/online/users
+chmod 777 data/online/users
+mkdir data/online/ident
+chmod 777 data/online/ident
+mkdir data/online/tmpid
+chmod 777 data/online/tmpid
+chmod 777 data/htdocs/*
+chmod 777 *.pl
+chmod 777 config.pm
+mkdir dokus/
+mv *.txt dokus/
+mkdir ../../htdocs/yChat/
+mv *.gif ../../htdocs/yChat/
+mv *.swf ../../htdocs/yChat/
+
+echo
+echo yChat Setup beendet ...
+echo Created and Copyright by Paul C. Bütow
+echo
diff --git a/0.6.1/stat.pl b/0.6.1/stat.pl
new file mode 100644
index 0000000..229d1ff
--- /dev/null
+++ b/0.6.1/stat.pl
@@ -0,0 +1,209 @@
+#!/usr/bin/perl -w
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+
+my $var = $q->param('var');
+$alias = $q->param('alias');
+$tmpid = $q->param('tmpid');
+
+print $q->header();
+&start_html("Statistiken");
+print $q->div("yChat Statistiken"), $q->hr,
+ $q->div( $q->a( { -href=>"stat.pl?var=ranking&alias=$alias&tmpid=$tmpid" }, "Rankings"), " | ",
+ $q->a( { -href=>"stat.pl?var=del&alias=$alias&tmpid=$tmpid" }, "Loginstatistiken"), " | ",
+ $q->a( { -href=>"stat.pl?var=stat&alias=$alias&tmpid=$tmpid" }, "DB-Statistik"), " | ",
+ $q->a( { -href=>"stat.pl?var=code&alias=$alias&tmpid=$tmpid" }, "Programmcode"), " | ",
+ $q->a( { -href=>"stat.pl?var=var&alias=$alias&tmpid=$tmpid" }, "Umgebungsvariablen"),), $q->hr;
+
+if ($var eq "ranking") {
+
+ opendir(COUNTS, "data/user/counts");
+ my @counts = readdir(COUNTS);
+ closedir(COUNTS);
+
+ print "<div>";
+
+ my $nr_start = $q->param('start');
+ my $nr_end = $q->param('end');
+ my %online;
+ my $rank;
+ my $nr;
+
+ foreach(@counts) {
+ if(-f "data/user/counts/$_" ) {
+ if (s#.online##g) {
+ open(TOTAL, "<data/user/counts/$_.online");
+ my $total = <TOTAL>;
+ close TOTAL;
+ $online{sprintf("%.2f",($total / 3600))} = $_;
+ }
+ }
+ }
+
+ print "<div>", $q->b("Rankings:"), $q->br,
+ "<table><tr><td><div><b>#:</b></div></td><td><b><div>St.:</div></b></td><td><b><div>Name:</div></b></td></tr>";
+
+ if (!$nr_start) {
+ $nr_start = 1;
+ } if (!$nr_end) {
+ $nr_end = 20;
+ }
+
+ foreach $wert (reverse(sort { $a <=> $b } keys %online)) {
+ $nr++;
+ if ($online{$wert} eq $alias) {
+ $rank = $nr;
+ last if ($nr > $nr_end);
+ }
+ next if ($nr < $nr_start || $nr > $nr_end);
+ print "<tr><td><font color='ffffff' size='1' face='arial'>".$nr."</font></td><td><font color='ffffff' size='1' face='arial'> ".$wert."h </font></td><td> <a href='main2.pl?var=alias_html&alias=$alias&tmp=$online{$wert}&tmpid=$tmpid'><font size='1' face='arial'>$online{$wert}</font></a></td></tr>\n";
+ }
+ print "</table>", $q->hr;
+ $nr_start -= 20; $nr_end -= 20;
+ print "Rankings von <a href='stat.pl?var=ranking&start=$nr_start&end=$nr_end&alias=$alias&tmpid=$tmpid'>$nr_start bis $nr_end</a> anzeigen ...<br>" if ($nr_start > 0);
+ $nr_start += 40; $nr_end += 40;
+ print "Rankings von <a href='stat.pl?var=ranking&start=$nr_start&end=$nr_end&alias=$alias&tmpid=$tmpid'>$nr_start bis $nr_end</a> anzeigen ...",
+ $q->br, $q->br, $q->b("$alias, Du befindest Dich auf Rank $rank</div>");
+
+} elsif ($var eq "del") {
+
+ print "<div>", $q->b("Alte Benutzer l&ouml;schen:"), $q->br,
+ "Benutzer, die sich 1440 Stunden (60 Tage) nicht mehr in das System eingeloggt haben, werden gelöscht.", $q->br, $q->br;
+
+ opendir(USER, "data/user/options");
+ my @user = readdir(USER);
+ closedir(USER);
+ @user = sort(@user);
+
+ my $i = 0;
+ my $j;
+ my $k = 0;
+ my $l = 0;
+ my $full = $q->param('tmp');
+
+ foreach(@user) {
+ if (-f "data/user/lastlogin/$_") {
+ open(LOGIN,"<data/user/lastlogin/$_");
+ my $login = <LOGIN>;
+ close LOGIN;
+ $login = sprintf("%.2f",((time - $login) / 3600));
+ $j++;
+ if (999 < $login && $login < 1440) { # 1440 = 60 Tage
+ $k++;
+ print $q->font( { -color=>"ffa500" }, $q->b( "$j($k) $_ Letztes Login vor: ".$login."h") ), $q->br, "\n" if ($full ne undef);
+ } elsif ($login < 48) {
+ $l++;
+ print $q->font( { -color=>"ffffef" }, $q->b( "$j($l) $_ Letztes Login vor: ".$login."h") ), $q->br, "\n" if ($full ne undef);
+ } elsif ($login < 1440) {
+ print "$j $_ Letztes Login vor: ".$login."h", $q->br, "\n" if ($full ne undef);
+ } else {
+ $k++;
+ &kill($_,$i++,$login);
+ }
+ } elsif (-f "data/user/options/$_") {
+ &kill($_,$i++);
+ }
+ }
+ print $q->hr if ($full ne undef);
+ print "</div>", $q->div( $q->b(
+ "$j Benutzer befinden sich in der Datenbank!", $q->br,
+ $q->font( { -color=>"ffffef" }, "$l Benutzer haben sich innerhalb der letzten 48 Stunden eingeloggt!"), $q->br,
+ $q->font( { -color=>"ffa500" }, "$k Benutzer haben sich &uuml;ber 1000 Stunden nicht mehr eingeloggt!"), $q->br,
+ $q->font( { -color=>"ff0000" }, "$i Benutzer wurden gerade eben gelöscht!") ), $q->br, $q->br,
+ "PS: Jeder registrierte Benutzername wird nur einmal gez&auml;hlt!" );
+ print $q->br, $q->div( "(", $q->a( { -href=>"stat.pl?var=del&tmp=true&alias=$alias&tmpid=$tmpid"}, "Vollst&auml;ndige Ansicht"), ")" ) if ($full eq undef);
+
+} elsif ($var eq "var") {
+
+ print "<div>", $q->b("Server Umgebungsvariablen:"), $q->br, $q->br,
+ "Die Serverumgebungsvariablen k&ouml;nnen nur von Oberw&auml;chtern eingesehen werden!", $q->br, $q->br;
+
+ if (&hierachie($alias) eq "ow") {
+ &secure_checkid($alias);
+ while(($key,$value) = each(%ENV)) {
+ print "$key = $value\n", $q->br;
+ }
+ }
+
+ print "</div>";
+
+} elsif ($var eq "stat") {
+
+ print $q->div( $q->b("yChat-DB Statistik:") ), $q->br;
+ $files = 0;
+ $size = 0;
+ $directorys = 1;
+ &zaehle("data");
+ $size = sprintf("%.2f", ($size/1048576));
+ print $q->div( "Dateien insgesamt: $files", $q->br, "MB insgesamt: $size", $q->br, "Verzeichnisse insgesamt: $directorys");
+
+ } elsif ($var eq "code") {
+
+ print $q->div( $q->b("yChat Programmcode-Statistik:") ), $q->br;
+
+ my ($zeilen,$size,$bytes,$files);
+
+ opendir(DIR,".");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ $dir = sort(@dir);
+
+ foreach(@dir) {
+ if (/.+[pl]$/ || /.+[pm]$/) {
+ $bytes = (-s);
+ $size += $bytes;
+ open(PL, "<$_");
+ my @pl = <PL>;
+ close PL;
+ local $nr = $#pl+1;
+ $zeilen += $nr;
+ $files++;
+ print $q->div("Datei $files: $nr Zeilen, $bytes Bytes"), $q->br, "\n";
+ }
+ }
+print $q->div( $q->b("Programmcode: $files Dateien, $zeilen Zeilen", $q->br, "Größe: $size Bytes") );
+
+}
+
+print $q->end_html;
+
+sub zaehle {
+ local ($dir,$data) = @_;
+ $dir = "$dir/$data" if ($data ne undef);
+ opendir(DATA,$dir);
+ local @data = readdir(DATA);
+ closedir(DATA);
+ $files2 = 0;
+ foreach(@data) {
+ if (-f "$dir/$_") {
+ $files++;
+ $files2++;
+ $size += (-s "$dir/$_");
+ } elsif (-d "$dir/$_" && $_ ne "." && $_ ne "..") {
+ $directorys++;
+ &zaehle($dir,$_);
+ }
+ }
+}
+
+sub kill {
+ my ($rm,$nr,$login) = @_;
+ $login = "XXXXXX" if ($login eq undef);
+ print $q->font( { -color=>"ff0000" }, $q->b( "$j($nr) $rm Letztes Login vor: ".$login."h (wurde gel&ouml;scht)") ), $q->br, "\n";
+ print "<font size='1'>";
+ print "options " if unlink("data/user/options/$rm");
+ print "profiles " if unlink("data/user/profiles/$rm");
+ print "gbooks " if unlink("data/user/gbooks/$rm");
+ print "counts " if unlink("data/user/counts/$rm");
+ print "counts.online " if unlink("data/user/counts/".$rm.".online");
+ print "lastlogin " if unlink("data/user/lastlogin/$rm");
+ print "memos" if unlink("data/user/memos/$rm");
+ print "</font>", $q->hr, "\n";
+ &zeit;
+ open(DEL, ">>data/kill");
+ print DEL "($day.$month.$year $hours:$min:$sec) $rm wurde automatisch gekillt [$alias]\n";
+ close DEL;
+} \ No newline at end of file
diff --git a/0.6.1/wa.gif b/0.6.1/wa.gif
new file mode 100644
index 0000000..553984c
--- /dev/null
+++ b/0.6.1/wa.gif
Binary files differ
diff --git a/0.6.1/y.gif b/0.6.1/y.gif
new file mode 100644
index 0000000..356175d
--- /dev/null
+++ b/0.6.1/y.gif
Binary files differ
diff --git a/0.6.1/yIntro.swf b/0.6.1/yIntro.swf
new file mode 100644
index 0000000..d592826
--- /dev/null
+++ b/0.6.1/yIntro.swf
Binary files differ
diff --git a/0.6.1/ySymbol.swf b/0.6.1/ySymbol.swf
new file mode 100644
index 0000000..2b899bb
--- /dev/null
+++ b/0.6.1/ySymbol.swf
Binary files differ
diff --git a/0.6.1/y_.gif b/0.6.1/y_.gif
new file mode 100644
index 0000000..f8b6ee5
--- /dev/null
+++ b/0.6.1/y_.gif
Binary files differ
diff --git a/0.6.2/CREDITS.txt b/0.6.2/CREDITS.txt
new file mode 100644
index 0000000..683e57e
--- /dev/null
+++ b/0.6.2/CREDITS.txt
@@ -0,0 +1,33 @@
+########################### yChat.de CREDITS ################################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+Vielen Dank an alle Personen, dir mit geholfen haben ( und immernoch helfen )
+yChat besser zu machen:
+
+ - Andreas Buchwald aka Anklepper, für ...
+ ... die Programmierung des "Nach-UntenScroll-JavaScripts", des
+ "Nachrichten-Verlauf-JavaScripts" im Texteingabeframe.
+ ... die technische Umsetzung, daß sich das Inputframe bei jedem
+ Textposting nicht wieder reloadet.
+ ... ein nettes JavaScript, welches erlaubt, Formularwerte
+ frameübergreifend zu ändern.
+ ... die Erstellung der Flashanimationen.
+ ... die Programmierung der Auto-Away- und der Auto-Logout Funktion.
+ ... die Optimierung der Statusgrafiken in der Onlineliste.
+ ( www.anklepper.de ).
+
+ - Dave aka Truhe, für ...
+ ... die Erstellung der Farbtabelle unter Chatoptionen inkl.
+ Auswähl-JavaScript!
+ ... die Erstellung einiger CSS.
+ ... die Unterstützung der Umsetzung der Auto-Away- und Auto-Logout
+ Funktion.
+ ... die Erstellung der "Chatiquette".
+ ... einige Bugfixes in JavaScript-Codes.
+ ( maligree.yi.org )
+
+ - Dommi für die Erstellung der Away-Grafik. Diese wurde jedoch nachträglich
+ von mir verfärbt und für viele Bug-Reports :-)
+
+ - Larry Wall, für die Erfindung von Perl ! \ No newline at end of file
diff --git a/0.6.2/README.txt b/0.6.2/README.txt
new file mode 100644
index 0000000..3adc006
--- /dev/null
+++ b/0.6.2/README.txt
@@ -0,0 +1,29 @@
+############################## yChat.de README ##############################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+Allgemeine Bedingungen bzgl. yChat:
+
+ 1. Das yChat-System in den Versionen 0.6.X und früher ist Freeware und darf
+ kostenlos weitergeben und eingesetzt werden.
+
+ 2. Ohne Einwilligung des Autors darf mit dem Skript auf irgend welche Art
+ kein Geld verdient werden.
+
+ 3. Wird das yChat-System eingesetzt, so darf es manipuliert werden, soweit
+ die Copyright-Hinweise des Autors (/about) und die Versionsbezeichnung
+ auf der Startseite enthalten bleiben.
+
+ 4. Wird das yChat-System manipuliert, so muß das veränderte Skript auf
+ Anforderung an den Autor weitergegeben werden. Dieser darf die
+ Veränderungen in das Standard-yChat-System integrieren.
+
+ 5. Wird das yChat-System eingesetzt, so muß dem Autor die Location bzw. die
+ URL bekanntgegeben werden. Auf Wunsch wird dort eine Subdomain
+ DEINNAME.yChat.de gelinkt.
+
+ 6. Es ist verboten, Sourcecode aus dem yChat-System zu kopieren und
+ für andere, nicht von yChat abhängige Perl-Programme einzusetzen.
+
+ 7. Der Autor übernimmt keine Haftung über das Skript oder die Folgen der
+ Einsetzung des Skripts und leistet keinen Installationssupport. \ No newline at end of file
diff --git a/0.6.2/SETUP.txt b/0.6.2/SETUP.txt
new file mode 100644
index 0000000..1574fbd
--- /dev/null
+++ b/0.6.2/SETUP.txt
@@ -0,0 +1,144 @@
+############################## yChat.de SETUP ###############################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+
+yChat findest Du im Internet unter der Adresse www.yChat.de. Bei Kritik,
+Anregungen oder Fragen bitte in das dort vorhandene Board posten oder eine
+E-Mail an die oben stehende Adresse senden. Ich bemühe mich, yChat so gut wie
+möglich zu machen und bin über Ratschläge immer sehr erfreut :-) ...
+
+Die Installation kann auf Unix-Systemen voll automatisch duchgeführt werden.
+Allerdings ist dafür ein Telnet-Zugang notwendig. Kopiere alle vorhandenen
+Dateien in das Verzeichnis cgi-bin/yChat und führe dann das Shellskript
+setup.sh mit dem Befehl ./setup.sh aus. Alle Verzeichnisse werden
+automatisch erstellt. Dies wurde allerdings nur auf SuSE Linux Systemen
+mit root-Zugriff getestet. Solltest Du ein anderes System verwenden oder
+den Chat auf einen virtuellen Webserver installieren wollen, dann mußt Du
+unter Umständen das Verzeichnis "../../htdocs/yChat" nach "../../yChat"
+in der setup.sh umbenennen. Ansonsten werden die dazugehörigen Grafikdateien
+falsch oder gar nicht kopiert.
+
+Wenn Du keinen Telnet-Zugang hast, kannst Du hier die Verzeichnisse manuell
+einrichten:
+
+Folgende Basis-Dateien sind im Chat enthalten und müssen in das cgi-bin
+Verzeichnis kopiert werden. Z.B. nach ./cgi-bin/yChat/:
+
+config.pm => Configurationsdatei ("Shared subs")
+htdocs.pl => Generiert dynamische HTML-Inhalte
+index.pl => Startskript (Registrierung, Login, Chatframeset)
+input.pl => Skript für das Chateingabeframe
+main.pl => Hauptskript (Alle Hauptfunktionen des Chats)
+main2.pl => Skript für editieren der Benutzerdaten etc
+online.pl => Anzeige und Überprüfung der eingelogten Benutzer
+push.pl => Server-Push-Routine
+setup.sh => Dient zur automatischen Einrichtung des Chats
+stat.pl => Erstellt diverse Statistiken
+README.txt => Beinhaltet wichtige Informationen
+UPDATES.txt => Updateliste der verschiedenen Versionen
+CREDITS.txt => Personen, die geolfen haben yChat zu proggen
+SETUP.txt => Dieses Dokument
+chatiq.sno => Datei beinhaltet die Chatiquette
+colors.sno => Datei beinhaltet alle Farben in hex. für die Chatoptionen
+help.sno => Datei beinhaltet alle Chatbefehle
+
+
+- Hier befinden sich alle für den Chat notwenidgen Daten:
+ ./cgi-bin/yChat/data/*
+
+- Hier befinden sich alle Logdateien, die vom Chat erstellt werden:
+ ./cgi-bin/yChat/data/logs/*
+
+- Hier befinden sich die Message-Dateien der eingelogten Benutzer:
+ ./cgi-bin/yChat/data/msgs/*
+
+- Hier befinden sich alle Daten der registrierten Benutzer:
+ ./cgi-bin/yChat/data/user/*
+
+- Hier wird abgespeichert, wie oft ein Benutzerprofil insgesant schon
+ aufgerufen wurde und wie lange die Chatter schon online waren:
+ ./cgi-bin/yChat/data/user/counts/*
+
+- Hier werden alle Memos abgespeichert.
+ ./cgi-bin/yChat/data/user/memos/*
+
+- Hier befinden sich alle Chat-Optionen und Passwörter der registrierten
+ Benutzer:
+ ./cgi-bin/yChat/data/user/options/*
+
+- Hier befinden sich alle Benutzerprofile der Benutzer:
+ ./cgi-bin/yChat/data/user/profiles/*
+
+- Hier befinden sich alle Gästebucheinträge der Benutzer:
+ ./cgi-bin/yChat/data/user/gbooks/*
+
+- Hier wird abgespeichert, wann der der jew. benutzer zum letzten mal das
+ System betreten hat.
+ ./cgi-bin/yChat/data/user/lastlogin/*
+
+- Hier befinden sich alle Daten zu den aktuellen Chaträumen und User die
+ online sind
+ ./cgi-bin/yChat/data/online/*
+
+- Verzeichnis für die Raumstatusdateien. Hier wird abgespeichert:
+ Raumbesetzer, Away (inkl. Away-Nachricht)und das Raumthema.
+ ./cgi-bin/yChat/data/online/rstat/*
+
+ - Hier befinden sich die Chatter, die sich in den jew. Räumen befinden. Die
+ Verzeichnisse der Räume werden automatisch erstellt.
+ ./cgi-bin/yChat/data/online/rooms/*
+
+- Hier befinden sich alle PIDs (Process IDs) der Chatter in den jew. Räumen.
+ ./cgi-bin/yChat/data/online/pids/*
+
+- Hier befinden sich alle Chatter, die sich z.Z. im System befinden
+ ./cgi-bin/yChat/data/online/users/*
+
+- Hier befinden sich alle IP-Nummern und TempIDs der eingeloggten Chatter
+ ./cgi-bin/yChat/data/online/ident/*
+
+ - Hier befinden sichTempIDs der eingeloggten Chatter
+ ./cgi-bin/yChat/data/online/tmpid/*
+
+Alle Grafik- und Multimediadateien (*.gif, *.jpg, *.swf) sollten in ein
+nicht-CGI-BIN-Verzeichnis
+ kopiert werden. Z.B. nach ./yChat/.
+
+Zum schluß sollte die config.pm-Datei nach wünschen editiert werden.
+Allerdings sollten die Copyright Hinweise und die Versionsnummern nicht
+manipuliert werden.
+
+Jetzt einfach die Datei index.pl vom Browser ausführen lassen :-)
+
+
+Im Folgendem werde ich ein wenig auf die im yChat-Sourcecode oft verwendeten .
+Variablen eingehen:
+
+ $var => Sagt dem Skript, wie es gestartet werden soll.
+ $alias => Teilt dem Skript den Benutzername mit.
+ $tmpid => Beim einloggen in den Chat wird für den Benutzer eine
+ temporäre ID generiert. Diese wird so wohl in der Variable
+ $tmpid als auch in eine Datei geschrieben. Handelt der
+ Benutzer, so wird vom Skript die Variable $tmpid mit dem
+ Eintrag in der Datei verglichen. Sind beide Werte
+ identisch, dann wird die Handlung des Benutzers
+ ausgeführt. Stimmen die Werte nicht überein, dann wird
+ die Fehlermeldung, daß der Benutzer die falsche $tmpid hat
+ um mit $alias zu handeln,ausgegeben und das Skript beendet
+ sich. Dies ist eine Sicherheitsmaßnahme welche verbietet,
+ mit fremden Benutzernamen im System zu handeln.
+ $room => Sagt dem Skript, wie der aktuelle Raumname lautet.
+ $col => Sagt dem Skript, wie die aktuelle Chatfarbe des Nicks von
+ $alias lautet.
+ $seccol => Sagt dem Skript, wie die aktuelle Chatfarbe der Schrift von
+ $alias lautet.
+ $msg => Beinhaltet den von $alias zu postenden Text im Chat.
+ Hiervon wird auch in den Benutzergästebüchern und im
+ Benutzerboard Gebrauch gemacht.
+ $whisper => Beinhaltet den Benutzernamen, zu dem $alias zuletzt
+ geflüstert hat.
+ $id und $tmp => Temporäre Variablen zwecks Übermittlung diverser Daten.
+ $pw => Wird im Skript index.pl verwendet um das Zugangspassword
+ zu übermitteln.
+
+Viel Spaß beim Chatten ... \ No newline at end of file
diff --git a/0.6.2/UPDATES.txt b/0.6.2/UPDATES.txt
new file mode 100644
index 0000000..eeac4dc
--- /dev/null
+++ b/0.6.2/UPDATES.txt
@@ -0,0 +1,308 @@
+########################### yChat.de UPDATE LIST ###########################
+## Copyright by Paul C. Bütow 2000 - 2001 (mail@paulbuetow.de) ##
+#############################################################################
+Hier sind alle Erneuerungen der Versionen dokumentiert:
+
+In Planung für 0.8.0:
+ # Kompletter rewrite des Systems.
+ + Chatdaemon, kein CGI-Chat mehr! (Natürlich auch in Perl). Der
+ Chat beantsprucht dann seinen eigenen Port und ist gleichzeitig
+ auch HTTP-Server für die Chat-Seiten!
+ - Evtl MySQL-Datenbank.
+ + Design komplett Template-basierend.
+ + Schlicht und einfaches Design, gut individualisierbar.
+ + Objektorientierte Programmierung.
+ + Multiplex-Serversockets und Fork-Prozesse.
+ + Raumnamen dürfen Sonderzeichen enthalten.
+ + Sauschnell!!!
+ - Fast alle alten und viele viele neue Chat-Befehle!
+ - Das Online-Frame soll aus/anschaltbar sein und wird nicht mehr
+ per HTTP-Refresh-, sondern JavaScript frameübergreifend
+ aktualisiert.
+ (Das neue System wird dieses Jahr wohl noch erscheinen und auch
+ kostenlos sein. Eine 0.7.x-Beta existiert schon. Für weitere
+ Informationen bitte an die oben stehende Mail-Adresse wenden.
+ Die mit einem +-Zeichen gekennzeichneten Punkte sind bereits
+ erfolgreich implentiert worden.)
+
+U.A. in Planung für 0.6.3:
+ - Nach dem Login eine richtige Start-Seite, wo alle verfügbaren
+ Chat-Räume aufgelistet sind. Per Mausklick soll der/die Chatter/
+ Chatterin in den gewünschten Raum gelangen.
+
+Update von 0.6.1 auf 0.6.2 (09.08.01)
+ - Wächter können nun auch IP# verbannen.
+ - Verbannte IP# können keine neuen Nicks mehr registrieren.
+ - Benutzerlimit wurde eingeführt.
+ - yChat aller 0.6.X Versionen und früher sind Freeware.
+ - Sonderchatter ohne Rechte: UvL (Unschuld vom Lande)
+ - In der config.pm kann man nun den Administrator und UvL bestimmen.
+ - Beseitigung vieler vieler Bugs.
+ - Neuer Befehl für Wa und Ow: mit /img kann das Superuser-Logo im
+ Online-Frame de/reaktiviert werden. Gleichzeitig wird auch die
+ Liste im Menüpunkt "Superuser" ergänzt. Wa und Ow können
+ allerdings auch Inkognito-Superuser in dieser Liste sehen.
+
+Update von 0.6.0 auf 0.6.1 (28.02.01)
+ - Alternativ zu "/msg Alias Nachricht" und "/ Nachricht" kann man
+ nun mit "/Alias Nachricht" auch nachrichten flüstern. Dies geht
+ allerdings nur dann, wenn Alias nicht gleich einem Chatbefehl ist!
+ - Wächter können keine verschlossenen Räume mehr betreten.
+ - Registriert sich ein neuer Chatter und hat noch keine feste Farbe
+ deffiniert, dann werden diese zufällig Generiert.
+ - Wird bei dem Befehl "/col" keine Farbe mit angegeben, dann werden
+ zufällige Chatfarben generiert!
+ - In der "config.pm" wurde die zusätliche Variable $admin
+ hinzugefügt. Sie beinhaltet den Alias vom Chatadministrator.
+ - Neue Administratorbefehle.
+ - Das Verzeichnis "data/online/tmpid" wurde angelegt. Hier befinden
+ sich alle aktuellen Temp-IDs. Die IDs werden nun schneller und
+ sicherer auf Richtigkeit überprüft.
+ - Temp-IDs können nun auch die Zeichen "." und "-" beinhalten.
+ - Raumnamen dürfen keine Spezialcharackter mehr beinhalten!
+
+
+Update von 0.4.9 auf 0.6.0 (22.02.01)
+ - Auf der Startseite wird angezeigt, wer alles eingeloggt ist.
+ - Das Skript 'online.pl' wurde komplett überarbeitet.
+ - Viele Programmteile des gesamten Systems wurden überarbeitet und
+ optimiert.
+ - Der Chat hat den neuen Menüpunkt "Chatiquette" bekommen, dort
+ stehen die wichtigsten Verhaltensregeln für Chatter.
+ - Oberwächter können in der "Statistik" die Serverumgebungsvariablen
+ einsehen.
+ - Erweiterung der Errorlogfunktion.
+ - Neue Befehle: mit "/banip Alias" wird ie IP-Nummer von Alias aus
+ dem Chat verbannt. Mit "/rbanip ip://x.x.x.x" wird diese IP-Nummer
+ entbannt. Mir "/rban ip://x.x.x.x" läßt sich eine verbannte
+ IP-Nummer zwar auch entbannen, diese wird jedoch allen Chattern
+ offen präsentiert. Die verbannten IP-Nummern sind mit dem bisher
+ bekannten Befehl "/ban" einzusehen. Die Liste der verbannten
+ IP-Nummern befindet sich in der Datei "data/ban".
+ - Die Liste der Chatbefehle wurde übersichtlicher gemacht.
+ - Noch zufälligere TempIDs.
+ - Bei "/kill Alias" wird Alias auch aus der Datei "data/ban"
+ entfernt.
+
+Update von 0.4.8 auf 0.4.9 (11.02.01)
+ - "/online Alias" zeigt die Onlinezeit in Stunden, nicht mehr in
+ Minuten an.
+ - Hinzufügung des Statistikskripts "stat.pl" unter dem Menüpunkt
+ "Statistik". Das Top 40 - PHP Skript wurde nicht mehr benötigt und
+ gelöscht.
+ - Neue Befehle: /me/ und /m/ (Müssen inmitten des Textes eingegeben
+ werden.)
+ - Wird ein Benutzer aus dem Chat gekillt, so wird dies in der Datei
+ "data/kill" protokolloert.
+ - In der main.pl wird die Datei "config.pm" per "require" nur noch
+ in das Dokument eingefügt, wenn es notwendig ist.
+ - In der Onlineliste neben dem Raumnamen steht nun, wieviele Benutzer
+ sich im aktuellen Raum befinden. Ausserdem wird in der Onlineliste
+ angezeigt, ob ein Benutzer abgemeldet ist oder nicht und welche
+ Rechte er hat. Die Onlineliste ist nun Alphabetisch sortiert.
+ - Wird das Profil geändert und das http:// bei der Homepage-Adresse
+ vergessen, so wird dies automatisch hinzugefügt.
+ - Viele Bugfixes.
+
+Update von 0.4.7 auf 0.4.8 (26.01.01)
+ - Top 20 Ranking Liste in PHP4.
+ - Überarbeitung des Flash-Intros.
+ - PIDs für die Signalhandler werden zuverlässiger abgespeichert und
+ ggf. wieder gelöscht.
+ - Das push.pl-Skript (endlosschleife) benötigt nun nurnoch halb so
+ viel Speicher beim Ausführen. Die Datei config.pm wird nicht mehr
+ mit "require config;" eingebunden.
+ - Benutzernamen dürfen maximal nurnoch 15 Zeichen lang sein.
+ - Chatnachrichten dürfen maximal nurnoch 300 Zeichen lang sein.
+ - Wenn ein Benutzer eine Nachricht textet, überprüft das System, ob
+ derjenige sich auch wirklich im jew. Raum befindet.
+ - In den Chatoptionen kann man zusätzliche Einstellungen vornehmen:
+ 1.) Anzahl der Nachrichten im Nachrichten-Verlauf
+ 2.) Anordnung der Nachrichten im Nachrichten-Verlauf.
+ Neueinstellungen dieser Optionen werden erst nach einem
+ Neueinloggen aktiv.
+ - Die Error-Logdatei "data/error" wurde erweitert.
+
+Update von 0.4.6 auf 0.4.7 (20.01.01)
+ - Auto-Away: Ist ein Chatter 5 Minuten inaktiv, dann erscheint im
+ aktuellen Raum die Nachricht "Alias wurde vom System
+ abgemeldet ..." . Bei Wiederaufnahme des Chats, meldet sich Alias
+ wieder zurück.
+ - Auto-Logout: Ist ein Chatter 20 Minuten inaktiv, dann wird dieser
+ aus dem System automatisch ausgelogt.
+ - Neue CSS für die Formulareingabefelder und dem Chat-Menü.
+ (Funktioniert allerdings nicht mit NN4.x, hier werden alle
+ Formulareingabefelder ohne CSS-Definitionen angezeigt.)
+
+Update von 0.4.5 auf 0.4.6 (18.01.01)
+ - Verbesserung: Beim Posten einer neuen Chatnachricht wird sogleich
+ ein Signal an alle laufenden Chatprozesse (PIDs) gesendet, so daß
+ diese aufgefordert werden, aus der Nachrichtendatei die neuen
+ Zeilen einzulesen. Das Push-Skript (push.pl) muß so nicht jede
+ Sekunde prüfen, ob neue Nachrichten da sind, da es diese
+ Information über das Signal erhält. Das Push-Skript verbraucht nun
+ weniger Prozessorleistung, da es jetzt 15 Sekunden lang
+ "dauerschläft" (sleep 15;), lediglich einen <!--PING--> versendet
+ und dann weiter schläft usw. Beendet sich push.pl, oder wird ein
+ Raum gewechselt, dann wird auch die PID aus der PID-Liste des
+ aktuellen Raums gelöscht und ggf. neu geschrieben.
+ Die Dateien "./data/online/pids/*" beinhalten alle aktuellen PIDs,
+ wobei * der jew. Raum ist.
+
+Update von 0.4.4 auf 0.4.5 (16.01.01)
+ - Jeder Chatraum hat nun eine globale Nachrichtendatei. Bisher
+ existierte für jeden Chatter enzelnd eine. Die Nachrichten werden
+ nun schneller gepostet.
+ - Neue Wächterbefehle:
+ "/st Raum Thema" ermöglicht das Ändern das Themas eines anderen
+ Raums.
+ "/sl Raum" ermöglicht das auf- und absperren eines anderen Raums.
+ - Nur noch Oberwächter können die Chatlogs lesen.
+ - Referenzierung der Variable $msg in main.pl.
+ - Flashanimationen.
+
+Update von 0.4.3 auf 0.4.4 (04.01.01)
+ - Optimiertung aller Chatbefehle.
+ - Neuer WÄ-Befehl: Mit "/ss Raum Nachricht" wird aus dem aktuellen
+ Raum heraus in den angegebenen Raum eine beliebige Nachricht
+ gerufen.
+ - Das Skript main.pl wurde in zwei verschiedene Skripts unterteilt:
+ main.pl => Beinhaltet hauptsächlich die Chatbefehle
+ input.pl => Beinhaltet das zu generierende Chateingabeframe.
+ - Das Chateingabeframe wird nun nie wieder reloadet. (Dies geschah
+ bisher noch nach Ausführung der Befehle /col /j /ju /msg und nach
+ Änderung der Chateinstellungen und erwies sich als recht nervige
+ Angelegenheit.) JavaScript macht es möglich.
+ - Überarbeitung und Erweiterung der Dokudateien.
+
+Update von 0.4.2 auf 0.4.3 (30.12.2k)
+ - Optimierung der Zuweisung der Variabeln im Programmcode:
+ Variablen werden nun wirklich nur deffiniert, wenn diese auch
+ erforderlich sind.
+ - Komplette Neuprogrammierung diverser Subs (nun leistungsfähiger)
+ - Bei Aufrug der Login-Seite wird der gesamte Chat auf leerstehende
+ Räume und "alte" Chatter überprüft und ggf. entfernt.
+ - Verbesserung diverser JavaScript-Codes.
+ - Editiert ein Benutzer sein Profil, so wird dies mit der Meldung
+ "Alias hat sein Profil geändert ..." bekanntgegeben.
+ - Mit "/t" ohne weiteren Text erscheint die Nachricht "Alias hat das
+ Thema des Raums gelöscht ..."
+ - Hinzufügung diverser Administratorbefehle: "/pw Alias" zeigt
+ Zugangspassword von Alias an. "/ow Alias" ernennt Alias zum OW.
+ "/row Alias" entzieht Alias die OW-Rechte.
+
+Update von 0.4.1 auf 0.4.2 (25.12.2k)
+ - Im Texteingabeformular werden nun per JavaScript die letzten 10
+ Postings zwischengespeichert und können per Drop-Down-Menü
+ wieder in das Submittextfeld geladen werden um erneuert getextet
+ zu werden.
+ - Neues Design.
+ - Diverse Dateien wurden umbenannt:
+ INSTALL.txt -> SETUP.txt
+ LIESMICH.txt -> README.txt
+ - Die Datei CREDITS.txt wurde angelegt und somit auch die URL
+ www.credits.yChat.de.
+
+Update von 0.4.0 auf 0.4.1 (22.12.2k)
+ - Design wurde geändert.
+ - Unter "Optionen" ist nun eine komplette Farbtabelle eingebaut.
+ - Folgende Oberwächterbefehle wurden nun auch für normale Wächter
+ freigegeben: /ip /ban /rban.
+
+Update von 0.2.6 auf 0.4.0 (19.12.2k)
+ - Der berüchtigte "IP-Bug" wurde beseitigt! Und zwar wurden TempIDs
+ eingeführt => Eine dauerhafte Überprüfung der Benutzer-IP-Nummer
+ ist also nicht mehr notwendig.
+ - Die totale Chat-Online-Zeit wird protokolliert und kann jew. mit
+ "/online Alias" aufgerufen werden. Die Onlinezeit wird alle 20 Sek.
+ aktualisiert.
+ - Neue Befehle: "/seen Alias" zeigt an, vor wieviel St. sich Alias
+ zuletzt in das System eingelogt hat. Der Befehle "/rmgb" entfernt
+ alle Einträge des eigenen Benutzergästebuchs im Profil.
+
+Update von 0.2.5 auf 0.2.6 (17.12.2k)
+ - Das Eingabeframe reloaded sich nicht mehr nach jedem Posting.
+ Vielen Dank an Truhe aka Dave und Klepper aka Andreas Buchwald!
+ Bei den Chatbefehlen /col /away /j und /ju muß sich das
+ Eingabeframe weiterhin reloaden.
+ - Der Befehl // wurde entfernt. Dieser war nicht mehr erforderlich.
+ weil Nachrichten werden nur noch sehr selten verschluckt. Dieser
+ Chatbefehl postete die letzte Nachricht nocheinmal.
+ - Neuer Befehl: mit "/memo Alias hier der Text" hinterläßt man
+ Alias eine Memo. Logt sich Alias in den Chat ein, dann erhält
+ er diese sofort. Dafür wurde das Verzeichnis ".data/user/memos/"
+ angelegt.
+ - Programmcode wurde ein wenig optimiert.
+ - Das Design wurde ein wenig geändert.
+ - Beseitigung diverser Bugs.
+
+Update von 0.2.4 auf 0.2.5 (15.12.2k)
+ - Derjenige, der einen Raum zuerst betritt, hat Raumbesetzerrechte.
+ - Raumbesetzer, Wächter und Oberwächte können weitere Raumbesetzer
+ bestimmen. Diese können Raumbeseter auch wieder degradieren.
+ - Raumbesetzer, Wächter und Oberwächter können dem aktuellen Raum
+ auf/absperren und Themen geben. Wächter und Oberwächter können
+ abgesperrte Räume betreten.
+ - Das Verzeichnis ".data/htdocs" wurde entfernt. Die Datei help_html
+ heist nun help.sno und befindet sich im yChat-Hauptverzeichnis.
+ - Das Verzeichnis ".data/user/lastlogin" wurde hinzugefügt. Hier
+ wird beim erfolgreichen Einloggen ein "Timestamp" gesetzt. Später
+ sollen Oberwächter "veraltete" Benutzer entfernen können.
+ - Neuer Oberwächterbefehl: "/kill Alias" entfernt Alias ganz und gar
+ vom System. Oberwächter und Wächter können nicht entfernt werden.
+ - Perl-Cache wurde im gesamten System komplett deaktiviert ( Weniger
+ Ladezeiten der HTML-Dokumente ).
+ - Nur Nachrichten aus dem Raum "Cyberbar" werden gelogt.
+ Selbsterstellte Räume werden nichtmehr gelogt. Viele Logfunktionen
+ wurden entfernt (weniger Serverbalast).
+ - Beseitigung einiger kleinen Bugs.
+ - Unter "Optionen" im Chat wir die Farbe nun mit einem Drop-Down-Menü
+ ausgewählt ( Vielen dank an Michi aka Snoopy ).
+ - Auf der Startseite wird nun angezeigt wieviele Benutzer eingelogt
+ sind. Ist keiner eingelogt, dann wird das System "aufgeräumt". D.h.
+ Dateien die nicht mehr gebraucht werden und noch nicht gelöscht
+ wurden werden entfernt ( z.B. Nachrichtendateien der einzelnen
+ Chatter und die Dateien die die IP-Nummern der eingelogten Benutzer
+ beinhalteten usw.).
+ - Hunzufügung einer TODO-Liste. Hier sind mehrere Funktionen
+ vermerkt, die in späteren yChat-Versionen eingebaut werden sollen.
+ (www.todo.yChat.de oder TODO.txt).
+
+Update von 0.2.3 auf 0.2.4 (30.11.2k)
+ - Optimierung bzw. Verbesserung der Push-Routine push.pl.
+ - Server-Ping wurde von 2-Pings-per-Minute auf 4 erhöht.
+ - yChat-Banner wurde erstellt und ist unter
+ documents.yChat.de/yBanner.jpg vorzufinden.
+ - Unter der URL servers.yChat.de wurde eine Serverliste angelegt,
+ welche anzeigt wo yChat-Systeme laufen.
+ - Des weiteren wurden die URLs updates.yChat.de, install.yChat.de
+ und liesmich.yChat.de eingerichtet.
+ - Die Menüpunkte wurden zusammengefaßt, damit sie unter einer
+ Auflösung von 800x600 nur eine Zeile belegen.
+ - Einige Bugs wurden entfernt.
+
+Update von 0.2.2 auf 0.2.3 (25.11.2k)
+ - Smooth scrolling JavaScript ( Vielen Dank an Andreas Buchwald ).
+ - "IP#-Fehler" wurde so gut wie beseitigt.
+ - Aufrufe der einzelnen Benutzerprofile wird gezählt und angezeigt.
+ Diese werden in data/user/counts/* gespeichert.
+ - Automatische Einrichtung des Chats mit setup.sh und Telnet.
+ - Menüpunkt "Dein Profil" wurde entfernt da eigenes Profil auch
+ stets über die Onlineliste aufgerufen werden kann.
+
+Update von 0.2.1 auf 0.2.2 (23.11.2k)
+ - Einige Bugs wurden entfernt.
+ - Geschwindigkeit des Chats wurde optimiert.
+ - Eine Liste aller eingelogten Benutzer erscheint am Rand. Hierfür
+ wurde die Datei online.pl eingeführt. Sie aktuallisiert sich alle
+ 20 Sekunden.
+ - Die UPDATES.txt wurde eingeführt.
+
+Update von 0.2.0 auf 0.2.1
+ - Einige Bugs wurden entfernt.
+ - Die IP# der eingelogten Benutzer werden nun anders verwaltet.
+
+Update von Alpha XVIII auf 0.2.0
+ - Die Handhabung der eingelogten Benutzer im System wurde komplett neu
+ überarbeitet.
+ - Neue Versionsnumern wurden eingeführt. \ No newline at end of file
diff --git a/0.6.2/adm.gif b/0.6.2/adm.gif
new file mode 100644
index 0000000..d7b68d9
--- /dev/null
+++ b/0.6.2/adm.gif
Binary files differ
diff --git a/0.6.2/away.gif b/0.6.2/away.gif
new file mode 100644
index 0000000..c001883
--- /dev/null
+++ b/0.6.2/away.gif
Binary files differ
diff --git a/0.6.2/chatiq.sno b/0.6.2/chatiq.sno
new file mode 100644
index 0000000..2a024f5
--- /dev/null
+++ b/0.6.2/chatiq.sno
@@ -0,0 +1 @@
+<div><h2>Chatiquette</h2></div><hr><div>Hier einige Grundlagen ...</div><style type="text/css"> li { color: #ffffff }</style><ul><li><div>Vergiss nie, dass am anderen Ende auch nur Menschen sitzen. Diese m&ouml;gen es gar nicht, angep&ouml;belt, beleidigt oder in sonstiger Weise angegriffen zu werden.</div></li><li><div>St&ouml;rend ist auch immer, wenn ein privater Streit im Chat ausgetragen wird. Tragt eure privaten Sachen ausserhalb des Chats aus.<br>Selbst wenn es nur Spass ist - weiss der Rest im Chat das?</div></li><li><div>Dauergeschrei f&auml;llt auch immer wieder st&ouml;rend auf. Was in Grossbuchstaben geschrieben wird, wird als Schreien bezeichnet.</div></li><li><div>Unsere ganz besonderen Spezialisten wollen auch immer wieder rausfliegen. Um das zu erreichen, senden sie die ganze Zeit Unsinn.</div></li><li><div>Diskussionen sind dagegen kein Problem. Daf&uuml;r ist ein Chat ja da. Sobald allerdings das Thema der Diskussion zu sehr entgleist, sollte die Diskussion in einen etwas weniger &ouml;ffentlichen Raum verlegt werden.</div></li></ul><div>Daraus ergeben sich folgende Regeln:</div><ul><li><div>keinen beleidigenden Wortschatz verwenden</div></li><li><div>obz&ouml;ner und verfassungsfeindlicher Wortschatz f&auml;llt auch weg</div></li><li><div>streitet euch woanders oder in einem privaten Raum</div></li><li><div>schreit nich so viel</div></li><li><div>schreibt keinen Unsinn, der so aussieht, als ob eure Katze über die Tastatur gelaufen ist</div></li><li><div>schreibt nicht zu schnell hintereinander, besonders nicht dasselbe</div></li><li><div>verlagert die Diskussion, wenn sich jemand gest&ouml;rt f&uuml;hlt</div></li><li><div>Diese Liste ist nicht vollst&auml;ndig. Mit dem gesunden Menschenverstand sollte es eigentlich m&ouml;glich sein, sich die nicht aufgef&uuml;hrten Punkte zu denken.</div></li></ul><div>So - nach den ganzen "lass-es-bessers" noch ein paar &Uuml;berlebenstips:</div><ul><li><div>beachte die oben stehenden Punkte ;-)</div></li><li><div>es macht sich immer gut, beim Reinkommen mal zu gr&uuml;ssen</div></li><li><div>warte nicht, bis man/frau dich anspricht - werde selbst aktiv und gib deinen Senf dazu</div></li><li><div>es gibt meist kein allgemein anerkanntes Gespr&auml;chsthema - lies dich einfach rein</div></li><li><div>die frage &quot;wer will chatten&quot; ist eigentlich &uuml;berfl&uuml;ssig in einem Chat (wir warten doch alle nur aufs Ufo ;-)</div></li><li><div>fang nich sofort mit den W-Fragen (woher, wie alt, weiblich oder männlich?) an - es st&ouml;rt einige Leute</div></li></ul><div>Problematisch f&uuml;r die W&auml;chter und Oberw&auml;chter ist:</div><ul><li><div>&quot;der nervt mich - schmeiss den mal raus&quot; ist oft nicht nachvollziehbar, weil der W&Auml; oder OW die Vorgeschichte - die vielleicht ausserhalb des yChat stattgefunden hat - nicht kennt oder keinen Beweis daf&uuml;r hat.</div></li></ul><hr><div><h2>Richtlinien f&uuml;r den gestressten W&Auml; und OW:</h2></div><ul><li><div>Du hast die Macht - aber mi&szlig;brauche sie nicht!</div></li><li><div>Leute, die ganz offensichtlich st&ouml;ren wollen und dabei den Chatbetrieb massiv behindern, sofort rausschmeissen! Kriterien dazu:</div><ul><li><div>Fluten des Chats</div></li><li><div>Wiederholung von Parolen</div></li><li><div>Exzessive Nutzung von zuf&auml;lligen Buchstaben-/Zeichenfolgen</div></li><li><div>usw...</div></li></ul></li><li><div>Bei den anderen vorher noch eine Warnung aussprechen...</div></li><li><div>Nicht vergessen: auch f&uuml;r euch gelten die oben aufgef&uuml;hrten Regeln!</div></li><li><div>Vergabe von Raumbesetzer- und W&auml;chterrechten:<br>(dies gilt f&uuml;r RB-Vergabe in der Cyberbar, W&Auml; allgemein)</div><ul><li><div>Um RB oder W&Auml; betteln wird schon mal gar nicht beachtet.</div></li><li><div>Wer W&Auml; wird, soll sichs verdienen - z.B. durch h&auml;ufiges Helfen bei Neulingen.</div></li><li><div>Ein W&Auml; sollte schon &ouml;fter im Chat sein.</div></li><li><div>Oberw&auml;chter zu werden ist sehr schwierig. Frag gar nicht erst danach ;-)</div></li></ul></ul><div>Wer meint, von einem W&auml;chter oder Oberw&auml;chter ungerecht behandelt worden zu sein (z.B. weil dieser wegen persönlichen Streitigkeiten rausschmeisst), richte seine Klage an einen Oberw&auml;chter oder direkt an den obersten Boss: Snooper (<a href="mailto:admin@ychat.de">admin@ychat.de</a>).</div> \ No newline at end of file
diff --git a/0.6.2/colors.sno b/0.6.2/colors.sno
new file mode 100644
index 0000000..3640b9e
--- /dev/null
+++ b/0.6.2/colors.sno
@@ -0,0 +1,290 @@
+ <table cellspacing=0 cellpadding=5 border=0>
+ <tr>
+ <td bgcolor="000000"><span style="color:#FFFFFF; text-decoration:line-through;">000000</span></td>
+ <td bgcolor="000033"><span style="color:#FFFFFF; text-decoration:line-through;">000033</span></td>
+ <td bgcolor="000066"><span style="color:#FFFFFF; text-decoration:line-through;">000066</span></td>
+ <td bgcolor="000099"><span style="color:#FFFFFF; text-decoration:line-through;">000099</span></td>
+ <td bgcolor="0000CC"><span style="color:#FFFFFF; text-decoration:line-through;">0000CC</span></td>
+ <td bgcolor="0000FF"><a href="javascript:insertcode('0000FF');" style="color:#FFFFFF;">0000FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="003300"><span style="color:#FFFFFF; text-decoration:line-through;">003300</span></td>
+ <td bgcolor="003333"><span style="color:#FFFFFF; text-decoration:line-through;">003333</span></td>
+ <td bgcolor="003366"><span style="color:#FFFFFF; text-decoration:line-through;">003366</span></td>
+ <td bgcolor="003399"><a href="javascript:insertcode('003399');" style="color:#FFFFFF;">003399</a></td>
+ <td bgcolor="0033CC"><a href="javascript:insertcode('0033CC');" style="color:#FFFFFF;">0033CC</a></td>
+ <td bgcolor="0033FF"><a href="javascript:insertcode('0033FF');" style="color:#FFFFFF;">0033FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="006600"><span style="color:#FFFFFF; text-decoration:line-through;">006600</span></td>
+ <td bgcolor="006633"><span style="color:#FFFFFF; text-decoration:line-through;">006633</span></td>
+ <td bgcolor="006666"><a href="javascript:insertcode('006666');" style="color:#FFFFFF;">006666</a></td>
+ <td bgcolor="006699"><a href="javascript:insertcode('006699');" style="color:#FFFFFF;">006699</a></td>
+ <td bgcolor="0066CC"><a href="javascript:insertcode('0066CC');" style="color:#FFFFFF;">0066CC</a></td>
+ <td bgcolor="0066FF"><a href="javascript:insertcode('0066FF');" style="color:#FFFFFF;">0066FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="009900"><a href="javascript:insertcode('009900');" style="color:#FFFFFF;">009900</a></td>
+ <td bgcolor="009933"><a href="javascript:insertcode('009933');" style="color:#FFFFFF;">009933</a></td>
+ <td bgcolor="009966"><a href="javascript:insertcode('009966');" style="color:#FFFFFF;">009966</a></td>
+ <td bgcolor="009999"><a href="javascript:insertcode('009999');" style="color:#FFFFFF;">009999</a></td>
+ <td bgcolor="0099CC"><a href="javascript:insertcode('0099CC');" style="color:#FFFFFF;">0099CC</a></td>
+ <td bgcolor="0099FF"><a href="javascript:insertcode('0099FF');" style="color:#FFFFFF;">0099FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00CC00"><a href="javascript:insertcode('00CC00');" style="color:#000000;">00CC00</a></td>
+ <td bgcolor="00CC33"><a href="javascript:insertcode('00CC33');" style="color:#000000;">00CC33</a></td>
+ <td bgcolor="00CC66"><a href="javascript:insertcode('00CC66');" style="color:#000000;">00CC66</a></td>
+ <td bgcolor="00CC99"><a href="javascript:insertcode('00CC99');" style="color:#000000;">00CC99</a></td>
+ <td bgcolor="00CCCC"><a href="javascript:insertcode('00CCCC');" style="color:#000000;">00CCCC</a></td>
+ <td bgcolor="00CCFF"><a href="javascript:insertcode('00CCFF');" style="color:#000000;">00CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00FF00"><a href="javascript:insertcode('00FF00');" style="color:#000000;">00FF00</a></td>
+ <td bgcolor="00FF33"><a href="javascript:insertcode('00FF33');" style="color:#000000;">00FF33</a></td>
+ <td bgcolor="00FF66"><a href="javascript:insertcode('00FF66');" style="color:#000000;">00FF66</a></td>
+ <td bgcolor="00FF99"><a href="javascript:insertcode('00FF99');" style="color:#000000;">00FF99</a></td>
+ <td bgcolor="00FFCC"><a href="javascript:insertcode('00FFCC');" style="color:#000000;">00FFCC</a></td>
+ <td bgcolor="00FFFF"><a href="javascript:insertcode('00FFFF');" style="color:#000000;">00FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="330000"><span style="color:#FFFFFF; text-decoration:line-through;">330000</span></td>
+ <td bgcolor="330033"><span style="color:#FFFFFF; text-decoration:line-through;">330033</span></td>
+ <td bgcolor="330066"><span style="color:#FFFFFF; text-decoration:line-through;">330066</span></td>
+ <td bgcolor="330099"><a href="javascript:insertcode('330099');" style="color:#FFFFFF;">330099</a></td>
+ <td bgcolor="3300CC"><a href="javascript:insertcode('3300CC');" style="color:#FFFFFF;">3300CC</a></td>
+ <td bgcolor="3300FF"><a href="javascript:insertcode('3300FF');" style="color:#FFFFFF;">3300FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="333300"><span style="color:#FFFFFF; text-decoration:line-through;">333300</span></td>
+ <td bgcolor="333333"><span style="color:#FFFFFF; text-decoration:line-through;">333333</span></td>
+ <td bgcolor="333366"><a href="javascript:insertcode('333366');" style="color:#FFFFFF;">333366</a></td>
+ <td bgcolor="333399"><a href="javascript:insertcode('333399');" style="color:#FFFFFF;">333399</a></td>
+ <td bgcolor="3333CC"><a href="javascript:insertcode('3333CC');" style="color:#FFFFFF;">3333CC</a></td>
+ <td bgcolor="3333FF"><a href="javascript:insertcode('3333FF');" style="color:#FFFFFF;">3333FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="336600"><a href="javascript:insertcode('336600');" style="color:#FFFFFF;">336600</a></td>
+ <td bgcolor="336633"><a href="javascript:insertcode('336633');" style="color:#FFFFFF;">336633</a></td>
+ <td bgcolor="336666"><a href="javascript:insertcode('336666');" style="color:#FFFFFF;">336666</a></td>
+ <td bgcolor="336699"><a href="javascript:insertcode('336699');" style="color:#FFFFFF;">336699</a></td>
+ <td bgcolor="3366CC"><a href="javascript:insertcode('3366CC');" style="color:#FFFFFF;">3366CC</a></td>
+ <td bgcolor="3366FF"><a href="javascript:insertcode('3366FF');" style="color:#FFFFFF;">3366FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="339900"><a href="javascript:insertcode('339900');" style="color:#FFFFFF;">339900</a></td>
+ <td bgcolor="339933"><a href="javascript:insertcode('339933');" style="color:#FFFFFF;">339933</a></td>
+ <td bgcolor="339966"><a href="javascript:insertcode('339966');" style="color:#FFFFFF;">339966</a></td>
+ <td bgcolor="339999"><a href="javascript:insertcode('339999');" style="color:#FFFFFF;">339999</a></td>
+ <td bgcolor="3399CC"><a href="javascript:insertcode('3399CC');" style="color:#FFFFFF;">3399CC</a></td>
+ <td bgcolor="3399FF"><a href="javascript:insertcode('3399FF');" style="color:#FFFFFF;">3399FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33CC00"><a href="javascript:insertcode('33CC00');" style="color:#000000;">33CC00</a></td>
+ <td bgcolor="33CC33"><a href="javascript:insertcode('33CC33');" style="color:#000000;">33CC33</a></td>
+ <td bgcolor="33CC66"><a href="javascript:insertcode('33CC66');" style="color:#000000;">33CC66</a></td>
+ <td bgcolor="33CC99"><a href="javascript:insertcode('33CC99');" style="color:#000000;">33CC99</a></td>
+ <td bgcolor="33CCCC"><a href="javascript:insertcode('33CCCC');" style="color:#000000;">33CCCC</a></td>
+ <td bgcolor="33CCFF"><a href="javascript:insertcode('33CCFF');" style="color:#000000;">33CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33FF00"><a href="javascript:insertcode('33FF00');" style="color:#000000;">33FF00</a></td>
+ <td bgcolor="33FF33"><a href="javascript:insertcode('33FF33');" style="color:#000000;">33FF33</a></td>
+ <td bgcolor="33FF66"><a href="javascript:insertcode('33FF66');" style="color:#000000;">33FF66</a></td>
+ <td bgcolor="33FF99"><a href="javascript:insertcode('33FF99');" style="color:#000000;">33FF99</a></td>
+ <td bgcolor="33FFCC"><a href="javascript:insertcode('33FFCC');" style="color:#000000;">33FFCC</a></td>
+ <td bgcolor="33FFFF"><a href="javascript:insertcode('33FFFF');" style="color:#000000;">33FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="660000"><span style="color:#FFFFFF; text-decoration:line-through;">660000</span></td>
+ <td bgcolor="660033"><span style="color:#FFFFFF; text-decoration:line-through;">660033</span></td>
+ <td bgcolor="660066"><a href="javascript:insertcode('660066');" style="color:#FFFFFF;">660066</a></td>
+ <td bgcolor="660099"><a href="javascript:insertcode('660099');" style="color:#FFFFFF;">660099</a></td>
+ <td bgcolor="6600CC"><a href="javascript:insertcode('6600CC');" style="color:#FFFFFF;">6600CC</a></td>
+ <td bgcolor="6600FF"><a href="javascript:insertcode('6600FF');" style="color:#FFFFFF;">6600FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="663300"><a href="javascript:insertcode('663300');" style="color:#FFFFFF;">663300</a></td>
+ <td bgcolor="663333"><a href="javascript:insertcode('663333');" style="color:#FFFFFF;">663333</a></td>
+ <td bgcolor="663366"><a href="javascript:insertcode('663366');" style="color:#FFFFFF;">663366</a></td>
+ <td bgcolor="663399"><a href="javascript:insertcode('663399');" style="color:#FFFFFF;">663399</a></td>
+ <td bgcolor="6633CC"><a href="javascript:insertcode('6633CC');" style="color:#FFFFFF;">6633CC</a></td>
+ <td bgcolor="6633FF"><a href="javascript:insertcode('6633FF');" style="color:#FFFFFF;">6633FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="666600"><a href="javascript:insertcode('666600');" style="color:#FFFFFF;">666600</a></td>
+ <td bgcolor="666633"><a href="javascript:insertcode('666633');" style="color:#FFFFFF;">666633</a></td>
+ <td bgcolor="666666"><a href="javascript:insertcode('666666');" style="color:#FFFFFF;">666666</a></td>
+ <td bgcolor="666699"><a href="javascript:insertcode('666699');" style="color:#FFFFFF;">666699</a></td>
+ <td bgcolor="6666CC"><a href="javascript:insertcode('6666CC');" style="color:#FFFFFF;">6666CC</a></td>
+ <td bgcolor="6666FF"><a href="javascript:insertcode('6666FF');" style="color:#FFFFFF;">6666FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="669900"><a href="javascript:insertcode('669900');" style="color:#000000;">669900</a></td>
+ <td bgcolor="669933"><a href="javascript:insertcode('669933');" style="color:#000000;">669933</a></td>
+ <td bgcolor="669966"><a href="javascript:insertcode('669966');" style="color:#000000;">669966</a></td>
+ <td bgcolor="669999"><a href="javascript:insertcode('669999');" style="color:#000000;">669999</a></td>
+ <td bgcolor="6699CC"><a href="javascript:insertcode('6699CC');" style="color:#000000;">6699CC</a></td>
+ <td bgcolor="6699FF"><a href="javascript:insertcode('6699FF');" style="color:#000000;">6699FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66CC00"><a href="javascript:insertcode('66CC00');" style="color:#000000;">66CC00</a></td>
+ <td bgcolor="66CC33"><a href="javascript:insertcode('66CC33');" style="color:#000000;">66CC33</a></td>
+ <td bgcolor="66CC66"><a href="javascript:insertcode('66CC66');" style="color:#000000;">66CC66</a></td>
+ <td bgcolor="66CC99"><a href="javascript:insertcode('66CC99');" style="color:#000000;">66CC99</a></td>
+ <td bgcolor="66CCCC"><a href="javascript:insertcode('66CCCC');" style="color:#000000;">66CCCC</a></td>
+ <td bgcolor="66CCFF"><a href="javascript:insertcode('66CCFF');" style="color:#000000;">66CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66FF00"><a href="javascript:insertcode('66FF00');" style="color:#000000;">66FF00</a></td>
+ <td bgcolor="66FF33"><a href="javascript:insertcode('66FF33');" style="color:#000000;">66FF33</a></td>
+ <td bgcolor="66FF66"><a href="javascript:insertcode('66FF66');" style="color:#000000;">66FF66</a></td>
+ <td bgcolor="66FF99"><a href="javascript:insertcode('66FF99');" style="color:#000000;">66FF99</a></td>
+ <td bgcolor="66FFCC"><a href="javascript:insertcode('66FFCC');" style="color:#000000;">66FFCC</a></td>
+ <td bgcolor="66FFFF"><a href="javascript:insertcode('66FFFF');" style="color:#000000;">66FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="990000"><a href="javascript:insertcode('990000');" style="color:#FFFFFF;">990000</a></td>
+ <td bgcolor="990033"><a href="javascript:insertcode('990033');" style="color:#FFFFFF;">990033</a></td>
+ <td bgcolor="990066"><a href="javascript:insertcode('990066');" style="color:#FFFFFF;">990066</a></td>
+ <td bgcolor="990099"><a href="javascript:insertcode('990099');" style="color:#FFFFFF;">990099</a></td>
+ <td bgcolor="9900CC"><a href="javascript:insertcode('9900CC');" style="color:#FFFFFF;">9900CC</a></td>
+ <td bgcolor="9900FF"><a href="javascript:insertcode('9900FF');" style="color:#FFFFFF;">9900FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="993300"><a href="javascript:insertcode('993300');" style="color:#FFFFFF;">993300</a></td>
+ <td bgcolor="993333"><a href="javascript:insertcode('993333');" style="color:#FFFFFF;">993333</a></td>
+ <td bgcolor="993366"><a href="javascript:insertcode('993366');" style="color:#FFFFFF;">993366</a></td>
+ <td bgcolor="993399"><a href="javascript:insertcode('993399');" style="color:#FFFFFF;">993399</a></td>
+ <td bgcolor="9933CC"><a href="javascript:insertcode('9933CC');" style="color:#FFFFFF;">9933CC</a></td>
+ <td bgcolor="9933FF"><a href="javascript:insertcode('9933FF');" style="color:#FFFFFF;">9933FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="996600"><a href="javascript:insertcode('996600');" style="color:#FFFFFF;">996600</a></td>
+ <td bgcolor="996633"><a href="javascript:insertcode('996633');" style="color:#FFFFFF;">996633</a></td>
+ <td bgcolor="996666"><a href="javascript:insertcode('996666');" style="color:#FFFFFF;">996666</a></td>
+ <td bgcolor="996699"><a href="javascript:insertcode('996699');" style="color:#FFFFFF;">996699</a></td>
+ <td bgcolor="9966CC"><a href="javascript:insertcode('9966CC');" style="color:#FFFFFF;">9966CC</a></td>
+ <td bgcolor="9966FF"><a href="javascript:insertcode('9966FF');" style="color:#FFFFFF;">9966FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="999900"><a href="javascript:insertcode('999900');" style="color:#000000;">999900</a></td>
+ <td bgcolor="999933"><a href="javascript:insertcode('999933');" style="color:#000000;">999933</a></td>
+ <td bgcolor="999966"><a href="javascript:insertcode('999966');" style="color:#000000;">999966</a></td>
+ <td bgcolor="999999"><a href="javascript:insertcode('999999');" style="color:#000000;">999999</a></td>
+ <td bgcolor="9999CC"><a href="javascript:insertcode('9999CC');" style="color:#000000;">9999CC</a></td>
+ <td bgcolor="9999FF"><a href="javascript:insertcode('9999FF');" style="color:#000000;">9999FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99CC00"><a href="javascript:insertcode('99CC00');" style="color:#000000;">99CC00</a></td>
+ <td bgcolor="99CC33"><a href="javascript:insertcode('99CC33');" style="color:#000000;">99CC33</a></td>
+ <td bgcolor="99CC66"><a href="javascript:insertcode('99CC66');" style="color:#000000;">99CC66</a></td>
+ <td bgcolor="99CC99"><a href="javascript:insertcode('99CC99');" style="color:#000000;">99CC99</a></td>
+ <td bgcolor="99CCCC"><a href="javascript:insertcode('99CCCC');" style="color:#000000;">99CCCC</a></td>
+ <td bgcolor="99CCFF"><a href="javascript:insertcode('99CCFF');" style="color:#000000;">99CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99FF00"><a href="javascript:insertcode('99FF00');" style="color:#000000;">99FF00</a></td>
+ <td bgcolor="99FF33"><a href="javascript:insertcode('99FF33');" style="color:#000000;">99FF33</a></td>
+ <td bgcolor="99FF66"><a href="javascript:insertcode('99FF66');" style="color:#000000;">99FF66</a></td>
+ <td bgcolor="99FF99"><a href="javascript:insertcode('99FF99');" style="color:#000000;">99FF99</a></td>
+ <td bgcolor="99FFCC"><a href="javascript:insertcode('99FFCC');" style="color:#000000;">99FFCC</a></td>
+ <td bgcolor="99FFFF"><a href="javascript:insertcode('99FFFF');" style="color:#000000;">99FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC0000"><a href="javascript:insertcode('CC0000');" style="color:#FFFFFF;">CC0000</a></td>
+ <td bgcolor="CC0033"><a href="javascript:insertcode('CC0033');" style="color:#FFFFFF;">CC0033</a></td>
+ <td bgcolor="CC0066"><a href="javascript:insertcode('CC0066');" style="color:#FFFFFF;">CC0066</a></td>
+ <td bgcolor="CC0099"><a href="javascript:insertcode('CC0099');" style="color:#FFFFFF;">CC0099</a></td>
+ <td bgcolor="CC00CC"><a href="javascript:insertcode('CC00CC');" style="color:#FFFFFF;">CC00CC</a></td>
+ <td bgcolor="CC00FF"><a href="javascript:insertcode('CC00FF');" style="color:#FFFFFF;">CC00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC3300"><a href="javascript:insertcode('CC3300');" style="color:#FFFFFF;">CC3300</a></td>
+ <td bgcolor="CC3333"><a href="javascript:insertcode('CC3333');" style="color:#FFFFFF;">CC3333</a></td>
+ <td bgcolor="CC3366"><a href="javascript:insertcode('CC3366');" style="color:#FFFFFF;">CC3366</a></td>
+ <td bgcolor="CC3399"><a href="javascript:insertcode('CC3399');" style="color:#FFFFFF;">CC3399</a></td>
+ <td bgcolor="CC33CC"><a href="javascript:insertcode('CC33CC');" style="color:#FFFFFF;">CC33CC</a></td>
+ <td bgcolor="CC33FF"><a href="javascript:insertcode('CC33FF');" style="color:#FFFFFF;">CC33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC6600"><a href="javascript:insertcode('CC6600');" style="color:#000000;">CC6600</a></td>
+ <td bgcolor="CC6633"><a href="javascript:insertcode('CC6633');" style="color:#000000;">CC6633</a></td>
+ <td bgcolor="CC6666"><a href="javascript:insertcode('CC6666');" style="color:#000000;">CC6666</a></td>
+ <td bgcolor="CC6699"><a href="javascript:insertcode('CC6699');" style="color:#000000;">CC6699</a></td>
+ <td bgcolor="CC66CC"><a href="javascript:insertcode('CC66CC');" style="color:#000000;">CC66CC</a></td>
+ <td bgcolor="CC66FF"><a href="javascript:insertcode('CC66FF');" style="color:#000000;">CC66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC9900"><a href="javascript:insertcode('CC9900');" style="color:#000000;">CC9900</a></td>
+ <td bgcolor="CC9933"><a href="javascript:insertcode('CC9933');" style="color:#000000;">CC9933</a></td>
+ <td bgcolor="CC9966"><a href="javascript:insertcode('CC9966');" style="color:#000000;">CC9966</a></td>
+ <td bgcolor="CC9999"><a href="javascript:insertcode('CC9999');" style="color:#000000;">CC9999</a></td>
+ <td bgcolor="CC99CC"><a href="javascript:insertcode('CC99CC');" style="color:#000000;">CC99CC</a></td>
+ <td bgcolor="CC99FF"><a href="javascript:insertcode('CC99FF');" style="color:#000000;">CC99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCCC00"><a href="javascript:insertcode('CCCC00');" style="color:#000000;">CCCC00</a></td>
+ <td bgcolor="CCCC33"><a href="javascript:insertcode('CCCC33');" style="color:#000000;">CCCC33</a></td>
+ <td bgcolor="CCCC66"><a href="javascript:insertcode('CCCC66');" style="color:#000000;">CCCC66</a></td>
+ <td bgcolor="CCCC99"><a href="javascript:insertcode('CCCC99');" style="color:#000000;">CCCC99</a></td>
+ <td bgcolor="CCCCCC"><a href="javascript:insertcode('CCCCCC');" style="color:#000000;">CCCCCC</a></td>
+ <td bgcolor="CCCCFF"><a href="javascript:insertcode('CCCCFF');" style="color:#000000;">CCCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCFF00"><a href="javascript:insertcode('CCFF00');" style="color:#000000;">CCFF00</a></td>
+ <td bgcolor="CCFF33"><a href="javascript:insertcode('CCFF33');" style="color:#000000;">CCFF33</a></td>
+ <td bgcolor="CCFF66"><a href="javascript:insertcode('CCFF66');" style="color:#000000;">CCFF66</a></td>
+ <td bgcolor="CCFF99"><a href="javascript:insertcode('CCFF99');" style="color:#000000;">CCFF99</a></td>
+ <td bgcolor="CCFFCC"><a href="javascript:insertcode('CCFFCC');" style="color:#000000;">CCFFCC</a></td>
+ <td bgcolor="CCFFFF"><a href="javascript:insertcode('CCFFFF');" style="color:#000000;">CCFFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF0000"><a href="javascript:insertcode('FF0000');" style="color:#FFFFFF;">FF0000</a></td>
+ <td bgcolor="FF0033"><a href="javascript:insertcode('FF0033');" style="color:#FFFFFF;">FF0033</a></td>
+ <td bgcolor="FF0066"><a href="javascript:insertcode('FF0066');" style="color:#FFFFFF;">FF0066</a></td>
+ <td bgcolor="FF0099"><a href="javascript:insertcode('FF0099');" style="color:#FFFFFF;">FF0099</a></td>
+ <td bgcolor="FF00CC"><a href="javascript:insertcode('FF00CC');" style="color:#FFFFFF;">FF00CC</a></td>
+ <td bgcolor="FF00FF"><a href="javascript:insertcode('FF00FF');" style="color:#FFFFFF;">FF00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF3300"><a href="javascript:insertcode('FF3300');" style="color:#FFFFFF;">FF3300</a></td>
+ <td bgcolor="FF3333"><a href="javascript:insertcode('FF3333');" style="color:#FFFFFF;">FF3333</a></td>
+ <td bgcolor="FF3366"><a href="javascript:insertcode('FF3366');" style="color:#FFFFFF;">FF3366</a></td>
+ <td bgcolor="FF3399"><a href="javascript:insertcode('FF3399');" style="color:#FFFFFF;">FF3399</a></td>
+ <td bgcolor="FF33CC"><a href="javascript:insertcode('FF33CC');" style="color:#FFFFFF;">FF33CC</a></td>
+ <td bgcolor="FF33FF"><a href="javascript:insertcode('FF33FF');" style="color:#FFFFFF;">FF33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF6600"><a href="javascript:insertcode('FF6600');" style="color:#000000;">FF6600</a></td>
+ <td bgcolor="FF6633"><a href="javascript:insertcode('FF6633');" style="color:#000000;">FF6633</a></td>
+ <td bgcolor="FF6666"><a href="javascript:insertcode('FF6666');" style="color:#000000;">FF6666</a></td>
+ <td bgcolor="FF6699"><a href="javascript:insertcode('FF6699');" style="color:#000000;">FF6699</a></td>
+ <td bgcolor="FF66CC"><a href="javascript:insertcode('FF66CC');" style="color:#000000;">FF66CC</a></td>
+ <td bgcolor="FF66FF"><a href="javascript:insertcode('FF66FF');" style="color:#000000;">FF66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF9900"><a href="javascript:insertcode('FF9900');" style="color:#000000;">FF9900</a></td>
+ <td bgcolor="FF9933"><a href="javascript:insertcode('FF9933');" style="color:#000000;">FF9933</a></td>
+ <td bgcolor="FF9966"><a href="javascript:insertcode('FF9966');" style="color:#000000;">FF9966</a></td>
+ <td bgcolor="FF9999"><a href="javascript:insertcode('FF9999');" style="color:#000000;">FF9999</a></td>
+ <td bgcolor="FF99CC"><a href="javascript:insertcode('FF99CC');" style="color:#000000;">FF99CC</a></td>
+ <td bgcolor="FF99FF"><a href="javascript:insertcode('FF99FF');" style="color:#000000;">FF99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFCC00"><a href="javascript:insertcode('FFCC00');" style="color:#000000;">FFCC00</a></td>
+ <td bgcolor="FFCC33"><a href="javascript:insertcode('FFCC33');" style="color:#000000;">FFCC33</a></td>
+ <td bgcolor="FFCC66"><a href="javascript:insertcode('FFCC66');" style="color:#000000;">FFCC66</a></td>
+ <td bgcolor="FFCC99"><a href="javascript:insertcode('FFCC99');" style="color:#000000;">FFCC99</a></td>
+ <td bgcolor="FFCCCC"><a href="javascript:insertcode('FFCCCC');" style="color:#000000;">FFCCCC</a></td>
+ <td bgcolor="FFCCFF"><a href="javascript:insertcode('FFCCFF');" style="color:#000000;">FFCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFFF00"><a href="javascript:insertcode('FFFF00');" style="color:#000000;">FFFF00</a></td>
+ <td bgcolor="FFFF33"><a href="javascript:insertcode('FFFF33');" style="color:#000000;">FFFF33</a></td>
+ <td bgcolor="FFFF66"><a href="javascript:insertcode('FFFF66');" style="color:#000000;">FFFF66</a></td>
+ <td bgcolor="FFFF99"><a href="javascript:insertcode('FFFF99');" style="color:#000000;">FFFF99</a></td>
+ <td bgcolor="FFFFCC"><a href="javascript:insertcode('FFFFCC');" style="color:#000000;">FFFFCC</a></td>
+ <td bgcolor="FFFFFF"><a href="javascript:insertcode('FFFFFF');" style="color:#000000;">FFFFFF</a></td>
+ </tr>
+</table> \ No newline at end of file
diff --git a/0.6.2/config.pm b/0.6.2/config.pm
new file mode 100644
index 0000000..52bc89e
--- /dev/null
+++ b/0.6.2/config.pm
@@ -0,0 +1,333 @@
+# yChat - Copyright by Paul C. Bütow
+
+########################### Dieser Teil bestimmt die Standart-Variabeln.
+##STANDART-CONFIGURATION:## (CSS, Farben, Version etc.)
+###########################
+$admin = "Snooper"; # Chatadministrator
+$uvl = "red_pepper"; # Die Unschuld vom Land
+$mogeladmin = "Coke"; # Geheimer Administrator
+$limit = 55; # Benutzerlimit
+$datum = "09.08.01"; # Datum der letzten Änderung (ändern erwünscht)
+$version = "0.6.2"; # Bitte Hauptversionsnummer nicht ändern
+$title = "yChat [$version]";
+$gfxpath = "../../yChat";
+$style = <<ENDCSS;
+<style type="text/css">
+ body { background-color: #005146 }
+ body.blank { background-color: #000000 }
+ body.online { background-color: #000000 }
+ div { font-family: arial, geneva, verdana, helvetiva; font-size: 12px; color: #ffffff }
+ div.b { font-weight: bold; color: #ffa500 }
+ a { color: #ffffef; }
+ a:hover { color: #ffffff; }
+ p { font-family:verdana, arial, geneva, helvetica, sans-serif; color:#FFFFFF; font-size:12px; }
+</style>
+<style type="text/css" media="all">
+ a { text-decoration: none; }
+ a:hover { text-decoration:underline; }
+ input { border:2px solid #000000; font-size:12px; color:#000000; background-color: #ffffff; height:23px; padding:2px;}
+ select { border:2px solid #000000; font-family:arial, verdana, helvetica; font-size:11px; color:#000000; height:21px; padding:2px;}
+</style>
+ENDCSS
+
+############### Dieser TeFil enthält Programmcode, der an verschiedenen
+##SHARED-SUBS## Stellen ausgeführt werden muß und jedem Skript zur
+############### Verfügung steht.
+
+sub printfile { # Liest eine externe Datei ein und gibt sie mit print aus
+ my ($file2print,$pagetitle,$bodyclass) = @_;
+ if ($pagetitle ne "") {
+ &start_html($pagetitle,$bodyclass);
+ }
+ open(FILE2PRINT,"<$file2print");
+ while(<FILE2PRINT>) {
+ print "$_\n";
+ }
+ close FILE2PRINT;
+}
+
+sub start_html { # Der HEADER einer HTML-Datei
+ print "<html><head><title>$title - $_[0]</title>$_[2]$style</head>";
+ if ($_[1] eq "start") {
+ print "<body onload=\"document.login.alias.focus();\">";
+ } elsif ($_[1] ne "") {
+ print "<body class=$_[1]>";
+ } else {
+ print "<body>";
+ }
+}
+
+sub post { # Öffentliche Nachricht posten.
+ my ($room,$msg2post,$secroom) = @_;
+ my @rooms = $room;
+ @rooms = ($room,$secroom) if ($room ne $secroom);
+ foreach $raum (@rooms) {
+ open(MSGFILE,">>data/msgs/$raum");
+ print MSGFILE "!<;".time."<;!<;!<;$msg2post<;\n";
+ close MSGFILE;
+ opendir(PID,"data/online/pids/$raum");
+ my @pids = readdir(PID);
+ closedir(PID);
+ foreach(@pids) {
+ if (-f "data/online/pids/$raum/$_") {
+ kill USR1 => $_;
+ }
+ }
+ }
+ &log($msg2post) if ($room eq "Cyberbar");
+}
+
+sub post_prv { # Private Nachricht posten (flüstern).
+ my ($alias2post,$msg2post) = @_;
+ opendir(DIR,"data/online/rooms");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach $raum (@dir) {
+ opendir(DIR,"data/online/rooms/$raum");
+ my @chatter = readdir(DIR);
+ closedir(DIR);
+ foreach $chatter (@chatter) {
+ if ($chatter eq $alias2post) {
+ open(MSGFILE,">>data/msgs/$raum");
+ print MSGFILE "$alias2post<;".time."<;!<;!<;$msg2post<;\n";
+ close MSGFILE;
+ opendir(PID,"data/online/pids/$raum");
+ my @pids = readdir(PID);
+ closedir(PID);
+ foreach(@pids) {
+ if (-f "data/online/pids/$raum/$_") {
+ kill USR1 => $_;
+ }
+ }
+ goto ENDPRV;
+ }
+ }
+ }
+ENDPRV:
+}
+
+sub log { # Protokollieren der Nachrichten etc.
+ my $msg2log = $_[0];
+ my $js;
+ &zeit;
+ ($msg2log,$js) = split(/<script/, $msg2log);
+ open(LOG,">>data/logs/$day.$month.$year");
+ print LOG "<br><font color=ffffef><i>($hours:$min:$sec)</i></font> $msg2log\n";
+ close LOG;
+}
+
+sub zeit { # Aktuelles Datum und Uhrzeit bestimmen.
+ ($sec, $min, $hours, $day, $month, $year) = (localtime)[0..5];
+ $month += 1;
+ $hours = "0".$hours if ($hours < 10);
+ $min = "0".$min if ($min < 10);
+ $sec = "0".$sec if ($sec < 10);
+ $day = "0".$day if ($day < 10);
+ $month = "0".$month if ($month < 10);
+ $year = $year - 100;
+ if ($year < 10) {
+ $year = "200".$year;
+ } else {
+ $year = "20".$year;
+ }
+}
+
+sub error { # Error-Ausgabe.
+ my $error_msg = $_[0];
+ &start_html( "Error: ($error_msg)" );
+ print $q->div( "Error: ($error_msg)" ),
+ $q->end_html;
+ open(ERROR,">>data/error");
+ flock(ERROR, 2);
+ print ERROR "Alias: $alias TempID: $tmpid File. $0 PID: $$ Time: ".time." Message: $error_msg \n";
+ close ERROR;
+ exit 0;
+}
+
+sub check_online { # Auf alte Räume und Chatter prüfen und ggf. entfernen.
+ open(PROVE,">data/online/prove");
+ print PROVE time;
+ close PROVE;
+ opendir(RAUMDIR, "data/online/rooms");
+ my @raumdir = readdir(RAUMDIR);
+ closedir(RAUMDIR);
+ foreach $raum (@raumdir) {
+ opendir(BENUTZERDIR, "data/online/rooms/$raum");
+ my @benutzerdir = readdir(BENUTZERDIR);
+ closedir(BENUTZERDIR);
+ my $raumleer= 1;
+ foreach $benutzer (@benutzerdir) {
+ if (-f "data/online/rooms/$raum/$benutzer") {
+ $raumleer = 0;
+ open (BENUTZER,"<data/online/rooms/$raum/$benutzer");
+ my $benutzerstamp = <BENUTZER>;
+ close BENUTZER;
+ if ($benutzerstamp < (time - 40)) {
+ unlink("data/online/$raum/$benutzer");
+ open (BENUTZER2,"<data/online/users/$benutzer");
+ my $benutzerstamp2 = <BENUTZER2>;
+ close BENUTZER2;
+ if ($benutzerstamp2 < (time - 40)) {
+ if ($benutzer ne $alias) {
+ &rm_alias($benutzer,$raum);
+ } else {
+ unlink("data/online/rooms/$raum/$benutzer");
+ }
+ &zeit;
+ &post($raum,"<i><font color=ffffff>($hours:$min:$sec) $benutzer hat den Chat verlassen ... </font></i>");
+ }
+ }
+ }
+ }
+ opendir(PIDS,"data/online/pids/$raum");
+ my @pids = readdir(PIDS);
+ closedir(PIDS);
+ if ($raumleer == 1) { # Falls Raum leer ist => entf.
+ rmdir("data/online/rooms/$raum");
+ unlink("data/online/rstat/$raum");
+ unlink("data/online/rstat/$raum.away");
+ unlink("data/msgs/$raum");
+ foreach(@pids) {
+ if (-f "data/online/pids/$raum/$_") {
+ unlink("data/online/pids/$raum/$_");
+ }
+ }
+ rmdir("data/online/pids/$raum");
+ } else {
+ foreach(@pids) {
+ unless (kill 0 => $_) {
+ unlink("data/online/pids/$room/$_");
+ }
+ }
+ }
+ }
+}
+
+sub rm_alias { # Falls Benutzer offline gegangen ist
+ my($benutzer,$raum) = @_;
+ unlink("data/online/rooms/$raum/$benutzer");
+ unlink("data/online/users/$benutzer");
+ opendir TMPID, "data/online/tmpid";
+ my @tmpid = readdir(TMPID);
+ close(TMPID);
+ foreach(@tmpid) {
+ unlink("data/online/tmpid/$_") if (/^$benutzer\..+$/);
+ }
+ unlink("data/online/ident/$benutzer");
+ &rm_rstat($benutzer,$raum);
+}
+
+sub rm_rstat { # Benutzer als Raumbesetzer austragen
+ my ($r_alias,$rstatroom) = @_;
+ open (RSTAT,"<data/online/rstat/$rstatroom");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ my @rstat2 = ($rstat[0],$rstat[1]);
+ for ($i=2;$i<=$#rstat;$i++) {
+ chomp($rstat[$i]);
+ push(@rstat2,$rstat[$i]."\n") if ($rstat[$i] ne $r_alias);
+ }
+ open (RSTAT,">data/online/rstat/$rstatroom");
+ flock(RSTAT, 2);
+ print RSTAT @rstat2;
+ close RSTAT;
+}
+
+sub rm_away { # Benutzer als Raumbesetzer austragen
+ my ($a_alias,$rstatroom) = @_;
+ open (AWAY,"<data/online/rstat/$rstatroom.away");
+ my @away = <AWAY>;
+ close AWAY;
+ my @away2;
+ foreach (@away) {
+ my @split = split(/<;/);
+ push(@away2, $_) if ($a_alias ne $split[0]);
+ }
+ open (AWAY,">data/online/rstat/$rstatroom.away");
+ print AWAY @away2;
+ close AWAY;
+}
+
+sub secure_checkid { # TmpID überprüfen
+ my ($alias2check) = $_[0];
+ unless (-f "data/online/tmpid/$alias.$tmpid") {
+ &error("Falsche TempID!");
+ }
+}
+
+sub hierachie { # Chatter nach SU überprüfen.
+ open WA, "<data/wa";
+ my @was = <WA>;
+ close WA;
+ foreach(@was) {
+ chomp;
+ if ($_ eq $_[0]) {
+ return "wa";
+ }
+ }
+ open OW, "<data/ow";
+ my @ows = <OW>;
+ close OW;
+ foreach(@ows) {
+ chomp;
+ if ($_ eq $_[0]) {
+ return "ow";
+ }
+ }
+}
+
+sub prove_besetzer { # Prüfen, ob Benutzer Raumbesetzerrechte hat
+ my ($alias,$room,$method) = @_;
+ open DATEI,"<data/online/rstat/$room";
+ my @rstat = <DATEI>;
+ close DATEI;
+ if ($method eq "return_list") {
+ my @value;
+ for($i=2;$i<=$#rstat;$i++) {
+ push @value,$rstat[$i];
+ }
+ return @value;
+ }
+ for($i=2;$i<=$#rstat;$i++) {
+ chomp($rstat[$i]);
+ if ($rstat[$i] eq $alias) {
+ return 1;
+ }
+ }
+}
+
+sub prove_away { # Prüfen, ob Benutzer abgemeldet ist
+ my ($a_alias,$room,$method) = @_;
+ open(DATEI,"<data/online/rstat/$room.away");
+ @away = <DATEI>;
+ close DATEI;
+ if ($method eq "return_list") {
+ my $away2;
+ foreach(@away) {
+ push @away2,split(/<; /);
+ }
+ return @away2;
+ }
+ my $alias, $away;
+ foreach(@away) {
+ if (/^$a_alias.*/) {
+ ($alias,$away) = split(/<; /);
+ chomp($away);
+ return $away;
+ }
+ }
+}
+
+sub random_color {
+ my @digit = ("F","C","A","B",5..9);
+ my $dig1 = rand(@digit);
+ my $dig2 = rand(@digit);
+ my $dig3 = rand(@digit);
+ my $dig4 = rand(@digit);
+ my $dig5 = rand(@digit);
+ my $dig6 = rand(@digit);
+ return $digit[$dig1].$digit[$dig2].$digit[$dig3].$digit[$dig4].$digit[$dig5].$digit[$dig6];
+}
+
+
+# sub debug { open DEBUG,">data/debug"; while(@_) { chomp; print DEBUG "$_\n"; } close DEBUG;} \ No newline at end of file
diff --git a/0.6.2/help.sno b/0.6.2/help.sno
new file mode 100644
index 0000000..2bffa92
--- /dev/null
+++ b/0.6.2/help.sno
@@ -0,0 +1,62 @@
+<div>
+ Alle Chat-Befehle:
+</div>
+<hr>
+<table border=1>
+<tr><th><div>SU</div></th><th><div>Befehl</div></th><th><div>Beschreibung</div></th></tr>
+<tr><td><div>NC</div></td><td><div>/about</div></td><td><div>Zeigt aktuelle Version und andere Infos der Community an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/away <font color=red>Nachricht</font></div></td><td><div>Abmelden mit einer<font color=red>Abmeldenachricht</font></div></td></tr>
+<tr><td><div>NC</div></td><td><div>/clear</div></td><td><div>Bildschirm wird gelöscht</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/col <font color=red>XXXXXX</font> <font color=ffa500>XXXXXX</font></div></td><td><div>Farbe/n (<font color=red>Namensfarbe</font> / <font color=ffa500>Textfarbe</font>) wechseln. Angabe in Hexadezimal. Wird gar keine Farbe angegeben, dann wird eine zufällige generiert!</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/date</div></td><td><div>Zeigt aktuelles Datum und Urzeit an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/j <font color=red>Raumname</font></div></td><td><div>Raum wechseln/erstellen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ju <font color=red>Alias</font></div></td><td><div>In den Raum wechseln/folgen, wo sich <font color=red>Alias</font> befindet.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/m <font color=red>Aktion</font></div></td><td><div>Handeln mit 2 Farben</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/me <font color=red>Aktion</font></div></td><td><div>Handeln mit einer Farbe</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/memo <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine <font color=ffa500>Memonachricht</font> hinterlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/msg <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine private <font color=ffa500>Nachricht</font> flüstern</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ <font color=ffa500>Nachricht</font></div></td><td><div>Eine private <font color=ffa500>Nachricht</font> demjenigen flüstern, dem zuletzt eine geflüstert wurde</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/online <font color=red>Alias</font></div></td><td><div>Zeigt Onlineminuten von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/q</div></td><td><div>Chat verlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/rmgb</div></td><td><div>Das eigene Gästebuch komplett weglöschen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/s <font color=red>Nachricht</font></div></td><td><div><font color=red>Nachricht</font> schreien</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/seen <font color=red>Alias</font></div></td><td><div>Zeigt an, vor wieviel Stunden sich <font color=red>Nachricht</font> zum letzten Mal in das System eingelogt hat</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/w</div></td><td><div>Zeigt an, wer sich im aktuellen Raum befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc <font color=red>Raum</font></div></td><td><div>Zeigt an, wer sich im <font color=red>Raum</font> befindet. Wird kein Raum angegeben, dann wird ledeglich angezeigt, wer sich im System befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc/</div></td><td><div>Zeigt alle offenen Räume und deren Chatter an</div></td></tr>
+<tr><td><div>NC</div></td><td> <div>/wj <font color=red>Alias</font></div></td><td><div>Zeigt an, in welchen Raum sich <font color=red>Alias</font> befindet</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/l</div></td><td><div>Der aktuelle Raum wird ab- bzw. aufgesperrt</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/rsu <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> die Raumbesetzerrechte entnehmen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/su <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Raumbesetzer ernennen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/t <font color=red>Thema</font></div></td><td><div>Dem aktuellen Raum wird ein <font color=red>Thema</font> gegeben</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban</div></td><td><div>Zeigt alle verbannten Benutzer an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> verbannen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/rban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> "entbannen"</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/banip <font color=red>Alias</font></div></td><td><div>Die IP-Nummer von <font color=red>Alias</font> verbannen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/rbanip ip://<font color=red>x.x.x.x</font></div></td><td><div>Die IP-Nummer <font color=red>x.x.x.x</font> "entbannen"</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ip <font color=red>Alias</font></div></td><td><div>Zeigt die IP-Nummer von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/img</div></td><td><div>Versteckt/reaktiviert das eigene Superuser-Logo im Online-Frame</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/k <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird aus dem Chat katapultiert!</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/o <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird aus dem Chat ausgeloggt!</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/sl <font color=red>Raum</font></div></td><td><div>Einen anderen <font color=ffa500>Raum</font> absperren</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ss <font color=red>Raum</font> <font color=ffa500>Nachricht</font></div></td><td><div>Eine <font color=ffa500>Nachricht</font> in <font color=red>Raum</font> hinüber rufen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/st <font color=red>Raum</font> <font color=ffa500>Thema</font></div></td><td><div>Einem anderen <font color=ffa500>Raum</font> ein <font color=ffa500>Thema</font > geben</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/kill <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird ganz und gar aus dem System entfernt</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/wa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Wächter ernennen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/rwa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom Wächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/sys <font color=red>Nachricht</font></div></td><td><div>Systemnachricht schreiben. (Erscheint in allen existierenden Räumen)</div></td></tr>
+</table><hr>
+<div>
+ Zur Erklärung: NC steht für "Normale Chatter", RB für "Raumbesetzer", WÄ für "Wächter" und OW für "Oberwächter".
+ Obrige Befehle können nur von der/den jeweiligen Benutzergruppe/n ausgeführt werden.<br><br>
+ Allerdings gibt es folgendes zu beachten: Oberwächter verfügen über alle Chatbefehle. Normale Wächter über alle Chatbefehle, außer über die der Oberwächter.
+ Raumbesetzer können nur Raumbesetzerbefehle und die Befehle der normalen Chatter durchführen. Normale Chatter haben ledeglich die Standardbefehle zu verwenden.<br><br>
+ Weitere Besonderheiten der Wächter und Oberwächter:<br><br>
+ Wächter und Oberwächter können ....<br>
+ ... abgesperrte Chaträume problemlos betreten.<br>
+ ... nicht gekickt, verbannt oder gekillt werden.<br><br>
+ Nur Oberwächer können Logdateien der Cyberbar lesen!<br><br>
+ Oberwächter ernennt nur der Systemadministrator!
+</div>
+</body>
+</html> \ No newline at end of file
diff --git a/0.6.2/htdocs.pl b/0.6.2/htdocs.pl
new file mode 100644
index 0000000..f23c8d6
--- /dev/null
+++ b/0.6.2/htdocs.pl
@@ -0,0 +1,258 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print $q->header;
+
+$var = $q->param("var");
+
+if ($var eq "help_html") {
+ &printfile("help.sno","Alle Chatbefehle");
+} elsif ($var eq "logo_html") {
+ &start_html("Logo");
+print<<END;
+<layer top=-3 left=0><div style="position:absolute; top:5; left:10">
+<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
+ codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0"
+ WIDTH=48 HEIGHT=48>
+ <PARAM NAME=movie VALUE="$gfxpath/ySymbol.swf">
+ <PARAM NAME=loop VALUE=false>
+ <PARAM NAME=menu VALUE=false>
+ <PARAM NAME=quality VALUE=high>
+ <PARAM NAME=scale VALUE=noborder>
+ <PARAM NAME=wmode VALUE=opaque>
+ <PARAM NAME=bgcolor VALUE=#005146>
+ <EMBED src="$gfxpath/ySymbol.swf" loop=false menu=false quality=high scale=noborder wmode=opaque bgcolor=#005146
+ WIDTH=48 HEIGHT=48 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED>
+</OBJECT>
+</div></layer>
+END
+print $q->end_html;
+} elsif ($var eq "menu_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ $tmp = $q->param("tmp");
+ &menu_html;
+} elsif ($var eq "werda_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &werda_html;
+} elsif ($var eq "logs_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ &logs_html;
+} elsif ($var eq "view_logs_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $tmp = $q->param("tmp");
+ &secure_checkid($alias);
+ if (&hierachie($alias) eq "ow") {
+ &printfile($tmp,"Logdatei","blank");
+ }
+} elsif ($var eq "superuser_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ &superuser_html;
+} elsif ($var eq "chatiquette_html") {
+ &printfile("chatiq.sno","Chatiquette");
+ print $q->end_html;
+} else {
+ print
+ $q->start_html(-bgcolor=>"000000"),
+ $q->end_html;
+}
+
+sub menu_html {
+if ($tmp eq "quit") {
+ &start_html("Quit","blank","<script language=\"JavaScript\">open(\"index.pl?tmp=quit\",\"_top\");</script>");
+ print $q->end_html;
+ &secure_checkid($alias);
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffffff>$alias verläßt den Chat ... </font></i>");
+ sleep 2;
+ &rm_alias($alias,$room);
+ exit;
+}
+ENDJS
+ &start_html("Menü","blank");
+print <<END;
+<script language="JavaScript">
+function fenster(fenster,target) {
+ open(fenster,target,"width=500,height=500,screenX=100,screenY=100,scrollbars");
+}
+</script>
+<font size=2 face=verdana><p>
+ <a href='javascript:fenster("htdocs.pl?var=werda_html&alias=$alias&room=$room&col=$col&secol=$secol&tmp=$tmp&tmpid=$tmpid","weristda")'>Wer ist da?</a>
+ <a href='javascript:fenster("main2.pl?var=edit_profile_html&alias=$alias&tmpid=$tmpid&room=$room","ProfilAendern")'>Profil ändern</a>
+ <a href='javascript:fenster("main2.pl?var=edit_options_html&alias=$alias&tmpid=$tmpid&room=$room","Optionen")'>Optionen</a>
+ <a href='javascript:fenster("main2.pl?var=list_alias_html&alias=$alias&tmpid=$tmpid","Benutzerliste")'>Benutzer</a>
+ <a href='javascript:fenster("htdocs.pl?var=help_html&tmpid=$tmpid","Befehle")'>Befehle</a>
+ <a href='javascript:fenster("main2.pl?var=gb_html&alias=$alias&tmpid=$tmpid","Board")'>Board</a><br>
+ <a href='javascript:fenster("htdocs.pl?var=superuser_html&alias=$alias&tmpid=$tmpid","Superuser")'>Superuser</a>
+ <a href='javascript:fenster("htdocs.pl?var=logs_html&alias=$alias&tmpid=$tmpid","Logdateien")'>Logs</a>
+ <a href='javascript:fenster("stat.pl?&alias=$alias&tmpid=$tmpid","Statistik")'>Statistik</a>
+ <a href='javascript:fenster("htdocs.pl?var=chatiquette_html","Chatiquette")'>Chatiquette</a>
+ <a href="http://www.home.yChat.de" target="Home">Home</a>
+ <a href="http://www.credits.yChat.de" target="Credits">Credits</a>
+ <a href="htdocs.pl?alias=$alias&var=menu_html&room=$room&tmpid=$tmpid&tmp=quit">Verlassen</a>
+</p></font>
+</body>
+</html>
+END
+}
+
+sub werda_html { # Anzeige, wer eingelogt ist.
+ &start_html("Wer ist da?");
+ print <<END;
+<div>
+ $alias, schön daß Du hier bist :-)
+</div>
+<hr>
+<div>
+ Folgende Personen befinden sich im Chat:
+</div>
+<br>
+<div>
+END
+ opendir(ROOMDIRS,"data/online/rooms");
+ local @roomdirs = readdir(ROOMDIRS);
+ close(ROOMDIRS);
+ foreach(@roomdirs) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ my $room = $_;
+ open(RSTAT,"<data/online/rstat/$room");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ opendir(ROOMDIR,"data/online/rooms/$room");
+ my @roomdir = readdir(ROOMDIR);
+ close(ROOMDIR);
+ local $nr = $#roomdir-1;
+ print $q->b( $_ ),
+ " $door ($nr) Raumthema: $rstat[1]",
+ $q->br;
+ foreach(@roomdir) {
+ if ($_ ne ".." && $_ ne ".") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid" }, "$_"), " ";
+ }
+ }
+ print $q->br, $q->br;
+ }
+ }
+ print
+ "</div>",
+ $q->end_html;
+}
+
+sub logs_html {
+ &start_html("Logdateien");
+ print <<END;
+<div>
+ Hier befinden sich alle Logdateien
+</div>
+<hr>
+END
+ if (&hierachie($alias) eq "ow") {
+ print $q->div( "Folgende Logdateien des Raumes \"Cyberbar\" können nur von Oberwächtern gelesen werden (Sortiert nach A-Z, a-z):" ),
+ $q->br;
+ opendir(LOGS,"data/logs");
+ local @logs = readdir(LOGS);
+ closedir(LOGS);
+ local @sortedir = sort(@logs);
+ foreach(@sortedir) {
+ if (-f "data/logs/$_") {
+ print $q->a( { -href=>"htdocs.pl?alias=$alias&var=view_logs_html&tmp=data/logs/$_&tmpid=$tmpid",
+ -target=>"_new" },
+ "$_" ),
+ " ";
+ }
+ }
+ } else {
+ print $q->div( "Logdateien können nur von Oberwächtern (OW) gelesen werden. Du bist jedoch ein Wächter (WÄ) oder ein",
+ "\"Normaler Chatter\". Oberwächter können alles nachlesen, was öffentlich im Raum \"Cyberbar\" gechattet wurde." ),
+ $q->hr;
+ &printfile("data/htdocs/logs_html");
+ }
+ print
+ $q->end_html;
+}
+
+sub superuser_html { # Zeigt an, wer Superuser ist
+ start_html("Superuser");
+ print "<div>Hallo $alias. Du bist als ";
+ my $hierachie = &hierachie($alias);
+ if ($hierachie eq "ow") {
+ print
+ $q->b( "Oberwächter" ),
+ " (OW) eingetragen.</div>",
+ $q->hr;
+ } elsif ($hierachie eq "wa") {
+ print
+ $q->b( "Wächter" ),
+ " (WÄ) eingetragen.</div>",
+ $q->hr;
+ } else {
+ print
+ $q->b( "normaler Chatter" ),
+ " (NC) eingetragen.</div>",
+ $q->hr;
+ }
+
+my @was, @ows;
+if (hierachie eq "wa" || $hierachie eq "ow") {
+ open WA, "<data/wa";
+ @was = <WA>;
+ close WA;
+ open OW, "<data/ow";
+ @ows = <OW>;
+ close OW;
+} else {
+ open WA, "<data/wa2";
+ @was = <WA>;
+ close WA;
+ open OW, "<data/ow2";
+ @ows = <OW>;
+ close OW;
+}
+ my $nrow = $#ows+1;
+ print
+ "<div>",
+ $q->b( "OW" ),
+ "s ($nrow Stück)";
+ foreach(@ows) {
+ print
+ $q->font( { -color=>"ffa500" },
+ " ".$_);
+ }
+ my $nrwa = $#was+1;
+ print
+ "</div>",
+ $q->hr,
+ "<div>",
+ $q->b( "WÄ" ),
+ "s ($nrwa Stück)";
+ foreach(@was) {
+ print
+ $q->font( { -color=>"FFA500" },
+ " ".$_);
+ }
+print <<END;
+<hr>
+ Die jeweiligen Fähigkeiten der Oberwächter (OW) und der Wächter (WÄ) sind unter
+ "<a href="htdocs.pl?var=help_html">Chat-Befehle</a>"
+ dokumentiert. Versteckte Superuser können nur von anderen Superusern auf
+dieser Liste eingesehen werden!
+</div>
+</body>
+</html>
+END
+} \ No newline at end of file
diff --git a/0.6.2/index.pl b/0.6.2/index.pl
new file mode 100644
index 0000000..055b878
--- /dev/null
+++ b/0.6.2/index.pl
@@ -0,0 +1,526 @@
+#!/usr/bin/perl
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print $q->header;
+
+$var = $q->param("var");
+$alias = $q->param("alias");
+$pw = $q->param("pw");
+$tmp = $q->param("tmp");
+
+#exit 0 if ($ENV{'HTTP_USER_AGENT'} eq "Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; Win 9x 4.90)");
+
+if ($var eq "create_alias_html") {
+ &create_alias_html;
+} elsif ($var eq "create_alias") {
+ &create_alias;
+} elsif ($var eq "login_html") {
+ &login_html;
+} elsif ($var eq "chatiquette_html") {
+ &chatiquette_html;
+} elsif ($alias eq "") {
+ &login_html;
+} else {
+ &checklogin;
+}
+
+sub login_html { # Erste Startseite
+&check_online;
+local $counter = undef;
+open(COUNT,"<data/count");
+ $counter = <COUNT>;
+close COUNT;
+$counter++;
+open(COUNT,">data/count");
+ flock(COUNT, 2);
+ print COUNT $counter;
+close COUNT;
+opendir(USERS,"data/online/users");
+ my @users = readdir(USERS);
+closedir(USERS);
+opendir(REGISTRED,"data/user/options");
+ local @registred = readdir(REGISTRED);
+closedir(REGISTRED);
+my ($logtin,$users) = ($#users-1,$#registred-1);
+&start_html("Created & Copyright by Paul C. Bütow","start");
+print <<END;
+ <center>
+ <table width=500>
+ <tr>
+ <td>
+ <center>
+ <table>
+ <tr>
+ <td>
+ <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0" WIDTH=240 HEIGHT=240>
+ <param name=movie value="$gfxpath/yIntro.swf">
+ <param name=loop value=false>
+ <param name=menu value=false>
+ <param name=quality value=high>
+ <param name=scale value=noborder>
+ <param name=wmode value=opaque>
+ <param name=bgcolor value=#005146>
+ <embed src="$gfxpath/yIntro.swf" loop=false menu=false quality=high scale=noborder wmode=opaque bgcolor=#005146 WIDTH=240 HEIGHT=240 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED>
+ </object>
+ </td>
+ <td>
+ <div>
+ yChat: Version $version
+ <br><br>
+ Letztes Update: $datum
+ <br><br>
+ Seitenaufrufe: $counter
+ <br><br>
+ Benutzer registriert: $users
+ <br><br>
+ Benutzer online: $logtin
+ <br><br>
+ Benutzerlimit: $limit
+ <br><br>
+ Webmaster: <a href="mailto:mail\@paulbuetow.de">Paul C. Bütow</a>
+ <br><br>
+ Page: <a href="http://www.PaulBuetow.de">www.PaulBuetow.de</a>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </center>
+ </div>
+ <br>
+ <br>
+END
+ if ($tmp eq "true") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Wahrscheinlich existiert Dein Alias "$alias" nicht,
+ <br>
+ Du hast Dich verschrieben oder das Passwort ist falsch.
+ <br>
+ Versuch es erneuert !
+ </div>
+END
+ } elsif ($tmp eq "quit") {
+print <<END;
+ <div>
+ Du hast soeben den Chat verlassen.
+ <br>
+ Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ } elsif ($tmp eq "autologout") {
+print <<END;
+ <div>
+ Du wurdest automatisch aus dem Chat ausgeloggt. Grund: Du warst 10 Minuten inaktiv.
+ <br>
+ Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ } elsif ($tmp eq "banned") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wurdest aus dem Chat verbannt!!!
+ <br>
+ Z.z. kannst Du Dich leider nicht in den Chat einloggen.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($tmp eq "kick") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wurdest soeben aus dem Chat katapultiert!
+ <br>
+ Schlechtes Verhalten mag die Ursache hierfür sein.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($tmp eq "logout") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wurdest soeben aus dem Chat ausgeloggt!
+ <br>
+ Ursache hierfür mag sein, daß der Chat voll war und Du Dich nicht am
+ Geschehen beteiligt- und unnötige Chatkapazitäten in Anspruch
+ genommen hast.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($tmp eq "full") {
+ print "<div class=b>ACHTUNG!</div><div>Der Chat ist leider voll! Bitte versuch Dich später noch mal einzuloggen!</div>";
+ } elsif ($var eq "create_alias") {
+print "<div>Du hast sich soeben in die Datenbank eingetragen. Einfach auf \"Los Geht's\" klicken :-)</div>";
+ } else {
+print <<END;
+ <div>
+ Herzlich willkommen!
+ <br>
+ Einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ }
+
+print <<END;
+ <hr>
+ <form name="login" action="index.pl" method="post">
+ <input type="hidden" name="tmp" value="true">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Alias:
+ <br>
+ <input name="alias" value="$alias">
+ </div>
+ </td>
+ <td>
+ <div>
+ Dein Passwort:
+ <br>
+ <input type="password" name="pw" value="$pw">
+ </div>
+ </td>
+ </tr>
+ </table>
+ <br>
+ <br>
+ <div>
+ Solltest Du noch keinen Nick besitzen, dann auf "Registrieren" klicken!
+ </div>
+ <br>
+ <table>
+ <tr>
+ <td>
+ <font color="ffffff">
+ <input type="submit" value="Los geht's!">
+ </font>
+ </form>
+ </td>
+ <td>
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias_html">
+ <font color="ffffff">
+ <input type="submit" value="Registrieren">
+ </font>
+ </form>
+ </td>
+ </tr>
+ </table>
+ <hr>
+END
+if ($logtin > 0) {
+ print "<div>Folgende Personen sind eingeloggt:<br><font size='1'>";
+ foreach(@users) {
+ print "$_ " if (-f "data/online/users/$_");
+ }
+ print "</font></div>";
+}
+print<<END;
+ </td>
+ </tr>
+ </table>
+ </center>
+</body>
+</html>
+END
+ if (-d "data/online/rooms") {
+ } else {
+ mkdir "data/online/rooms", 0777;
+ }
+}
+
+
+sub chatiquette_html {
+&start_html("Registration");
+print <<END;
+ <center>
+ <table width=500>
+ <tr>
+ <td>
+END
+open CHATIQ, "chatiq.sno";
+ foreach(<CHATIQ>) {
+ last if (/^\n+$/);
+ print $_;
+ }
+WEITER:
+close CHATIQ;
+print<<END;
+ </td>
+ </tr>
+ </table>
+ </center>
+</body>
+</html>
+END
+}
+
+sub create_alias_html { # HTML-Form für Erstellung eines neuen Benutzers.
+ open(BAN,"<data/ban");
+ my @ban = <BAN>;
+ close BAN;
+ foreach(@ban) {
+ chomp;
+ if ($_ eq "ip://".$ENV{'REMOTE_ADDR'}) {
+ $tmp = "banned";
+ &login_html;
+ exit 0;
+ }
+ }
+my $reload = $_[0];
+&start_html("Registration");
+print <<END;
+ <center>
+ <table width=500>
+ <tr>
+ <td>
+END
+ if ($reload eq "alias_exists") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Der von Dir gewählte Benutzername "$alias" existiert in unserer Datenbank bereits. Bitte versuch es erneuert mit
+ einem anderen Benutzernamen !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "pw_wrong") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Deine beiden Passworteingaben stimmen nicht überein. Bitte geb das Passwort erneuert an um sicherzugehen, daß
+ kein falsches Passwort abgespeichert wird !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "alias_prohibited") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein gewählter Benutername "$alias" enthält illegale Zeichen. Bitte versuch einen anderen Benutzernamen!
+ </div>
+ <hr>
+END
+} elsif ($reload eq "alias_length") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein gewählter Benutername "$alias" enthält zu viele Zeichen. Es sind maximal 15 Zeichen erlaubt!!
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Hier kannst Du Dich registrieren. Bitte beachte, daß die Passworteingabefelder übereinstimmen!
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="index.pl">
+ <input type="hidden" name="var" value="create_alias">
+ <div>
+ Dein Alias:
+ <font color="ffa500">
+ (Muß angegeben werden)
+ </font>
+ <br>
+ <input name="alias" VALUE="$alias">
+ </div>
+ <br>
+ <div>
+ Dein gewünschtes Passwort:
+ <br>
+ <input type="password" name="pw" value="$pw">
+ </div>
+ <br>
+ <div>
+ Geb hier Dein Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp">
+ </div>
+ <br>
+ <font color=ffffff>
+ <input type="submit" value="Registrieren">
+ </font>
+ <br>
+ </form>
+ <hr>
+ <div>
+ Um den Chat zu betreten müssen die Daten nach der Registration auf der Startseite erneuert bestätigt werden !
+ </div>
+ </td>
+ </tr>
+ </table>
+</center>
+</body>
+</html>
+END
+}
+
+sub checklogin { # Überprüfen, ob die Login-Daten korrekt sind.
+opendir(USERS,"data/online/users");
+ my @users = readdir(USERS);
+closedir(USERS);
+ my $users = $#users;
+ my $hierachie = &hierachie($alias);
+ if ($users > $limit && $hierachie ne "wa" && $hierachie ne "ow") {
+ $tmp = "full";
+ &login_html;
+ exit 0;
+ }
+ my $lognotexists = "true";
+ opendir(USERDIR,"data/user/options");
+ my @userdir = readdir(USERDIR);
+ closedir(USERDIR);
+ foreach $user (@userdir) {
+ if ($user eq $alias) {
+ if ($alias eq "Swesda" || $alias eq "ErausNRW") {
+ open SWESDA, ">>data/$alias";
+ print SWESDA $ENV{'HTTP_USER_AGENT'}."\n";
+ close SWESDA;
+ }
+ open(OPTIONS,"<data/user/options/$alias");
+ my @options = <OPTIONS>;
+ close OPTIONS;
+ foreach(@options) {
+ chomp $_;
+ }
+ if ($options[0] eq $pw) {
+ open(BAN,"<data/ban");
+ my @ban = <BAN>;
+ close BAN;
+ foreach(@ban) {
+ chomp;
+ if ($_ eq $alias || $_ eq "ip://".$ENV{'REMOTE_ADDR'}) {
+ if (-f "data/online/users/$admin") {
+ &zeit;
+ &post_prv($admin,"<font color=ffffff><font color=ffa500>$_</font> kann sich nicht einloggen (Ist verbannt)!!</font>");
+ }
+ $tmp = "banned";
+ &login_html;
+ exit 0;
+ }
+ }
+ if ($options[1] eq undef) { $col = &random_color;}
+ else { $col = $options[1]; }
+ if ($options[2] eq undef) { $secol = &random_color;}
+ else { $secol = $options[2];}
+ if ($options[3] eq undef) { $maxVerlauf = "10";}
+ else { $maxVerlauf = $options[3];}
+ if ($options[4] eq undef) { $verlaufOrder = "1";}
+ else {$verlaufOrder = $options[4];}
+ my @digit = (A..Z, a..z, 0..9, "-", ".");
+ my $num1 = rand(@digit);
+ my $num2 = rand(@digit);
+ my $num3 = rand(@digit);
+ my $num4 = rand(@digit);
+ my $num5 = rand(@digit);
+ my $num6 = rand(@digit);
+ my $num7 = rand(@digit);
+ my $num8 = rand(@digit);
+ my $num9 = rand(@digit);
+ my $num10 = rand(@digit);
+ $tmpid = $digit[$num1].$digit[$num2].$digit[$num3].$digit[$num4].$digit[$num5].$digit[$num6].$digit[$num7].$digit[$num8].$digit[$num9].$digit[$num10];
+ open TMPID, ">data/online/tmpid/$alias.$tmpid";
+ print TMPID $alias;
+ close TMPID;
+ open IDENT, ">data/online/ident/$alias" ;
+ print IDENT "$ENV{'REMOTE_ADDR'}\n$tmpid\n$ENV{'HTTP_USER_AGENT'}";
+ close IDENT;
+ open LASTLOGIN, ">data/user/lastlogin/$alias";
+ print LASTLOGIN time;
+ close LASTLOGIN;
+ &frameset_html;
+ exit 0;
+ } else {
+ $lognotexists = "false";
+ }
+ }
+ }
+ &login_html; # Falls Login-Daten inkorrekt sind, zurück zur Startseite.
+}
+
+sub create_alias { # Erstellung eines neuen Benutzers.
+ if ($alias =~ /\W/ || $alias eq "") {
+ goto CREATE if ($alias =~ /[-]/ && $alias !~ /\W/);
+ &create_alias_html("alias_prohibited");;
+ exit 0;
+ } elsif ($pw ne $tmp) {
+ &create_alias_html("pw_wrong");
+ exit 0;
+ } elsif (length($alias) >= 15) {
+ &create_alias_html("alias_length");
+ exit 0;
+ }
+CREATE:
+ opendir(USERDIR,"data/user/options");
+ my @user = readdir(USERDIR);
+ close USERDIR;
+ foreach $user (@user) {
+ if ($user eq $alias) {
+ &create_alias_html("alias_exists");
+ exit;
+ }
+ }
+ open(OPTIONS,">data/user/options/$alias");
+ print OPTIONS $pw."\n";
+ close OPTIONS;
+ local $number = $#user;
+ &zeit;
+ &post("Cyberbar","<i><font color=ffffff>($hours:$min:$sec)</font> <font color=ffffff>$alias [$number] hat sich soeben als neuer Benutzer registriert :-) ...</font></i>");
+ &login_html;
+}
+
+sub frameset_html {
+print <<END;
+<html>
+ <head>
+ <title>
+ $title - Powered by CXG - Chatters of the next generation
+ </title>
+ </head>
+<frameset border=0 frameborder=0 framespacing=0 cols="130,*">
+ <frameset border=0 frameborder=0 framespacing=0 rows="300,*,55">
+ <frame name="online" src="online.pl?room=Cyberbar&alias=$alias&tmpid=$tmpid">
+ <frame src="htdocs.pl">
+ <frameset border=0 frameborder=0 framespacing=0 cols="70,*">
+ <frame name="logo" src="htdocs.pl?var=logo_html" scrolling="no">
+ <frame name="reload" src="htdocs.pl" scrolling="no">
+ </frameset>
+ </frameset>
+ <frameset border=0 frameborder=0 framespacing=0 rows="60,*,55">
+ <frame name="menu" src="htdocs.pl?alias=$alias&var=menu_html&room=Cyberbar&col=$col&secol=$secol&tmpid=$tmpid" scrolling="no">
+ <frame name='main' src='push.pl?room=Cyberbar&alias=$alias&tmpid=$tmpid'>
+ <frame name="input" src="input.pl?alias=$alias&room=Cyberbar&col=$col&secol=$secol&tmp=login&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder" scrolling="no">
+ </frameset>
+</frameset>
+</html>
+END
+} \ No newline at end of file
diff --git a/0.6.2/input.pl b/0.6.2/input.pl
new file mode 100644
index 0000000..3960501
--- /dev/null
+++ b/0.6.2/input.pl
@@ -0,0 +1,204 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print $q->header();
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+&secure_checkid($alias);
+$room = $q->param("room");
+$col = $q->param("col");
+$secol = $q->param("secol");
+$tmp = $q->param("tmp");
+$whisper = $q->param("whisper");
+$maxVerlauf = $q->param("maxVerlauf");
+$verlaufOrder = $q->param("verlaufOrder");
+
+if ($maxVerlauf eq undef) { $maxVerlauf = "10";}
+if ($verlaufOrder eq undef) { $verlaufOrder = "1";}
+
+if ($tmp eq "login") {
+ &zeit;
+ if ($alias ne 'Snooper'){
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias hat den Chat betreten ...</font></i>");
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) Der Snooper hat den Chat betreten ...</font></i>");
+ }
+}
+
+print <<END;
+<html>
+<head>
+<script language="JavaScript"><!--
+
+// Einstellungsvariablen
+maxVerlauf = $maxVerlauf; // Anzahl der Einträge des Verlaufs
+maxPreview = 20; // Zeichenlänge der Verlaufsvorschau
+verlaufOrder = $verlaufOrder; // Neue Nachrichten von: 0=oben, 1=unten
+//autoAwayTimeout = 20; // Sekunden, nach denen der User 'Away' gesetzt wird
+//autoQuitTimeout = 40; // Sekunden, nach denen der User den Chat verlässt
+autoAwayTimeout = 300; // Sekunden, nach denen der User 'Away' gesetzt wird
+autoQuitTimeout = 1200; // Sekunden, nach denen der User den Chat verlässt
+
+// Interne Variablen
+userNotFocused = false; // Wenn User nicht schreibt
+userAway = false; // Wenn User automatisch auf 'Away' gesetzt ist
+userAwayTime = 0; // Sekunden, die User 'Away' ist
+fullVerlauf = new Array( maxVerlauf ); // Verlaufspuffer
+
+function delout()
+{
+ addVerlauf (document.inf.msg.value); // Dem Verlauf eine Nachricht anhängen
+ document.inf.msg.focus(); // Fukus in das Eingabeform
+ document.inf.msg.select(); // Text im Eigabeform markieren
+ document.inf.submit(); // Formular absenden
+ return false; // Abbrechen, damit das Frame nicht neu geladen wird
+}
+
+function CheckAuswahl()
+{
+ id=document.verlaufform.verlauf.selectedIndex; // ID des ausgewählten Feldes
+
+ if (fullVerlauf[id-1] != null) // Nur, wenn das Feld nicht leer ist
+ {
+ document.inf.msg.value = fullVerlauf[id-1]; // Eintrag ins Textfeld
+ }
+
+ document.verlaufform.verlauf.selectedIndex = 0; // Ersten Eintrag (Überschrift) auswählen
+ document.inf.msg.focus(); // Eingabefeld fokusieren
+
+ return true;
+}
+
+function addVerlauf (msg)
+{
+ if (msg == "") // Falls msg leer
+ return false; // Aufruf ignorieren
+
+ if (verlaufOrder) // neue Nachrichten von unten
+ {
+ for (i=0; i<(maxVerlauf-1); i++) // Alle Einträge einen aufrutschen
+ {
+ document.verlaufform.verlauf.options[i+1].text = document.verlaufform.verlauf.options[i+2].text;
+ fullVerlauf[i] = fullVerlauf[i+1];
+ }
+ }
+ else // neue Nachrichten von oben
+ {
+ for (i=(maxVerlauf-2); i>=0; i--) // Alle Einträge einen aufrutschen
+ {
+ document.verlaufform.verlauf.options[i+2].text = document.verlaufform.verlauf.options[i+1].text;
+ fullVerlauf[i+1] = fullVerlauf[i];
+ }
+ }
+
+ if (msg.length > maxPreview) // Vorschau zuschneiden
+ pre = msg.slice(0, maxPreview-3) + "...";
+ else
+ pre = msg;
+
+ if (verlaufOrder) // pos = Position des neuen Eintrags
+ pos = maxVerlauf-1;
+ else
+ pos = 0
+
+ document.verlaufform.verlauf.options[pos+1].text = pre; // Neue Vorschau anfügen
+ fullVerlauf[pos] = msg; // Neuen Eintrag an den Verlauf anfügen
+
+// document.verlaufform.verlauf.selectedIndex = maxVerlauf; // Fokus auf den letzten Eintrag
+ document.verlaufform.verlauf.selectedIndex = 0; // Fokus auf den ersten Eintrag (Überschrift)
+}
+
+function msgBlur()
+{
+ userNotFocused = true;
+ userAwayTime = 0;
+ userAway = false;
+}
+
+function msgFocus()
+{
+ userNotFocused = false;
+ if (userAway) // Wird ausgeführt, falls User 'Away' war
+ {
+ ; // nop
+ }
+ userAwayTime = 0;
+ userAway = false;
+}
+
+function checkInterval()
+{
+// status = "userNotFocused=" + userNotFocused + "; userAway=" + userAway + "; userAwayTime=" + userAwayTime + ""; // Debug
+ if (userNotFocused)
+ {
+ userAwayTime += 5; // Addiere 5, da nur alle 5Sek ausgeführt
+ if (!userAway)
+ {
+ if (autoAwayTimeout < userAwayTime) // Falls Zeit abgelaufen
+ {
+ if (document.inf.tmp.value != "away")
+ open ("main.pl?alias=$alias&tmpid=$tmpid&msg=/away&col=$col&room=$room&tmp=autoaway","reload"); // 'Away' setzen
+ userAway = true;
+ }
+ }
+ else
+ {
+ if (autoQuitTimeout < userAwayTime) // Falls Zeit abgelaufen
+ {
+ open ("main.pl?alias=$alias&tmpid=$tmpid&msg=/q&room=$room&tmp=autologout","reload"); // Chat beenden
+ }
+ }
+ }
+
+ window.setTimeout("checkInterval()",5000); // In 5 Sekunden wieder aufrufen
+}
+
+function initFrame()
+{
+ window.setTimeout("checkInterval()",5000); // In 5 Sekunden aufrufen
+ document.inf.msg.focus(); // Eingabefeld fokusieren
+}
+//-->
+</script>
+$style
+</head>
+<body class="blank" onload="initFrame();">
+ <div align="left">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td>
+ <form name="inf" target="reload" action="main.pl" onsubmit="return delout();">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="room" value="$room">
+ <input type="hidden" name="col" value="$col">
+ <input type="hidden" name="secol" value="$secol">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="whisper" value="$whisper">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input size="50" maxlength="300" name="msg" onBlur="msgBlur();" onFocus="msgFocus();">
+ </form>
+ </td>
+ <td><form name="verlaufform">
+ <script language="JavaScript"><!--
+ document.write("<select size='1' name='verlauf' size='40' onChange='CheckAuswahl();'>");
+ document.write("<option value>- Nachrichten-Verlauf -</option>");
+ for(i=0; i<maxVerlauf; i++) // Leere Verlaufsfelder generieren
+ document.write("<option value>(leer)</option>");
+ document.write("</select>");
+ //-->
+ </script>
+ </form>
+ </td>
+ </tr>
+ </table>
+ </div>
+</body>
+</html>
+END
+
+&rm_away($alias,$room); \ No newline at end of file
diff --git a/0.6.2/main.pl b/0.6.2/main.pl
new file mode 100644
index 0000000..20a469e
--- /dev/null
+++ b/0.6.2/main.pl
@@ -0,0 +1,985 @@
+#!/usr/bin/perl
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+print $q->header();
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+$mogeladmin ="Coke";
+
+{
+ unless (-f "data/online/tmpid/$alias.$tmpid") {
+ require config;
+ &error("Falsche TempID !");
+ }
+}
+
+$room = $q->param("room");
+$tmp = $q->param("tmp");
+
+
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ $rmsg = \$q->param("msg");
+
+unless (-e "data/online/rooms/$room/$alias") {
+ require config;
+ &post_prv($alias,"<font color=ffffff>Du befindest Dich nicht im Raum \"<font color=ffa500>$room</font>\" und kannst dort auch keine Nachrichten posten!</font>");
+ &reload_html;
+} elsif (length($$rmsg) > 300) {
+ require config;
+ &post_prv($alias,"<font color=ffffff>Deine Nachricht enthält zu viele Zeichen. Maximal sind 300 Zeichen erlaubt.</font>");
+ &reload_html;
+}
+
+if ($tmp eq "away") {
+ require config;
+ &rm_away($alias,$room);
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias hat sich zurück gemeldet ... </font></i><script language='JavaScript'>parent.online.location.reload();</script>");
+}
+
+if ($q->param('var') eq "change_colors") {
+ &reload_html("change_colors")
+}
+
+$$rmsg =~ s#<#&lt\;#g;
+
+if (substr($$rmsg,0,1) ne "/") {
+ &prove_color($alias,$col); &prove_color($alias,$secol);
+ open MSGFILE,">>data/msgs/$room";
+ unless ($$rmsg =~ s#/me/#<i>$alias</i>#g || $$rmsg =~ s#/m/#<i><font color=$col>$alias</font></i>#g) {
+ print MSGFILE "!<;".time."<;!<;!<;<b><font color=$col>$alias: <font color=$secol>$$rmsg</font></font></b><;\n";
+ } else {
+ $$rmsg =~ s#/me/#<i>$alias</i>#g;
+ $$rmsg =~ s#/m/#<i><font color=$col>$alias</font></i>#g;
+ print MSGFILE "!<;".time."<;!<;!<;<b><font color=$secol>$$rmsg</font></font></b><;\n";
+ }
+ close MSGFILE;
+ opendir PID,"data/online/pids/$room";
+ my @pids = readdir(PID);
+ closedir(PID);
+ foreach(@pids) {
+ if (-f "data/online/pids/$room/$_") {
+ kill USR1 => $_;
+ }
+ }
+ require config;
+ &log("<b><font color=$col>$alias: <font color=$secol>$$rmsg</font></font></b>") if ($room eq "Cyberbar");
+ &reload_html;
+} else {
+ require config;
+ &cmd($$rmsg);
+}
+
+sub reload_html { # Wird neugeladen, wenn eine Nachricht getextet wird!
+ my ($action,$whisper) = @_;
+ print "<html><head><script language='JavaScript'>";
+ if ($action eq "change_room") {
+ print "open('online.pl?alias=$alias&room=$room&tmpid=$tmpid','online');";
+ print "parent.input.document.inf.room.value = '$room';";
+ print "open('htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol&tmpid=$tmpid','menu');";
+ } elsif ($action eq "change_colors") {
+ print "parent.input.document.inf.col.value = '$col';";
+ print "parent.input.document.inf.secol.value = '$secol';";
+ if ($whisper eq "keep-alive") {
+ print "</script></body</html>";
+ goto KEEPALIVE;
+ }
+ print "open('htdocs.pl?alias=$alias&var=menu_html&room=$room&col=$col&secol=$secol&tmpid=$tmpid','menu');";
+ } elsif ($action eq "whisper") {
+ print "parent.input.document.inf.whisper.value = '$whisper';";
+ } elsif ($action eq "away") {
+ print "parent.input.document.inf.tmp.value = 'away';";
+ } elsif ($action eq "quit" && $tmp eq "autologout") {
+ print "open('index.pl?tmp=autologout','_top');";
+ &rm_alias($alias,$room);
+ } elsif ($action eq "quit") {
+ print "open('index.pl?tmp=quit','_top');";
+ &rm_alias($alias,$room);
+ }
+ print "parent.input.document.inf.tmp.value = 'notaway';" if ($tmp eq "away");
+ print "</script></head><body bgcolor='$col'>";
+ print $q->end_html;
+ exit 0;
+}
+
+sub change_room { # Den Chat-Raum wechseln
+ my ($method,$newroom,$oldroom,$alias2follow) = @_;
+ open RSTAT, "<data/online/rstat/$newroom"; #Überprüfen, ob Alias Raum betreten darf
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ if ($rstat[0] eq "1\n") {
+ unless (&hierachie($alias) eq "ow") {
+ &post_prv($alias,"<font size=2 color=ffffff>Der Raum \"<font color=ffa500>$newroom</font>\" ist leider abgesperrt!</font>");
+ &reload_html;
+ }
+ }
+ open MSGFILE,">>data/msgs/$room";
+ print MSGFILE "$alias<;".time."<;cr<;$newroom<;!<;\n";
+ close MSGFILE;
+ $room = $oldroom;
+ my $tmpstamp = time+5;
+ &zeit;
+ if ($method eq "j") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias wechselt in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias kommt aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i>");
+ open MSGFILE,">>data/msgs/$room";
+ print MSGFILE "$alias<;$tmpstamp<;!<;!<;<i><font color=ffffff>($hours:$min:$sec) Du wechselst aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i><;\n";
+ close MSGFILE;
+ } elsif ($method eq "ju") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias folgt \"$alias2follow\" in den Raum \"$newroom\" ...</font></i>");
+ $room = $newroom;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias kommt aus dem Raum \"$oldroom\" und folgt \"$alias2follow\" herein nach \"$newroom\" ...</font></i>");
+ open(MSGFILE,">>data/msgs/$room");
+ flock(MSGFILE, 2);
+ print MSGFILE "$alias<;$tmpstamp<;!<;!<;<i><font color=ffffff>($hours:$min:$sec) Du folgst \"$alias2follow\" aus dem Raum \"$oldroom\" herein nach \"$newroom\" ...</font></i><;\n";
+ close MSGFILE;
+ }
+ unlink("data/online/rooms/$oldroom/$alias");
+ &rm_rstat($alias,$oldroom);
+ &check_online;
+ opendir(PID,"data/online/pids/$raum");
+ my @pids = readdir(PID);
+ closedir(PID);
+ foreach(@pids) {
+ if (-f "data/online/pids/$raum/$_") {
+ kill USR1 => $_;
+ }
+ }
+}
+
+sub cmd { # Alle Chatbefehle, die über input_html eingegeben werden können.
+ $_[0] = $_[0]." ";
+ $_[0] = substr($_[0], 1, length($_[0])-1);
+ my @cmd = split(/ /, $_[0]);
+ my $cmd = substr($_[0],0 , index($_[0], " "));
+#############>- NORMALE CHATBEFEHLE ( Alphabetisch sortiert ) -<
+#############>- INFORMATIONEN ÜBER DAS SYSTEM AUSGEBEN -<
+ if ($cmd eq "about") {
+ &post_prv("$alias","<font color=ffffff>Aktuelle Version ist $title und wurde am $datum aktuallisiert. Programmiert von Paul C. Bütow (2000 - 2001).</font>");
+ &reload_html;
+#############>- ABMELDEN MIT 'AWAY-NACHRICHT' -<
+ } elsif ($cmd eq "away") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $away_msg = $away_msg." ".$cmd[$i];
+ }
+ &zeit;
+ my $js = "<script language='JavaScript'>parent.online.location.reload();</script>";
+ if ($tmp ne "autoaway") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias meldet sich ab (<font color=ffa500>$away_msg</font> ) ...</i></font>$js");
+ } else {
+ $away_msg = " $alias wurde vom System abgemeldet ...";
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)$away_msg</i></font>$js");
+ }
+ open AWAY,">>data/online/rstat/$room.away";
+ flock AWAY, 2;
+ print AWAY "$alias<;$away_msg\n";
+ close AWAY;
+ &reload_html("away");
+#############>- EIGENEN CHATBILDSCHIRM LÖSCHEN -<
+ } elsif ($cmd eq "clear") {
+ &post_prv($alias,"<script language='JavaScript'>window.open('push.pl?alias=$alias&room=$room&var=clear_screen&tmpid=$tmpid','main');</script>");
+ &reload_html;
+#############>- FARBEN WECHSELN -<
+ } elsif ($cmd eq "col") {
+ if ($cmd[1] ne undef) {
+ &prove_color($alias,$cmd[1],1);
+ $col = $cmd[1];
+ my $tmpsecol = $cmd[2];
+ my $length = length($tmpsecol);
+ if ($tmpsecol eq "" || $length < 6 || $length > 6) {
+ $secol = $col
+ } else {
+ $secol = $tmpsecol;
+ }
+ } else {
+ $col = &random_color;
+ $secol = &random_color;
+ }
+ open OPTIONS,"<data/user/options/$alias";
+ my @options = <OPTIONS>;
+ close OPTIONS;
+ open OPTIONS,">data/user/options/$alias";
+ print OPTIONS $options[0]."".$col."\n".$secol;
+ close OPTIONS;
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat die Farbe gewechselt ...</font></i>");
+ &reload_html("change_colors");
+#############>- AKTUELLES DATUM UND URZEIT AUSGEBEN -<
+ } elsif ($cmd eq "date") {
+ &zeit;
+ &post_prv("$alias","<font color=ffffff>Heute ist der $day.$month. Jahr $year. Es ist genau $hours:$min Uhr und $sec Sekunden.</font>");
+ &reload_html;
+#############>- EINEN NEUEN RAUM ERSTELLEN BZW. IN EINEN BESTEHENDEN RAUM WECHSELN -<
+ } elsif ($cmd eq "j") {
+ if ($cmd[1] =~ /\W/ || $cmd[1] eq "") {
+ &post_prv($alias,"<font color=ffffff>Der Raum <font color=ffa500>$cmd[1]</font> enthält illegale Zeichen!</font>");
+ &reload_html;
+ } else {
+ &change_room("j",$cmd[1],$room);
+ &reload_html("change_room");
+ }
+#############>- HANDELN -<
+ } elsif ($cmd eq "me" || $cmd eq "m") {
+ my $me_msg;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $me_msg = $me_msg." ".$cmd[$i];
+ }
+ $me_msg =~ s#/me/#<i>$alias</i>#g;
+ $me_msg =~ s#/m/#<i><font color=$col>$alias</font></i>#g;
+ if ($cmd eq "m") {
+ &post($room,"<b><font color=$col><i>$alias</i> <font color=$secol>$me_msg</font></font></b>");
+ } else {
+ &post($room,"<b><font color=$col><i>$alias</i> $me_msg</font></b>");
+ }
+ &reload_html;
+#############>- MEMO SCHREIBEN -<
+ } elsif ($cmd eq "memo") {
+ my $alias2memo = $cmd[1];
+ if(-f "data/user/options/$alias2memo") {
+ my $memo_msg;
+ for ($i=2; $i <= $#cmd; $i++) {
+ $memo_msg = $memo_msg." ".$cmd[$i];
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2memo <font color=ffffff>wurde folgende memo erfolgreich hinterlassen: $memo_msg</font></font>");
+ &zeit;
+ open MEMO,">>data/user/memos/$alias2memo";
+ print MEMO "<font color=ffffff>($day.$month. - $hours:$min:$sec) <font color=ffa500>$alias</font> hat Dir eine Memo hinterlassen: <font color=ffa500>$memo_msg</font></font><br>\n";
+ close MEMO;
+ &reload_html;
+ }
+ &post_prv("$alias","<font color=ffa500>$alias2memo <font color=ffffff>existiert in der Datenbank nicht !</font></font>");
+ &reload_html;
+#############>- TOTALONLINEZEIT VON ALIAS ANZEIGEN -<
+ } elsif ($cmd eq "online") {
+ my $alias2prove= $cmd[1];
+ if (-f "data/user/options/$alias2prove") {
+ open ONLINE,"<data/user/counts/$alias2prove.online";
+ my $online = <ONLINE>;
+ close ONLINE;
+ my $totaltime = sprintf("%.2f",($online / 3600));
+ &post_prv("$alias","<font color=ffa500>$alias2prove <font color=ffffff>war insgesamt schon $totaltime Stunden online!</font></font>");
+ } else {
+ &post_prv("$alias","<font color=ffa500>$alias2prove <font color=ffffff>existiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+ &reload_html;
+#############>- DAS SYSTEM VERLASSEN -<
+ } elsif ($cmd eq "q") {
+ &zeit;
+ if ($tmp ne "autologout") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias loggt sich aus dem Chat aus ... </font></i>");
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias wurde vom System automatisch ausgeloggt ... </font></i>");
+ }
+ &reload_html("quit");
+#############>- DAS EIGENE GÄSTEBUCH LÖSCHEN -<
+ } elsif ($cmd eq "rmgb") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias löscht das eigene Gästebuch ...</font></i>");
+ unlink("data/user/gbooks/$alias");
+ &reload_html;
+#############>- SCHREIEN -<
+ } elsif ($cmd eq "s") {
+ my $msg2scream;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2scream = $msg2scream." ".$cmd[$i];
+ }
+ $msg2scream =~ s#ä#Ä#g; $msg2scream =~ s#ö#Ö#g; $msg2scream =~ s#ü#Ü#g; $msg2scream = "\U$msg2scream";
+ &post($room,"<b><font color=$col><i>$alias schreit:</i> <font color=$secol>$msg2scream</font></font></b>");
+ &reload_html;
+#############>- SEHEN, WANN SICH ALIAS ZUM LETZTEN MAL EINGElOGGT HAT -<
+ } elsif ($cmd eq "seen") {
+ my $alias2prove = $cmd[1];
+ if (-f "data/user/options/$alias2prove") {
+ if (-f "data/user/lastlogin/$alias2prove") {
+ open LASTLOGIN,"<data/user/lastlogin/$alias2prove";
+ my $lastlogin = <LASTLOGIN>;
+ close LASTLOGIN;
+ my $timestamp = sprintf("%.2f",((time() - $lastlogin) / 3600));
+ &post_prv("$alias","<font color=ffa500>$alias2prove <font color=ffffff> hat sich vor $timestamp Stunden zuletzt in das System eingeloggt!</font></font>");
+ } else {
+ &post_prv("$alias","<font color=ffa500>$alias2prove <font color=ffffff> hat sich seit der Einführung dieses Befehls noch nie eingeloggt!</font></font>");
+ }
+ } else {
+ &post_prv("$alias","<font color=ffa500>$alias2prove <font color=ffffff> exsistiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+ &reload_html;
+#############>- ANZEIGEN WER SICH IM AKTUELLEN RAUM BEFINDET -<
+ } elsif ($cmd eq "w") {
+ open RSTAT,"data/online/rstat/$room";
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ chomp($rstat[1]);
+ my $theme = "Raumthema:".$rstat[1] if ($rstat[1] ne undef);
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ my ($is,$nr) = ("t",0);
+ opendir DIR,"data/online/rooms/$room";
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ my $personen;
+ foreach(@dir) {
+ if (-f "data/online/rooms/$room/$_") {
+ $personen = $personen." ".$_;
+ $nr++;
+ }
+ }
+ &post_prv($alias,"<font color=ffffff>Der aktuelle Raum: $room $theme $door ($nr) : <font color=ffa500>$personen</font></font>");
+ &reload_html;
+#############>- ANZEIGEN WER SICH IM SYSTEM BEFINDET -<
+ } elsif ($cmd eq "wc" || $cmd eq "wc/") {
+ my $raum = $cmd[1];
+ my $personen;
+ if ($raum eq "" && $cmd eq "wc") {
+ opendir USERS,"data/online/users";
+ my @users = readdir(USERS);
+ close USERS;
+ foreach(@users) {
+ $personen = $personen." ".$_ if (-f "data/online/users/$_");
+ }
+ my $nr = ($#users-1);
+ my ($nrs,$is) = ("","ist");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "sind";
+ }
+ &post_prv("$alias","<font color=ffffff>$nr Person$nrs $is insgesamt eingeloggt: <font color=ffa500>$personen</font></font>");
+ } elsif ($raum eq "" && $cmd eq "wc/") {
+ my $msg2post;
+ opendir DIR,"data/online/rooms";
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ opendir(DIR,"data/online/rooms/$_");
+ my @dir2 = readdir(DIR);
+ closedir(DIR);
+ open(RSTAT,"<data/online/rstat/$_");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ chomp($rstat[1]);
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ my $nr = $#dir2-1;
+ $msg2post = $msg2post."<tr><td><b><font size=2 color=ffffff>$_ $door ($nr) [".$rstat[1]."]: </font></b></td></tr><tr><td><font size=2 color=ffa500>";
+ foreach $chatter (@dir2) {
+ if (-f "data/online/rooms/$_/$chatter") {
+ $msg2post = $msg2post."$chatter ";
+ }
+ }
+ print "</font></td>";
+ }
+ }
+ &post_prv("$alias","<font color=ffffff>Folgende Räume sind offen:</font><table>$msg2post</table>");
+ } elsif ($raum ne "") {
+ my $personen;
+ opendir(DIR,"data/online/rooms/$raum");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ $personen = $personen." ".$_ if (-f "data/online/rooms/$raum/$_");
+ }
+ my ($nr,$is) = (($#dir-1),"t");
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "n";
+ }
+ &post_prv($alias,"<font color=ffffff> $nr Person$nrs befinde$is sich im Raum \"$raum\": <font color=ffa500>$personen</font></font>");
+ }
+ &reload_html;
+#############>- ANZEIGEN IN WELCHEN RAUM SICH JMD. BEFINDET BZW. JMD IN EINEN RAUM FOLGEN -<
+ } elsif ($cmd eq "wj" || $cmd eq "ju") {
+ my $alias2search = $cmd[1];
+ opendir ROOMS,"data/online/rooms";
+ my @dir = readdir(ROOMS);
+ closedir(ROOMS);
+ foreach $raum (@dir) {
+ opendir DIR2,"data/online/rooms/$raum";
+ my @dir2 = readdir(DIR2);
+ closedir(DIR2);
+ foreach $user (@dir2) {
+ if (-f "data/online/rooms/$raum/$user" && $user eq $alias2search) {
+ if ($cmd eq "wj") {
+ &post_prv("$alias","<font color=ffa500>$alias2search <font color=ffffff>befindet sich im Raum \"$raum\" !</font></font>");
+ } else {
+ &change_room("ju",$raum,$room,$alias2search);
+ }
+ &reload_html("change_room");
+ }
+ }
+ }
+ &post_prv("$alias","<font color=ffa500>$alias2search <font color=ffffff> ist nicht eingeloggt !</font></font>");
+ &reload_html;
+#############>- RAUMNESETZER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- RAUM ABSCHLIESSEN/AUFSCHLIESSEN -<
+ } elsif ($cmd eq "l") {
+ my $hierachie = &hierachie($alias);
+ if (prove_besetzer($alias,$room) == 1 || $hierachie eq "wa" || $hierachie eq "ow") {
+ open RSTAT, "data/online/rstat/$room";
+ my @r_stat = <RSTAT>;
+ close RSTAT;
+ my $lock = "0\n";
+ &zeit;
+ if ($room eq "Cyberbar" || $room eq "Wired") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias sperrt den Raum ohne Erfolg ab ...</font></i>");
+ } else {
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias sperrt den Raum ab ...</font></i>");
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias sperrt den Raum auf ...</font></i>");
+ }
+ for ($i=1;$i<=$#r_stat;$i++) {
+ $lock = $lock.$r_stat[$i];
+ }
+ open RSTAT,">data/online/rstat/$room";
+ flock RSTAT, 2;
+ print RSTAT $lock;
+ close RSTAT;
+ }
+ &reload_html;
+ }
+#############>- RAUMBESETZER ERNENNEN -<
+ } elsif ($cmd eq "su") {
+ my $hierachie = &hierachie($alias);
+ if (prove_besetzer($alias,$room) == 1 || $hierachie eq "wa" || $hierachie eq "ow") {
+ my $alias2su = $cmd[1];
+ opendir DIR,"data/online/rooms/$room";
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ if ($_ eq $alias2su) {
+ open(DATEI,"<data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ if (prove_besetzer($alias2su,$room) == 1 || &hierachie($alias2su) eq "wa" || &hierachie($alias2su) eq "ow") {
+ &post_prv($alias,"<font color=ffa500>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist bereits RB, WÄ oder OW)</font>");
+ &reload_html;
+ }
+ open RSTAT,">>data/online/rstat/$room";
+ flock(RSTAT, 2);
+ print RSTAT $alias2su."\n";
+ close RSTAT;
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias verleiht \"$alias2su\" Raumbesetzerrechte ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>");
+ &reload_html;
+ }
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist nicht anwesend)</font>");
+ &reload_html;
+ }
+#############>- RAUMBESETZER ENTNENNEN -<
+ } elsif ($cmd eq "rsu") {
+ my $hierachie = &hierachie($alias);
+ if (prove_besetzer($alias,$room) == 1 || $hierachie eq "wa" || $hierachie eq "ow") {
+ my $alias2rsu = $cmd[1];
+ open(DATEI,"<data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+ if (prove_besetzer($alias2rsu,$room) == 1) {
+ &rm_rstat($alias2rsu,$room);
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias entzieht \"$alias2rsu\" die Raumbesetzerrechte ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>");
+ } else {
+ &post_prv($alias,"<font color=ffa500>$alias2rsu <font color=ffffff>ist kein Raumbesetzer und kann dieser Status auch nicht aberkannt werden !</font></font>");
+ }
+ &reload_html;
+ }
+#############>- RAUM EIN THEMA GEBEN -<
+ } elsif ($cmd eq "t") {
+ my $hierachie = &hierachie($alias);
+ if (prove_besetzer($alias,$room) == 1 || $hierachie eq "wa" || $hierachie eq "ow") {
+ open RSTAT, "data/online/rstat/$room";
+ my @r_stat = <RSTAT>;
+ close RSTAT;
+ &zeit;
+ my $theme;
+ if ($cmd[1] ne undef) {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $theme = $theme." ".$cmd[$i];
+ }
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias gibt dem Raum das Thema (<font color=ffa500> $theme </font>) ...</font></i>");
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias löscht das Thema des Raums ...</font></i>");
+ }
+ $theme = $r_stat[0].$theme."\n";
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $theme = $theme.$r_stat[$i]."\n";
+ }
+ open RSTAT,">data/online/rstat/$room";
+ print RSTAT $theme;
+ close RSTAT;
+ &reload_html;
+ }
+#############>- SUPERUSER BEFEHLE ( Alphabetisch sortiert ) -<
+#############>- ALIAS VERBANNEN -<
+ } elsif ($cmd eq "ban" || $cmd eq "banip") {
+ my $hierachiealias = &hierachie($alias);
+ if ($hierachiealias eq "wa" || $hierachiealias eq "ow") {
+ my $alias2ban = $cmd[1];
+ my $hierachie = &hierachie($alias2ban);
+ open BAN,"<data/ban";
+ my @ban = <BAN>;
+ close BAN;
+ if ($cmd[1] eq undef) {
+ my $nr = @ban;
+ my $banned;
+ foreach(@ban) {
+ chomp($_);
+ $banned .= " $_";
+ }
+ &post_prv("$alias","<font color=ffffff>Folgende Benutzer sind verbannt [$nr]: <font color=ffa500>$banned</font></font>");
+ &reload_html;
+ } elsif (-f "data/user/options/$alias2ban") {
+ if ($hierachie eq "wa") {
+ &post_prv("$alias","<font color=ffa500>$alias2ban <font color=ffffff>ist Wächter und kann nicht verbannt werden!</font></font>");
+ &reload_html;
+ } elsif ($hierachie eq "ow") {
+ &post_prv("$alias","<font color=ffa500>$alias2ban <font color=ffffff>ist Oberwächter und kann nicht verbannt werden!</font></font>");
+ &reload_html;
+ }
+ if ($cmd eq "ban") {
+ if (add_entry($alias2ban,"ban") == 1) {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias verbannt \"$alias2ban\" aus dem Chat ...</font></i>");
+ } else {
+ &post_prv("$alias","<font color=ffa500>$alias2ban <font color=ffffff>ist bereits verbannt!</font></font>");
+ }
+ } elsif ($hierachie ne "ow" && $hierachie ne "wa") {
+ if (-f "data/online/ident/$alias2ban") {
+ open DATEI, "<data/online/ident/$alias2ban";
+ my $ipnr = <DATEI>;
+ close DATEI;
+ chomp($ipnr);
+ if (add_entry("ip://$ipnr","ban") == 1) {
+ &zeit;
+ &post_prv($alias,"<font color=ffffff>IP-Nummer von <font color=ffa500>$alias2ban</font> ($ipnr) wurde verbannt! ...</font></i>");
+ } else {
+ &post_prv("$alias","<font color=ffffff>Die IP-Nummer <font color=ffa500>$ipnr</font> von $alias2ban ist bereits verbannt!</font></font>");
+ }
+ &reload_html;
+ } else {
+ &post_prv("$alias","<font color=ffffff>Die IP-Nummer von <font color=ffa500>$alias2ban </font>kann nicht verbannt werden, da Benutzer nicht eingeloggt ist!</font></font>");
+ &reload_html;
+ }
+ } else {
+ goto ENDCMD;
+ }
+ &reload_html;
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2ban $ipnr<font color=ffffff>kann nicht verbannt werden, da Benutzername nicht existiert!</font></font>");
+ &reload_html;
+ }
+#############>- ALIAS ENTBANNEN -<
+ } elsif ($cmd eq "rban" || $cmd eq "rbanip") {
+ my $hierachie = &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $alias2rban = $cmd[1];
+ open(BAN,"<data/ban");
+ @ban = <BAN>;
+ close BAN;
+ foreach $ban (@ban) {
+ if (&rm_entry($alias2rban,"ban") == 1) {
+ if ($alias2rban =~ /ip:/) {
+ &post_prv($alias,"<font color=ffffff>Die IP-Nummer <font color=ffa500>$alias2rban</font> wurde aus der Banliste ausgetragen!</font></font>");
+ } else {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias entbannt \"$alias2rban\" ...</font></i>");
+ }
+ &reload_html;
+ }
+ }
+ &post_prv($alias,"<font color=ffa500>$alias2rban <font color=ffffff>ist nicht verbannt!</font></font>");
+ &reload_html;
+ }
+#############>- IP # VON ALIAS ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "ip") {
+ my $hierachie = &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $alias2prove = $cmd[1];
+ opendir DIR,"data/online/ident";
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach(@dir) {
+ if ($_ eq $alias2prove) {
+ open DATEI, "<data/online/ident/$alias2prove";
+ my $ipnr = <DATEI>;
+ close DATEI;
+ chomp($ipnr);
+ &post_prv("$alias","<font color=ffa500>$_<font color=ffffff> hat die IP-Nummer $ipnr !</font></font>");
+ }
+ }
+ &reload_html;
+ }
+#############>- ALIAS AUS DEM CHAT KATAPULTIEREN -<
+ } elsif ($cmd eq "k" || $cmd eq "o") {
+ my $hierachie = &hierachie($alias);
+ if ($hierachie eq "wa" || $hierachie eq "ow") {
+ my $alias2kick = $cmd[1];
+ if (-f "data/online/users/$alias2kick") {
+ opendir DIR,"data/online/rooms";
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ foreach $raum (@dir) {
+ opendir DIR, "data/online/rooms/$raum";
+ my @dir2 = readdir(DIR);
+ closedir(DIR);
+ foreach $chatter (@dir2) {
+ if ($chatter eq $alias2kick) {
+ my $hierachie2 = &hierachie($alias2kick);
+ if ($hierachie2 eq "ow" && $alias ne $admin) {
+ &post_prv("$alias","<font color=ffa500>$alias2kick <font color=ffffff> ist Oberwächter und kann nicht \"gekickt/ausgeloggt\" werden !</font></font>");
+ } elsif ($hierachie2 eq "wa" && $hierachie ne "ow") {
+ &post_prv("$alias","<font color=ffa500>$alias2kick <font color=ffffff> ist Wächter und kann nicht \"gekickt/ausgeloggt\" werden !</font></font>");
+ } else {
+ if ($cmd eq "k") {
+ &post_prv("$alias2kick","<script language=\"JavaScript\">window.open(\"index.pl?tmp=kick\",\"_top\");</script>");
+ } else {
+ &post_prv("$alias2kick","<script language=\"JavaScript\">window.open(\"index.pl?tmp=logout\",\"_top\");</script>");
+ }
+ $_ = undef if ($room eq $raum);
+ &zeit;
+ if ($cmd eq "k") {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias katapultiert \"$alias2kick\" aus dem Chat ...</font></i>",$raum);
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias loggt \"$alias2kick\" aus dem Chat aus ...</font></i>",$raum);
+ }
+ rm_alias($alias2kick,$raum);
+ check_online;
+ }
+ &reload_html;
+ }
+ }
+ }
+ }
+ &post_prv("$alias","<font color=ffa500>$alias2kick <font color=ffffff> ist nicht anwesend und kann nicht \"gekickt\" werden !</font></font>");
+ &reload_html;
+ }
+#############>- EINEN BENUTZER AUS DEM SYSTEM LÖSCHEN -<
+ } elsif ($cmd eq "kill") {
+ if (hierachie($alias) eq "ow") {
+ my $alias2kill = $cmd[1];
+ if (-f "data/user/options/$alias2kill") {
+ my $hierachie = &hierachie($alias2kill);
+ if ($hierachie eq "ow") {
+ &post_prv($alias,"<font color=ffa500>$alias2kill</font> <font color=ffffff>ist Oberwächter und kann nicht aus dem System entfernt werden !</font>");
+ } elsif ($hierachie eq "wa") {
+ &post_prv($alias,"<font color=ffa500>$alias2kill</font> <font color=ffffff>ist Wächter und kann nicht aus dem System entfernt werden !</font>");
+ } else {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias killt \"$alias2kill\" ganz und gar aus dem System ...</font></i>");
+ unlink("data/user/options/$alias2kill");
+ unlink("data/user/profiles/$alias2kill");
+ unlink("data/user/gbooks/$alias2kill");
+ unlink("data/user/counts/$alias2kill");
+ unlink("data/user/counts/$alias2kill.online");
+ unlink("data/user/lastlogin/$alias2kill");
+ unlink("data/user/memos/$alias2kill");
+ &rm_entry($alias2kill,"ban");
+ open(DEL, ">>data/kill");
+ print DEL "($day.$month.$year $hours:$min:$sec) $alias2kill wurde von $alias gekillt\n";
+ close DEL;
+ }
+ } else {
+ &post_prv("$alias","<font color=ffa500>$alias2kill <font color=ffffff> existiert nicht in der DB und kann nicht \"gekillt\" werden !</font></font>");
+ }
+ &reload_html;
+ }
+#############>- EINEN ANDEREN RAUM AUF-/ABSPERREN -<
+ } elsif ($cmd eq "sl") {
+ my $hierachie = &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $sl_room = $cmd[1];
+ if (-e "data/online/rooms/$sl_room") {
+ my $lock = "0\n";
+ &zeit;
+ open RSTAT,"<data/online/rstat/$sl_room";
+ my @r_stat = <RSTAT>;
+ close RSTAT;
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias sperrt den Raum \"$sl_room\" von aussen ab ...</font></i>",$sl_room);
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias sperrt den Raum \"$sl_room\" von aussen auf ...</font></i>",$sl_room);
+ }
+ for ($i=1;$i<=$#r_stat;$i++) {
+ $lock = $lock.$r_stat[$i];
+ }
+ open RSTAT,">data/online/rstat/$sl_room";
+ print RSTAT $lock;
+ close RSTAT;
+ } else {
+ &post_prv($alias,"<font color=ffffff>Der Raum <font color=ffa500>$sl_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ }
+#############>- IN EINEN ANDEREN RAUM HINEINRUFEN -<
+ } elsif ($cmd eq "ss") {
+ my $hierachie = &hierachie($alias);
+ if ($hierachie eq "ow" || $hierachie eq "wa") {
+ my $ss_room = $cmd[1];
+ if (-e "data/online/rooms/$ss_room") {
+ my $ss_msg;
+ for ($i=2; $i <= $#cmd; $i++) {
+ $ss_msg = $ss_msg." ".$cmd[$i];
+ }
+ my $msg2scream = "\U$ss_msg";
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias ruft in den Raum \"$ss_room\" hinein: <b><font color=$col>$msg2scream</font></b> ...</font></i>",$ss_room);
+ &reload_html;
+ } else {
+ &post_prv($alias,"<font color=ffffff>Der Raum <font color=ffa500>$ss_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ }
+#############>- EINEN ANDEREN RAUM EIN THEMA GEBEN -<
+ } elsif ($cmd eq "st") {
+ my $hierachie = &hierachie($alias);
+ if ($hierachie eq "wa" || $hierachie eq "ow") {
+ my $st_room = $cmd[1];
+ if (-e "data/online/rooms/$st_room") {
+ my $theme;
+ &zeit;
+ if ($cmd[2] ne undef) {
+ for ($i=2; $i <= $#cmd; $i++) {
+ $theme = $theme." ".$cmd[$i];
+ }
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias gibt dem Raum \"$st_room\" das Thema (<font color=ffa500> $theme </font>) ...</font></i>",$st_room);
+ } else {
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias löscht das Thema des Raums \"$st_room\" ...</font></i>",$st_room);
+ }
+ open RSTAT,"<data/online/rstat/$st_room";
+ my @r_stat = <RSTAT>;
+ close RSTAT;
+ $theme = $r_stat[0].$theme."\n";
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $theme = $theme.$r_stat[$i];
+ }
+ open RSTAT,">data/online/rstat/$st_room";
+ print RSTAT $theme;
+ close RSTAT;
+ } else {
+ &post_prv($alias,"<font color=ffffff>Der Raum <font color=ffa500>$st_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ }
+#############>- SYSTEMNACHRICHT IN ALLE BESTEHENDEN RÄUME &postEN -<
+ } elsif ($cmd eq "sys") {
+ my $hierachie = &hierachie($alias);
+ if ($hierachie eq "ow") {
+ my $sys_msg;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $sys_msg = $sys_msg." ".$cmd[$i];
+ }
+ &zeit;
+ $sys_msg = "<i><font color=ffffff>($hours:$min:$sec)</font></i> <b><font size=2 color=red>SYSTEMNACHRICHT</font></b><i><font color=ffffff>: $sys_msg ...</font></i>";
+ opendir(ROOMS,"data/msgs");
+ my @rooms = readdir(ROOMS);
+ close(ROOMS);
+ foreach(@rooms) {
+ &post($_,$sys_msg);
+ }
+ log($sys_msg);
+ &reload_html;
+ }
+#############>- EIGENES SUPERUSER-LOGO VERSCHWINDEN/AUFTAUCHEN LASSEN -<
+ } elsif ($cmd eq "img") {
+ my $hierachie = &hierachie($alias);
+ if ($hierachie eq "wa" || $hierachie eq "ow") {
+ if(&rm_entry($alias, $hierachie."2")) {
+ &post_prv("$alias","<font color=ffffff>Deine Superuserlogo wurde versteckt!</font></font>");
+ } else {
+ &post_prv("$alias","<font color=ffffff>Deine Superuserlogo wurde wieder sichtbar gemacht!</font></font>");
+ &add_entry($alias, $hierachie."2");
+ }
+ &reload_html;
+ }
+#############>- ALIAS ZUM WÄCHTER ERNNENNEN -<
+ } elsif ($cmd eq "wa") {
+ if (hierachie($alias) eq "ow") {
+ if (-f "data/user/options/$cmd[1]") {
+ if (hierachie($cmd[1]) eq "ow") {
+ &post_prv("$alias","<font color=ffa500>$cmd[1] <font color=ffffff>ist bereits als Oberwächter eingetragen. Oberwächter können nicht gleichzeitig Wächter sein!</font></font>");
+ } elsif (!add_entry($cmd[1],"wa")) {
+ &post_prv("$alias","<font color=ffa500>$cmd[1] <font color=ffffff>ist bereits als Wächter eingetragen. Eine erneuerte Eintragung ist nicht möglich!</font></font>")
+ } else {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias ernennt \"$cmd[1]\" zum Wächter ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>");
+ &add_entry($cmd[1],"wa2");
+ }
+ &reload_html;
+ } else {
+ &post_prv($alias,"<font color=ffa500>$alias2wa <font color=ffffff>kann nicht zum Wächter ernannt werden da Benutzername nicht existiert!</font></font>");
+ }
+ &reload_html;
+ }
+#############>- ALIAS DIE WÄCHTERRECHTE ENTZIEHEN -<
+ } elsif ($cmd eq "rwa") {
+ if (hierachie($alias) eq "ow") {
+ if (&rm_entry($cmd[1],"wa") == 1) {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias hat \"$cmd[1]\" vom Wächter zum normalen Chatter degradiert ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>");
+ &rm_entry($cmd[1],"wa2");
+ } else {
+ &post_prv($alias,"<font color=ffa500>$cmd[1] <font color=ffffff>ist kein Wächter und können die Wächterrechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ }
+#############>- ADMINISTRATORBEFEHLE -<
+ } elsif ($alias eq $admin || $alias eq $mogeladmin) {
+#############>- ALIAS ZUM OBERWÄCHTER ERNENNEN -<
+ if ($cmd eq "ow") {
+ if (-f "data/user/options/$cmd[1]") {
+ if (add_entry($cmd[1],"ow") == 1) {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias ernennt \"$cmd[1]\" zum Oberwächter ...</font></i>");
+ &add_entry($cmd[1],"ow2");
+ } else {
+ &post_prv("$alias","<font color=ffa500>$cmd[1] <font color=ffffff>ist bereits als Oberwächter eingetragen!</font></font>");
+ }
+ } else {
+ &post_prv($alias,"<font color=ffa500>$alias2wa <font color=ffffff>kann nicht zum Wächter ernannt werden da Benutzername nicht existiert!</font></font>");
+ }
+ &reload_html;
+#############>- ALIAS DIE OBERWÄCHTERRECHTE ENTZIEHEN -<
+ } elsif ($cmd eq "row") {
+ if (&rm_entry($cmd[1],"ow") ne undef) {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias hat \"$cmd[1]\" vom Oberwächter zum normalen Chatter degradiert ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>");
+ &rm_entry($cmd[1],"ow2");
+ } else {
+ &post_prv($alias,"<font color=ffa500>$cmd[1] <font color=ffffff>ist kein Oberwächter und können die Rechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+#############>- PASSWORD EINES BENUTZERS ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "pw") {
+ my $pw2show = $cmd[1];
+ if (-f "data/user/options/$pw2show") {
+ open PW,"<data/user/options/$pw2show";
+ my @pw = <PW>;
+ close PW;
+ chomp($pw[0]);
+ &post_prv($alias,"<font color=ffa500>$pw2show <font color=ffffff> hat das Passwort \"$pw[0]\" !</font></font>");
+ &reload_html;
+ }
+ &post_prv($alias,"<font color=ffa500>$pw2show <font color=ffffff> existiert nicht in der Benutzerdatenbank !</font></font>");
+ &reload_html;
+#############>- IDENT-DATEI EINES BENUTZERS ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "id" || $cmd eq "agent") {
+ my $id2show = $cmd[1];
+ if (-f "data/online/ident/$id2show") {
+ open ID,"<data/online/ident/$id2show";
+ my @id = <ID>;
+ close ID;
+ if ($cmd eq "id") {
+ chomp($id[1]);
+ &post_prv($alias,"<font color=ffa500>$id2show <font color=ffffff> hat die Temp-ID \"$id[1]\" !</font></font>");
+ } else {
+ chomp($id[2]);
+ &post_prv($alias,"<font color=ffa500>$id2show <font color=ffffff> verwendet \"$id[2]\" !</font></font>");
+ }
+ &reload_html;
+ }
+ &post_prv($alias,"<font color=ffa500>$id2show <font color=ffffff> ist nicht eingeloggt !</font></font>");
+ &reload_html;
+#############>- SYSTEMMELDUNG posten -<
+ } elsif ($cmd eq "cool") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $msg2post</font></i>");
+ &reload_html;
+#############>- REVERSE -<
+ } elsif ($cmd eq "rev") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ $msg2post = reverse($msg2post);
+ &post($room,"<b><font color=$col>$alias: <font color=$secol>$msg2post</font></font></b>");
+ &reload_html;
+ }
+ }
+ENDCMD:
+#############>- FLÜSTERN ( Auch mit '/' ) -<
+ my ($alias2post,$msg2post,$action);
+ &prove_color($alias,$col,1); &prove_color($alias,$secol,1);
+ if ($cmd eq "msg") {
+ $alias2post = $cmd[1];
+ for ($i=2; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ $action = "whisper";
+ } elsif ($cmd eq "") {
+ $alias2post = $q->param('whisper');
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ } else {
+ $alias2post = $cmd;
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ $action = "whisper";
+ }
+ $msg2post =~ s#/me/#<i>$alias</i>#g;
+ $msg2post =~ s#/m/#<i><font color=$col>$alias</font></i>#g;
+ if (-f "data/online/users/$alias2post") {
+ &post_prv($alias,"<b><font color=$col><i>Zu $alias2post geflüstert:</i> <font color=$secol>$msg2post</font></font></i></b>");
+ &post_prv($alias2post,"<b><font color=$col><i>$alias flüstert:</i> <font color=$secol>$msg2post</font></font></i></b>");
+ &reload_html($action,$alias2post);
+ }
+ &post_prv($alias," <font color=ffffff>Benutzer oder Befehl <font color=ffa500>$alias2post</font> ist nicht anwesend/verfügbar!</font></font>");
+ &reload_html;
+}
+#############>- ENDE DER CHATBEFEHLE -<
+
+sub rm_entry {
+ my ($alias,$file) = @_;
+ open ENTRY, "<data/$file";
+ my @entry = <ENTRY>;
+ close ENTRY;
+ my @new;
+ foreach(@entry) {
+ push @new,$_ if ($alias."\n" ne $_);
+ }
+ if (@entry != @new) {
+ open ENTRY, ">data/$file";
+ flock ENTRY, 2;
+ print ENTRY @new;
+ close ENTRY;
+ return 1;
+ } else {
+ return;
+ }
+}
+
+sub add_entry {
+ my ($alias,$file) = @_;
+ open ENTRY, "<data/$file";
+ my @entry = <ENTRY>;
+ close ENTRY;
+ foreach(@entry) {
+ chomp;
+ if ($alias eq $_) {
+ return;
+ }
+ }
+ open ENTRY, ">>data/$file";
+ flock ENTRY, 2;
+ print ENTRY $alias."\n";
+ close ENTRY;
+ return 1;
+}
+
+sub prove_color {
+ my ($alias,$color,$req) = @_;
+ my $length = length($color);
+ if ($length > 6 || $length < 6) {
+ require config if (req != 1);
+ &post_prv($alias,"<font color=ffffff>Ungültige Hexadezimalfarbe.</font>");
+ &reload_html;
+ }
+}
diff --git a/0.6.2/main2.pl b/0.6.2/main2.pl
new file mode 100644
index 0000000..747291e
--- /dev/null
+++ b/0.6.2/main2.pl
@@ -0,0 +1,624 @@
+#!/usr/bin/perl -w
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print $q->header();
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+
+$var = $q->param("var");
+if ($var eq "list_alias_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &list_alias_html;
+} elsif ($var eq "alias_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $tmp = $q->param("tmp");
+ &alias_html;
+} elsif ($var eq "edit_profile_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ &edit_html("edit_profile_html");
+} elsif ($var eq "edit_options_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $room = $q->param("room");
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ &edit_html("edit_options_html");
+} elsif ($var eq "gb_html") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &gb_html;
+} elsif ($var eq "post_gb") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $msg = $q->param("msg");
+ $tmp = $q->param("tmp");
+ $id = $q->param("id");
+ &post_gb;
+} elsif ($var eq "edit_profile") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ $room = $q->param("room");
+ &secure_checkid($alias);
+ &edit("edit_profile");
+} elsif ($var eq "edit_options") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $tmp = $q->param("tmp");
+ $id = $q->param("id");
+ $room = $q->param("room");
+ $col = $q->param("col");
+ $secol = $q->param("secol");
+ &edit("edit_options");
+} elsif ($var eq "rm_gb_alias") {
+ $alias = $q->param("alias");
+ $tmpid = $q->param("tmpid");
+ &secure_checkid($alias);
+ $tmp = $q->param("tmp");
+ $id = $q->param("id");
+ &rm_gb;
+} else {
+ &error("Parameter fehlt");
+}
+
+###########################
+##HAUPTTEIL DIESER DATEI:##
+###########################
+
+sub gb_html { # Das Benutzerboard/Gästebuch.
+ my $message = $_[0];
+ &start_html("Benutzerboard");
+if ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </i>
+ einen Text und poste
+ <u>dann</u>
+ !
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Vielen Dank für Deinen Beitrag. Wenn Du willst, kannst Du jetzt gleich noch einen Eintrag posten ...
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Falls Du Anregungen oder Verbesserungsvorschläge für die Community hast, dann poste doch einen kleinen Eintrag :-)
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="guestbook">
+ <input type="hidden" name="id" value="y">
+ <input size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+ if (-e "data/guestbook") {
+ open (DATEI,"<data/guestbook") || &error("Konnte dat/guestbook nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ print
+ $q->div(@datei);
+ }
+ print
+ $q->end_html;
+}
+
+
+sub post_gb { # Wenn etwas in ein Gästebuch eingetragen wird
+ &zeit;
+ if ($msg eq "") {
+ if ($id eq "y") { # Überprüfen, ob Benutzerboard- oder Privatgästebuch
+ &gb_html("post_empty");
+ } else {
+ &alias_html("post_empty");
+ }
+ exit;
+ }
+ $msg =~ s#<#&lt\;#g;
+ $msg =~ s#\n#<br>#g;
+ my $tmpath = "";
+ if ($id eq "y") {
+ $tmpath = "data/guestbook";
+ } else {
+ $tmpath = "data/user/gbooks/$tmp";
+ }
+ open(GB,"$tmpath");
+ my @gb = <GB>;
+ close GB;
+ pop(@gb) if ($#gb > 99);
+ my @newdatei = "<br><b>$alias schrieb am $day.$month.$year um $hours:$min:$sec ...</b><br>$msg<br>\n";
+ push(@newdatei,@gb);
+ open(GB,">$tmpath");
+ print GB @newdatei;
+ close GB;
+ if ($id eq "y") {
+ &gb_html("post_ok");
+ exit;
+ } else {
+ post_prv("$tmp","<font color=ffffff>$alias hat soeben einen Pin in Dein Profil gehängt ... </font>");
+ &alias_html;
+ exit;
+ }
+}
+
+sub rm_gb { # Gästebucheintrag entfernen
+ open(GB,"<data/user/gbooks/$alias");
+ my @gbfile = <GB>;
+ close GB;
+ my @newgbfile = ();
+ for ($i=0; $i <= $#gbfile; $i++) {
+ push(@newgbfile,$gbfile[$i]) if ($i != $id);
+ }
+ open(GB,">data/user/gbooks/$alias");
+ print GB @newgbfile;
+ close GB;
+ &alias_html("rm_ok");
+}
+
+sub list_alias_html { # Liste aller Benutzer
+ &start_html("Alle Benutzer");
+ opendir(REGISTERED,"data/user/options");
+ my @users = readdir(REGISTERED);
+ closedir(REGISTERED);
+ my @liste = sort(@users);
+ my $nr = $#users-1;
+print <<END;
+ <div>
+ Es sind z.Z. genau $nr Benutzernamen in der Datenbank vorhanden! (Sortiert nach #, A-Z, a-z)
+ </div>
+ <hr>
+ <div>
+END
+ foreach(@liste) {
+ if (-f "data/user/options/$_") {
+ print
+ $q->a( { -href=>"main2.pl?var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid" },
+ "$_"),
+ " ";
+ }
+ }
+print <<END;
+ </div>
+</body>
+</html>
+END
+}
+
+sub alias_html { # Anzeigen eines Benutzerprofils
+ my $message = $_[0];
+ open(COUNTS,"<data/user/counts/$tmp");
+ local $counter = <COUNTS>;
+ close COUNTS;
+ $counter++;
+ open(COUNTS,">data/user/counts/$tmp");
+ print COUNTS $counter;
+ close COUNTS;
+ &start_html($tmp);
+print <<END;
+<div>
+ <a href="htdocs.pl?var=werda_html&alias=$alias&tmpid=$tmpid">Hier</a>
+ gehts zur Gesamtübersicht !
+</div>
+<hr>
+END
+if ($message eq "rm_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Der von Dir gewählte Eintrag wurde erfolgreich gelöscht.
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </u>
+ einen Text und poste
+ <u>dann</u>
+ !
+ <hr>
+END
+}
+ open(PROFILE,"<data/user/profiles/$tmp");
+ @data = <PROFILE>;
+ close PROFILE;
+print <<END;
+ <div>
+ Dieses Profil wurde insgesamt schon $counter mal aufgerufen !
+ <br><br>Alias: $tmp
+ <br><br>Nachname: $data[0]
+ <br><br>Vorname: $data[1]
+ <br><br>Alter: $data[2]
+ <br><br>Wohnort: $data[3]
+ <br><br>E-Mail:
+ <a href="mailto:$data[4]">$data[4]</a>
+ <br><br>ICQ-Nummer: $data[5]
+ <br><br>Homepage: <a href="$data[6]" target="_new">$data[6]</a>
+ <br><br>Weiteres:<br>$data[7]
+ <hr>
+ Hier kannst Du $tmp eine Nachricht hinterlassen!
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input type="text" size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+if (-e "data/user/gbooks/$tmp") {
+ open (DATEI,"<data/user/gbooks/$tmp") || &error("Konnte data/user/gbooks/$tmp nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ my $nr = 1;
+ if ($alias ne $tmp) {
+ foreach(@datei) {
+ print "<br>Eintrag # $nr: $_";
+ $nr++;
+ }
+ } else {
+print <<END;
+ <table>
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="rm_gb_alias">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="$tmp">
+END
+for($i=0; $i <= $#datei; $i++) {
+print <<END;
+ <tr>
+ <td>
+ <input type="radio" name="id" value="$i">
+ </td>
+ <td>
+ <div class=q>
+ <br>
+ Eintrag # $nr:
+ $datei[$i]
+ </div>
+ </td>
+ </tr>
+END
+$nr++;
+}
+print <<END;
+ </table>
+ <table>
+ <tr>
+ <td>
+ <font color=ffffff>
+ <input type="submit" value="Markierten Eintrag löschen">
+ </font>
+ </td>
+ <td>
+ <font color=ffffff>
+ <input type="reset" value="Markierung rückgängig machen">
+ </font>
+ </td>
+ </tr>
+ </table>
+ </form>
+END
+}
+}
+ print
+ $q->end_html;
+}
+
+sub edit_html { # Chat-Optionen / Benutzerprofil editieren
+ my ($method,$message) = @_;
+ &start_html("Benutzerprofil ändern");
+ if ($method eq "edit_options_html") {
+ open(DATEI,"<data/user/options/$alias");
+ } elsif ($method eq "edit_profile_html") {
+ open(DATEI,"<data/user/profiles/$alias");
+ }
+ @data = <DATEI>;
+ close DATEI;
+ foreach(@data) {
+ chomp $_;
+ }
+ if ($method eq "edit_options_html") {
+ if ($message eq "edit_options_ok") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec)</font> <font color=$col>$alias</font> <font color=$secol> hat die Chateinstellungen geändert ...</font></i>");
+print <<END;
+<script language="JavaScript">
+ open("main.pl?var=change_colors&alias=$alias&room=$room&col=$col&secol=$secol&tmpid=$tmpid","reload");
+</script>
+<div class=b>
+ Hinweis:
+</div>
+<div>
+ Du hast soeben Deine Chat-Optionen erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren. Um
+ weiterzuchatten einfach Fenster schliessen!
+</div>
+<hr>
+END
+ } elsif ($message eq "edit_pw_wrong") {
+print <<END;
+<div class=b>
+ ACHTUNG!
+</div>
+<div>
+ Du hast soeben versucht, dein Passwort zu ändern. Jedoch stimmte die Erste Eingabe nicht mit der Zweiten überein.
+ Bitte versuch es erneuert ...
+</div>
+<hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Deine Chat-Optionen editieren!" ),
+ $q->hr;
+ }
+print <<END;
+<script lang="javascript" type="text/javascript">
+<!--
+
+function radioWert(rObj) {
+ for (var i=0; i<rObj.length; i++) if (rObj[i].checked) return rObj[i].value;
+ return false;
+}
+
+function insertcode( code ) {
+ document.optionen.elements[radioWert(document.optionen.eingabe)].value = code;
+}
+
+//-->
+</script>
+
+<form name="optionen" action="main2.pl">
+ <input type="hidden" name="var" value="edit_options">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Passwort
+ <font color=ffa500>
+ (Gut merken !!)
+ </font>
+ <br>
+ <input type="password" name="id" value="$data[0]">
+ </div>
+ </td>
+ <td width=20>
+ </td>
+ <td>
+ <div>
+ Geb hier das Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp" value="$data[0]">
+ </div>
+ </td>
+ </tr>
+ </table>
+ <hr>
+ <div>Einstellungen für den Nachrichten-Verlauf</div>
+ <table>
+ <tr>
+ <td>
+ <br>
+ <div>Anzahl der Nachrichten im Verlauf (Standart = 10)</div>
+ <font color=ffffff>
+ <select name="maxVerlauf" size="1">
+ <option value="$data[3]">$data[3]
+END
+for($i=1;$i<=50;$i++) {
+ print "<option value=\"$i\">$i";
+}
+print<<END;
+ </select>
+ </font>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <br>
+<div>Wie sollen die Nachrichten im Verlauf angeordnet sein?</div>
+ <font color=ffffff>
+ <select name="verlaufOrder" size="1">
+ <option value="$data[4]">Bisherige Einstellung ($data[4])
+ <option value="0">Neue Verlaufnachrichten oben (0)
+ <option value="1">Neue Verlaufnachrichten unten (1)
+ </select>
+ </font>
+ </td>
+ </tr>
+ </table>
+<br>
+ <div>PS: Einstellungen des Nachrichten-Verlaufs werden erst nach einem Neueinloggen aktualisiert.</div>
+ <hr>
+ <table>
+ <tr>
+ <td>
+ <div>
+ <input type="radio" name="eingabe" value="col" checked>
+ Auswahl von Farbe 1
+ <br>
+ (Farbe Deines Nicks):
+ <br>
+ <input name="col" size="6" maxlength="6" value="$data[1]">
+ </div>
+ </td>
+ <td width=20>
+ </td>
+ <td>
+ <div>
+ <input type="radio" name="eingabe" value="secol">
+ Auswahl von Farbe 2
+ <br>
+ (Farbe Deiner Nachrichten):
+ <br>
+ <input name="secol" size="6" maxlength="6" value="$data[2]">
+ </div>
+ </td>
+ </tr>
+ </table>
+<br>
+ <div>
+ Beliebige Auswahl markieren und Farbe wählen. Um Deine Optionen abzuspeichern,
+ auf "Daten ändern" klicken!
+ </div>
+ <br>
+END
+ open(COLORS,"<colors.sno");
+ @colors = <COLORS>;
+ close COLORS;
+ print @colors;
+ } elsif ($method eq "edit_profile_html") {
+ if ($message eq "edit_profile_ok") {
+ &zeit;
+ &post($room,"<i><font color=ffffff>($hours:$min:$sec) $alias hat das Profil geändert ...</font></i>");
+print <<END;
+ <div class=b>
+ Hinweis:
+ </div>
+ <div>
+ Du hast soeben Dein Profil erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren:
+ <hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Dein Profil editieren!" ),
+ $q->hr;
+ }
+print <<END;
+ <form action="main2.pl">
+ <input type="hidden" name="var" value="edit_profile">
+ <div>
+ Dein Nachname:
+ <br>
+ <input name="nachname" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ Dein Vorname:
+ <br>
+ <input name="vorname" value="$data[1]">
+ </div>
+ <br>
+ <div>
+ Dein Alter:
+ <br>
+ <input name="alter" value="$data[2]">
+ </div>
+ <br>
+ <div>
+ Dein Wohnort:
+ <br>
+ <input name="wohnort" value="$data[3]">
+ </div>
+ <br>
+ <div>
+ Deine E-Mail Adresse:
+ <br>
+ <input name="email" value="$data[4]">
+ </div>
+ <br>
+ <div>
+ Deine ICQ-Nummer:
+ <br>
+ <input name="icq" value="$data[5]">
+ </div>
+ <br>
+ <div>
+ Deine Homepage:
+ <br>
+ <input name="homepage" value="$data[6]">
+ </div>
+ <br>
+ <div>
+ Weiteres:
+ <br>
+ <textarea rows="5" cols="40"name="weiteres" wrap="virtual">$data[7]</textarea>
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <font color=ffffff>
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="room" value="$room">
+ <input type="submit" value="Daten ändern ...">
+ </font>
+ </form>
+</body>
+</html>
+END
+}
+
+
+sub edit { # Benutzerprofil od. Chat-Optionen abspeichern
+ my $method = $_[0];
+ &zeit;
+ if ($method eq "edit_profile") {
+ my $url = $q->param('homepage');
+ $url =~ s#^http://*##;
+ open(PROFILE,">data/user/profiles/$alias");
+ my $profile = $q->param('nachname')."\n".$q->param('vorname')."\n".$q->param('alter')."\n".$q->param('wohnort')."\n".$q->param('email')."\n".$q->param('icq')."\n"."http://$url\n".$q->param('weiteres');
+ $profile =~ s#<#&lt\;#g;
+ print PROFILE $profile;
+ close PROFILE;
+ &edit_html("edit_profile_html","edit_profile_ok");
+ } elsif ($method eq "edit_options") {
+ if ($id ne $tmp) {
+ &edit_html("edit_options_html","edit_pw_wrong");
+ exit;
+ }
+ open(OPTIONS,">data/user/options/$alias");
+ my $options = $id."\n".$col."\n".$secol."\n".$q->param("maxVerlauf")."\n".$q->param("verlaufOrder");
+ $options =~ s#<#&lt\;#g;
+ print OPTIONS $options;
+ close OPTIONS;
+ &edit_html("edit_options_html","edit_options_ok");
+ }
+} \ No newline at end of file
diff --git a/0.6.2/online.pl b/0.6.2/online.pl
new file mode 100644
index 0000000..6d64f1b
--- /dev/null
+++ b/0.6.2/online.pl
@@ -0,0 +1,133 @@
+#!/usr/bin/perl
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+print $q->header();
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+&secure_checkid($alias);
+$room = $q->param("room");
+
+my @away = &prove_away($alias,$room,"return_list");
+
+for ($i=0;$i<=$#away;$i+=2) {
+ goto DONOTCOUNT if ($away[$i] eq $alias);
+}
+
+open(DATEI,"<data/online/users/$alias");
+ my $oldstamp = <DATEI>;
+close DATEI;
+if ($oldstamp > (time - 40)) {
+ open(DATEI,"<data/user/counts/$alias.online");
+ my $online = <DATEI>;
+ close DATEI;
+ my $total = (time-$oldstamp+$online);
+ open DATEI,">data/user/counts/$alias.online";
+ print DATEI $total;
+ close DATEI;
+}
+DONOTCOUNT:
+
+unless (-d "data/online/rooms/$room") {
+ mkdir "data/online/rooms/$room", 0777;
+}
+unless (-f "data/online/rstat/$room") {
+ open(DATEI,">data/online/rstat/$room"); # Raumbesetzerstatus setzen
+ print DATEI "0\n\n$alias\n";
+ close DATEI;
+}
+
+open(DATEI,">data/online/users/$alias");
+ print DATEI time;
+close DATEI;
+open(DATEI,">data/online/rooms/$room/$alias");
+ print DATEI time;
+close DATEI;
+
+open(DATEI,"<data/online/prove");
+ my $provetime = <DATEI>;
+close DATEI;
+&check_online if ($provetime < (time - 30));
+
+print<<HEADER;
+<html>
+ <head>
+ <meta http-equiv="refresh" content="20" URL="online.pl?room=$room&alias=$alias&tmpid=$tmpid">
+ <style type="text/css">
+ a { font-family: arial; font-size:11px; color: #ffffef; }
+ a:hover { color: #ffffff; }
+ </style>
+ <style type="text/css" media="all">
+ a { text-decoration: none; }
+ a:hover { text-decoration:underline; }
+ </style>
+ </head>
+ <body bgcolor="#000000">
+HEADER
+
+opendir(ROOM,"data/online/rooms/".$room);
+ my @room = sort(readdir(ROOM));
+closedir(ROOM);
+
+my $chatter = $#room-1;
+my @besetzer = &prove_besetzer(undef,$room,"return_list");
+
+open WA, "<data/wa2";
+ my @wa = <WA>;
+close WA;
+open OW, "<data/ow2";
+ my @ow = <OW>;
+close OW;
+
+print "<font size='1' color='ffffff' face='arial'>$room ($chatter):</font><table>";
+
+foreach $online (@room) {
+ if (-f "data/online/rooms/$room/$online") {
+ for ($i=0;$i<=$#away;$i+=2) {
+ chomp $away[$i+1];
+ if ($away[$i] eq $online) {
+ my $away = $away[$i+1];
+ print "<tr><td><img title='$away' alt='$away' src='$gfxpath/away.gif'></td>";
+ goto WEITER;
+ }
+ }
+ if ($online eq "red_pepper") {
+ print "<tr><td><img title='Die Unschuld vom Land' alt='Die Unschuld vom Land' src='$gfxpath/uvl.gif'></td>";
+ goto WEITER;
+ }
+ if ($online eq $admin) {
+ print "<tr><td><img title='Administrator' alt='Administrator' src='$gfxpath/adm.gif'></td>";
+ goto WEITER;
+ }
+ foreach(@ow) {
+ chomp;
+ if ($_ eq $online) {
+ print "<tr><td><img title='Oberw&auml;chter' alt='Oberw&auml;chter' src='$gfxpath/ow.gif'></td>";
+ goto WEITER;
+ }
+ }
+ foreach(@wa) {
+ chomp;
+ if ($_ eq $online) {
+ print "<tr><td><img title='W&auml;chter' alt='W&auml;chter' src='$gfxpath/wa.gif'></td>";
+ goto WEITER;
+ }
+ }
+ foreach(@besetzer) {
+ chomp;
+ if ($_ eq $online) {
+ print "<tr><td><img title='Raumbesetzer' alt='Raumbesetzer' src='$gfxpath/rb.gif'></td>";
+ goto WEITER;
+ }
+ }
+ print "<tr><td></td>";
+WEITER:
+ print "<td><a href='main2.pl?var=alias_html&alias=$alias&tmp=$online&tmpid=$tmpid' target='$online'>$online</a></td></tr>";
+ }
+}
+
+print "</table>", $q->end_html; \ No newline at end of file
diff --git a/0.6.2/ow.gif b/0.6.2/ow.gif
new file mode 100644
index 0000000..b30e8f9
--- /dev/null
+++ b/0.6.2/ow.gif
Binary files differ
diff --git a/0.6.2/push.pl b/0.6.2/push.pl
new file mode 100644
index 0000000..cc5a2aa
--- /dev/null
+++ b/0.6.2/push.pl
@@ -0,0 +1,116 @@
+#!/usr/bin/perl
+
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+print $q->header;
+
+$alias = $q->param("alias");
+$tmpid = $q->param("tmpid");
+
+{
+ unless (-f "data/online/tmpid/$alias.$tmpid") {
+ require config;
+ &error("Falsche TempID !");
+ }
+}
+
+$room = $q->param("room");
+
+my $pid = $$;
+$| = 1;
+
+print <<END;
+<html>
+ <head>
+<script language="JavaScript">
+<!--
+// Scroll-Routine von Anklepper (http://www.anklepper.de)
+// speziell für yChat (http://www.yChat.de), Copyright 2000
+scrolling = true;
+moves_steps = 4;
+moves_interval = 4;
+function moves()
+{
+ if( scrolling != false )
+ window.scrollBy( 0, moves_steps );
+ window.setTimeout( "moves()", moves_interval );
+}
+moves();
+//-->
+</script>
+</head>
+<body bgcolor=000000 link=FFFFFF alink=FFFFEF vlink=FFFFEF>
+<font size=1 color=ffffff face=arial>loading chat-engine ...</font><br>
+END
+sleep 1;
+print "<font size=1 color=ffffff face=arial>loading in progress ...</font><br>";
+sleep 1;
+print "<font size=1 color=ffffff face=arial><b>$alias</b>, welcome to <b>yChat</b>! :-)</font><br>";
+
+
+if (-f "data/user/memos/$alias") {
+ open(MEMOS,"<data/user/memos/$alias");
+ my @memos = <MEMOS>;
+ close MEMOS;
+ my $memos;
+ foreach (@memos) {
+ $memos .= $_;
+ }
+ print $memos;
+ unlink("data/user/memos/$alias");
+}
+
+my $startime,$change_room,@flood;
+OPENMSGFILE:
+$change_room = 0;
+$startime = time;
+
+if (-e "data/msgs/$room") {
+ open(MSGFILE,"<data/msgs/$room");
+ unless (-d "data/online/pids") {
+ mkdir "data/online/pids", 0777;
+ } unless (-d "data/online/pids/$room") {
+ mkdir "data/online/pids/$room", 0777;
+ }
+ open(PID,">data/online/pids/$room/$pid");
+ print PID time;
+ close PID;
+} else {
+ sleep 1;
+ goto OPENMSGFILE;
+}
+
+&sendmsgs;
+while (-f "data/online/users/$alias") {
+ local $SIG{USR1} = \&sendmsgs;
+ goto OPENMSGFILE if ($change_room == 1);
+ sleep 15;
+ print "\n";
+}
+
+sub sendmsgs {
+ for ($curpos = tell(MSGFILE); <MSGFILE>; $curpos = tell(MSGFILE)) {
+ my ($address, $stamp, $command, $action, $message) = split(/<;/, $_);
+ if ($address eq "!" || $address eq $alias) {
+ if ($stamp > $startime) {
+ if ($command eq "cr") {
+ unlink("data/online/pids/$room/$pid");
+ $room = $action;
+ close MSGFILE;
+ $change_room = 1;
+ }
+ print "$message<br>\n" if ($change_room != 1);
+ push(@flood,$message);
+ if ($flood[0] eq $flood[1] && $flood[0] eq $flood[2] && $flood[0] eq $flood[3]) {
+ print "<i><font color=red> Jemand floodet den Chat !</font></i><br>\n";
+ }
+ shift(@flood) if ($#flood > 2);
+ }
+ }
+ }
+ seek(MSGFILE, $curpos, 0);
+}
+
+unlink("data/online/pids/$room/$pid"); \ No newline at end of file
diff --git a/0.6.2/rb.gif b/0.6.2/rb.gif
new file mode 100644
index 0000000..321341c
--- /dev/null
+++ b/0.6.2/rb.gif
Binary files differ
diff --git a/0.6.2/stat.pl b/0.6.2/stat.pl
new file mode 100644
index 0000000..0cddb6e
--- /dev/null
+++ b/0.6.2/stat.pl
@@ -0,0 +1,209 @@
+#!/usr/bin/perl -w
+# yChat - Copyright by Paul C. Bütow
+
+use CGI;
+$q = new CGI;
+require config;
+
+my $var = $q->param('var');
+$alias = $q->param('alias');
+$tmpid = $q->param('tmpid');
+
+print $q->header();
+&start_html("Statistiken");
+print $q->div("yChat Statistiken"), $q->hr,
+ $q->div( $q->a( { -href=>"stat.pl?var=ranking&alias=$alias&tmpid=$tmpid" }, "Rankings"), " | ",
+ $q->a( { -href=>"stat.pl?var=del&alias=$alias&tmpid=$tmpid" }, "Loginstatistiken"), " | ",
+ $q->a( { -href=>"stat.pl?var=stat&alias=$alias&tmpid=$tmpid" }, "DB-Statistik"), " | ",
+ $q->a( { -href=>"stat.pl?var=code&alias=$alias&tmpid=$tmpid" }, "Programmcode"), " | ",
+ $q->a( { -href=>"stat.pl?var=var&alias=$alias&tmpid=$tmpid" }, "Umgebungsvariablen"),), $q->hr;
+
+if ($var eq "ranking") {
+
+ opendir(COUNTS, "data/user/counts");
+ my @counts = readdir(COUNTS);
+ closedir(COUNTS);
+
+ print "<div>";
+
+ my $nr_start = $q->param('start');
+ my $nr_end = $q->param('end');
+ my %online;
+ my $rank;
+ my $nr;
+
+ foreach(@counts) {
+ if(-f "data/user/counts/$_" ) {
+ if (s#.online##g) {
+ open(TOTAL, "<data/user/counts/$_.online");
+ my $total = <TOTAL>;
+ close TOTAL;
+ $online{sprintf("%.2f",($total / 3600))} = $_;
+ }
+ }
+ }
+
+ print "<div>", $q->b("Rankings:"), $q->br,
+ "<table><tr><td><div><b>#:</b></div></td><td><b><div>St.:</div></b></td><td><b><div>Name:</div></b></td></tr>";
+
+ if (!$nr_start) {
+ $nr_start = 1;
+ } if (!$nr_end) {
+ $nr_end = 20;
+ }
+
+ foreach $wert (reverse(sort { $a <=> $b } keys %online)) {
+ $nr++;
+ if ($online{$wert} eq $alias) {
+ $rank = $nr;
+ last if ($nr > $nr_end);
+ }
+ next if ($nr < $nr_start || $nr > $nr_end);
+ print "<tr><td><font color='ffffff' size='1' face='arial'>".$nr."</font></td><td><font color='ffffff' size='1' face='arial'> ".$wert."h </font></td><td> <a href='main2.pl?var=alias_html&alias=$alias&tmp=$online{$wert}&tmpid=$tmpid'><font size='1' face='arial'>$online{$wert}</font></a></td></tr>\n";
+ }
+ print "</table>", $q->hr;
+ $nr_start -= 20; $nr_end -= 20;
+ print "Rankings von <a href='stat.pl?var=ranking&start=$nr_start&end=$nr_end&alias=$alias&tmpid=$tmpid'>$nr_start bis $nr_end</a> anzeigen ...<br>" if ($nr_start > 0);
+ $nr_start += 40; $nr_end += 40;
+ print "Rankings von <a href='stat.pl?var=ranking&start=$nr_start&end=$nr_end&alias=$alias&tmpid=$tmpid'>$nr_start bis $nr_end</a> anzeigen ...",
+ $q->br, $q->br, $q->b("$alias, Du befindest Dich auf Rank $rank</div>");
+
+} elsif ($var eq "del") {
+
+ print "<div>", $q->b("Alte Benutzer l&ouml;schen:"), $q->br,
+ "Benutzer, die sich 1440 Stunden (60 Tage) nicht mehr in das System eingeloggt haben, werden gelöscht.", $q->br, $q->br;
+
+ opendir(USER, "data/user/options");
+ my @user = readdir(USER);
+ closedir(USER);
+ @user = sort(@user);
+
+ my $i = 0;
+ my $j;
+ my $k = 0;
+ my $l = 0;
+ my $full = $q->param('tmp');
+
+ foreach(@user) {
+ if (-f "data/user/lastlogin/$_") {
+ open(LOGIN,"<data/user/lastlogin/$_");
+ my $login = <LOGIN>;
+ close LOGIN;
+ $login = sprintf("%.2f",((time - $login) / 3600));
+ $j++;
+ if (999 < $login && $login < 1440) { # 1440 = 60 Tage
+ $k++;
+ print $q->font( { -color=>"ffa500" }, $q->b( "$j($k) $_ Letztes Login vor: ".$login."h") ), $q->br, "\n" if ($full ne undef);
+ } elsif ($login < 48) {
+ $l++;
+ print $q->font( { -color=>"ffffef" }, $q->b( "$j($l) $_ Letztes Login vor: ".$login."h") ), $q->br, "\n" if ($full ne undef);
+ } elsif ($login < 1440) {
+ print "$j $_ Letztes Login vor: ".$login."h", $q->br, "\n" if ($full ne undef);
+ } else {
+ $k++;
+ &kill($_,$i++,$login);
+ }
+ } elsif (-f "data/user/options/$_") {
+ &kill($_,$i++);
+ }
+ }
+ print $q->hr if ($full ne undef);
+ print "</div>", $q->div( $q->b(
+ "$j Benutzer befinden sich in der Datenbank!", $q->br,
+ $q->font( { -color=>"ffffef" }, "$l Benutzer haben sich innerhalb der letzten 48 Stunden eingeloggt!"), $q->br,
+ $q->font( { -color=>"ffa500" }, "$k Benutzer haben sich &uuml;ber 1000 Stunden nicht mehr eingeloggt!"), $q->br,
+ $q->font( { -color=>"ff0000" }, "$i Benutzer wurden gerade eben gelöscht!") ), $q->br, $q->br,
+ "PS: Jeder registrierte Benutzername wird nur einmal gez&auml;hlt!" );
+ print $q->br, $q->div( "(", $q->a( { -href=>"stat.pl?var=del&tmp=true&alias=$alias&tmpid=$tmpid"}, "Vollst&auml;ndige Ansicht"), ")" ) if ($full eq undef);
+
+} elsif ($var eq "var") {
+
+ print "<div>", $q->b("Server Umgebungsvariablen:"), $q->br, $q->br,
+ "Die Serverumgebungsvariablen k&ouml;nnen nur von Oberw&auml;chtern eingesehen werden!", $q->br, $q->br;
+
+ if (&hierachie($alias) eq "ow") {
+ &secure_checkid($alias);
+ while(($key,$value) = each(%ENV)) {
+ print "$key = $value\n", $q->br;
+ }
+ }
+
+ print "</div>";
+
+} elsif ($var eq "stat") {
+
+ print $q->div( $q->b("yChat-DB Statistik:") ), $q->br;
+ $files = 0;
+ $size = 0;
+ $directorys = 1;
+ &zaehle("data");
+ $size = sprintf("%.2f", ($size/1048576));
+ print $q->div( "Dateien insgesamt: $files", $q->br, "MB insgesamt: $size", $q->br, "Verzeichnisse insgesamt: $directorys");
+
+ } elsif ($var eq "code") {
+
+ print $q->div( $q->b("yChat Programmcode-Statistik:") ), $q->br;
+
+ my ($zeilen,$size,$bytes,$files);
+
+ opendir(DIR,".");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ $dir = sort(@dir);
+
+ foreach(@dir) {
+ if (/.+[pl]$/ || /.+[pm]$/) {
+ $bytes = (-s);
+ $size += $bytes;
+ open(PL, "<$_");
+ my @pl = <PL>;
+ close PL;
+ local $nr = $#pl+1;
+ $zeilen += $nr;
+ $files++;
+ print $q->div("Datei $files: $nr Zeilen, $bytes Bytes"), $q->br, "\n";
+ }
+ }
+print $q->div( $q->b("Programmcode: $files Dateien, $zeilen Zeilen", $q->br, "Größe: $size Bytes") );
+
+}
+
+print $q->end_html;
+
+sub zaehle {
+ local ($dir,$data) = @_;
+ $dir = "$dir/$data" if ($data ne undef);
+ opendir(DATA,$dir);
+ local @data = readdir(DATA);
+ closedir(DATA);
+ $files2 = 0;
+ foreach(@data) {
+ if (-f "$dir/$_") {
+ $files++;
+ $files2++;
+ $size += (-s "$dir/$_");
+ } elsif (-d "$dir/$_" && $_ ne "." && $_ ne "..") {
+ $directorys++;
+ &zaehle($dir,$_);
+ }
+ }
+}
+
+sub kill {
+ my ($rm,$nr,$login) = @_;
+ $login = "XXXXXX" if ($login eq undef);
+ print $q->font( { -color=>"ff0000" }, $q->b( "$j($nr) $rm Letztes Login vor: ".$login."h (wurde gel&ouml;scht)") ), $q->br, "\n";
+ print "<font size='1'>";
+ print "options " if unlink("data/user/options/$rm");
+ print "profiles " if unlink("data/user/profiles/$rm");
+ print "gbooks " if unlink("data/user/gbooks/$rm");
+ print "counts " if unlink("data/user/counts/$rm");
+ print "counts.online " if unlink("data/user/counts/".$rm.".online");
+ print "lastlogin " if unlink("data/user/lastlogin/$rm");
+ print "memos" if unlink("data/user/memos/$rm");
+ print "</font>", $q->hr, "\n";
+ &zeit;
+ open(DEL, ">>data/kill");
+ print DEL "($day.$month.$year $hours:$min:$sec) $rm wurde automatisch gekillt [$alias]\n";
+ close DEL;
+} \ No newline at end of file
diff --git a/0.6.2/uvl.gif b/0.6.2/uvl.gif
new file mode 100644
index 0000000..b9208d6
--- /dev/null
+++ b/0.6.2/uvl.gif
Binary files differ
diff --git a/0.6.2/wa.gif b/0.6.2/wa.gif
new file mode 100644
index 0000000..553984c
--- /dev/null
+++ b/0.6.2/wa.gif
Binary files differ
diff --git a/0.6.2/yIntro.swf b/0.6.2/yIntro.swf
new file mode 100644
index 0000000..81d9015
--- /dev/null
+++ b/0.6.2/yIntro.swf
Binary files differ
diff --git a/0.6.2/ySymbol.swf b/0.6.2/ySymbol.swf
new file mode 100644
index 0000000..2b899bb
--- /dev/null
+++ b/0.6.2/ySymbol.swf
Binary files differ
diff --git a/0.7.1/changeroom.pm b/0.7.1/changeroom.pm
new file mode 100644
index 0000000..4961e01
--- /dev/null
+++ b/0.7.1/changeroom.pm
@@ -0,0 +1,81 @@
+sub change_room { # Den Chat-Raum wechseln
+ my ($method,$newroom,$oldroom,$alias2) = @_;
+
+ if ($newroom eq $oldroom) {
+ &post_prv($alias,"<font color='ffffff'>Du befindest dich bereits im Raum <font color='ffa500'>$newroom</font>!</font>");
+ &reload_html;
+
+ } elsif ($newroom eq $loginplace) {
+ &post($room,"<i><font color='ffffff'>".&timestring." <font color='$col'>$alias</font> verl&auml;sst den Chat und geht in die <b>$loginplace</b> ... </font></i>", $alias);
+ &post_strmsg($alias,$room,'quit');
+
+ unlink("data/online/rooms/$room/$alias");
+
+ &rm_rstat($alias,$room);
+ &check_online;
+ &reload_html;
+ }
+
+ open RSTAT, "<data/online/rstat/$newroom";
+ my @rstat = <RSTAT>;
+ close RSTAT;
+
+ #Überprüfen, ob Alias Raum betreten darf
+ if ($rstat[0] eq "1\n") {
+ if (3 <= &hierachie($alias)) {
+ &post_prv($alias,"<font color='ffffff'>Der Raum <font color='ffa500'>$newroom</font> ist leider abgesperrt!</font>");
+ &reload_html;
+ }
+ }
+
+ &private_javascript($alias, $room, "parent.input.document.inf.room.value = '$newroom';open('chat?request=online&room=$newroom&alias=$alias&tmpid=$tmpid','online');" );
+ open MSGFILE,">>data/msgs/$newroom";
+ print MSGFILE "$alias<;".time."<;!<;!<;<;\n";
+ close MSGFILE;
+
+ open MSGFILE,">>data/msgs/$room";
+ if ($method eq "j") {
+ print MSGFILE "$alias<;".time."<;!<;!<;<i><font color='ffffff'>".&timestring." Du wechselst aus dem Raum <b>$oldroom</b> herein nach <b>$newroom</b> ...</font></i><br><;\n";
+
+ } elsif ($method eq "ju") {
+ print MSGFILE "$alias<;".time."<;!<;!<;<i><font color='ffffff'>".&timestring." Du folgst <b>$alias2</b> aus dem Raum <b>$oldroom</b> herein nach <b>$newroom</b> ...</font></i><br><;\n";
+
+ } elsif ($method eq "sep") {
+ print MSGFILE "$alias<;".time."<;!<;!<;<i><font color='ffffff'>".&timestring." Du wechselst aus dem Raum <b>$oldroom</b> herein nach <b>$newroom</b> und sperrst ab...</font></i><br><;\n";
+
+ } elsif ($method eq "beam") {
+ print MSGFILE "$alias<;".time."<;!<;!<;<i><font color='ffffff'>".&timestring." Du wurdest von <b>$alias2</b> in den Raum <b>$newroom</b> gebeamt...</font></i><br><;\n";
+ }
+ close MSGFILE;
+
+ &post_strmsg($alias,$room,'cr',$newroom);
+ $room = $oldroom;
+
+ my $tmpstamp = time;
+ if ($method eq "j") {
+ &post($room,"<i><font color='ffffff'>".&timestring." <font color='$col'>$alias</font> wechselt in den Raum <b>$newroom</b> ...</font></i>", $alias);
+ $room = $newroom;
+ &post($room,"<i><font color='ffffff'>".&timestring." <font color='$col'>$alias</font> kommt aus dem Raum <b>$oldroom</b> herein nach <b>$newroom</b> ...</font></i>", $alias);
+
+ } elsif ($method eq "ju") {
+ &post($room,"<i><font color='ffffff'>".&timestring." <font color='$col'>$alias</font> folgt <b>$alias2</b> in den Raum <b>$newroom</b> ...</font></i>", $alias);
+ $room = $newroom;
+ &post($room,"<i><font color='ffffff'>".&timestring." <font color='$col'>$alias</font> kommt aus dem Raum <b>$oldroom</b> und folgt <b>$alias2</b> herein nach <b>$newroom</b> ...</font></i>", $alias);
+
+ } elsif ($method eq "sep") {
+ &post($room,"<i><font color='ffffff'>".&timestring." <font color='$col'>$alias</font> wechselt in den Raum <b>$newroom</b> und sperrt ab...</font></i>", $alias);
+ $room = $newroom;
+ &post($room,"<i><font color='ffffff'>".&timestring." <font color='$col'>$alias</font> kommt aus dem Raum <b>$oldroom</b> herein nach <b>$newroom</b> und sperrt ab...</font></i>", $alias);
+
+ } elsif ($method eq "beam") {
+ &post($room,"<i><font color='ffffff'>".&timestring." <font color='$col'>$alias2</font> beamt <b>$alias</b> in den Raum <b>$newroom</b>...</font></i>", $alias2);
+ $room = $newroom;
+ &post($room,"<i><font color='ffffff'>".&timestring." <font color='$col'>$alias2</font> beamt <b>$alias</b> aus dem Raum <b>$oldroom</b> herein nach <b>$room</b>...</font></i>", $alias2);
+ }
+
+ unlink("data/online/rooms/$oldroom/$alias");
+ &rm_rstat($alias,$oldroom);
+ &check_online;
+}
+
+1;
diff --git a/0.7.1/chatiq.sno b/0.7.1/chatiq.sno
new file mode 100644
index 0000000..2a024f5
--- /dev/null
+++ b/0.7.1/chatiq.sno
@@ -0,0 +1 @@
+<div><h2>Chatiquette</h2></div><hr><div>Hier einige Grundlagen ...</div><style type="text/css"> li { color: #ffffff }</style><ul><li><div>Vergiss nie, dass am anderen Ende auch nur Menschen sitzen. Diese m&ouml;gen es gar nicht, angep&ouml;belt, beleidigt oder in sonstiger Weise angegriffen zu werden.</div></li><li><div>St&ouml;rend ist auch immer, wenn ein privater Streit im Chat ausgetragen wird. Tragt eure privaten Sachen ausserhalb des Chats aus.<br>Selbst wenn es nur Spass ist - weiss der Rest im Chat das?</div></li><li><div>Dauergeschrei f&auml;llt auch immer wieder st&ouml;rend auf. Was in Grossbuchstaben geschrieben wird, wird als Schreien bezeichnet.</div></li><li><div>Unsere ganz besonderen Spezialisten wollen auch immer wieder rausfliegen. Um das zu erreichen, senden sie die ganze Zeit Unsinn.</div></li><li><div>Diskussionen sind dagegen kein Problem. Daf&uuml;r ist ein Chat ja da. Sobald allerdings das Thema der Diskussion zu sehr entgleist, sollte die Diskussion in einen etwas weniger &ouml;ffentlichen Raum verlegt werden.</div></li></ul><div>Daraus ergeben sich folgende Regeln:</div><ul><li><div>keinen beleidigenden Wortschatz verwenden</div></li><li><div>obz&ouml;ner und verfassungsfeindlicher Wortschatz f&auml;llt auch weg</div></li><li><div>streitet euch woanders oder in einem privaten Raum</div></li><li><div>schreit nich so viel</div></li><li><div>schreibt keinen Unsinn, der so aussieht, als ob eure Katze über die Tastatur gelaufen ist</div></li><li><div>schreibt nicht zu schnell hintereinander, besonders nicht dasselbe</div></li><li><div>verlagert die Diskussion, wenn sich jemand gest&ouml;rt f&uuml;hlt</div></li><li><div>Diese Liste ist nicht vollst&auml;ndig. Mit dem gesunden Menschenverstand sollte es eigentlich m&ouml;glich sein, sich die nicht aufgef&uuml;hrten Punkte zu denken.</div></li></ul><div>So - nach den ganzen "lass-es-bessers" noch ein paar &Uuml;berlebenstips:</div><ul><li><div>beachte die oben stehenden Punkte ;-)</div></li><li><div>es macht sich immer gut, beim Reinkommen mal zu gr&uuml;ssen</div></li><li><div>warte nicht, bis man/frau dich anspricht - werde selbst aktiv und gib deinen Senf dazu</div></li><li><div>es gibt meist kein allgemein anerkanntes Gespr&auml;chsthema - lies dich einfach rein</div></li><li><div>die frage &quot;wer will chatten&quot; ist eigentlich &uuml;berfl&uuml;ssig in einem Chat (wir warten doch alle nur aufs Ufo ;-)</div></li><li><div>fang nich sofort mit den W-Fragen (woher, wie alt, weiblich oder männlich?) an - es st&ouml;rt einige Leute</div></li></ul><div>Problematisch f&uuml;r die W&auml;chter und Oberw&auml;chter ist:</div><ul><li><div>&quot;der nervt mich - schmeiss den mal raus&quot; ist oft nicht nachvollziehbar, weil der W&Auml; oder OW die Vorgeschichte - die vielleicht ausserhalb des yChat stattgefunden hat - nicht kennt oder keinen Beweis daf&uuml;r hat.</div></li></ul><hr><div><h2>Richtlinien f&uuml;r den gestressten W&Auml; und OW:</h2></div><ul><li><div>Du hast die Macht - aber mi&szlig;brauche sie nicht!</div></li><li><div>Leute, die ganz offensichtlich st&ouml;ren wollen und dabei den Chatbetrieb massiv behindern, sofort rausschmeissen! Kriterien dazu:</div><ul><li><div>Fluten des Chats</div></li><li><div>Wiederholung von Parolen</div></li><li><div>Exzessive Nutzung von zuf&auml;lligen Buchstaben-/Zeichenfolgen</div></li><li><div>usw...</div></li></ul></li><li><div>Bei den anderen vorher noch eine Warnung aussprechen...</div></li><li><div>Nicht vergessen: auch f&uuml;r euch gelten die oben aufgef&uuml;hrten Regeln!</div></li><li><div>Vergabe von Raumbesetzer- und W&auml;chterrechten:<br>(dies gilt f&uuml;r RB-Vergabe in der Cyberbar, W&Auml; allgemein)</div><ul><li><div>Um RB oder W&Auml; betteln wird schon mal gar nicht beachtet.</div></li><li><div>Wer W&Auml; wird, soll sichs verdienen - z.B. durch h&auml;ufiges Helfen bei Neulingen.</div></li><li><div>Ein W&Auml; sollte schon &ouml;fter im Chat sein.</div></li><li><div>Oberw&auml;chter zu werden ist sehr schwierig. Frag gar nicht erst danach ;-)</div></li></ul></ul><div>Wer meint, von einem W&auml;chter oder Oberw&auml;chter ungerecht behandelt worden zu sein (z.B. weil dieser wegen persönlichen Streitigkeiten rausschmeisst), richte seine Klage an einen Oberw&auml;chter oder direkt an den obersten Boss: Snooper (<a href="mailto:admin@ychat.de">admin@ychat.de</a>).</div> \ No newline at end of file
diff --git a/0.7.1/colors.sno b/0.7.1/colors.sno
new file mode 100644
index 0000000..3640b9e
--- /dev/null
+++ b/0.7.1/colors.sno
@@ -0,0 +1,290 @@
+ <table cellspacing=0 cellpadding=5 border=0>
+ <tr>
+ <td bgcolor="000000"><span style="color:#FFFFFF; text-decoration:line-through;">000000</span></td>
+ <td bgcolor="000033"><span style="color:#FFFFFF; text-decoration:line-through;">000033</span></td>
+ <td bgcolor="000066"><span style="color:#FFFFFF; text-decoration:line-through;">000066</span></td>
+ <td bgcolor="000099"><span style="color:#FFFFFF; text-decoration:line-through;">000099</span></td>
+ <td bgcolor="0000CC"><span style="color:#FFFFFF; text-decoration:line-through;">0000CC</span></td>
+ <td bgcolor="0000FF"><a href="javascript:insertcode('0000FF');" style="color:#FFFFFF;">0000FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="003300"><span style="color:#FFFFFF; text-decoration:line-through;">003300</span></td>
+ <td bgcolor="003333"><span style="color:#FFFFFF; text-decoration:line-through;">003333</span></td>
+ <td bgcolor="003366"><span style="color:#FFFFFF; text-decoration:line-through;">003366</span></td>
+ <td bgcolor="003399"><a href="javascript:insertcode('003399');" style="color:#FFFFFF;">003399</a></td>
+ <td bgcolor="0033CC"><a href="javascript:insertcode('0033CC');" style="color:#FFFFFF;">0033CC</a></td>
+ <td bgcolor="0033FF"><a href="javascript:insertcode('0033FF');" style="color:#FFFFFF;">0033FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="006600"><span style="color:#FFFFFF; text-decoration:line-through;">006600</span></td>
+ <td bgcolor="006633"><span style="color:#FFFFFF; text-decoration:line-through;">006633</span></td>
+ <td bgcolor="006666"><a href="javascript:insertcode('006666');" style="color:#FFFFFF;">006666</a></td>
+ <td bgcolor="006699"><a href="javascript:insertcode('006699');" style="color:#FFFFFF;">006699</a></td>
+ <td bgcolor="0066CC"><a href="javascript:insertcode('0066CC');" style="color:#FFFFFF;">0066CC</a></td>
+ <td bgcolor="0066FF"><a href="javascript:insertcode('0066FF');" style="color:#FFFFFF;">0066FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="009900"><a href="javascript:insertcode('009900');" style="color:#FFFFFF;">009900</a></td>
+ <td bgcolor="009933"><a href="javascript:insertcode('009933');" style="color:#FFFFFF;">009933</a></td>
+ <td bgcolor="009966"><a href="javascript:insertcode('009966');" style="color:#FFFFFF;">009966</a></td>
+ <td bgcolor="009999"><a href="javascript:insertcode('009999');" style="color:#FFFFFF;">009999</a></td>
+ <td bgcolor="0099CC"><a href="javascript:insertcode('0099CC');" style="color:#FFFFFF;">0099CC</a></td>
+ <td bgcolor="0099FF"><a href="javascript:insertcode('0099FF');" style="color:#FFFFFF;">0099FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00CC00"><a href="javascript:insertcode('00CC00');" style="color:#000000;">00CC00</a></td>
+ <td bgcolor="00CC33"><a href="javascript:insertcode('00CC33');" style="color:#000000;">00CC33</a></td>
+ <td bgcolor="00CC66"><a href="javascript:insertcode('00CC66');" style="color:#000000;">00CC66</a></td>
+ <td bgcolor="00CC99"><a href="javascript:insertcode('00CC99');" style="color:#000000;">00CC99</a></td>
+ <td bgcolor="00CCCC"><a href="javascript:insertcode('00CCCC');" style="color:#000000;">00CCCC</a></td>
+ <td bgcolor="00CCFF"><a href="javascript:insertcode('00CCFF');" style="color:#000000;">00CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00FF00"><a href="javascript:insertcode('00FF00');" style="color:#000000;">00FF00</a></td>
+ <td bgcolor="00FF33"><a href="javascript:insertcode('00FF33');" style="color:#000000;">00FF33</a></td>
+ <td bgcolor="00FF66"><a href="javascript:insertcode('00FF66');" style="color:#000000;">00FF66</a></td>
+ <td bgcolor="00FF99"><a href="javascript:insertcode('00FF99');" style="color:#000000;">00FF99</a></td>
+ <td bgcolor="00FFCC"><a href="javascript:insertcode('00FFCC');" style="color:#000000;">00FFCC</a></td>
+ <td bgcolor="00FFFF"><a href="javascript:insertcode('00FFFF');" style="color:#000000;">00FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="330000"><span style="color:#FFFFFF; text-decoration:line-through;">330000</span></td>
+ <td bgcolor="330033"><span style="color:#FFFFFF; text-decoration:line-through;">330033</span></td>
+ <td bgcolor="330066"><span style="color:#FFFFFF; text-decoration:line-through;">330066</span></td>
+ <td bgcolor="330099"><a href="javascript:insertcode('330099');" style="color:#FFFFFF;">330099</a></td>
+ <td bgcolor="3300CC"><a href="javascript:insertcode('3300CC');" style="color:#FFFFFF;">3300CC</a></td>
+ <td bgcolor="3300FF"><a href="javascript:insertcode('3300FF');" style="color:#FFFFFF;">3300FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="333300"><span style="color:#FFFFFF; text-decoration:line-through;">333300</span></td>
+ <td bgcolor="333333"><span style="color:#FFFFFF; text-decoration:line-through;">333333</span></td>
+ <td bgcolor="333366"><a href="javascript:insertcode('333366');" style="color:#FFFFFF;">333366</a></td>
+ <td bgcolor="333399"><a href="javascript:insertcode('333399');" style="color:#FFFFFF;">333399</a></td>
+ <td bgcolor="3333CC"><a href="javascript:insertcode('3333CC');" style="color:#FFFFFF;">3333CC</a></td>
+ <td bgcolor="3333FF"><a href="javascript:insertcode('3333FF');" style="color:#FFFFFF;">3333FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="336600"><a href="javascript:insertcode('336600');" style="color:#FFFFFF;">336600</a></td>
+ <td bgcolor="336633"><a href="javascript:insertcode('336633');" style="color:#FFFFFF;">336633</a></td>
+ <td bgcolor="336666"><a href="javascript:insertcode('336666');" style="color:#FFFFFF;">336666</a></td>
+ <td bgcolor="336699"><a href="javascript:insertcode('336699');" style="color:#FFFFFF;">336699</a></td>
+ <td bgcolor="3366CC"><a href="javascript:insertcode('3366CC');" style="color:#FFFFFF;">3366CC</a></td>
+ <td bgcolor="3366FF"><a href="javascript:insertcode('3366FF');" style="color:#FFFFFF;">3366FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="339900"><a href="javascript:insertcode('339900');" style="color:#FFFFFF;">339900</a></td>
+ <td bgcolor="339933"><a href="javascript:insertcode('339933');" style="color:#FFFFFF;">339933</a></td>
+ <td bgcolor="339966"><a href="javascript:insertcode('339966');" style="color:#FFFFFF;">339966</a></td>
+ <td bgcolor="339999"><a href="javascript:insertcode('339999');" style="color:#FFFFFF;">339999</a></td>
+ <td bgcolor="3399CC"><a href="javascript:insertcode('3399CC');" style="color:#FFFFFF;">3399CC</a></td>
+ <td bgcolor="3399FF"><a href="javascript:insertcode('3399FF');" style="color:#FFFFFF;">3399FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33CC00"><a href="javascript:insertcode('33CC00');" style="color:#000000;">33CC00</a></td>
+ <td bgcolor="33CC33"><a href="javascript:insertcode('33CC33');" style="color:#000000;">33CC33</a></td>
+ <td bgcolor="33CC66"><a href="javascript:insertcode('33CC66');" style="color:#000000;">33CC66</a></td>
+ <td bgcolor="33CC99"><a href="javascript:insertcode('33CC99');" style="color:#000000;">33CC99</a></td>
+ <td bgcolor="33CCCC"><a href="javascript:insertcode('33CCCC');" style="color:#000000;">33CCCC</a></td>
+ <td bgcolor="33CCFF"><a href="javascript:insertcode('33CCFF');" style="color:#000000;">33CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33FF00"><a href="javascript:insertcode('33FF00');" style="color:#000000;">33FF00</a></td>
+ <td bgcolor="33FF33"><a href="javascript:insertcode('33FF33');" style="color:#000000;">33FF33</a></td>
+ <td bgcolor="33FF66"><a href="javascript:insertcode('33FF66');" style="color:#000000;">33FF66</a></td>
+ <td bgcolor="33FF99"><a href="javascript:insertcode('33FF99');" style="color:#000000;">33FF99</a></td>
+ <td bgcolor="33FFCC"><a href="javascript:insertcode('33FFCC');" style="color:#000000;">33FFCC</a></td>
+ <td bgcolor="33FFFF"><a href="javascript:insertcode('33FFFF');" style="color:#000000;">33FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="660000"><span style="color:#FFFFFF; text-decoration:line-through;">660000</span></td>
+ <td bgcolor="660033"><span style="color:#FFFFFF; text-decoration:line-through;">660033</span></td>
+ <td bgcolor="660066"><a href="javascript:insertcode('660066');" style="color:#FFFFFF;">660066</a></td>
+ <td bgcolor="660099"><a href="javascript:insertcode('660099');" style="color:#FFFFFF;">660099</a></td>
+ <td bgcolor="6600CC"><a href="javascript:insertcode('6600CC');" style="color:#FFFFFF;">6600CC</a></td>
+ <td bgcolor="6600FF"><a href="javascript:insertcode('6600FF');" style="color:#FFFFFF;">6600FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="663300"><a href="javascript:insertcode('663300');" style="color:#FFFFFF;">663300</a></td>
+ <td bgcolor="663333"><a href="javascript:insertcode('663333');" style="color:#FFFFFF;">663333</a></td>
+ <td bgcolor="663366"><a href="javascript:insertcode('663366');" style="color:#FFFFFF;">663366</a></td>
+ <td bgcolor="663399"><a href="javascript:insertcode('663399');" style="color:#FFFFFF;">663399</a></td>
+ <td bgcolor="6633CC"><a href="javascript:insertcode('6633CC');" style="color:#FFFFFF;">6633CC</a></td>
+ <td bgcolor="6633FF"><a href="javascript:insertcode('6633FF');" style="color:#FFFFFF;">6633FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="666600"><a href="javascript:insertcode('666600');" style="color:#FFFFFF;">666600</a></td>
+ <td bgcolor="666633"><a href="javascript:insertcode('666633');" style="color:#FFFFFF;">666633</a></td>
+ <td bgcolor="666666"><a href="javascript:insertcode('666666');" style="color:#FFFFFF;">666666</a></td>
+ <td bgcolor="666699"><a href="javascript:insertcode('666699');" style="color:#FFFFFF;">666699</a></td>
+ <td bgcolor="6666CC"><a href="javascript:insertcode('6666CC');" style="color:#FFFFFF;">6666CC</a></td>
+ <td bgcolor="6666FF"><a href="javascript:insertcode('6666FF');" style="color:#FFFFFF;">6666FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="669900"><a href="javascript:insertcode('669900');" style="color:#000000;">669900</a></td>
+ <td bgcolor="669933"><a href="javascript:insertcode('669933');" style="color:#000000;">669933</a></td>
+ <td bgcolor="669966"><a href="javascript:insertcode('669966');" style="color:#000000;">669966</a></td>
+ <td bgcolor="669999"><a href="javascript:insertcode('669999');" style="color:#000000;">669999</a></td>
+ <td bgcolor="6699CC"><a href="javascript:insertcode('6699CC');" style="color:#000000;">6699CC</a></td>
+ <td bgcolor="6699FF"><a href="javascript:insertcode('6699FF');" style="color:#000000;">6699FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66CC00"><a href="javascript:insertcode('66CC00');" style="color:#000000;">66CC00</a></td>
+ <td bgcolor="66CC33"><a href="javascript:insertcode('66CC33');" style="color:#000000;">66CC33</a></td>
+ <td bgcolor="66CC66"><a href="javascript:insertcode('66CC66');" style="color:#000000;">66CC66</a></td>
+ <td bgcolor="66CC99"><a href="javascript:insertcode('66CC99');" style="color:#000000;">66CC99</a></td>
+ <td bgcolor="66CCCC"><a href="javascript:insertcode('66CCCC');" style="color:#000000;">66CCCC</a></td>
+ <td bgcolor="66CCFF"><a href="javascript:insertcode('66CCFF');" style="color:#000000;">66CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66FF00"><a href="javascript:insertcode('66FF00');" style="color:#000000;">66FF00</a></td>
+ <td bgcolor="66FF33"><a href="javascript:insertcode('66FF33');" style="color:#000000;">66FF33</a></td>
+ <td bgcolor="66FF66"><a href="javascript:insertcode('66FF66');" style="color:#000000;">66FF66</a></td>
+ <td bgcolor="66FF99"><a href="javascript:insertcode('66FF99');" style="color:#000000;">66FF99</a></td>
+ <td bgcolor="66FFCC"><a href="javascript:insertcode('66FFCC');" style="color:#000000;">66FFCC</a></td>
+ <td bgcolor="66FFFF"><a href="javascript:insertcode('66FFFF');" style="color:#000000;">66FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="990000"><a href="javascript:insertcode('990000');" style="color:#FFFFFF;">990000</a></td>
+ <td bgcolor="990033"><a href="javascript:insertcode('990033');" style="color:#FFFFFF;">990033</a></td>
+ <td bgcolor="990066"><a href="javascript:insertcode('990066');" style="color:#FFFFFF;">990066</a></td>
+ <td bgcolor="990099"><a href="javascript:insertcode('990099');" style="color:#FFFFFF;">990099</a></td>
+ <td bgcolor="9900CC"><a href="javascript:insertcode('9900CC');" style="color:#FFFFFF;">9900CC</a></td>
+ <td bgcolor="9900FF"><a href="javascript:insertcode('9900FF');" style="color:#FFFFFF;">9900FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="993300"><a href="javascript:insertcode('993300');" style="color:#FFFFFF;">993300</a></td>
+ <td bgcolor="993333"><a href="javascript:insertcode('993333');" style="color:#FFFFFF;">993333</a></td>
+ <td bgcolor="993366"><a href="javascript:insertcode('993366');" style="color:#FFFFFF;">993366</a></td>
+ <td bgcolor="993399"><a href="javascript:insertcode('993399');" style="color:#FFFFFF;">993399</a></td>
+ <td bgcolor="9933CC"><a href="javascript:insertcode('9933CC');" style="color:#FFFFFF;">9933CC</a></td>
+ <td bgcolor="9933FF"><a href="javascript:insertcode('9933FF');" style="color:#FFFFFF;">9933FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="996600"><a href="javascript:insertcode('996600');" style="color:#FFFFFF;">996600</a></td>
+ <td bgcolor="996633"><a href="javascript:insertcode('996633');" style="color:#FFFFFF;">996633</a></td>
+ <td bgcolor="996666"><a href="javascript:insertcode('996666');" style="color:#FFFFFF;">996666</a></td>
+ <td bgcolor="996699"><a href="javascript:insertcode('996699');" style="color:#FFFFFF;">996699</a></td>
+ <td bgcolor="9966CC"><a href="javascript:insertcode('9966CC');" style="color:#FFFFFF;">9966CC</a></td>
+ <td bgcolor="9966FF"><a href="javascript:insertcode('9966FF');" style="color:#FFFFFF;">9966FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="999900"><a href="javascript:insertcode('999900');" style="color:#000000;">999900</a></td>
+ <td bgcolor="999933"><a href="javascript:insertcode('999933');" style="color:#000000;">999933</a></td>
+ <td bgcolor="999966"><a href="javascript:insertcode('999966');" style="color:#000000;">999966</a></td>
+ <td bgcolor="999999"><a href="javascript:insertcode('999999');" style="color:#000000;">999999</a></td>
+ <td bgcolor="9999CC"><a href="javascript:insertcode('9999CC');" style="color:#000000;">9999CC</a></td>
+ <td bgcolor="9999FF"><a href="javascript:insertcode('9999FF');" style="color:#000000;">9999FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99CC00"><a href="javascript:insertcode('99CC00');" style="color:#000000;">99CC00</a></td>
+ <td bgcolor="99CC33"><a href="javascript:insertcode('99CC33');" style="color:#000000;">99CC33</a></td>
+ <td bgcolor="99CC66"><a href="javascript:insertcode('99CC66');" style="color:#000000;">99CC66</a></td>
+ <td bgcolor="99CC99"><a href="javascript:insertcode('99CC99');" style="color:#000000;">99CC99</a></td>
+ <td bgcolor="99CCCC"><a href="javascript:insertcode('99CCCC');" style="color:#000000;">99CCCC</a></td>
+ <td bgcolor="99CCFF"><a href="javascript:insertcode('99CCFF');" style="color:#000000;">99CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99FF00"><a href="javascript:insertcode('99FF00');" style="color:#000000;">99FF00</a></td>
+ <td bgcolor="99FF33"><a href="javascript:insertcode('99FF33');" style="color:#000000;">99FF33</a></td>
+ <td bgcolor="99FF66"><a href="javascript:insertcode('99FF66');" style="color:#000000;">99FF66</a></td>
+ <td bgcolor="99FF99"><a href="javascript:insertcode('99FF99');" style="color:#000000;">99FF99</a></td>
+ <td bgcolor="99FFCC"><a href="javascript:insertcode('99FFCC');" style="color:#000000;">99FFCC</a></td>
+ <td bgcolor="99FFFF"><a href="javascript:insertcode('99FFFF');" style="color:#000000;">99FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC0000"><a href="javascript:insertcode('CC0000');" style="color:#FFFFFF;">CC0000</a></td>
+ <td bgcolor="CC0033"><a href="javascript:insertcode('CC0033');" style="color:#FFFFFF;">CC0033</a></td>
+ <td bgcolor="CC0066"><a href="javascript:insertcode('CC0066');" style="color:#FFFFFF;">CC0066</a></td>
+ <td bgcolor="CC0099"><a href="javascript:insertcode('CC0099');" style="color:#FFFFFF;">CC0099</a></td>
+ <td bgcolor="CC00CC"><a href="javascript:insertcode('CC00CC');" style="color:#FFFFFF;">CC00CC</a></td>
+ <td bgcolor="CC00FF"><a href="javascript:insertcode('CC00FF');" style="color:#FFFFFF;">CC00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC3300"><a href="javascript:insertcode('CC3300');" style="color:#FFFFFF;">CC3300</a></td>
+ <td bgcolor="CC3333"><a href="javascript:insertcode('CC3333');" style="color:#FFFFFF;">CC3333</a></td>
+ <td bgcolor="CC3366"><a href="javascript:insertcode('CC3366');" style="color:#FFFFFF;">CC3366</a></td>
+ <td bgcolor="CC3399"><a href="javascript:insertcode('CC3399');" style="color:#FFFFFF;">CC3399</a></td>
+ <td bgcolor="CC33CC"><a href="javascript:insertcode('CC33CC');" style="color:#FFFFFF;">CC33CC</a></td>
+ <td bgcolor="CC33FF"><a href="javascript:insertcode('CC33FF');" style="color:#FFFFFF;">CC33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC6600"><a href="javascript:insertcode('CC6600');" style="color:#000000;">CC6600</a></td>
+ <td bgcolor="CC6633"><a href="javascript:insertcode('CC6633');" style="color:#000000;">CC6633</a></td>
+ <td bgcolor="CC6666"><a href="javascript:insertcode('CC6666');" style="color:#000000;">CC6666</a></td>
+ <td bgcolor="CC6699"><a href="javascript:insertcode('CC6699');" style="color:#000000;">CC6699</a></td>
+ <td bgcolor="CC66CC"><a href="javascript:insertcode('CC66CC');" style="color:#000000;">CC66CC</a></td>
+ <td bgcolor="CC66FF"><a href="javascript:insertcode('CC66FF');" style="color:#000000;">CC66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC9900"><a href="javascript:insertcode('CC9900');" style="color:#000000;">CC9900</a></td>
+ <td bgcolor="CC9933"><a href="javascript:insertcode('CC9933');" style="color:#000000;">CC9933</a></td>
+ <td bgcolor="CC9966"><a href="javascript:insertcode('CC9966');" style="color:#000000;">CC9966</a></td>
+ <td bgcolor="CC9999"><a href="javascript:insertcode('CC9999');" style="color:#000000;">CC9999</a></td>
+ <td bgcolor="CC99CC"><a href="javascript:insertcode('CC99CC');" style="color:#000000;">CC99CC</a></td>
+ <td bgcolor="CC99FF"><a href="javascript:insertcode('CC99FF');" style="color:#000000;">CC99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCCC00"><a href="javascript:insertcode('CCCC00');" style="color:#000000;">CCCC00</a></td>
+ <td bgcolor="CCCC33"><a href="javascript:insertcode('CCCC33');" style="color:#000000;">CCCC33</a></td>
+ <td bgcolor="CCCC66"><a href="javascript:insertcode('CCCC66');" style="color:#000000;">CCCC66</a></td>
+ <td bgcolor="CCCC99"><a href="javascript:insertcode('CCCC99');" style="color:#000000;">CCCC99</a></td>
+ <td bgcolor="CCCCCC"><a href="javascript:insertcode('CCCCCC');" style="color:#000000;">CCCCCC</a></td>
+ <td bgcolor="CCCCFF"><a href="javascript:insertcode('CCCCFF');" style="color:#000000;">CCCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCFF00"><a href="javascript:insertcode('CCFF00');" style="color:#000000;">CCFF00</a></td>
+ <td bgcolor="CCFF33"><a href="javascript:insertcode('CCFF33');" style="color:#000000;">CCFF33</a></td>
+ <td bgcolor="CCFF66"><a href="javascript:insertcode('CCFF66');" style="color:#000000;">CCFF66</a></td>
+ <td bgcolor="CCFF99"><a href="javascript:insertcode('CCFF99');" style="color:#000000;">CCFF99</a></td>
+ <td bgcolor="CCFFCC"><a href="javascript:insertcode('CCFFCC');" style="color:#000000;">CCFFCC</a></td>
+ <td bgcolor="CCFFFF"><a href="javascript:insertcode('CCFFFF');" style="color:#000000;">CCFFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF0000"><a href="javascript:insertcode('FF0000');" style="color:#FFFFFF;">FF0000</a></td>
+ <td bgcolor="FF0033"><a href="javascript:insertcode('FF0033');" style="color:#FFFFFF;">FF0033</a></td>
+ <td bgcolor="FF0066"><a href="javascript:insertcode('FF0066');" style="color:#FFFFFF;">FF0066</a></td>
+ <td bgcolor="FF0099"><a href="javascript:insertcode('FF0099');" style="color:#FFFFFF;">FF0099</a></td>
+ <td bgcolor="FF00CC"><a href="javascript:insertcode('FF00CC');" style="color:#FFFFFF;">FF00CC</a></td>
+ <td bgcolor="FF00FF"><a href="javascript:insertcode('FF00FF');" style="color:#FFFFFF;">FF00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF3300"><a href="javascript:insertcode('FF3300');" style="color:#FFFFFF;">FF3300</a></td>
+ <td bgcolor="FF3333"><a href="javascript:insertcode('FF3333');" style="color:#FFFFFF;">FF3333</a></td>
+ <td bgcolor="FF3366"><a href="javascript:insertcode('FF3366');" style="color:#FFFFFF;">FF3366</a></td>
+ <td bgcolor="FF3399"><a href="javascript:insertcode('FF3399');" style="color:#FFFFFF;">FF3399</a></td>
+ <td bgcolor="FF33CC"><a href="javascript:insertcode('FF33CC');" style="color:#FFFFFF;">FF33CC</a></td>
+ <td bgcolor="FF33FF"><a href="javascript:insertcode('FF33FF');" style="color:#FFFFFF;">FF33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF6600"><a href="javascript:insertcode('FF6600');" style="color:#000000;">FF6600</a></td>
+ <td bgcolor="FF6633"><a href="javascript:insertcode('FF6633');" style="color:#000000;">FF6633</a></td>
+ <td bgcolor="FF6666"><a href="javascript:insertcode('FF6666');" style="color:#000000;">FF6666</a></td>
+ <td bgcolor="FF6699"><a href="javascript:insertcode('FF6699');" style="color:#000000;">FF6699</a></td>
+ <td bgcolor="FF66CC"><a href="javascript:insertcode('FF66CC');" style="color:#000000;">FF66CC</a></td>
+ <td bgcolor="FF66FF"><a href="javascript:insertcode('FF66FF');" style="color:#000000;">FF66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF9900"><a href="javascript:insertcode('FF9900');" style="color:#000000;">FF9900</a></td>
+ <td bgcolor="FF9933"><a href="javascript:insertcode('FF9933');" style="color:#000000;">FF9933</a></td>
+ <td bgcolor="FF9966"><a href="javascript:insertcode('FF9966');" style="color:#000000;">FF9966</a></td>
+ <td bgcolor="FF9999"><a href="javascript:insertcode('FF9999');" style="color:#000000;">FF9999</a></td>
+ <td bgcolor="FF99CC"><a href="javascript:insertcode('FF99CC');" style="color:#000000;">FF99CC</a></td>
+ <td bgcolor="FF99FF"><a href="javascript:insertcode('FF99FF');" style="color:#000000;">FF99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFCC00"><a href="javascript:insertcode('FFCC00');" style="color:#000000;">FFCC00</a></td>
+ <td bgcolor="FFCC33"><a href="javascript:insertcode('FFCC33');" style="color:#000000;">FFCC33</a></td>
+ <td bgcolor="FFCC66"><a href="javascript:insertcode('FFCC66');" style="color:#000000;">FFCC66</a></td>
+ <td bgcolor="FFCC99"><a href="javascript:insertcode('FFCC99');" style="color:#000000;">FFCC99</a></td>
+ <td bgcolor="FFCCCC"><a href="javascript:insertcode('FFCCCC');" style="color:#000000;">FFCCCC</a></td>
+ <td bgcolor="FFCCFF"><a href="javascript:insertcode('FFCCFF');" style="color:#000000;">FFCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFFF00"><a href="javascript:insertcode('FFFF00');" style="color:#000000;">FFFF00</a></td>
+ <td bgcolor="FFFF33"><a href="javascript:insertcode('FFFF33');" style="color:#000000;">FFFF33</a></td>
+ <td bgcolor="FFFF66"><a href="javascript:insertcode('FFFF66');" style="color:#000000;">FFFF66</a></td>
+ <td bgcolor="FFFF99"><a href="javascript:insertcode('FFFF99');" style="color:#000000;">FFFF99</a></td>
+ <td bgcolor="FFFFCC"><a href="javascript:insertcode('FFFFCC');" style="color:#000000;">FFFFCC</a></td>
+ <td bgcolor="FFFFFF"><a href="javascript:insertcode('FFFFFF');" style="color:#000000;">FFFFFF</a></td>
+ </tr>
+</table> \ No newline at end of file
diff --git a/0.7.1/commands b/0.7.1/commands
new file mode 100644
index 0000000..1d107bc
--- /dev/null
+++ b/0.7.1/commands
@@ -0,0 +1,784 @@
+sub command {
+ $_[0] = $_[0] . ' ';
+ $_[0] = substr($_[0], 1, length($_[0]) - 1);
+ my(@cmd) = split(/ /, $_[0], 0);
+ my $cmd = substr($_[0], 0, index($_[0], ' '));
+ my $tmp = $_[1];
+ sub lock {
+ my $method = shift @_;
+ open RSTAT, "data/online/rstat/$room";
+ my(@r_stat) = <RSTAT>;
+ close RSTAT;
+ my $lock = "0\n";
+ if ($room eq $standardroom) {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> sperrt den Raum ohne Erfolg ab ...</font></i>", $alias);
+ }
+ else {
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> sperrt den Raum ab ...</font></i>", $alias) if $method ne 'separee';
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> sperrt den Raum auf ...</font></i>", $alias) if $method ne 'separee';
+ }
+ for ($i = 1; $i <= $#r_stat; ++$i) {
+ $lock = $lock . $r_stat[$i];
+ }
+ open RSTAT, ">data/online/rstat/$room";
+ print RSTAT $lock;
+ close RSTAT;
+ }
+ &reload_html;
+ }
+ if ($cmd eq 'about') {
+ &post_prv($alias, "<font color=ffffff>Aktuelle Version ist $title und wurde am $datum aktuallisiert. Programmiert von Paul C. B\374tow (2000 - 2001).</font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'away') {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $away_msg = $away_msg . ' ' . $cmd[$i];
+ }
+ my $room = &get_room($alias);
+ if ($tmp eq 'autoaway') {
+ $away_msg = "$alias wurde vom System agbemeldet ...";
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='ffa500'><b>Das System</b></font> meldet <b>$alias</b> wegen Inaktivit&auml;t ab ...</i></font>", $alias);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> meldet sich ab (<font color='$col'>$away_msg</font> ) ...</i></font>", $alias);
+ }
+ open AWAY, ">>data/online/rstat/$room.away";
+ print AWAY "$alias<;$away_msg\n";
+ close AWAY;
+ &private_javascript($alias, $room, q[parent.input.document.inf.tmp.value = 'away'; parent.online.location.reload();]);
+ &reload_html;
+ }
+ elsif ($cmd eq 'clear') {
+ &post_prv($alias, "<script language='JavaScript'>window.open('chat?request=stream&alias=$alias&room=$room&col=$col&secol=$secol&tmp=login&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder','main');</script>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'col') {
+ my $col, $secol;
+ if ($cmd[1] ne undef) {
+ $col = $cmd[1];
+ &prove_color($alias, $col);
+ my $tmpsecol = $cmd[2];
+ my $length = length $tmpsecol;
+ if ($tmpsecol eq '' or $length < 6 or $length > 6) {
+ $secol = $col;
+ }
+ else {
+ $secol = $tmpsecol;
+ }
+ }
+ else {
+ $col = &random_color;
+ $secol = &random_color;
+ }
+ open OPTIONS, "<data/user/options/$alias";
+ my(@options) = <OPTIONS>;
+ close OPTIONS;
+ open OPTIONS, ">data/user/options/$alias";
+ print OPTIONS $options[0] . $col . "\n" . $secol;
+ close OPTIONS;
+ &post($room, '<i><font color=ffffff>' . &timestring . "</font> <font color=$col>$alias</font> <font color=$secol> hat die Farbe gewechselt...</font></i>", $alias);
+ &private_javascript($alias, $room, "parent.input.document.inf.col.value = '$col'; parent.input.document.inf.secol.value = '$secol';");
+ &post_strmsg($alias, $room, 'col', "$col;$secol");
+ &reload_html;
+ }
+ elsif ($cmd eq 'date') {
+ my($secs, $mins, $hours, $days, $months, $years) = &timearray;
+ &post_prv($alias, "<font color=ffffff>Heute ist der $days.$months. Jahr $years. Es ist genau $hours:$mins Uhr und $secs Sekunden.</font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'exit') {
+ my $room = &get_room($alias);
+ if ($tmp eq 'autologout') {
+ &private_javascript($alias, $room, q[open('chat?request=start&tmp=autologout','_top');]);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='ffa500'><b>Das System</b></font> loggt <b>$alias</b> wegen Inaktivit&auml;t aus ... </font></i>", $alias);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> loggt sich ganz aus ... </font></i>", $alias);
+ &private_javascript($alias, $room, q[open('chat?request=start&tmp=quit','_top');]);
+ }
+ &rm_alias($alias, $room);
+ &rm_away($alias, $room);
+ &reload_html;
+ }
+ elsif ($cmd eq 'hits' or $cmd eq 'uptime') {
+ &post_prv($alias, "<font color=ffffff>Uptime: $startime " . &calculate_uptime_hours($STARTIME) . "h; $HITS Hits; " . &calculate_hpm($HITS, $STARTIME) . ' Hits pro Minute</font>');
+ &reload_html;
+ }
+ elsif ($cmd eq 'ig') {
+ my $alias2ignore = $cmd[1];
+ if ($alias2ignore) {
+ if (-f "data/user/options/$alias2ignore") {
+ &post_strmsg($alias, $room, 'ig', $alias2ignore);
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2ignore</font> <font color='ffffff'>existiert nicht in der Datenbank!</font>");
+ }
+ }
+ else {
+ &post_strmsg($alias, $room, 'igl');
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'j' or $cmd eq 'sep') {
+ if ($cmd[1] =~ /\W/ or $cmd[1] eq '') {
+ &post_prv($alias, "<font color=ffffff>Der Raum <font color=ffa500>$cmd[1]</font> enth\344lt illegale Zeichen!</font>");
+ &reload_html;
+ }
+ else {
+ if ($cmd eq 'j') {
+ &change_room('j', $cmd[1], $room);
+ &reload_html;
+ }
+ else {
+ if ($cmd[1] eq $standardroom) {
+ &post_prv($alias, "<font color=ffffff>Der Raum <font color=ffa500>$cmd[1]</font> ist ein Standardraum und kann nicht als Separee er&ouml;ffnet werden!</font>");
+ }
+ else {
+ &change_room('sep', $cmd[1], $room);
+ &lock('separee');
+ }
+ &reload_html;
+ }
+ }
+ }
+ elsif ($cmd eq 'me' or $cmd eq 'm') {
+ my $me_msg;
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $me_msg = $me_msg . ' ' . $cmd[$i];
+ }
+ $me_msg =~ s[/me/][<i>$alias</i>]g;
+ $me_msg =~ s[/m/][<i><font color=$col>$alias</font></i>]g;
+ if ($cmd eq 'm') {
+ &post($room, "<b><font color=$col><i>$alias</i> <font color=$secol>$me_msg</font></font></b>", $alias);
+ }
+ else {
+ &post($room, "<b><font color=$col><i>$alias</i> $me_msg</font></b>", $alias);
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'memo') {
+ my $alias2memo = $cmd[1];
+ my($secs, $mins, $hours, $days, $months, $years) = &timearray;
+ if (-f "data/user/options/$alias2memo") {
+ my $memo_msg;
+ for ($i = 2; $i <= $#cmd; ++$i) {
+ $memo_msg = $memo_msg . ' ' . $cmd[$i];
+ }
+ &post_prv($alias, "<font color=ffa500>$alias2memo <font color=ffffff>wurde folgende memo erfolgreich hinterlassen: $memo_msg</font></font>");
+ open MEMO, ">>data/user/memos/$alias2memo";
+ print MEMO "<font color=ffffff>($days.$months.$years - $hours:$mins:$secs) <font color=$col>$alias</font> hat Dir eine Memo hinterlassen: <font color=ffa500>$memo_msg</font></font><br>\n";
+ close MEMO;
+ &reload_html;
+ }
+ &post_prv($alias, "<font color=ffa500>$alias2memo <font color=ffffff>existiert in der Datenbank nicht !</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'menu') {
+ &private_javascript($alias, $room, "window.open('chat?request=htdocs&alias=$alias&var=menu_html&room=$standardroom&col=$col&secol=$secol&tmpid=$tmpid','menuframe','width=500,height=500,screenX=100,screenY=100,scrollbars');");
+ &reload_html;
+ }
+ elsif ($cmd eq 'online') {
+ my $alias2prove = $cmd[1];
+ if (-f "data/user/options/$alias2prove") {
+ open ONLINE, "<data/user/counts/$alias2prove.online";
+ my $online = <ONLINE>;
+ close ONLINE;
+ my $totaltime = sprintf('%.2f', $online / 3600);
+ &post_prv("$alias", "<font color=ffa500>$alias2prove <font color=ffffff>war insgesamt schon $totaltime Stunden online!</font></font>");
+ }
+ else {
+ &post_prv("$alias", "<font color=ffa500>$alias2prove <font color=ffffff>existiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'q') {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> verl&auml;sst den Chat ... </font></i>", $alias);
+ &post_strmsg($alias, $room, 'quit');
+ unlink "data/online/rooms/$room/$alias";
+ &rm_rstat($alias, $room);
+ &rm_away($alias, $room);
+ &check_online;
+ &reload_html;
+ }
+ elsif ($cmd eq 'rmgb') {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> l\366scht das eigene G\344stebuch ...</font></i>", $alias);
+ unlink "data/user/gbooks/$alias";
+ &reload_html;
+ }
+ elsif ($cmd eq 's') {
+ my $msg2scream;
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2scream = $msg2scream . ' ' . $cmd[$i];
+ }
+ $msg2scream =~ s/\344/\304/g;
+ $msg2scream =~ s/\366/\326/g;
+ $msg2scream =~ s/\374/\334/g;
+ $msg2scream = "\U$msg2scream\E";
+ &post($room, "<b><font color=$col><i>$alias schreit:</i> <font color=$secol>$msg2scream</font></font></b>", $alias);
+ &reload_html;
+ }
+ elsif ($cmd eq 'seen') {
+ my $alias2prove = $cmd[1];
+ if (-f "data/user/options/$alias2prove") {
+ if (-f "data/user/lastlogin/$alias2prove") {
+ open LASTLOGIN, "<data/user/lastlogin/$alias2prove";
+ my $lastlogin = <LASTLOGIN>;
+ close LASTLOGIN;
+ my $timestamp = sprintf('%.2f', (time - $lastlogin) / 3600);
+ &post_prv("$alias", "<font color='ffa500'>$alias2prove <font color=ffffff> hat sich vor $timestamp Stunden zuletzt in das System eingeloggt!</font></font>");
+ }
+ else {
+ &post_prv("$alias", "<font color='ffa500'>$alias2prove <font color=ffffff> hat sich seit der Einf\374hrung dieses Befehls noch nie eingeloggt!</font></font>");
+ }
+ }
+ else {
+ &post_prv("$alias", "<font color='ffa500'>$alias2prove <font color=ffffff> exsistiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'selfkill') {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> entfernt sich ganz und gar aus dem System und loggt sich aus ... </font></i>", $alias);
+ &private_javascript($alias, $room, q[open('chat?request=start&tmp=selfkill','_top');]);
+ &kill_alias($alias);
+ &reload_html;
+ }
+ elsif ($cmd eq 'w') {
+ my $theme = &get_theme($room);
+ my $door = '[<font color=red>Abgesperrt!</font>]' if $rstat[0] eq "1\n";
+ my($is, $nr) = ('t', 0);
+ my $persons;
+ opendir DIR, "data/online/rooms/$room";
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach $_ (@dir) {
+ if (-f "data/online/rooms/$room/$_") {
+ $persons = $persons . ' ' . $_;
+ ++$nr;
+ }
+ }
+ &post_prv($alias, "<font color=ffffff>Der aktuelle <b>Raum:</b> $room $theme $door ($nr): <font color='ffa500'>$persons</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'wc' or $cmd eq 'wc/') {
+ my $raum = $cmd[1];
+ my $persons;
+ if ($raum eq '' and $cmd eq 'wc') {
+ opendir USERS, 'data/online/users';
+ my(@users) = readdir USERS;
+ close USERS;
+ foreach $_ (@users) {
+ $persons = $persons . ' ' . $_ if -f "data/online/users/$_";
+ }
+ my $nr = $#users - 1;
+ my($nrs, $is) = ('', 'ist');
+ if ($nr != 1) {
+ $nrs = 'en';
+ $is = 'sind';
+ }
+ &post_prv("$alias", "<font color=ffffff>$nr Person$nrs $is insgesamt eingeloggt: <font color='ffa500'>$persons</font></font>");
+ }
+ elsif ($raum eq '' and $cmd eq 'wc/') {
+ my $msg2post;
+ opendir DIR, 'data/online/rooms';
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach $_ (@dir) {
+ if (-e "data/online/rooms/$_" and $_ ne '..' and $_ ne '.') {
+ opendir DIR, "data/online/rooms/$_";
+ my(@dir2) = readdir DIR;
+ closedir DIR;
+ open RSTAT, "<data/online/rstat/$_";
+ my(@rstat) = <RSTAT>;
+ close RSTAT;
+ chomp $rstat[1];
+ my $door = '[<font color=red>Abgesperrt!</font>]' if $rstat[0] eq "1\n";
+ my $nr = $#dir2 - 1;
+ $msg2post = $msg2post . "<tr><td><b><font size=2 color='ffffff'>$_ $door ($nr) [" . $rstat[1] . q(]: </font></b></td></tr><tr><td><font size=2 color='ffa500'>);
+ foreach $chatter (@dir2) {
+ $msg2post = $msg2post . "$chatter " if -f "data/online/rooms/$_/$chatter";
+ }
+ print '</font></td>';
+ }
+ }
+ &post_prv($alias, "<font color=ffffff>Folgende R&auml;ume sind offen:</font><table>$msg2post</table>");
+ }
+ elsif ($raum ne '') {
+ my $persons;
+ opendir DIR, "data/online/rooms/$raum";
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach $_ (@dir) {
+ $persons = $persons . ' ' . $_ if -f "data/online/rooms/$raum/$_";
+ }
+ my($nr, $is) = ($#dir - 1, 't');
+ if ($nr != 1) {
+ $nrs = 'en';
+ $is = 'n';
+ }
+ &post_prv($alias, "<font color=ffffff> $nr Person$nrs befinde$is sich im Raum <b>$raum</b> <font color='ffa500'>$persons</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'wj' or $cmd eq 'ju') {
+ my $alias2search = $cmd[1];
+ my $roomofalias = &get_room($alias2search);
+ if ($roomofalias) {
+ if ($cmd eq 'wj') {
+ &post_prv($alias, "<font color='ffa500'>$alias2search <font color=ffffff>befindet sich im Raum <b>$roomofalias</b> !</font></font>");
+ }
+ else {
+ &change_room('ju', $roomofalias, $room, $alias2search);
+ }
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2search <font color=ffffff> ist nicht eingeloggt!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif (1 <= &hierachie($alias, $room)) {
+ if ($cmd eq 'l') {
+ &lock;
+ }
+ elsif ($cmd eq 'su') {
+ my $alias2su = $cmd[1];
+ opendir DIR, "data/online/rooms/$room";
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach $_ (@dir) {
+ if ($_ eq $alias2su) {
+ open DATEI, "<data/online/rstat/$room";
+ my(@rstat) = <DATEI>;
+ close DATEI;
+ if (1 <= hierachie($alias2su, $room)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2su</font> <font color='ffffff'> kann nicht zum Raumbesetzer ernannt werden. (Ist bereits RB, W\304 oder OW)</font>");
+ &reload_html;
+ }
+ open RSTAT, ">>data/online/rstat/$room";
+ print RSTAT "$alias2su<;1\n";
+ close RSTAT;
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> verleiht <b>$alias2su</b> Raumbesetzerrechte ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ &reload_html;
+ }
+ }
+ &post_prv($alias, "<font color='ffa500'>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist nicht anwesend)</font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'rsu') {
+ my $alias2rsu = $cmd[1];
+ if (1 == hierachie($alias2rsu, $room)) {
+ &rm_rstat($alias2rsu, $room);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> entzieht <b>$alias2rsu</b> die Raumbesetzerrechte ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2rsu <font color='ffffff'>ist gar kein Raumbesetzer!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 't') {
+ open RSTAT, "data/online/rstat/$room";
+ my(@r_stat) = <RSTAT>;
+ close RSTAT;
+ my $theme;
+ if ($cmd[1] ne undef) {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $theme = $theme . ' ' . $cmd[$i];
+ }
+ &post($room, q[<i><font color='ffffff'>] . &timestring . qq[ <font color='$col'>$alias</font> gibt dem Raum das Thema "<font color='$col'>$theme</font>" ...</font></i>], $alias);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> l\366scht das Thema des Raums ...</font></i>", $alias);
+ }
+ $theme = $r_stat[0] . $theme . "\n";
+ for ($i = 2; $i <= $#r_stat; ++$i) {
+ $theme = $theme . $r_stat[$i] . "\n";
+ }
+ open RSTAT, ">data/online/rstat/$room";
+ print RSTAT $theme;
+ close RSTAT;
+ &reload_html;
+ }
+ elsif (3 <= &hierachie($alias)) {
+ if ($cmd eq 'ban' or $cmd eq 'banip') {
+ my $alias2ban = $cmd[1];
+ my $hierachie = &hierachie($alias2ban);
+ open BAN, '<data/ban';
+ my(@ban) = <BAN>;
+ close BAN;
+ if ($cmd[1] eq undef) {
+ my $nr = @ban;
+ my $banned;
+ foreach $_ (@ban) {
+ chomp $_;
+ $banned .= " $_";
+ }
+ &post_prv($alias, "<font color=ffffff>Folgende Benutzer sind verbannt [$nr]: <font color='ff0000'>$banned</font></font>");
+ &reload_html;
+ }
+ elsif (-f "data/user/options/$alias2ban") {
+ if (3 <= $hierachie eq 'wa') {
+ &post_prv($alias, "<font color='ffa500'>$alias2ban <font color='ffffff'>kann nicht verbannt werden!</font></font>");
+ &reload_html;
+ }
+ if ($cmd eq 'ban') {
+ if (&add_entry($alias2ban, 'ban') == 1) {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> verbannt <b>$alias2ban</b> aus dem Chat ...</font></i>", $alias);
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2ban <font color=ffffff>ist bereits verbannt!</font></font>");
+ }
+ }
+ elsif ($cmd eq 'banip') {
+ open DATEI, "<data/online/ident/$alias2ban";
+ my $ipnr = <DATEI>;
+ close DATEI;
+ chomp $ipnr;
+ if (add_entry("ip://$ipnr", 'ban') == 1) {
+ &post_prv($alias, "<font color='ffffff'>IP-Nummer von <font color='ffa500'>$alias2ban</font> (<font color='ff0000'>$ipnr</font>) wurde verbannt!</font></i>");
+ }
+ else {
+ &post_prv($alias, "<font color='ffffff'>Die IP-Nummer <font color='ff0000'>$ipnr</font> von <font color='ffa500'>$alias2ban</font> ist bereits verbannt!</font></font>");
+ }
+ &reload_html;
+ }
+ &reload_html;
+ }
+ &post_prv($alias, "<font color='ffa500'>$alias2ban <font color=ffffff> kann nicht verbannt werden, da Benutzername nicht existiert!</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'rban' or $cmd eq 'rbanip') {
+ my $alias2rban = $cmd[1];
+ open BAN, '<data/ban';
+ @ban = <BAN>;
+ close BAN;
+ foreach $ban (@ban) {
+ if (&rm_entry($alias2rban, 'ban') == 1) {
+ if ($alias2rban =~ /ip:/) {
+ &post_prv($alias, "<font color='ffffff'>Die IP-Nummer <font color='ff0000'>$alias2rban</font> wurde aus der Banliste ausgetragen!</font></font>");
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> entbannt <b>$alias2rban</b> ...</font></i>", $alias);
+ }
+ &reload_html;
+ }
+ }
+ &post_prv($alias, "<font color='ff0000'>$alias2rban <font color='ffffff'>ist nicht verbannt!</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'img') {
+ my $hierachie = &hierachie($alias);
+ &hierachie_rm($alias);
+ if ($hierachie % 2 > 0) {
+ &post_prv($alias, q[<font color='ffffff'>Dein Superuserlogo wurde versteckt!</font>]);
+ &hierachie_add($alias, $hierachie + 1);
+ }
+ else {
+ &post_prv("$alias", q[<font color='ffffff'>Dein Superuserlogo wurde wieder sichtbar gemacht!</font></font>]);
+ &hierachie_add($alias, $hierachie - 1);
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'ip') {
+ my $alias2prove = $cmd[1];
+ opendir DIR, 'data/online/ident';
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach $_ (@dir) {
+ if ($_ eq $alias2prove) {
+ open DATEI, "<data/online/ident/$alias2prove";
+ my $ipnr = <DATEI>;
+ close DATEI;
+ chomp $ipnr;
+ &post_prv($alias, "<font color='ffa500'>$_<font color='ffffff'> hat die IP-Nummer <font color='ff0000'>$ipnr</font> !</font></font>");
+ }
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'k' or $cmd eq 'o') {
+ my $alias2kick = $cmd[1];
+ if (-f "data/online/users/$alias2kick") {
+ opendir DIR, 'data/online/rooms';
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach my $raum (@dir) {
+ opendir DIR, "data/online/rooms/$raum";
+ my(@dir2) = readdir DIR;
+ closedir DIR;
+ foreach my $chatter (@dir2) {
+ if ($chatter eq $alias2kick) {
+ my $hierachie2 = &hierachie($alias2kick);
+ if (&hierachie($alias) <= &hierachie($alias2kick)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2kick <font color='ffffff'> besitzt einen h&ouml;heren oder gleichen Rang und kann nicht gekickt/ausgeloggt werden!</font></font>");
+ }
+ else {
+ if ($cmd eq 'k') {
+ &post_prv($alias2kick, '<script language="JavaScript">window.open("chat?request=start&tmp=kick","_top");</script>');
+ }
+ else {
+ &post_prv($alias2kick, '<script language="JavaScript">window.open("chat?request=start&tmp=logout","_top");</script>');
+ }
+ $_ = undef if $room eq $raum;
+ if ($cmd eq 'k') {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> katapultiert <b>$alias2kick</b> aus dem Chat ...</font></i>", $alias, $raum);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> loggt <b>$alias2kick</b> aus dem Chat aus ...</font></i>", $alias, $alias);
+ }
+ rm_alias $alias2kick, $raum;
+ &check_online;
+ }
+ &reload_html;
+ }
+ }
+ }
+ }
+ &post_prv($alias, "<font color='ffa500'>$alias2kick <font color='ffffff'> ist nicht anwesend und kann nicht aus dem System katapultiert werden werden!</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'sl') {
+ my $sl_room = $cmd[1];
+ if (-e "data/online/rooms/$sl_room") {
+ my $lock = "0\n";
+ open RSTAT, "<data/online/rstat/$sl_room";
+ my(@r_stat) = <RSTAT>;
+ close RSTAT;
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> sperrt den Raum <b>$sl_room</b> von aussen ab ...</font></i>", $alias, $sl_room);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> sperrt den Raum <b>$sl_room</b> von aussen auf ...</font></i>", $alias, $sl_room);
+ }
+ for ($i = 1; $i <= $#r_stat; ++$i) {
+ $lock = $lock . $r_stat[$i];
+ }
+ open RSTAT, ">data/online/rstat/$sl_room";
+ print RSTAT $lock;
+ close RSTAT;
+ }
+ else {
+ &post_prv($alias, "<font color='ffffff'>Der Raum <font color='ffa500'>$sl_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'ss') {
+ my $ss_room = $cmd[1];
+ if (-e "data/online/rooms/$ss_room") {
+ my $ss_msg;
+ for ($i = 2; $i <= $#cmd; ++$i) {
+ $ss_msg = $ss_msg . ' ' . $cmd[$i];
+ }
+ my $msg2scream = "\U$ss_msg\E";
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> ruft in den Raum <b>$ss_room</b> hinein: <b><font color=$col>$msg2scream</font></b> ...</font></i>", $alias, $ss_room);
+ &reload_html;
+ }
+ else {
+ &post_prv($alias, "<font color='ffffff'>Der Raum <font color='ffa500'>$ss_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'st') {
+ my $st_room = $cmd[1];
+ if (-e "data/online/rooms/$st_room") {
+ my $theme;
+ if ($cmd[2] ne undef) {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $theme = $theme . ' ' . $cmd[$i];
+ }
+ &post($room, '<i><font color=ffffff>' . &timestring . qq[ <font color='$col'>$alias</font> gibt dem Raum <b>$st_room</b> das Thema "<font color='$col'>$theme</font>" ...</font></i>], $alias, $st_room);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> l\366scht das Thema des Raums <b>$st_room</b> ...</font></i>", $alias, $st_room);
+ }
+ open RSTAT, "<data/online/rstat/$st_room";
+ my(@r_stat) = <RSTAT>;
+ close RSTAT;
+ $theme = $r_stat[0] . $theme . "\n";
+ for ($i = 2; $i <= $#r_stat; ++$i) {
+ $theme = $theme . $r_stat[$i];
+ }
+ open RSTAT, ">data/online/rstat/$st_room";
+ print RSTAT $theme;
+ close RSTAT;
+ }
+ else {
+ &post_prv($alias, "<font color=ffffff>Der Raum <font color=ffa500>$st_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif (5 <= &hierachie($alias)) {
+ if ($cmd eq 'kill') {
+ my $alias2kill = $cmd[1];
+ if (-f "data/user/options/$alias2kill") {
+ if (5 <= &hierachie($alias2kill)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2kill</font> <font color='ffffff'>hat einen h&ouml;heren Rang und kann nicht aus dem System entfernt werden !</font>");
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col>$alias</font> killt <b>$alias2kill</b> ganz und gar aus dem System ...</font></i>", $alias);
+ &kill_alias($alias2kill, $alias);
+ }
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2kill <font color='ffffff'> existiert nicht in der Datenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'sys') {
+ my $sys_msg;
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $sys_msg = $sys_msg . ' ' . $cmd[$i];
+ }
+ $sys_msg = q[<i><font color='ffffff'>] . &timestring . " </font></i> <b><font size=2 color='red'>SYSTEMNACHRICHT</font></b><i><font color='ffffff'>: $sys_msg ...</font></i>";
+ opendir ROOMS, 'data/msgs';
+ my(@rooms) = readdir ROOMS;
+ close ROOMS;
+ foreach $_ (@rooms) {
+ &post($_, $sys_msg, $alias) unless /\./;
+ }
+ &log($sys_msg);
+ &reload_html;
+ }
+ elsif ($cmd eq 'wa') {
+ my $alias2wa = $cmd[1];
+ if (-f "data/user/options/$alias2wa") {
+ if (3 <= &hierachie($alias2wa)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2wa <font color='ffffff'>kann nicht zum W&auml;chter ernannt werden!</font></font>");
+ }
+ else {
+ &hierachie_add($alias2wa, 3);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> ernennt <b>$alias2wa</b> zum W\344chter ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ &reload_html;
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2wa <font color=ffffff>existiert nicht in der Datenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'rwa') {
+ my $alias2rwa = $cmd[1];
+ my $hierachie = &hierachie($alias2rwa);
+ if (3 == $hierachie or 4 == $hierachie) {
+ &hierachie_rm($alias2rwa);
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> hat <b>$alias2rwa</b> vom W\344chter zum normalen Chatter degradiert ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2rwa <font color=ffffff>ist kein W\344chter und k\366nnen diese Rechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif (7 <= &hierachie($alias)) {
+ if ($cmd eq 'ow') {
+ my $alias2ow = $cmd[1];
+ if (-f "data/user/options/$alias2ow") {
+ if (5 <= &hierachie($alias2ow)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2ow <font color='ffffff'>kann nicht zum Oberw&auml;chter ernannt werden!</font></font>");
+ }
+ else {
+ &hierachie_add($alias2ow, 5);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> ernennt <b>$alias2ow</b> zum Oberw&auml;chter ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ &reload_html;
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2wa <font color=ffffff>existiert nicht in der Datenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'row') {
+ my $alias2row = $cmd[1];
+ my $hierachie = &hierachie($alias2row);
+ if (5 == $hierachie or 6 == $hierachie) {
+ &hierachie_rm($alias2row);
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> hat <b>$alias2row</b> vom Oberw\344chter zum normalen Chatter degradiert ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2row <font color=ffffff>ist kein Oberw\344chter und k\366nnen diese Rechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'pw') {
+ my $pw2show = $cmd[1];
+ if (-f "data/user/options/$pw2show") {
+ open PW, "<data/user/options/$pw2show";
+ my(@pw) = <PW>;
+ close PW;
+ chomp $pw[0];
+ &post_prv($alias, "<font color='ffa500'>$pw2show <font color='ffffff'> hat das Passwort <font color='ff0000'>$pw[0]</font> !</font></font>");
+ &reload_html;
+ }
+ &post_prv($alias, "<font color='ffa500'>$pw2show <font color='ffffff'> existiert nicht in der Benutzerdatenbank!</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'id' or $cmd eq 'agent') {
+ my $id2show = $cmd[1];
+ if (-f "data/online/ident/$id2show") {
+ open ID, "<data/online/ident/$id2show";
+ my(@id) = <ID>;
+ close ID;
+ if ($cmd eq 'id') {
+ chomp $id[1];
+ &post_prv($alias, "<font color='ffa500'>$id2show <font color='ffffff'> hat die Temp-ID <font color='ff0000'>$id[1]</font> !</font></font>");
+ }
+ else {
+ chomp $id[2];
+ &post_prv($alias, "<font color='ffa500'>$id2show <font color='ffffff'> verwendet <font color='ff0000'>$id[2]</font> !</font></font>");
+ }
+ &reload_html;
+ }
+ &post_prv($alias, "<font color='ffa500'>$id2show <font color='ffffff'> ist nicht eingeloggt !</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'cool') {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ &post($room, '<i><font color=ffffff>' . &timestring . " $msg2post</font></i>", $alias);
+ &reload_html;
+ }
+ elsif ($cmd eq 'rev') {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ $msg2post = reverse($msg2post);
+ &post($room, "<b><font color='$col'>$alias: <font color='$secol'>$msg2post</font></font></b>", $alias);
+ &reload_html;
+ }
+ }
+ }
+ }
+ }
+ my($alias2post, $msg2post, $action);
+ if ($cmd eq 'msg') {
+ $alias2post = $cmd[1];
+ for ($i = 2; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ }
+ elsif ($cmd eq '') {
+ $alias2post = $whisper;
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ }
+ else {
+ $alias2post = $cmd;
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ }
+ $msg2post =~ s[/me/][<i>$alias</i>]g;
+ $msg2post =~ s[/m/][<i><font color=$col>$alias</font></i>]g;
+ if (-f "data/online/users/$alias2post" and not -f "data/online/rooms/$loginplace/$alias2post") {
+ &post_prv($alias, "<b><font color=$col><i>Zu $alias2post gefl\374stert:</i> <font color=$secol>$msg2post</font></font></i></b>");
+ &post_prv($alias2post, "<b><font color=$col><i>$alias fl\374stert:</i> <font color=$secol>$msg2post</font></font></i></b>");
+ &private_javascript($alias, $room, "parent.input.document.inf.whisper.value = '$alias2post';");
+ &reload_html;
+ }
+ &post_prv($alias, qq[ <font color=ffffff>Benutzer oder Befehl <font color=ffa500>$alias2post</font> ist nicht anwesend/verf\374gbar! Bitte den Befehl "/menu" eingeben, um das Chat-Men&uuml zu &ouml;ffnen.</font></font>]);
+ &reload_html;
+}
+1;
diff --git a/0.7.1/commands.pm b/0.7.1/commands.pm
new file mode 100644
index 0000000..cf42001
--- /dev/null
+++ b/0.7.1/commands.pm
@@ -0,0 +1,1016 @@
+sub command { # Alle Chatbefehle, die über input_html eingegeben werden können.
+ $_[0] = $_[0]." ";
+ $_[0] = substr($_[0], 1, length($_[0])-1);
+ my @cmd = split(/ /, $_[0]);
+ my $cmd = substr($_[0],0 , index($_[0], " "));
+ my $tmp = $_[1];
+#############>- NORMALE CHATBEFEHLE ( Alphabetisch sortiert ) -<
+
+#############>- INFORMATIONEN ÜBER DAS SYSTEM AUSGEBEN -<
+ if ($cmd eq "about") {
+ &post_prv($alias,"<font color=ffffff>Aktuelle Version ist $title und wurde am $datum aktuallisiert. Programmiert von Paul C. Bütow (2000 - 2001).</font>");
+ &reload_html;
+
+#############>- ABMELDEN MIT 'AWAY-NACHRICHT' -<
+ } elsif ($cmd eq "away") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $away_msg = $away_msg." ".$cmd[$i];
+ }
+
+ my $room = &get_room($alias);
+ if ($tmp eq "autoaway") {
+ $away_msg = "$alias wurde vom System agbemeldet ...";
+ &post($room,"<i><font color=ffffff>".&timestring." <font color='ffa500'><b>Das System</b></font> meldet <b>$alias</b> wegen Inaktivit&auml;t ab ...</i></font>", $alias);
+
+ } else {
+ &post($room,"<i><font color=ffffff>".&timestring." <font color='$col'>$alias</font> meldet sich ab (<font color='$col'>$away_msg</font> ) ...</i></font>", $alias);
+ }
+
+ open AWAY,">>data/online/rstat/$room.away";
+ print AWAY "$alias<;$away_msg\n";
+ close AWAY;
+
+ &private_javascript($alias, $room, "parent.input.document.inf.tmp.value = 'away'; parent.online.location.reload();" );
+ &reload_html;
+
+#############>- EIGENEN CHATBILDSCHIRM LÖSCHEN -<
+ } elsif ($cmd eq "clear") {
+ &post_prv($alias,"<script language='JavaScript'>window.open('chat?request=stream&alias=$alias&room=$room&col=$col&secol=$secol&tmp=login&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder','main');</script>");
+ &reload_html;
+
+#############>- FARBEN WECHSELN -<
+ } elsif ($cmd eq "col") {
+ my $col, $secol;
+
+ if ($cmd[1] ne undef) {
+
+ $col = $cmd[1];
+ &prove_color($alias,$col);
+
+ my $tmpsecol = $cmd[2];
+ my $length = length($tmpsecol);
+
+ if ($tmpsecol eq "" || $length < 6 || $length > 6) {
+ $secol = $col
+ } else {
+ $secol = $tmpsecol;
+ }
+
+ } else {
+ $col = &random_color;
+ $secol = &random_color;
+ }
+
+ open OPTIONS,"<data/user/options/$alias";
+ my @options = <OPTIONS>;
+ close OPTIONS;
+
+ open OPTIONS,">data/user/options/$alias";
+ print OPTIONS $options[0].$col."\n".$secol;
+ close OPTIONS;
+
+ &post($room,"<i><font color=ffffff>".&timestring."</font> <font color=$col>$alias</font> <font color=$secol> hat die Farbe gewechselt...</font></i>",$alias);
+ &private_javascript($alias, $room, "parent.input.document.inf.col.value = '$col'; parent.input.document.inf.secol.value = '$secol';" );
+ &post_strmsg($alias,$room,'col',"$col;$secol");
+
+ &reload_html;
+
+#############>- AKTUELLES DATUM UND URZEIT AUSGEBEN -<
+ } elsif ($cmd eq "date") {
+ my ($secs, $mins, $hours, $days, $months, $years) = &timearray;
+ &post_prv($alias,"<font color=ffffff>Heute ist der $days.$months. Jahr $years. Es ist genau $hours:$mins Uhr und $secs Sekunden.</font>");
+ &reload_html;
+
+#############>- DAS SYSETM VERLASSEN -<
+ } elsif ($cmd eq "exit") {
+
+ my $room = &get_room($alias);
+
+ if ($tmp eq "autologout") {
+ &private_javascript($alias, $room, "open('chat?request=start&tmp=autologout','_top');" );
+ &post($room,"<i><font color=ffffff>".&timestring." <font color='ffa500'><b>Das System</b></font> loggt <b>$alias</b> wegen Inaktivit&auml;t aus ... </font></i>", $alias);
+
+ } else {
+ &post($room,"<i><font color=ffffff>".&timestring." <font color='$col'>$alias</font> loggt sich ganz aus ... </font></i>", $alias);
+ &private_javascript($alias, $room, "open('chat?request=start&tmp=quit','_top');" );
+ }
+
+ &rm_alias($alias,$room);
+ &rm_away($alias,$room);
+ &reload_html;
+
+#############>- SERVER HITS & UPTIME ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "hits" || $cmd eq "uptime" ) {
+ &post_prv($alias,"<font color=ffffff>Uptime: $startime ".&calculate_uptime_hours($STARTIME)."h; $HITS Hits; ".&calculate_hpm($HITS, $STARTIME)." Hits pro Minute</font>");
+ &reload_html;
+
+#############>- EINEN BENUTZER AUF DIE IGNORELISTE SETZEN/ENTFERNEN BZW. IGNORELISTE ANZEIGENLASSEN -<
+ } elsif ($cmd eq "ig") {
+ my $alias2ignore = $cmd[1];
+
+ if ($alias2ignore) {
+
+ if (-f "data/user/options/$alias2ignore") {
+ # Auf die Ignore-Liste setzen/entfernen
+ &post_strmsg($alias,$room,'ig',$alias2ignore);
+
+ } else {
+ &post_prv($alias,"<font color='ffa500'>$alias2ignore</font> <font color='ffffff'>existiert nicht in der Datenbank!</font>");
+ }
+
+ } else {
+ # Ignoreliste anzeigen
+ &post_strmsg($alias,$room,'igl');
+ }
+
+ &reload_html;
+
+#############>- EINEN NEUEN RAUM ERSTELLEN BZW. IN EINEN BESTEHENDEN RAUM WECHSELN BZW. SEPAREE ERÖFFNEN-<
+ } elsif ($cmd eq "j" || $cmd eq "sep") {
+ if ($cmd[1] =~ /\W/ || $cmd[1] eq "") {
+ &post_prv($alias,"<font color=ffffff>Der Raum <font color=ffa500>$cmd[1]</font> enthält illegale Zeichen!</font>");
+ &reload_html;
+
+ } else {
+ if ($cmd eq "j") {
+ &change_room("j",$cmd[1],$room);
+ &reload_html;
+
+ } else {
+ if ($cmd[1] eq $standardroom) {
+ &post_prv($alias,"<font color=ffffff>Der Raum <font color=ffa500>$cmd[1]</font> ist ein Standardraum und kann nicht als Separee er&ouml;ffnet werden!</font>");
+
+ } else {
+ &change_room("sep",$cmd[1],$room);
+ &lock("separee");
+ }
+
+ &reload_html;
+ }
+ }
+
+#############>- HANDELN -<
+ } elsif ($cmd eq "me" || $cmd eq "m") {
+ my $me_msg;
+
+ for ($i=1; $i <= $#cmd; $i++) {
+ $me_msg = $me_msg." ".$cmd[$i];
+ }
+
+ $me_msg =~ s#/me/#<i>$alias</i>#g;
+ $me_msg =~ s#/m/#<i><font color=$col>$alias</font></i>#g;
+
+ if ($cmd eq "m") {
+ &post($room,"<b><font color=$col><i>$alias</i> <font color=$secol>$me_msg</font></font></b>", $alias);
+
+ } else {
+ &post($room,"<b><font color=$col><i>$alias</i> $me_msg</font></b>", $alias);
+ }
+
+ &reload_html;
+
+#############>- MEMO SCHREIBEN -<
+ } elsif ($cmd eq "memo") {
+ my $alias2memo = $cmd[1];
+ my ($secs, $mins, $hours, $days, $months, $years) = &timearray;
+
+ if(-f "data/user/options/$alias2memo") {
+ my $memo_msg;
+
+ for ($i=2; $i <= $#cmd; $i++) {
+ $memo_msg = $memo_msg." ".$cmd[$i];
+ }
+
+ &post_prv($alias,"<font color=ffa500>$alias2memo <font color=ffffff>wurde folgende memo erfolgreich hinterlassen: $memo_msg</font></font>");
+
+ open MEMO,">>data/user/memos/$alias2memo";
+ print MEMO "<font color=ffffff>($days.$months.$years - $hours:$mins:$secs) <font color=$col>$alias</font> hat Dir eine Memo hinterlassen: <font color=ffa500>$memo_msg</font></font><br>\n";
+ close MEMO;
+
+ &reload_html;
+ }
+
+ &post_prv($alias,"<font color=ffa500>$alias2memo <font color=ffffff>existiert in der Datenbank nicht !</font></font>");
+ &reload_html;
+
+#############>- CHAT-MENÜ ÖFFNEN/AKTUALISIEREN -<
+ } elsif ($cmd eq "menu") {
+ &private_javascript($alias, $room, "window.open('chat?request=htdocs&alias=$alias&var=menu_html&room=$standardroom&col=$col&secol=$secol&tmpid=$tmpid','menuframe','width=500,height=500,screenX=100,screenY=100,scrollbars');" );
+ &reload_html;
+
+#############>- TOTALONLINEZEIT VON ALIAS ANZEIGEN -<
+ } elsif ($cmd eq "online") {
+ my $alias2prove= $cmd[1];
+
+ if (-f "data/user/options/$alias2prove") {
+ open ONLINE,"<data/user/counts/$alias2prove.online";
+ my $online = <ONLINE>;
+ close ONLINE;
+
+ my $totaltime = sprintf("%.2f",($online / 3600));
+ &post_prv("$alias","<font color=ffa500>$alias2prove <font color=ffffff>war insgesamt schon $totaltime Stunden online!</font></font>");
+
+ } else {
+ &post_prv("$alias","<font color=ffa500>$alias2prove <font color=ffffff>existiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+
+ &reload_html;
+
+#############>- DEN CHAT VERLASSEN -<
+ } elsif ($cmd eq "q") {
+ &post($room,"<i><font color=ffffff>".&timestring." <font color='$col'>$alias</font> verl&auml;sst den Chat ... </font></i>", $alias);
+ &post_strmsg($alias,$room,'quit');
+
+ unlink("data/online/rooms/$room/$alias");
+
+ &rm_rstat($alias,$room);
+ &rm_away($alias,$room);
+ &check_online;
+ &reload_html;
+
+#############>- DAS EIGENE GÄSTEBUCH LÖSCHEN -<
+ } elsif ($cmd eq "rmgb") {
+ &post($room,"<i><font color=ffffff>".&timestring." <font color='$col'>$alias</font> löscht das eigene Gästebuch ...</font></i>", $alias);
+ unlink("data/user/gbooks/$alias");
+ &reload_html;
+
+#############>- SCHREIEN -<
+ } elsif ($cmd eq "s") {
+ my $msg2scream;
+
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2scream = $msg2scream." ".$cmd[$i];
+ }
+
+ $msg2scream =~ s#ä#Ä#g; $msg2scream =~ s#ö#Ö#g;
+ $msg2scream =~ s#ü#Ü#g; $msg2scream = "\U$msg2scream";
+
+ &post($room,"<b><font color=$col><i>$alias schreit:</i> <font color=$secol>$msg2scream</font></font></b>", $alias);
+ &reload_html;
+
+#############>- SEHEN, WANN SICH ALIAS ZUM LETZTEN MAL EINGElOGGT HAT -<
+ } elsif ($cmd eq "seen") {
+ my $alias2prove = $cmd[1];
+
+ if (-f "data/user/options/$alias2prove") {
+
+ if (-f "data/user/lastlogin/$alias2prove") {
+ open LASTLOGIN,"<data/user/lastlogin/$alias2prove";
+ my $lastlogin = <LASTLOGIN>;
+ close LASTLOGIN;
+
+ my $timestamp = sprintf("%.2f",((time() - $lastlogin) / 3600));
+ &post_prv("$alias","<font color='ffa500'>$alias2prove <font color=ffffff> hat sich vor $timestamp Stunden zuletzt in das System eingeloggt!</font></font>");
+
+ } else {
+ &post_prv("$alias","<font color='ffa500'>$alias2prove <font color=ffffff> hat sich seit der Einführung dieses Befehls noch nie eingeloggt!</font></font>");
+ }
+
+ } else {
+ &post_prv("$alias","<font color='ffa500'>$alias2prove <font color=ffffff> exsistiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+
+ &reload_html;
+
+#############>- SICH SELBST AUS DEM SYSETM GANZ UND GAR ENTFERNEN -<
+ } elsif ($cmd eq "selfkill") {
+ &post($room,"<i><font color='ffffff'>".&timestring." <font color='$col'>$alias</font> entfernt sich ganz und gar aus dem System und loggt sich aus ... </font></i>", $alias);
+ &private_javascript($alias, $room, "open('chat?request=start&tmp=selfkill','_top');" );
+ &kill_alias($alias);
+ &reload_html;
+
+#############>- ANZEIGEN WER SICH IM AKTUELLEN RAUM BEFINDET -<
+ } elsif ($cmd eq "w") {
+ my $theme = &get_theme($room);
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+ my ($is,$nr) = ("t",0);
+ my $persons;
+
+ opendir DIR,"data/online/rooms/$room";
+ my @dir = readdir(DIR);
+ closedir(DIR);
+
+ foreach(@dir) {
+ if (-f "data/online/rooms/$room/$_") {
+ $persons = $persons." ".$_;
+ $nr++;
+ }
+ }
+
+ &post_prv($alias,"<font color=ffffff>Der aktuelle <b>Raum:</b> $room $theme $door ($nr): <font color='ffa500'>$persons</font></font>");
+ &reload_html;
+
+#############>- ANZEIGEN WER SICH IM SYSTEM BEFINDET -<
+ } elsif ($cmd eq "wc" || $cmd eq "wc/") {
+ my $raum = $cmd[1];
+ my $persons;
+
+ if ($raum eq "" && $cmd eq "wc") {
+ opendir USERS,"data/online/users";
+ my @users = readdir(USERS);
+ close USERS;
+
+ foreach(@users) {
+ $persons = $persons." ".$_
+ if (-f "data/online/users/$_");
+ }
+
+ my $nr = ($#users-1);
+ my ($nrs,$is) = ("","ist");
+
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "sind";
+ }
+
+ &post_prv("$alias","<font color=ffffff>$nr Person$nrs $is insgesamt eingeloggt: <font color='ffa500'>$persons</font></font>");
+
+ } elsif ($raum eq "" && $cmd eq "wc/") {
+ my $msg2post;
+
+ opendir DIR,"data/online/rooms";
+ my @dir = readdir(DIR);
+ closedir(DIR);
+
+ foreach(@dir) {
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+
+ opendir(DIR,"data/online/rooms/$_");
+ my @dir2 = readdir(DIR);
+ closedir(DIR);
+
+ open(RSTAT,"<data/online/rstat/$_");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+ chomp($rstat[1]);
+
+ my $door = "[<font color=red>Abgesperrt!</font>]"
+ if ($rstat[0] eq "1\n");
+
+ my $nr = $#dir2-1;
+ $msg2post = $msg2post."<tr><td><b><font size=2 color='ffffff'>$_ $door ($nr) [".$rstat[1]."]: </font></b></td></tr><tr><td><font size=2 color='ffa500'>";
+
+ foreach $chatter (@dir2) {
+ $msg2post = $msg2post."$chatter "
+ if (-f "data/online/rooms/$_/$chatter");
+ }
+
+ print "</font></td>";
+ }
+ }
+
+ &post_prv($alias,"<font color=ffffff>Folgende R&auml;ume sind offen:</font><table>$msg2post</table>");
+
+ } elsif ($raum ne "") {
+ my $persons;
+
+ opendir(DIR,"data/online/rooms/$raum");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+
+ foreach(@dir) {
+ $persons = $persons." ".$_
+ if (-f "data/online/rooms/$raum/$_");
+ }
+
+ my ($nr,$is) = (($#dir-1),"t");
+
+ if ($nr != 1) {
+ $nrs = "en";
+ $is = "n";
+ }
+
+ &post_prv($alias,"<font color=ffffff> $nr Person$nrs befinde$is sich im Raum <b>$raum</b> <font color='ffa500'>$persons</font></font>");
+ }
+
+ &reload_html;
+
+#############>- ANZEIGEN IN WELCHEN RAUM SICH JMD. BEFINDET BZW. JMD IN EINEN RAUM FOLGEN-<
+ } elsif ($cmd eq "wj" || $cmd eq "ju") {
+ my $alias2search = $cmd[1];
+ my $roomofalias = &get_room($alias2search);
+
+ if ($roomofalias) {
+ if ($cmd eq "wj") {
+ &post_prv($alias,"<font color='ffa500'>$alias2search <font color=ffffff>befindet sich im Raum <b>$roomofalias</b> !</font></font>");
+
+ } else {
+ &change_room("ju",$roomofalias,$room,$alias2search);
+ }
+
+ } else {
+ &post_prv($alias,"<font color='ffa500'>$alias2search <font color=ffffff> ist nicht eingeloggt!</font></font>");
+ }
+
+ &reload_html;
+
+#############>- RAUMNESETZER BEFEHLE ( Alphabetisch sortiert ) -<
+ } elsif ( 1 <= &hierachie($alias,$room)) {
+
+#############>- RAUM ABSCHLIESSEN/AUFSCHLIESSEN -<
+ if ($cmd eq "l") {
+ &lock;
+ sub lock {
+ my $method = shift;
+
+ open RSTAT, "data/online/rstat/$room";
+ my @r_stat = <RSTAT>;
+ close RSTAT;
+
+ my $lock = "0\n";
+
+ if ($room eq $standardroom) {
+ &post($room,"<i><font color=ffffff>".&timestring." <font color='$col'>$alias</font> sperrt den Raum ohne Erfolg ab ...</font></i>", $alias);
+ } else {
+
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+
+ &post($room,"<i><font color=ffffff>".&timestring." <font color='$col'>$alias</font> sperrt den Raum ab ...</font></i>", $alias)
+ if ($method ne "separee");
+
+ } else {
+ &post($room,"<i><font color=ffffff>".&timestring." <font color='$col'>$alias</font> sperrt den Raum auf ...</font></i>", $alias)
+ if ($method ne "separee");
+ }
+
+ for ($i=1;$i<=$#r_stat;$i++) {
+ $lock = $lock.$r_stat[$i];
+ }
+
+ open RSTAT,">data/online/rstat/$room";
+ print RSTAT $lock;
+ close RSTAT;
+ }
+ &reload_html;
+ }
+
+#############>- ZUM RAUMBESETZER ERNENNEN -<
+ } elsif ($cmd eq "su") {
+ my $alias2su = $cmd[1];
+
+ opendir DIR,"data/online/rooms/$room";
+ my @dir = readdir(DIR);
+ closedir(DIR);
+
+ foreach(@dir) {
+ if ($_ eq $alias2su) {
+
+ open(DATEI,"<data/online/rstat/$room");
+ my @rstat = <DATEI>;
+ close DATEI;
+
+ if (1 <= hierachie($alias2su,$room)) {
+ &post_prv($alias,"<font color='ffa500'>$alias2su</font> <font color='ffffff'> kann nicht zum Raumbesetzer ernannt werden. (Ist bereits RB, WÄ oder OW)</font>");
+ &reload_html;
+ }
+
+ open RSTAT,">>data/online/rstat/$room";
+ print RSTAT "$alias2su<;1\n";
+ close RSTAT;
+
+ &post($room,"<i><font color='ffffff'>".&timestring." <font color='$col'>$alias</font> verleiht <b>$alias2su</b> Raumbesetzerrechte ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ &reload_html;
+ }
+ }
+
+ &post_prv($alias,"<font color='ffa500'>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist nicht anwesend)</font>");
+ &reload_html;
+
+#############>- RAUMBESETZER ENTNENNEN -<
+ } elsif ($cmd eq "rsu") {
+ my $alias2rsu = $cmd[1];
+
+ if (1 == hierachie($alias2rsu,$room)) {
+ &rm_rstat($alias2rsu,$room);
+ &post($room,"<i><font color=ffffff>".&timestring." <font color='$col'>$alias</font> entzieht <b>$alias2rsu</b> die Raumbesetzerrechte ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+
+ } else {
+ &post_prv($alias,"<font color='ffa500'>$alias2rsu <font color='ffffff'>ist gar kein Raumbesetzer!</font></font>");
+ }
+
+ &reload_html;
+
+#############>- RAUM EIN THEMA GEBEN -<
+ } elsif ($cmd eq "t") {
+ open RSTAT, "data/online/rstat/$room";
+ my @r_stat = <RSTAT>;
+ close RSTAT;
+
+ my $theme;
+ if ($cmd[1] ne undef) {
+
+ for ($i=1; $i <= $#cmd; $i++) {
+ $theme = $theme." ".$cmd[$i];
+ }
+
+ &post($room,"<i><font color='ffffff'>".&timestring." <font color='$col'>$alias</font> gibt dem Raum das Thema \"<font color='$col'>$theme</font>\" ...</font></i>", $alias);
+
+ } else {
+ &post($room,"<i><font color=ffffff>".&timestring." <font color='$col'>$alias</font> löscht das Thema des Raums ...</font></i>", $alias);
+ }
+
+ $theme = $r_stat[0].$theme."\n";
+
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $theme = $theme.$r_stat[$i]."\n";
+ }
+
+ open RSTAT,">data/online/rstat/$room";
+ print RSTAT $theme;
+ close RSTAT;
+ &reload_html;
+
+#############>- WÄCHTERBEFEHLE ( Alphabetisch sortiert ) -<
+ } elsif (3 <= &hierachie($alias)) {
+
+#############>- ALIAS VERBANNEN -<
+ if ($cmd eq "ban" || $cmd eq "banip") {
+ my $alias2ban = $cmd[1];
+ my $hierachie = &hierachie($alias2ban);
+
+ open BAN,"<data/ban";
+ my @ban = <BAN>;
+ close BAN;
+
+ if ($cmd[1] eq undef) {
+ my $nr = @ban;
+ my $banned;
+
+ foreach(@ban) {
+ chomp($_);
+ $banned .= " $_";
+ }
+
+ &post_prv($alias,"<font color=ffffff>Folgende Benutzer sind verbannt [$nr]: <font color='ff0000'>$banned</font></font>");
+ &reload_html;
+
+ } elsif (-f "data/user/options/$alias2ban") {
+ if (3 <= $hierachie eq "wa") {
+ &post_prv($alias,"<font color='ffa500'>$alias2ban <font color='ffffff'>kann nicht verbannt werden!</font></font>");
+ &reload_html;
+ }
+
+ if ($cmd eq "ban") {
+ if (&add_entry($alias2ban,"ban") == 1) {
+ &post($room,"<i><font color=ffffff>".&timestring." <font color='$col'>$alias</font> verbannt <b>$alias2ban</b> aus dem Chat ...</font></i>", $alias);
+
+ } else {
+ &post_prv($alias,"<font color='ffa500'>$alias2ban <font color=ffffff>ist bereits verbannt!</font></font>");
+ }
+
+ } elsif ($cmd eq "banip") {
+ open DATEI, "<data/online/ident/$alias2ban";
+ my $ipnr = <DATEI>;
+ close DATEI;
+
+ chomp($ipnr);
+
+ if (add_entry("ip://$ipnr","ban") == 1) {
+ &post_prv($alias,"<font color='ffffff'>IP-Nummer von <font color='ffa500'>$alias2ban</font> (<font color='ff0000'>$ipnr</font>) wurde verbannt!</font></i>");
+
+ } else {
+ &post_prv($alias,"<font color='ffffff'>Die IP-Nummer <font color='ff0000'>$ipnr</font> von <font color='ffa500'>$alias2ban</font> ist bereits verbannt!</font></font>");
+ }
+ &reload_html;
+
+ }
+ &reload_html;
+ }
+ &post_prv($alias,"<font color='ffa500'>$alias2ban <font color=ffffff> kann nicht verbannt werden, da Benutzername nicht existiert!</font></font>");
+ &reload_html;
+
+#############>- ALIAS ENTBANNEN -<
+ } elsif ($cmd eq "rban" || $cmd eq "rbanip") {
+ my $alias2rban = $cmd[1];
+
+ open(BAN,"<data/ban");
+ @ban = <BAN>;
+ close BAN;
+
+ foreach $ban (@ban) {
+ if (&rm_entry($alias2rban,"ban") == 1) {
+
+ if ($alias2rban =~ /ip:/) {
+ &post_prv($alias,"<font color='ffffff'>Die IP-Nummer <font color='ff0000'>$alias2rban</font> wurde aus der Banliste ausgetragen!</font></font>");
+
+ } else {
+ &post($room,"<i><font color=ffffff>".&timestring." <font color='$col'>$alias</font> entbannt <b>$alias2rban</b> ...</font></i>", $alias);
+
+ }
+ &reload_html;
+ }
+ }
+
+ &post_prv($alias,"<font color='ff0000'>$alias2rban <font color='ffffff'>ist nicht verbannt!</font></font>");
+ &reload_html;
+
+#############>- EIGENES SUPERUSER-LOGO VERSCHWINDEN/AUFTAUCHEN LASSEN -<
+ } elsif ($cmd eq "img") {
+ my $hierachie = &hierachie($alias);
+ &hierachie_rm($alias);
+
+ if (($hierachie % 2) > 0) {
+ &post_prv($alias,"<font color='ffffff'>Dein Superuserlogo wurde versteckt!</font>");
+ &hierachie_add($alias,$hierachie+1);
+
+ } else {
+ &post_prv("$alias","<font color='ffffff'>Dein Superuserlogo wurde wieder sichtbar gemacht!</font></font>");
+ &hierachie_add($alias,$hierachie-1);
+ }
+
+ &reload_html;
+
+#############>- IP # VON ALIAS ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "ip") {
+ my $alias2prove = $cmd[1];
+
+ opendir DIR,"data/online/ident";
+ my @dir = readdir(DIR);
+ closedir(DIR);
+
+ foreach(@dir) {
+ if ($_ eq $alias2prove) {
+ open DATEI, "<data/online/ident/$alias2prove";
+ my $ipnr = <DATEI>;
+ close DATEI;
+
+ chomp $ipnr;
+ &post_prv($alias,"<font color='ffa500'>$_<font color='ffffff'> hat die IP-Nummer <font color='ff0000'>$ipnr</font> !</font></font>");
+ }
+ }
+
+ &reload_html;
+
+#############>- ALIAS AUS DEM CHAT KATAPULTIEREN -<
+ } elsif ($cmd eq "k" || $cmd eq "o") {
+ my $alias2kick = $cmd[1];
+
+ if (-f "data/online/users/$alias2kick") {
+ opendir DIR,"data/online/rooms";
+ my @dir = readdir(DIR);
+ closedir(DIR);
+
+ foreach my $raum (@dir) {
+ opendir DIR, "data/online/rooms/$raum";
+ my @dir2 = readdir(DIR);
+ closedir(DIR);
+
+ foreach my $chatter (@dir2) {
+ if ($chatter eq $alias2kick) {
+
+ my $hierachie2 = &hierachie($alias2kick);
+
+ if (&hierachie($alias) <= &hierachie($alias2kick)) {
+ &post_prv($alias,"<font color='ffa500'>$alias2kick <font color='ffffff'> besitzt einen h&ouml;heren oder gleichen Rang und kann nicht gekickt/ausgeloggt werden!</font></font>");
+
+ } else {
+ if ($cmd eq "k") {
+ &post_prv($alias2kick,"<script language=\"JavaScript\">window.open(\"chat?request=start&tmp=kick\",\"_top\");</script>");
+
+ } else {
+ &post_prv($alias2kick,"<script language=\"JavaScript\">window.open(\"chat?request=start&tmp=logout\",\"_top\");</script>");
+ }
+
+ $_ = undef
+ if ($room eq $raum);
+
+ if ($cmd eq "k") {
+ &post($room,"<i><font color=ffffff>".&timestring." <font color='$col'>$alias</font> katapultiert <b>$alias2kick</b> aus dem Chat ...</font></i>",$alias, $raum);
+ } else {
+ &post($room,"<i><font color=ffffff>".&timestring." <font color='$col'>$alias</font> loggt <b>$alias2kick</b> aus dem Chat aus ...</font></i>",$alias, $alias);
+ }
+
+ rm_alias($alias2kick,$raum);
+ &check_online;
+
+ }
+ &reload_html;
+ }
+ }
+ }
+ }
+
+ &post_prv($alias,"<font color='ffa500'>$alias2kick <font color='ffffff'> ist nicht anwesend und kann nicht aus dem System katapultiert werden werden!</font></font>");
+ &reload_html;
+
+#############>- EINEN ANDEREN RAUM AUF-/ABSPERREN -<
+ } elsif ($cmd eq "sl") {
+ my $sl_room = $cmd[1];
+
+ if (-e "data/online/rooms/$sl_room") {
+ my $lock = "0\n";
+
+ open RSTAT,"<data/online/rstat/$sl_room";
+ my @r_stat = <RSTAT>;
+ close RSTAT;
+
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room,"<i><font color=ffffff>".&timestring." <font color='$col'>$alias</font> sperrt den Raum <b>$sl_room</b> von aussen ab ...</font></i>", $alias,$sl_room);
+
+ } else {
+ &post($room,"<i><font color=ffffff>".&timestring." <font color='$col'>$alias</font> sperrt den Raum <b>$sl_room</b> von aussen auf ...</font></i>", $alias,$sl_room);
+ }
+
+ for ($i=1;$i<=$#r_stat;$i++) {
+ $lock = $lock.$r_stat[$i];
+ }
+
+ open RSTAT,">data/online/rstat/$sl_room";
+ print RSTAT $lock;
+ close RSTAT;
+
+ } else {
+ &post_prv($alias,"<font color='ffffff'>Der Raum <font color='ffa500'>$sl_room</font> existiert nicht!</font></font>");
+ }
+
+ &reload_html;
+
+#############>- IN EINEN ANDEREN RAUM HINEINRUFEN -<
+ } elsif ($cmd eq "ss") {
+ my $ss_room = $cmd[1];
+
+ if (-e "data/online/rooms/$ss_room") {
+ my $ss_msg;
+
+ for ($i=2; $i <= $#cmd; $i++) {
+ $ss_msg = $ss_msg." ".$cmd[$i];
+ }
+
+ my $msg2scream = "\U$ss_msg";
+ &post($room,"<i><font color='ffffff'>".&timestring." <font color='$col'>$alias</font> ruft in den Raum <b>$ss_room</b> hinein: <b><font color=$col>$msg2scream</font></b> ...</font></i>",$alias, $ss_room);
+ &reload_html;
+
+ } else {
+ &post_prv($alias,"<font color='ffffff'>Der Raum <font color='ffa500'>$ss_room</font> existiert nicht!</font></font>");
+ }
+
+ &reload_html;
+
+#############>- EINEN ANDEREN RAUM EIN THEMA GEBEN -<
+ } elsif ($cmd eq "st") {
+ my $st_room = $cmd[1];
+ if (-e "data/online/rooms/$st_room") {
+ my $theme;
+
+ if ($cmd[2] ne undef) {
+
+ for ($i=1; $i <= $#cmd; $i++) {
+ $theme = $theme." ".$cmd[$i];
+ }
+
+ &post($room,"<i><font color=ffffff>".&timestring." <font color='$col'>$alias</font> gibt dem Raum <b>$st_room</b> das Thema \"<font color='$col'>$theme</font>\" ...</font></i>",$alias,$st_room);
+
+ } else {
+ &post($room,"<i><font color=ffffff>".&timestring." <font color='$col'>$alias</font> löscht das Thema des Raums <b>$st_room</b> ...</font></i>",$alias,$st_room);
+ }
+
+ open RSTAT,"<data/online/rstat/$st_room";
+ my @r_stat = <RSTAT>;
+ close RSTAT;
+
+ $theme = $r_stat[0].$theme."\n";
+
+ for ($i=2;$i<=$#r_stat;$i++) {
+ $theme = $theme.$r_stat[$i];
+ }
+
+ open RSTAT,">data/online/rstat/$st_room";
+ print RSTAT $theme;
+ close RSTAT;
+
+ } else {
+ &post_prv($alias,"<font color=ffffff>Der Raum <font color=ffa500>$st_room</font> existiert nicht!</font></font>");
+ }
+
+ &reload_html;
+
+#############>- OBERWÄCHTERBEFEHLE -<
+ } elsif (5 <= &hierachie($alias)) {
+
+#############>- EINEN BENUTZER AUS DEM SYSTEM LÖSCHEN -<
+ if ($cmd eq "kill") {
+ my $alias2kill = $cmd[1];
+
+ if (-f "data/user/options/$alias2kill") {
+
+ if (5 <= &hierachie($alias2kill)) {
+ &post_prv($alias,"<font color='ffa500'>$alias2kill</font> <font color='ffffff'>hat einen h&ouml;heren Rang und kann nicht aus dem System entfernt werden !</font>");
+
+ } else {
+ &post($room,"<i><font color=ffffff>".&timestring." <font color='$col>$alias</font> killt <b>$alias2kill</b> ganz und gar aus dem System ...</font></i>", $alias);
+ &kill_alias($alias2kill,$alias);
+ }
+
+ } else {
+ &post_prv($alias,"<font color='ffa500'>$alias2kill <font color='ffffff'> existiert nicht in der Datenbank!</font></font>");
+ }
+
+ &reload_html;
+
+#############>- SYSTEMNACHRICHT IN ALLE BESTEHENDEN RÄUME &postEN -<
+ } elsif ($cmd eq "sys") {
+ my $sys_msg;
+
+ for ($i=1; $i <= $#cmd; $i++) {
+ $sys_msg = $sys_msg." ".$cmd[$i];
+ }
+
+ $sys_msg = "<i><font color='ffffff'>".&timestring." </font></i> <b><font size=2 color='red'>SYSTEMNACHRICHT</font></b><i><font color='ffffff'>: $sys_msg ...</font></i>";
+
+ opendir ROOMS,"data/msgs";
+ my @rooms = readdir(ROOMS);
+ close(ROOMS);
+
+ foreach (@rooms) {
+ &post($_,$sys_msg,$alias)
+ unless(/\./);
+ }
+
+ &log($sys_msg);
+ &reload_html;
+
+#############>- ALIAS ZUM WÄCHTER ERNNENNEN -<
+ } elsif ($cmd eq "wa") {
+
+ my $alias2wa = $cmd[1];
+ if (-f "data/user/options/$alias2wa") {
+
+ if (3 <= &hierachie($alias2wa)) {
+ &post_prv($alias,"<font color='ffa500'>$alias2wa <font color='ffffff'>kann nicht zum W&auml;chter ernannt werden!</font></font>");
+
+ } else {
+ &hierachie_add($alias2wa,3);
+ &post($room,"<i><font color=ffffff>".&timestring." <font color='$col'>$alias</font> ernennt <b>$alias2wa</b> zum Wächter ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+
+ &reload_html;
+
+ } else {
+ &post_prv($alias,"<font color='ffa500'>$alias2wa <font color=ffffff>existiert nicht in der Datenbank!</font></font>");
+ }
+
+ &reload_html;
+
+#############>- ALIAS DIE WÄCHTERRECHTE ENTZIEHEN -<
+ } elsif ($cmd eq "rwa") {
+ my $alias2rwa = $cmd[1];
+ my $hierachie = &hierachie($alias2rwa);
+
+ if (3 == $hierachie || 4 == $hierachie) {
+ &hierachie_rm($alias2rwa);
+ &post($room,"<i><font color='ffffff'>".&timestring." <font color='$col'>$alias</font> hat <b>$alias2rwa</b> vom Wächter zum normalen Chatter degradiert ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+
+ } else {
+ &post_prv($alias,"<font color='ffa500'>$alias2rwa <font color=ffffff>ist kein Wächter und können diese Rechte nicht entzogen werden!</font></font>");
+ }
+
+ &reload_html;
+
+#############>- ADMINISTRATORBEFEHLE -<
+ } elsif (7 <= &hierachie($alias)) {
+#############>- ALIAS ZUM OBERWÄCHTER ERNENNEN -<
+ if ($cmd eq "ow") {
+
+ my $alias2ow = $cmd[1];
+ if (-f "data/user/options/$alias2ow") {
+
+ if (5 <= &hierachie($alias2ow)) {
+ &post_prv($alias,"<font color='ffa500'>$alias2ow <font color='ffffff'>kann nicht zum Oberw&auml;chter ernannt werden!</font></font>");
+
+ } else {
+ &hierachie_add($alias2ow,5);
+ &post($room,"<i><font color=ffffff>".&timestring." <font color='$col'>$alias</font> ernennt <b>$alias2ow</b> zum Oberw&auml;chter ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+
+ &reload_html;
+
+ } else {
+ &post_prv($alias,"<font color='ffa500'>$alias2wa <font color=ffffff>existiert nicht in der Datenbank!</font></font>");
+ }
+
+ &reload_html;
+
+#############>- ALIAS DIE OBERWÄCHTERRECHTE ENTZIEHEN -<
+ } elsif ($cmd eq "row") {
+ my $alias2row = $cmd[1];
+ my $hierachie = &hierachie($alias2row);
+
+ if (5 == $hierachie || 6 == $hierachie) {
+ &hierachie_rm($alias2row);
+ &post($room,"<i><font color='ffffff'>".&timestring." <font color='$col'>$alias</font> hat <b>$alias2row</b> vom Oberwächter zum normalen Chatter degradiert ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+
+ } else {
+ &post_prv($alias,"<font color='ffa500'>$alias2row <font color=ffffff>ist kein Oberwächter und können diese Rechte nicht entzogen werden!</font></font>");
+ }
+
+ &reload_html;
+
+#############>- PASSWORD EINES BENUTZERS ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "pw") {
+ my $pw2show = $cmd[1];
+
+ if (-f "data/user/options/$pw2show") {
+
+ open PW,"<data/user/options/$pw2show";
+ my @pw = <PW>;
+ close PW;
+
+ chomp($pw[0]);
+
+ &post_prv($alias,"<font color='ffa500'>$pw2show <font color='ffffff'> hat das Passwort <font color='ff0000'>$pw[0]</font> !</font></font>");
+ &reload_html;
+ }
+
+ &post_prv($alias,"<font color='ffa500'>$pw2show <font color='ffffff'> existiert nicht in der Benutzerdatenbank!</font></font>");
+ &reload_html;
+
+#############>- IDENT-DATEI EINES BENUTZERS ANZEIGEN LASSEN -<
+ } elsif ($cmd eq "id" || $cmd eq "agent") {
+ my $id2show = $cmd[1];
+
+ if (-f "data/online/ident/$id2show") {
+ open ID,"<data/online/ident/$id2show";
+ my @id = <ID>;
+ close ID;
+
+ if ($cmd eq "id") {
+ chomp($id[1]);
+
+ &post_prv($alias,"<font color='ffa500'>$id2show <font color='ffffff'> hat die Temp-ID <font color='ff0000'>$id[1]</font> !</font></font>");
+
+ } else {
+ chomp($id[2]);
+ &post_prv($alias,"<font color='ffa500'>$id2show <font color='ffffff'> verwendet <font color='ff0000'>$id[2]</font> !</font></font>");
+
+ }
+ &reload_html;
+ }
+
+ &post_prv($alias,"<font color='ffa500'>$id2show <font color='ffffff'> ist nicht eingeloggt !</font></font>");
+ &reload_html;
+
+#############>- SYSTEMMELDUNG posten -<
+ } elsif ($cmd eq "cool") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+
+ &post($room,"<i><font color=ffffff>".&timestring." $msg2post</font></i>", $alias);
+ &reload_html;
+
+#############>- REVERSE -<
+ } elsif ($cmd eq "rev") {
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+ $msg2post = reverse($msg2post);
+
+ &post($room,"<b><font color='$col'>$alias: <font color='$secol'>$msg2post</font></font></b>", $alias);
+ &reload_html;
+ }
+ }
+ }
+ }
+ }
+#############>- FLÜSTERN ( Auch mit '/' ) -<
+ my ($alias2post,$msg2post,$action);
+
+ if ($cmd eq "msg") {
+ $alias2post = $cmd[1];
+
+ for ($i=2; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+
+ } elsif ($cmd eq "") {
+ $alias2post = $whisper;
+
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+
+ } else {
+ $alias2post = $cmd;
+
+ for ($i=1; $i <= $#cmd; $i++) {
+ $msg2post = $msg2post." ".$cmd[$i];
+ }
+
+ }
+ $msg2post =~ s#/me/#<i>$alias</i>#g;
+ $msg2post =~ s#/m/#<i><font color=$col>$alias</font></i>#g;
+
+ if (-f "data/online/users/$alias2post" && !-f "data/online/rooms/$loginplace/$alias2post") {
+ &post_prv($alias,"<b><font color='$col'><i>Zu $alias2post geflüstert:</i> <font color='$secol'>$msg2post</font></font></i></b>");
+ &post_prv($alias2post,"<b><font color='$col'><i>$alias flüstert:</i> <font color='$secol'>$msg2post</font></font></i></b>");
+ &private_javascript($alias, $room, "parent.input.document.inf.whisper.value = '$alias2post';" );
+ &reload_html;
+ }
+
+ &post_prv($alias," <font color=ffffff>Benutzer oder Befehl <font color=ffa500>$alias2post</font> ist nicht anwesend/verfügbar! Bitte den Befehl \"/menu\" eingeben, um das Chat-Men&uuml zu &ouml;ffnen.</font></font>");
+ &reload_html;
+}
+
+1;
diff --git a/0.7.1/config.pm b/0.7.1/config.pm
new file mode 100644
index 0000000..3f379ff
--- /dev/null
+++ b/0.7.1/config.pm
@@ -0,0 +1,44 @@
+# yChat - Copyright by Paul C. Bütow
+
+########################### Dieser Teil bestimmt die Standart-Variabeln.
+##STANDART-CONFIGURATION:## (CSS, Farben, Version etc.)
+###########################
+$limit = 50; # Benutzerlimit
+$datum = "25.12.01"; # Datum der letzten Änderung (ändern erwünscht)
+$version = "0.7.0.1"; # Bitte Hauptversionsnummer nicht ändern
+$title = "yChat [$version]"; # Erscheint in der Browser-Leiste oben
+$standardroom = "Cyberbar"; # Standardchatraum
+$loginplace = "Lounge"; # Bezeichnung der Startseite nach dem Login
+$localhost = "212.202.190.233"; # Host oder IP# des Chat-Servers
+$localport = 2000; # Port über den fer Chat-Server läuft
+$gfxpath = "http://$localhost/yChat"; # URL der Binärdaten (Grafiken etc.)
+$bgcolor = "#3E535B"; # Hintergrundfarbe der HTML-Seiten
+$chatbg = "#000000"; # Hintergrundfarbe des Chat-Frames
+
+# PS: Um einen Chat-Administrator anzulegen, dann die Datei data/hierachie
+# anlegen, in eine Zeile muß folgendes eingetragen werden: "Nickname<;7"
+# (Natürlich ohne Anführungsstriche) Nickname ist somit Chat-Administrator
+# und kann Oberwächter und Wächter bestimmen!
+
+sub style {
+print <<ENDCSS;
+<style type="text/css">
+ body { background-color: $bgcolor }
+ body.blank { background-color: $chatbg }
+ body.online { background-color: $chatbg }
+ div { font-family: arial, geneva, verdana, helvetiva; font-size: 12px; color: #ffffff }
+ div.b { font-weight: bold; color: #ffa500 }
+ a { color: #ffffef; }
+ a:hover { color: #ffffff; }
+ p { font-family:verdana, arial, geneva, helvetica, sans-serif; color:#FFFFFF; font-size:12px; }
+</style>
+<style type="text/css" media="all">
+ a { text-decoration: none; }
+ a:hover { text-decoration:underline; }
+ input { border:2px solid #000000; font-size:12px; color:#000000; background-color: #ffffff; height:23px; padding:2px;}
+ select { border:2px solid #000000; font-family:arial, verdana, helvetica; font-size:11px; color:#000000; height:21px; padding:2px;}
+</style>
+ENDCSS
+}
+
+1;
diff --git a/0.7.1/help.sno b/0.7.1/help.sno
new file mode 100644
index 0000000..2239eac
--- /dev/null
+++ b/0.7.1/help.sno
@@ -0,0 +1,75 @@
+<div>
+ Alle Chat-Befehle:
+</div>
+<hr>
+<table border=1>
+<tr><th><div>SU</div></th><th><div>Befehl</div></th><th><div>Beschreibung</div></th></tr>
+<tr><td><div>NC</div></td><td><div>/about</div></td><td><div>Zeigt aktuelle Version und andere Infos der Community an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/away <font color=red>Nachricht</font></div></td><td><div>Abmelden mit einer<font color=red>Abmeldenachricht</font></div></td></tr>
+<tr><td><div>NC</div></td><td><div>/clear</div></td><td><div>Bildschirm wird gelöscht</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/col <font color=red>XXXXXX</font> <font color=ffa500>XXXXXX</font></div></td><td><div>Farbe/n (<font color=red>Namensfarbe</font> / <font color=ffa500>Textfarbe</font>) wechseln. Angabe in Hexadezimal. Wird gar keine Farbe angegeben, dann wird eine zufällige generiert!</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/date</div></td><td><div>Zeigt aktuelles Datum und Urzeit an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/exit</div></td><td><div>Komplett aus dem System ausloggen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/hits</div></td><td><div>Zeigt an vor wieviel Stunden der Chat-Server neugestartet wurde und die Hits und Hits per Minute seit dieser Zeit</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ig <font color=red>Alias</font></div></td><td><div>Setzt/entfernt <font color=red>Alias</font> auf/aus die/der Ignorierliste. Wird das Argument weggelassen, so wird die Liste aller ignorierten Personen angezeigt</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/j <font color=red>Raumname</font></div></td><td><div>Raum wechseln/erstellen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ju <font color=red>Alias</font></div></td><td><div>In den Raum wechseln/folgen, wo sich <font color=red>Alias</font> befindet.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/m <font color=red>Aktion</font></div></td><td><div>Handeln mit 2 Farben</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/me <font color=red>Aktion</font></div></td><td><div>Handeln mit einer Farbe</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/memo <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine <font color=ffa500>Memonachricht</font> hinterlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/msg <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine private <font color=ffa500>Nachricht</font> flüstern</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ <font color=ffa500>Nachricht</font></div></td><td><div>Eine private <font color=ffa500>Nachricht</font> demjenigen flüstern, dem zuletzt eine geflüstert wurde</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/online <font color=red>Alias</font></div></td><td><div>Zeigt Onlineminuten von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/q</div></td><td><div>Chat verlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/rmgb</div></td><td><div>Das eigene Gästebuch komplett weglöschen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/s <font color=red>Nachricht</font></div></td><td><div><font color=red>Nachricht</font> schreien</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/seen <font color=red>Alias</font></div></td><td><div>Zeigt an, vor wieviel Stunden sich <font color=red>Nachricht</font> zum letzten Mal in das System eingelogt hat</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/selfkill</div></td><td><div>Sich selbst ganz und gar aus dem System entfernen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/sep <font color=red>Raumname</font></div></td><td><div>In den Raum <font color=red>Raumnamen</font> wechseln und gleichzeitig absperren</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/uptime</div></td><td><div>Siehe Befehl "/hits"</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/w</div></td><td><div>Zeigt an, wer sich im aktuellen Raum befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc <font color=red>Raum</font></div></td><td><div>Zeigt an, wer sich im <font color=red>Raum</font> befindet. Wird kein Raum angegeben, dann wird ledeglich angezeigt, wer sich im System befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc/</div></td><td><div>Zeigt alle offenen Räume und deren Chatter an</div></td></tr>
+<tr><td><div>NC</div></td><td> <div>/wj <font color=red>Alias</font></div></td><td><div>Zeigt an, in welchen Raum sich <font color=red>Alias</font> befindet</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/l</div></td><td><div>Der aktuelle Raum wird ab- bzw. aufgesperrt</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/rsu <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> die Raumbesetzerrechte entnehmen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/su <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Raumbesetzer ernennen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/t <font color=red>Thema</font></div></td><td><div>Dem aktuellen Raum wird ein <font color=red>Thema</font> gegeben</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban</div></td><td><div>Zeigt alle verbannten Benutzer an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> verbannen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/rban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> "entbannen"</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/banip <font color=red>Alias</font></div></td><td><div>Die IP-Nummer von <font color=red>Alias</font> verbannen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/rbanip ip://<font color=red>x.x.x.x</font></div></td><td><div>Die IP-Nummer <font color=red>x.x.x.x</font> "entbannen"</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ip <font color=red>Alias</font></div></td><td><div>Zeigt die IP-Nummer von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/img</div></td><td><div>Versteckt/reaktiviert das eigene Superuser-Logo im Online-Frame</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/k <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird aus dem Chat katapultiert!</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/o <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird aus dem Chat ausgeloggt!</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/sl <font color=red>Raum</font></div></td><td><div>Einen anderen <font color=ffa500>Raum</font> absperren</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ss <font color=red>Raum</font> <font color=ffa500>Nachricht</font></div></td><td><div>Eine <font color=ffa500>Nachricht</font> in <font color=red>Raum</font> hinüber rufen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/st <font color=red>Raum</font> <font color=ffa500>Thema</font></div></td><td><div>Einem anderen <font color=ffa500>Raum</font> ein <font color=ffa500>Thema</font > geben</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/kill <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird ganz und gar aus dem System entfernt</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/wa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Wächter ernennen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/rwa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom Wächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/sys <font color=red>Nachricht</font></div></td><td><div>Systemnachricht schreiben. (Erscheint in allen existierenden Räumen)</div></td></tr>
+<tr><td><div><font color=red>AD</font></div></td><td><div>/cool <font color=red>Nachricht</font></div></td><td><div>Gibt für den aktuellen Raum eine Systemmeldung aus</div></td></tr>
+<tr><td><div><font color=red>AD</font></div></td><td><div>/id <font color=red>Alias</font></div></td><td><div>Zeigt TempID von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div><font color=red>AD</font></div></td><td><div>/ow <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Oberwächter ernennen</div></td></tr>
+<tr><td><div><font color=red>AD</font></div></td><td><div>/row <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom Oberwächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=red>AD</font></div></td><td><div>/pw <font color=red>Alias</font></div></td><td><div>Zeigt das Passwort von <font color=red>Alias</font> an</div></td></tr>
+
+</table><hr>
+<div>
+ Zur Erklärung: NC steht für "Normale Chatter", RB für "Raumbesetzer", WÄ für "Wächter" und OW für "Oberwächter".
+ Obrige Befehle können nur von der/den jeweiligen Benutzergruppe/n ausgeführt werden.<br><br>
+ Allerdings gibt es folgendes zu beachten: Oberwächter verfügen über alle Chatbefehle. Normale Wächter über alle Chatbefehle, außer über die der Oberwächter.
+ Raumbesetzer können nur Raumbesetzerbefehle und die Befehle der normalen Chatter durchführen. Normale Chatter haben ledeglich die Standardbefehle zu verwenden.<br><br>
+ Weitere Besonderheiten der Wächter und Oberwächter:<br><br>
+ Wächter und Oberwächter können ....<br>
+ ... abgesperrte Chaträume problemlos betreten.<br>
+ ... nicht gekickt, verbannt oder gekillt werden.<br><br>
+ Nur Oberwächer können Logdateien der Cyberbar lesen!<br><br>
+ Oberwächter ernennt nur der Systemadministrator! Dieser wiederum hat weitere spezielle Befehle die geheim sind und die nur ihm
+ vorbehalten sind und ihm das Administrieren erleichtert.
+</div>
+</body>
+</html>
diff --git a/0.7.1/hierachie.pm b/0.7.1/hierachie.pm
new file mode 100644
index 0000000..f4b0f3c
--- /dev/null
+++ b/0.7.1/hierachie.pm
@@ -0,0 +1,101 @@
+sub hierachie {
+ my ($alias,$room) = @_;
+
+ open FILE, "<data/online/rstat/$room";
+ my @rstat = <FILE>;
+ close FILE;
+ shift @rstat;
+ shift @rstat;
+
+ open FILE, "<data/hierachie";
+ my @hierachie = <FILE>;
+ close FILE;
+
+ my @userlevels = (@hierachie,@rstat);
+ foreach (@userlevels) {
+ my ($name, $level) = split "<;";
+
+ if ($name eq $alias) {
+ chomp $level;
+ return $level;
+ }
+ }
+}
+
+sub hierachie_rm {
+ my $alias = shift;
+ my @return;
+
+ open FILE, "<data/hierachie";
+ my @hierachie = <FILE>;
+ close FILE;
+
+ foreach (@hierachie) {
+ push @return, $_
+ unless (/^$alias<;/);
+ }
+
+ open FILE, ">data/hierachie";
+ print FILE @return;
+ close FILE;
+}
+
+sub hierachie_rm_rstat {
+ my ($alias,$room) = @_;
+ my @return;
+
+ open FILE, "<data/online/rstat/$room" or return;
+ my @hierachie = <FILE>;
+ close FILE;
+
+ foreach (@hierachie) {
+ push @return, $_
+ unless (/^$alias<;/);
+ }
+
+ open FILE, ">data/online/rstat/$room";
+ print FILE @return;
+ close FILE;
+}
+
+
+sub hierachie_add {
+ my ($alias,$level) = @_;
+
+ &hierachie_rm($alias);
+
+ open FILE, ">>data/hierachie";
+ print FILE "$alias<;$level\n";
+ close FILE;
+}
+
+sub hierachie_add_rstat {
+ my ($alias,$level,$room) = @_;
+
+ &hierachie_rm_rstat($alias,$room);
+
+ open FILE, ">>data/online/rstat/$room" or return;
+ print FILE "$alias<;$level\n";
+ close FILE;
+}
+
+sub prove_away { # Prüfen, ob Benutzer abgemeldet ist
+ my ($alias,$room) = @_;
+
+ open AWAY,"<data/online/rstat/$room.away" or return;
+ @away = <AWAY>;
+ close AWAY;
+
+ my $name, $away;
+ foreach(@away) {
+
+ if (/^$alias.*/) {
+ ($name,$away) = split(/<; /);
+ chomp($away);
+ return $away;
+ }
+ }
+}
+
+
+1;
diff --git a/0.7.1/htdocs.pm b/0.7.1/htdocs.pm
new file mode 100644
index 0000000..0fd23d9
--- /dev/null
+++ b/0.7.1/htdocs.pm
@@ -0,0 +1,220 @@
+
+sub htdocs {
+
+ if ($var eq "help_html") {
+ &printfile("help.sno","Alle Chatbefehle");
+
+ } elsif ($var eq "logo_html") {
+ &start_html("Logo");
+ &logo_html;
+
+ } elsif ($var eq "menu_html") {
+ &menu_html;
+
+ } elsif ($var eq "logs_html") {
+ &logs_html;
+
+ } elsif ($var eq "view_logs_html") {
+ &secure_checkid($alias,$tmpid);
+ &printfile("data/logs/$tmp","Logdatei","blank")
+ if (5 <= &hierachie($alias));
+
+ } elsif ($var eq "superuser_html") {
+ &secure_checkid($alias,$tmpid);
+ &superuser_html;
+
+ } elsif ($var eq "chatiquette_html") {
+ &printfile("chatiq.sno","Chatiquette");
+ print $q->end_html;
+
+ } else {
+ print
+ $q->start_html(-bgcolor=>"000000"),
+ $q->end_html;
+ }
+}
+
+sub menu_html {
+ &start_html("Menü");
+print <<END;
+<div>
+ Von hier aus kannst du alle Untermenüpunkte des Systems erreichen:
+</div>
+<hr>
+END
+&menu();
+print "</body>\n</html>";
+}
+
+sub logo_html {
+print<<END;
+ <layer top=-3 left=0><div style="position:absolute; top:5; left:10">
+ <OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
+ codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0"
+ WIDTH=48 HEIGHT=48>
+ <PARAM NAME=movie VALUE="$gfxpath/ySymbol.swf">
+ <PARAM NAME=loop VALUE=false>
+ <PARAM NAME=menu VALUE=false>
+ <PARAM NAME=quality VALUE=high>
+ <PARAM NAME=scale VALUE=noborder>
+ <PARAM NAME=wmode VALUE=opaque>
+ <PARAM NAME=bgcolor VALUE=$bgcolor>
+ <EMBED src="$gfxpath/ySymbol.swf" loop=false menu=false quality=high scale=noborder wmode=opaque bgcolor=$bgcolor WIDTH=48 HEIGHT=48 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED>
+ </OBJECT>
+ </div></layer>
+END
+ print $q->end_html;
+}
+
+
+
+sub logs_html {
+ &start_html("Logdateien");
+ &menu;
+ print <<END;
+<div>
+ Hier befinden sich alle Logdateien
+</div>
+<hr>
+END
+ if (5 <= &hierachie($alias)) {
+ print $q->div( "Folgende Logdateien des Raumes \"$standardroom\" können nur von Oberwächtern oder höher gelesen werden (Sortiert nach A-Z, a-z):" ),
+ $q->br;
+
+ opendir(LOGS,"data/logs");
+ my @logs = readdir(LOGS);
+ closedir(LOGS);
+
+ my @sortedir = sort(@logs);
+
+ foreach(@sortedir) {
+
+ if (-f "data/logs/$_") {
+ print $q->a( { -href=>"chat?request=htdocs&alias=$alias&var=view_logs_html&tmp=$_&tmpid=$tmpid",
+ -target=>"_new" },
+ "$_" ),
+ " ";
+ }
+ }
+ } else {
+ print $q->div( "Logdateien können nur von Oberwächtern (OW) gelesen werden. Du bist jedoch ein Wächter (WÄ) oder ein",
+ "\"Normaler Chatter\". Oberwächter können alles nachlesen, was öffentlich im Raum \"Cyberbar\" gechattet wurde." ),
+ $q->hr;
+ }
+ print
+ $q->end_html;
+}
+
+sub superuser_html { # Zeigt an, wer Superuser ist
+ start_html("Superuser");
+ &menu;
+
+ print "<div>Hallo $alias. Du bist als ";
+ my $hierachie = &hierachie($alias);
+ if (7 <= $hierachie) {
+ print
+ $q->b( "Administrator" ),
+ " (AD) eingetragen.</div><br>",
+ $q->br;
+ } elsif (5 <= $hierachie) {
+ print
+ $q->b( "Oberwächter" ),
+ " (OW) eingetragen.</div><br>",
+ $q->br;
+ } elsif (3 <= $hierachie) {
+ print
+ $q->b( "Wächter" ),
+ " (WÄ) eingetragen.</div><br>",
+ $q->br;
+ } else {
+ print
+ $q->b( "normaler Chatter" ),
+ " (NC) eingetragen.</div><br>",
+ $q->br;
+ }
+
+open FILE, "data/hierachie";
+ my @hierachie = <FILE>;
+close FILE;
+
+my @ows, @was, @ads;
+foreach (@hierachie) {
+ my ($name,$level) = split "<;";
+ chomp $level;
+
+ if ($level == 3) {
+ push @was, $name;
+
+ } elsif ($level == 5) {
+ push @ows, $name;
+
+ } elsif ($level == 7) {
+ push @ads, $name;
+ }
+
+
+ if (3 <= $hierachie) {
+ if ($level == 4) {
+ push @was, "$name!";
+
+ } elsif ($level == 6) {
+ push @ows, "$name!";
+
+ } elsif ($level == 8) {
+ push @ads, "$name!" ;
+ }
+ }
+}
+
+ my $nads = $#ads+1;
+ print "<div>", $q->b( "AD" ), "s ($nads Stück)";
+
+ foreach(@ads) {
+ print $q->font( { -color=>"ffa500" }, " ".$_);
+ }
+
+ my $nrow = $#ows+1;
+ print "</div><br><br><div>", $q->b( "OW" ), "s ($nrow Stück)";
+
+ foreach(@ows) {
+ print $q->font( { -color=>"ffa500" }," ".$_);
+ }
+
+ my $nrwa = $#was+1;
+ print "</div><br>", $q->br, "<div>", $q->b( "WÄ" ),"s ($nrwa Stück)";
+
+ foreach(@was) {
+ print $q->font( { -color=>"FFA500" }," ".$_);
+ }
+
+print <<END;
+<hr>
+ Die jeweiligen Fähigkeiten der Oberwächter (OW) und der Wächter (WÄ) sind unter
+ "<a href="chat?request=htdocs&var=help_html">Chat-Befehle</a>"
+ dokumentiert. Versteckte Superuser können nur von anderen Superusern auf
+dieser Liste eingesehen werden!
+</div>
+</body>
+</html>
+END
+}
+
+sub menu {
+print <<MENUEND;
+<div>
+ <a href='chat?request=main2&var=edit_profile_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Profil ändern</a>
+ <a href='chat?request=main2&var=edit_options_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Optionen</a>
+ <a href='chat?request=main2&var=list_alias_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Benutzer</a>
+ <a href='chat?request=htdocs&var=help_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Befehle</a>
+ <a href='chat?request=main2&var=gb_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Board</a>
+ <a href='chat?request=htdocs&var=superuser_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Superuser</a>
+ <a href='chat?request=htdocs&var=logs_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Logs</a>
+ <a href='chat?request=stat&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Statistik</a>
+ <a href='chat?request=htdocs&var=chatiquette_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Chatiquette</a>
+</div>
+<hr>
+MENUEND
+}
+
+
+1;
diff --git a/0.7.1/input.pm b/0.7.1/input.pm
new file mode 100644
index 0000000..a659a50
--- /dev/null
+++ b/0.7.1/input.pm
@@ -0,0 +1,195 @@
+sub input {
+
+ &rm_away($alias,$room);
+
+ $maxVerlauf = "10"
+ if ($maxVerlauf eq undef);
+
+ $verlaufOrder = "1"
+ if ($verlaufOrder eq undef);
+
+ if ($tmp eq "login") {
+ &post($room,"<i><font color=ffffff>".&timestring." <font color='$col'>$alias</font> hat den Chat im Raum <b>$room</b> betreten ...</font></i>");
+ }
+
+print <<END;
+<html>
+<head>
+<script language="JavaScript"><!--
+
+// Einstellungsvariablen
+maxVerlauf = $maxVerlauf; // Anzahl der Einträge des Verlaufs
+maxPreview = 20; // Zeichenlänge der Verlaufsvorschau
+verlaufOrder = $verlaufOrder; // Neue Nachrichten von: 0=oben, 1=unten
+//autoAwayTimeout = 5; // Sekunden, nach denen der User 'Away' gesetzt wird
+//autoQuitTimeout = 10; // Sekunden, nach denen der User den Chat verlässt
+autoAwayTimeout = 300; // Sekunden, nach denen der User 'Away' gesetzt wird
+autoQuitTimeout = 1200; // Sekunden, nach denen der User den Chat verlässt
+
+// Interne Variablen
+userNotFocused = false; // Wenn User nicht schreibt
+userAway = false; // Wenn User automatisch auf 'Away' gesetzt ist
+userAwayTime = 0; // Sekunden, die User 'Away' ist
+fullVerlauf = new Array( maxVerlauf ); // Verlaufspuffer
+
+function delout()
+{
+ addVerlauf (document.inf.msg.value); // Dem Verlauf eine Nachricht anhängen
+ document.inf.msg.focus(); // Fukus in das Eingabeform
+ document.inf.msg.select(); // Text im Eigabeform markieren
+ document.inf.submit(); // Formular absenden
+ return false; // Abbrechen, damit das Frame nicht neu geladen wird
+}
+
+function CheckAuswahl()
+{
+ id=document.verlaufform.verlauf.selectedIndex; // ID des ausgewählten Feldes
+
+ if (fullVerlauf[id-1] != null) // Nur, wenn das Feld nicht leer ist
+ {
+ document.inf.msg.value = fullVerlauf[id-1]; // Eintrag ins Textfeld
+ }
+
+ document.verlaufform.verlauf.selectedIndex = 0; // Ersten Eintrag (Überschrift) auswählen
+ document.inf.msg.focus(); // Eingabefeld fokusieren
+
+ return true;
+}
+
+function addVerlauf (msg)
+{
+ if (msg == "") // Falls msg leer
+ return false; // Aufruf ignorieren
+
+ if (verlaufOrder) // neue Nachrichten von unten
+ {
+ for (i=0; i<(maxVerlauf-1); i++) // Alle Einträge einen aufrutschen
+ {
+ document.verlaufform.verlauf.options[i+1].text = document.verlaufform.verlauf.options[i+2].text;
+ fullVerlauf[i] = fullVerlauf[i+1];
+ }
+ }
+ else // neue Nachrichten von oben
+ {
+ for (i=(maxVerlauf-2); i>=0; i--) // Alle Einträge einen aufrutschen
+ {
+ document.verlaufform.verlauf.options[i+2].text = document.verlaufform.verlauf.options[i+1].text;
+ fullVerlauf[i+1] = fullVerlauf[i];
+ }
+ }
+
+ if (msg.length > maxPreview) // Vorschau zuschneiden
+ pre = msg.slice(0, maxPreview-3) + "...";
+ else
+ pre = msg;
+
+ if (verlaufOrder) // pos = Position des neuen Eintrags
+ pos = maxVerlauf-1;
+ else
+ pos = 0
+
+ document.verlaufform.verlauf.options[pos+1].text = pre; // Neue Vorschau anfügen
+ fullVerlauf[pos] = msg; // Neuen Eintrag an den Verlauf anfügen
+
+// document.verlaufform.verlauf.selectedIndex = maxVerlauf; // Fokus auf den letzten Eintrag
+ document.verlaufform.verlauf.selectedIndex = 0; // Fokus auf den ersten Eintrag (Überschrift)
+}
+
+function msgBlur()
+{
+ userNotFocused = true;
+ userAwayTime = 0;
+ userAway = false;
+}
+
+function msgFocus()
+{
+ userNotFocused = false;
+ if (userAway) // Wird ausgeführt, falls User 'Away' war
+ {
+ ; // nop
+ }
+ userAwayTime = 0;
+ userAway = false;
+}
+
+function checkInterval()
+{
+// status = "userNotFocused=" + userNotFocused + "; userAway=" + userAway + "; userAwayTime=" + userAwayTime + ""; // Debug
+ if (userNotFocused)
+ {
+ userAwayTime += 5; // Addiere 5, da nur alle 5Sek ausgeführt
+ if (!userAway)
+ {
+ if (autoAwayTimeout < userAwayTime) // Falls Zeit abgelaufen
+ {
+ if (document.inf.tmp.value != "away")
+ open ("chat?request=main1&alias=$alias&tmpid=$tmpid&msg=%2faway&tmp=autoaway","reload"); // 'Away' setzen
+ userAway = true;
+ }
+ }
+ else
+ {
+ if (autoQuitTimeout < userAwayTime) // Falls Zeit abgelaufen
+ {
+ open ("chat?request=main1&alias=$alias&tmpid=$tmpid&msg=%2fexit&tmp=autologout","reload"); // Chat beenden
+ }
+ }
+ }
+
+ window.setTimeout("checkInterval()",5000); // In 5 Sekunden wieder aufrufen
+}
+
+function initFrame()
+{
+ window.setTimeout("checkInterval()",5000); // In 5 Sekunden aufrufen
+ document.inf.msg.focus(); // Eingabefeld fokusieren
+}
+//-->
+</script>
+END
+
+&style;
+
+print <<END;
+</head>
+<body class="blank" onload="initFrame();">
+ <div align="left">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td>
+ <form name="inf" target="reload" action="chat" onsubmit="return delout();">
+ <input type="hidden" name="request" value="main1">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="room" value="$room">
+ <input type="hidden" name="col" value="$col">
+ <input type="hidden" name="secol" value="$secol">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="whisper" value="$whisper">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input size="40" maxlength="300" name="msg" onBlur="msgBlur();" onFocus="msgFocus();">
+ </form>
+ </td>
+ <td><form name="verlaufform">
+ <script language="JavaScript"><!--
+ document.write("<select size='1' name='verlauf' size='40' onChange='CheckAuswahl();'>");
+ document.write("<option>- Nachrichten-Verlauf -</option>");
+ for(i=0; i<maxVerlauf; i++) // Leere Verlaufsfelder generieren
+ document.write("<option value>(leer)</option>");
+ document.write("</select>");
+ //-->
+ </script>
+ </form>
+ </td>
+ </tr>
+ </table>
+ </div>
+</body>
+</html>
+END
+
+$client->$shutdown(2);
+exit 0;
+}
+
+1;
diff --git a/0.7.1/loggedin.pm b/0.7.1/loggedin.pm
new file mode 100644
index 0000000..8899a29
--- /dev/null
+++ b/0.7.1/loggedin.pm
@@ -0,0 +1,89 @@
+sub loggedin { # Startseite nach dem Login
+ &start_html($loginplace,'blank');
+
+ print <<END;
+<div>
+ <font color='$col'>$alias</font>, schön daß Du hier bist :-)
+</div>
+<hr>
+<div>
+<a href="chat?request=stream&alias=$alias&room=$standardroom&col=$col&secol=$secol&tmp=login&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder">Hier</a>
+kannst du den Standardraum $standardroom betreten. <br><br>
+END
+# <form action="chat">
+# <div>
+# Raum der betreten werden soll:<br>
+# <input name="room" value="Cyberbar">
+# <input type="hidden" name="request" value="stream">
+# <input type="hidden" name="alias" value="$alias">
+# <input type="hidden" name="col" value="$col">
+# <input type="hidden" name="secol" value="$secol">
+# <input type="hidden" name="tmpid" value="$tmpid">
+# <input type="hidden" name="maxVerlauf" value="$maxVerlauf">
+# <input type="hidden" name="verlaufOrder" value="$verlaufOrder">
+# <input type="submit" value="Betreten">
+# </div>
+# </form>
+# <br>
+#<div>
+# Folgende Personen sind anwesend:
+#</div>
+#<br>
+#<div>
+#END
+
+ opendir(ROOMDIRS,"data/online/rooms");
+ local @roomdirs = readdir(ROOMDIRS);
+ close(ROOMDIRS);
+
+ foreach(@roomdirs) {
+
+ if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") {
+ my $room = $_;
+
+ open(RSTAT,"<data/online/rstat/$room");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+
+ my $door = "[<font color=red>Abgesperrt!</font>]" if ($rstat[0] eq "1\n");
+
+ opendir(ROOMDIR,"data/online/rooms/$room");
+ my @roomdir = readdir(ROOMDIR);
+ close(ROOMDIR);
+
+ my $nr = $#roomdir-1;
+
+ if ($door || $_ eq $loginplace) {
+ print $q->b( $_ )," $door ($nr) ";
+
+ } else {
+ print
+ $q->b( $q->a( { -href=>"chat?request=stream&alias=$alias&room=$_&col=$col&secol=$secol&tmp=login&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder" }, "$_") ), " ($nr)";
+ }
+
+ print " Raumthema: $rstat[1]" if ($rstat[1] ne "\n");
+ print $q->br;
+
+ foreach(@roomdir) {
+ if ($_ ne ".." && $_ ne ".") {
+ print $q->a( { -href=>"chat?request=main2&var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid" }, "$_"), " ";
+ }
+ }
+
+ print $q->br, $q->br;
+ }
+ }
+
+ print
+ $q->br, $q->br,
+ $q->b( $q->font( { -color=>"ffa500" }, "Aktuelles:" ) ),
+ $q->br,
+ "Wie ihr seht, ist der neue yChat da. Allerdings ist es gut Möglich, daß diese Version einige Bugs beinhaltet! ",
+ "Solltest du welche entdecken, dann schick doch bitte eine Mail an <a href='mailto:snooper\@ychat.de'>snooper\@ychat.de</a>.",
+ "<br><br>Leider konnten noch nicht alle geplanten Features eingebaut werden. Dazu fehlte leider die Zeit.",
+ " Denn mit steigendem Sourcecode leidet leider auch das schnelle Anpassungsvermögen neuer Ideen.<br><br>",
+ "Aber egal, hauptsache der Chat läuft wieder :-) Mfg, Snooper ...</div>",
+ $q->end_html;
+}
+
+1;
diff --git a/0.7.1/main1.pm b/0.7.1/main1.pm
new file mode 100644
index 0000000..34720b6
--- /dev/null
+++ b/0.7.1/main1.pm
@@ -0,0 +1,57 @@
+sub main1 {
+
+ if (!-e "data/online/rooms/$room/$alias" && $tmp ne "autoaway" && $tmp ne "autologout") {
+ &post_prv($alias,"<font color=ffffff>Du befindest Dich nicht im Raum <font color=ffa500>$room</font> und kannst dort auch keine Nachrichten posten!</font>");
+ &reload_html;
+
+ } elsif (length($msg) > 300) {
+ &post_prv($alias,"<font color=ffffff>Deine Nachricht enthält zu viele Zeichen. Maximal sind 300 Zeichen erlaubt.</font>");
+ &reload_html;
+ }
+
+ if ($tmp eq "away") {
+ &rm_away($alias,$room);
+ &post($room,"<i><font color=ffffff>".&timestring." <font color='$col'>$alias</font> hat sich zurück gemeldet ... </font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ &private_javascript($alias, $room, "parent.input.document.inf.tmp.value = 'notaway';");
+ }
+
+ $msg =~ s#<#&lt\;#g;
+
+ if (substr($msg,0,1) ne "/") {
+
+ unless ($tmp eq "autoaway") {
+ &prove_color($alias,$_)
+ foreach($col, $secol);
+ }
+
+ open MSGFILE,">>data/msgs/$room";
+ unless ($msg =~ s#/me/#<i>$alias</i>#g || $msg =~ s#/m/#<i><font color=$col>$alias</font></i>#g) {
+ print MSGFILE "!<;".time."<;!<;!<;<b><font color='$col'>$alias: <font color='$secol'>$msg<br></font></font></b><;$alias<;\n";
+
+ } else {
+ $msg =~ s#/me/#<i>$alias</i>#g;
+ $msg =~ s#/m/#<i><font color=$col>$alias</font></i>#g;
+ print MSGFILE "!<;".time."<;!<;!<;<b><font color=$secol>$msg</font></font></b><br><;$alias<;\n";
+ }
+ close MSGFILE;
+
+ opendir PID,"data/online/pids/$room";
+ my @pids = readdir(PID);
+ closedir(PID);
+
+ foreach(@pids) {
+ kill USR1 => $_
+ if (-f "data/online/pids/$room/$_");
+ }
+
+ &log("<b><font color=$col>$alias: <font color=$secol>$msg</font></font></b>")
+ if ($room eq $standardroom);
+
+ &reload_html;
+
+ } else {
+ &command($msg,$tmp);
+ }
+}
+
+1;
diff --git a/0.7.1/main2.pm b/0.7.1/main2.pm
new file mode 100644
index 0000000..3165c16
--- /dev/null
+++ b/0.7.1/main2.pm
@@ -0,0 +1,626 @@
+sub main2 {
+
+#####################################
+##WELCHE SUB MUß AUSGEFÜHRT WERDEN?##
+#####################################
+
+if ($var eq "list_alias_html") {
+ &list_alias_html;
+
+} elsif ($var eq "alias_html") {
+ &alias_html;
+
+} elsif ($var eq "edit_profile_html") {
+ &secure_checkid($alias,$tmpid);
+ &edit_html("edit_profile_html");
+
+} elsif ($var eq "edit_options_html") {
+ &secure_checkid($alias,$tmpid);
+ &edit_html("edit_options_html");
+
+} elsif ($var eq "gb_html") {
+ &gb_html;
+
+} elsif ($var eq "post_gb") {
+ &secure_checkid($alias,$tmpid);
+ &post_gb;
+
+} elsif ($var eq "edit_profile") {
+ &secure_checkid($alias,$tmpid);
+ &edit("edit_profile");
+
+} elsif ($var eq "edit_options") {
+ &secure_checkid($alias,$tmpid);
+ &edit("edit_options");
+
+} elsif ($var eq "rm_gb_alias") {
+ &secure_checkid($alias,$tmpid);
+ &rm_gb;
+
+} else {
+ &error("Parameter fehlt");
+}
+}
+###########################
+##HAUPTTEIL DIESER DATEI:##
+###########################
+
+sub gb_html { # Das Benutzerboard/Gästebuch.
+ my $message = $_[0];
+ &start_html("Benutzerboard");
+&menu();
+if ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </i>
+ einen Text und poste
+ <u>dann</u>
+ !
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Vielen Dank für Deinen Beitrag. Wenn Du willst, kannst Du jetzt gleich noch einen Eintrag posten ...
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Falls Du Anregungen oder Verbesserungsvorschläge für die Community hast, dann poste doch einen kleinen Eintrag :-)
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="chat">
+ <input type="hidden" name="request" value="main2">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="guestbook">
+ <input type="hidden" name="id" value="y">
+ <input size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+ if (-e "data/guestbook") {
+ open (DATEI,"<data/guestbook") || &error("Konnte dat/guestbook nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ print
+ $q->div(@datei);
+ }
+ print
+ $q->end_html;
+}
+
+
+sub post_gb { # Wenn etwas in ein Gästebuch eingetragen wird
+ my ($secs, $mins, $hours, $days, $months, $years) = &timearray;
+
+ if ($msg eq "") {
+ if ($id eq "y") { # Überprüfen, ob Benutzerboard- oder Privatgästebuch
+ &gb_html("post_empty");
+
+ } else {
+ &alias_html("post_empty");
+ }
+
+ $client->shutdown(2);
+ exit 0;
+ }
+
+ $msg =~ s#<#&lt\;#g;
+ $msg =~ s#\n#<br>#g;
+
+ my $tmpath = "";
+
+ if ($id eq "y") {
+ $tmpath = "data/guestbook";
+
+ } else {
+ $tmpath = "data/user/gbooks/$tmp";
+ }
+
+ open(GB,"$tmpath");
+ my @gb = <GB>;
+ close GB;
+
+ pop(@gb) if ($#gb > 99);
+ my @newdatei = "<br><b>$alias schrieb am $days.$months.$years um $hours:$mins:$secs ...</b><br>$msg<br>\n";
+ push(@newdatei,@gb);
+
+ open(GB,">$tmpath");
+ print GB @newdatei;
+ close GB;
+
+ if ($id eq "y") {
+ &gb_html("post_ok");
+ $client->shutdown(2);
+ exit 0;
+
+ } else {
+ post_prv($tmp,"<font color=ffffff>$alias hat soeben einen Pin in Dein Profil gehängt ... </font>");
+ &alias_html;
+ $client->shutdown(2);
+ exit 0;
+ }
+}
+
+sub rm_gb { # Gästebucheintrag entfernen
+ open(GB,"<data/user/gbooks/$alias");
+ my @gbfile = <GB>;
+ close GB;
+ my @newgbfile = ();
+ for ($i=0; $i <= $#gbfile; $i++) {
+ push(@newgbfile,$gbfile[$i]) if ($i != $id);
+ }
+ open(GB,">data/user/gbooks/$alias");
+ print GB @newgbfile;
+ close GB;
+ &alias_html("rm_ok");
+}
+
+sub list_alias_html { # Liste aller Benutzer
+ &start_html("Alle Benutzer");
+ opendir(REGISTERED,"data/user/options");
+ my @users = readdir(REGISTERED);
+ closedir(REGISTERED);
+ my @liste = sort(@users);
+ my $nr = $#users-1;
+&menu();
+print <<END;
+ <div>
+ Es sind z.Z. genau $nr Benutzernamen in der Datenbank vorhanden! (Sortiert nach #, A-Z, a-z)
+ </div>
+ <hr>
+ <div>
+END
+ foreach(@liste) {
+ if (-f "data/user/options/$_") {
+ print
+ $q->a( { -href=>"chat?request=main2&var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid" },
+ "$_"),
+ " ";
+ }
+ }
+print <<END;
+ </div>
+</body>
+</html>
+END
+}
+
+sub alias_html { # Anzeigen eines Benutzerprofils
+ my $message = $_[0];
+ open(COUNTS,"<data/user/counts/$tmp");
+ local $counter = <COUNTS>;
+ close COUNTS;
+ $counter++;
+ open(COUNTS,">data/user/counts/$tmp");
+ print COUNTS $counter;
+ close COUNTS;
+ &start_html($tmp);
+ &menu();
+print <<END;
+END
+if ($message eq "rm_ok") {
+print <<END;
+ <div class=b>
+ Meldung:
+ </div>
+ <div>
+ Der von Dir gewählte Eintrag wurde erfolgreich gelöscht.
+ </div>
+ <hr>
+END
+} elsif ($message eq "post_empty") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wolltest soeben einen leeren Eintrag posten. Bitte schreib
+ <i>
+ zuerst
+ </u>
+ einen Text und poste
+ <u>dann</u>
+ !
+ <hr>
+END
+}
+ open(PROFILE,"<data/user/profiles/$tmp");
+ @data = <PROFILE>;
+ close PROFILE;
+print <<END;
+ <div>
+ Dieses Profil wurde insgesamt schon $counter mal aufgerufen !
+ <br><br>Alias: $tmp
+ <br><br>Nachname: $data[0]
+ <br><br>Vorname: $data[1]
+ <br><br>Alter: $data[2]
+ <br><br>Wohnort: $data[3]
+ <br><br>E-Mail:
+ <a href="mailto:$data[4]">$data[4]</a>
+ <br><br>ICQ-Nummer: $data[5]
+ <br><br>Homepage: <a href="$data[6]" target="_new">$data[6]</a>
+ <br><br>Weiteres:<br>$data[7]
+ <hr>
+ Hier kannst Du $tmp eine Nachricht hinterlassen!
+ <form action="chat">
+ <input type="hidden" name="request" value="main2">
+ <input type="hidden" name="var" value="post_gb">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="$tmp">
+ <input type="text" size="40" name="msg">
+ <font color="ffffff">
+ <input type="submit" value="Hinterlassen ...">
+ </font>
+ </form>
+ <hr>
+END
+if (-e "data/user/gbooks/$tmp") {
+ open (DATEI,"<data/user/gbooks/$tmp") || &error("Konnte data/user/gbooks/$tmp nicht öffnen");
+ @datei = <DATEI>;
+ close DATEI;
+ my $nr = 1;
+ if ($alias ne $tmp) {
+ foreach(@datei) {
+ print "<br>Eintrag # $nr: $_";
+ $nr++;
+ }
+ } else {
+print <<END;
+ <table>
+ <form action="chat">
+ <input type="hidden" name="request" value="main2">
+ <input type="hidden" name="var" value="rm_gb_alias">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="tmp" value="$tmp">
+END
+for($i=0; $i <= $#datei; $i++) {
+print <<END;
+ <tr>
+ <td>
+ <input type="radio" name="id" value="$i">
+ </td>
+ <td>
+ <div class=q>
+ <br>
+ Eintrag # $nr:
+ $datei[$i]
+ </div>
+ </td>
+ </tr>
+END
+$nr++;
+}
+print <<END;
+ </table>
+ <table>
+ <tr>
+ <td>
+ <font color=ffffff>
+ <input type="submit" value="Markierten Eintrag löschen">
+ </font>
+ </td>
+ <td>
+ <font color=ffffff>
+ <input type="reset" value="Markierung rückgängig machen">
+ </font>
+ </td>
+ </tr>
+ </table>
+ </form>
+END
+}
+}
+ print
+ $q->end_html;
+}
+
+sub edit_html { # Chat-Optionen / Benutzerprofil editieren
+ my ($method,$message) = @_;
+ &start_html("Benutzerprofil ändern");
+
+ if ($method eq "edit_options_html") {
+ open(DATEI,"<data/user/options/$alias");
+
+ } elsif ($method eq "edit_profile_html") {
+ open(DATEI,"<data/user/profiles/$alias");
+ }
+
+ @data = <DATEI>;
+ close DATEI;
+
+ foreach(@data) {
+ chomp $_;
+ }
+
+ &menu();
+
+ if ($method eq "edit_options_html") {
+ if ($message eq "edit_options_ok") {
+# &private_javascript($alias, &get_room($alias), "parent.input.document.inf.col.value = '$col'; parent.input.document.inf.secol.value = '$secol';" );
+
+print <<END;
+<div class=b>
+ Hinweis:
+</div>
+<div>
+ Du hast soeben Deine Chat-Optionen erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren. Um
+ weiterzuchatten einfach Fenster schliessen!
+</div>
+<hr>
+END
+ } elsif ($message eq "edit_pw_wrong") {
+print <<END;
+<div class=b>
+ ACHTUNG!
+</div>
+<div>
+ Du hast soeben versucht, dein Passwort zu ändern. Jedoch stimmte die Erste Eingabe nicht mit der Zweiten überein.
+ Bitte versuch es erneuert ...
+</div>
+<hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Deine Chat-Optionen editieren!" ),
+ $q->hr;
+ }
+print <<END;
+<script lang="javascript" type="text/javascript">
+<!--
+
+function radioWert(rObj) {
+ for (var i=0; i<rObj.length; i++) if (rObj[i].checked) return rObj[i].value;
+ return false;
+}
+
+function insertcode( code ) {
+ document.optionen.elements[radioWert(document.optionen.eingabe)].value = code;
+}
+
+//-->
+</script>
+
+<form name="optionen" action="chat">
+ <input type="hidden" name="var" value="edit_options">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Passwort
+ <font color=ffa500>
+ (Gut merken !!)
+ </font>
+ <br>
+ <input type="password" name="id" value="$data[0]">
+ </div>
+ </td>
+ <td width=20>
+ </td>
+ <td>
+ <div>
+ Geb hier das Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp" value="$data[0]">
+ </div>
+ </td>
+ </tr>
+ </table>
+ <hr>
+ <div>Einstellungen für den Nachrichten-Verlauf</div>
+ <table>
+ <tr>
+ <td>
+ <br>
+ <div>Anzahl der Nachrichten im Verlauf (Standart = 10)</div>
+ <font color=ffffff>
+ <select name="maxVerlauf" size="1">
+ <option value="$data[3]">$data[3]
+END
+for($i=1;$i<=50;$i++) {
+ print "<option value=\"$i\">$i";
+}
+print<<END;
+ </select>
+ </font>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <br>
+<div>Wie sollen die Nachrichten im Verlauf angeordnet sein?</div>
+ <font color=ffffff>
+ <select name="verlaufOrder" size="1">
+ <option value="$data[4]">Bisherige Einstellung ($data[4])
+ <option value="0">Neue Verlaufnachrichten oben (0)
+ <option value="1">Neue Verlaufnachrichten unten (1)
+ </select>
+ </font>
+ </td>
+ </tr>
+ </table>
+<br>
+ <div>PS: Einstellungen des Nachrichten-Verlaufs werden erst nach einem Neueinloggen aktualisiert.</div>
+ <hr>
+ <table>
+ <tr>
+ <td>
+ <div>
+ <input type="radio" name="eingabe" value="col" checked>
+ Auswahl von Farbe 1
+ <br>
+ (Farbe Deines Nicks):
+ <br>
+ <input name="col" size="6" maxlength="6" value="$data[1]">
+ </div>
+ </td>
+ <td width=20>
+ </td>
+ <td>
+ <div>
+ <input type="radio" name="eingabe" value="secol">
+ Auswahl von Farbe 2
+ <br>
+ (Farbe Deiner Nachrichten):
+ <br>
+ <input name="secol" size="6" maxlength="6" value="$data[2]">
+ </div>
+ </td>
+ </tr>
+ </table>
+<br>
+ <div>
+ Beliebige Auswahl markieren und Farbe wählen. Um Deine Optionen abzuspeichern,
+ auf "Daten ändern" klicken!
+ </div>
+ <br>
+END
+ open(COLORS,"<colors.sno");
+ @colors = <COLORS>;
+ close COLORS;
+ print @colors;
+ } elsif ($method eq "edit_profile_html") {
+ if ($message eq "edit_profile_ok") {
+print <<END;
+ <div class=b>
+ Hinweis:
+ </div>
+ <div>
+ Du hast soeben Dein Profil erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren:
+ <hr>
+END
+ } else {
+ print
+ $q->div( "Hier kannst Du Dein Profil editieren!" ),
+ $q->hr;
+ }
+print <<END;
+ <form action="chat">
+ <input type="hidden" name="var" value="edit_profile">
+ <div>
+ Dein Nachname:
+ <br>
+ <input name="nachname" value="$data[0]">
+ </div>
+ <br>
+ <div>
+ Dein Vorname:
+ <br>
+ <input name="vorname" value="$data[1]">
+ </div>
+ <br>
+ <div>
+ Dein Alter:
+ <br>
+ <input name="alter" value="$data[2]">
+ </div>
+ <br>
+ <div>
+ Dein Wohnort:
+ <br>
+ <input name="wohnort" value="$data[3]">
+ </div>
+ <br>
+ <div>
+ Deine E-Mail Adresse:
+ <br>
+ <input name="email" value="$data[4]">
+ </div>
+ <br>
+ <div>
+ Deine ICQ-Nummer:
+ <br>
+ <input name="icq" value="$data[5]">
+ </div>
+ <br>
+ <div>
+ Deine Homepage:
+ <br>
+ <input name="homepage" value="$data[6]">
+ </div>
+ <br>
+ <div>
+ Weiteres:
+ <br>
+ <textarea rows="5" cols="40"name="weiteres" wrap="virtual">$data[7]</textarea>
+ </div>
+END
+ }
+print <<END;
+ <hr>
+ <font color=ffffff>
+ <input type="hidden" name="request" value="main2">
+ <input type="hidden" name="alias" value="$alias">
+ <input type="hidden" name="tmpid" value="$tmpid">
+ <input type="hidden" name="room" value="$room">
+ <input type="submit" value="Daten ändern ...">
+ </font>
+ </form>
+</body>
+</html>
+END
+}
+
+
+sub edit { # Benutzerprofil od. Chat-Optionen abspeichern
+ my $method = $_[0];
+
+ if ($method eq "edit_profile") {
+ my $url = $homepage;
+ $url =~ s#^http://*##;
+
+ open(PROFILE,">data/user/profiles/$alias");
+ my $profile = "$nachname\n$vorname\n$alter\n$wohnort\n$email\n$icq\nhttp://$url\n$weiteres";
+ $profile =~ s#<#&lt\;#g;
+ print PROFILE $profile;
+
+ close PROFILE;
+ &edit_html("edit_profile_html","edit_profile_ok");
+
+ } elsif ($method eq "edit_options") {
+ if ($id ne $tmp) {
+ &edit_html("edit_options_html","edit_pw_wrong");
+ $client->shutdown(2);
+ exit 0;
+ }
+
+ open(OPTIONS,">data/user/options/$alias");
+ my $options = "$id\n$col\n$secol\n$maxVerlauf\n$verlaufOrder";
+ $options =~ s#<#&lt\;#g;
+ print OPTIONS $options;
+ close OPTIONS;
+
+ my $room = &get_room($alias);
+
+ &private_javascript($alias, $room, "parent.input.document.inf.col.value = '$col'; parent.input.document.inf.secol.value = '$secol';" );
+ &post($room,"<i><font color=ffffff>".&timestring." <font color='$col'>$alias</font> <font color='$secol'>hat seine Chat-Einstellungen ge&auml;ndert</font> ...</font></i>", $alias);
+ &post_strmsg($alias,$room,'col',"$col;$secol");
+
+ &edit_html("edit_options_html","edit_options_ok");
+ }
+}
+
+
+1;
diff --git a/0.7.1/online.pm b/0.7.1/online.pm
new file mode 100644
index 0000000..de7e08b
--- /dev/null
+++ b/0.7.1/online.pm
@@ -0,0 +1,151 @@
+
+sub online {
+
+ &secure_checkid($alias,$tmpid);
+
+ my @away = &prove_away($alias,$room,"return_list");
+
+ while (true) {
+ for ($i=0;$i<=$#away;$i+=2) {
+ last
+ if ($away[$i] eq $alias || $room eq $loginplace);
+ }
+
+ open(DATEI,"<data/online/users/$alias");
+ my $oldstamp = <DATEI>;
+ close DATEI;
+
+ if ($oldstamp > (time - 100)) {
+ open(DATEI,"<data/user/counts/$alias.online");
+ my $online = <DATEI>;
+ close DATEI;
+
+ my $total = (time-$oldstamp+$online);
+ open DATEI,">data/user/counts/$alias.online";
+ print DATEI $total;
+ close DATEI;
+ }
+
+ last;
+ }
+
+unless (-d "data/online/rooms/$room") {
+ mkdir "data/online/rooms/$room", 0777;
+}
+
+ open(DATEI,">data/online/users/$alias");
+ print DATEI time;
+ close DATEI;
+
+ open(DATEI,">data/online/rooms/$room/$alias");
+ print DATEI time;
+ close DATEI;
+
+ open(DATEI,"<data/online/prove");
+ my $provetime = <DATEI>;
+ close DATEI;
+
+ &check_online
+ if ($provetime < (time - 40));
+
+print<<HEADER;
+<html>
+ <head>
+ <meta http-equiv="refresh" content="20" URL="chat?request=online&room=$room&alias=$alias&tmpid=$tmpid">
+ <style type="text/css">
+ a { font-family: arial; font-size:11px; color: #ffffef; }
+ a:hover { color: #ffffff; }
+ </style>
+ <style type="text/css" media="all">
+ a { text-decoration: none; }
+ a:hover { text-decoration:underline; }
+ </style>
+ </head>
+ <body bgcolor="$chatbg">
+HEADER
+
+ opendir(ROOM,"data/online/rooms/".$room);
+ my @room = sort(readdir(ROOM));
+ closedir(ROOM);
+
+ my $chatter = $#room-1;
+
+ print "<font size='1' color='ffffff' face='arial'>$room ($chatter):</font><table>\n";
+
+ open FILE, "<data/online/rstat/$room";
+ my @rstat = <FILE>;
+ close FILE;
+ shift @rstat;
+ shift @rstat;
+
+ open FILE, "<data/hierachie";
+ my @userlevels = (<FILE>,@rstat);
+ close FILE;
+
+ open FILE, "<data/online/rstat/$room.away";
+ my @away = <FILE>;
+ close FILE;
+
+ foreach my $nick (@room) {
+ if (-f "data/online/rooms/$room/$nick") {
+
+ my $inside = 0;
+ foreach (@away) {
+ my ($name,$awaymessage) = split "<;";
+
+ if ($name eq $nick) {
+ chomp $awaymessage;
+ print "<tr><td><img title='$awaymessage' alt='$awaymessage' src='$gfxpath/away.gif'></td>";
+ $inside = 2;
+ }
+ }
+
+ if ($inside == 0) {
+ foreach (@userlevels) {
+ my ($name,$level) = split "<;";
+
+ if ($nick eq $name) {
+ chomp $level;
+ $inside = 1;
+
+ if ($level == 1) {
+ print "<tr><td><img title='Raumbesetzer' alt='Raumbesetzer' src='$gfxpath/rb.gif'></td>";
+ last;
+
+ } elsif ($level == 2) {
+ print "<tr><td><img title='Die Unschuld vom Land' alt='Die Unschuld vom Land' src='$gfxpath/uvl.gif'></td>";
+ last;
+
+ } elsif ($level == 3) {
+ print "<tr><td><img title='W&auml;chter' alt='W&auml;chter' src='$gfxpath/wa.gif'></td>";
+ last;
+
+ } elsif ($level == 5) {
+ print "<tr><td><img title='oberw&auml;chter' alt='Oberw&auml;chter' src='$gfxpath/ow.gif'></td>";
+ last;
+
+ } elsif ($level == 7) {
+ print "<tr><td><img title='Administrator' alt='Administrator' src='$gfxpath/adm.gif'></td>";
+ last;
+
+ } else {
+ print "<tr><td></td>";
+ last;
+ }
+ }
+ }
+ }
+
+ if ($inside == 0) {
+ print "<tr><td></td>";
+ }
+
+ print "<td><a href='chat?request=main2&var=alias_html&alias=$alias&tmp=$nick&tmpid=$tmpid' target='$nick'>$nick</a></td></tr>\n";
+ }
+ }
+
+ print "</table></body></html>";
+
+}
+
+1;
diff --git a/0.7.1/setup.sh b/0.7.1/setup.sh
new file mode 100644
index 0000000..342e9c7
--- /dev/null
+++ b/0.7.1/setup.sh
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+mke2fs /dev/ram0
+mke2fs /dev/ram1
+
+mkdir data
+cd data
+mkdir {logs,msgs,user,online}
+mount /dev/ram0 msgs
+mount /dev/ram1 online
+cd user
+mkdir {counts,memos,options,profiles,gbooks,lastlogin}
+cd ../online
+mkdir {rstat,rooms,pids,users,ident,tmpid}
+cd ..
+cdhmod 777 * -R
+chown paul * -R
+
diff --git a/0.7.1/shared.pm b/0.7.1/shared.pm
new file mode 100644
index 0000000..2d712aa
--- /dev/null
+++ b/0.7.1/shared.pm
@@ -0,0 +1,478 @@
+############### Dieser TeFil enthält Programmcode, der an verschiedenen
+##SHARED-SUBS## Stellen ausgeführt werden muß und jedem Skript zur
+############### Verfügung steht.
+
+sub reload_html {
+ print "<html><body bgcolor='$chatbg'></body></html>";
+ $client->shutdown(2);
+ exit 0;
+}
+
+sub printfile { # Liest eine externe Datei ein und gibt sie mit print aus
+ my ($file2print,$pagetitle,$bodyclass) = @_;
+
+ &start_html($pagetitle,$bodyclass)
+ if ($pagetitle ne "");
+
+ &menu
+ unless ($bodyclass eq "blank");
+
+ open(FILE2PRINT,"<$file2print");
+
+ print "$_\n"
+ while(<FILE2PRINT>);
+
+ close FILE2PRINT;
+}
+
+sub start_html { # Der HEADER einer HTML-Datei
+ print "<html><head><title>$title - $_[0]</title>$_[2]";
+ &style;
+ print "</head>";
+
+ if ($_[1] eq "start") {
+ print "<body onload=\"document.login.alias.focus();\">";
+
+ } elsif ($_[1] ne "") {
+ print "<body class=$_[1]>";
+
+ } else {
+ print "<body>";
+ }
+}
+
+sub post { # Öffentliche Nachricht posten.
+ my ($room,$msg2post,$alias,$secroom) = @_;
+ my @rooms = $room;
+
+ @rooms = ($room,$secroom)
+ if ($room ne $secroom);
+
+ foreach my $theroom (@rooms) {
+ open(MSGFILE,">>data/msgs/$theroom");
+ print MSGFILE "!<;".time."<;!<;!<;$msg2post<br><;$alias<;\n";
+ close MSGFILE;
+
+ opendir(PID,"data/online/pids/$theroom");
+ my @pids = readdir(PID);
+ closedir(PID);
+
+ foreach(@pids) {
+ kill USR1 => $_
+ if (-f "data/online/pids/$theroom/$_");
+ }
+ }
+
+ &log($msg2post)
+ if ($room eq $standardroom);
+}
+
+sub post_prv { # Private Nachricht posten (flüstern).
+ my ($alias2post,$msg2post) = @_;
+ my $roomofalias = &get_room($alias2post);
+
+ return false
+ if (!$roomofalias);
+
+ open(MSGFILE,">>data/msgs/$roomofalias");
+ print MSGFILE "$alias2post<;".time."<;!<;!<;$msg2post<br><;$alias<;\n";
+ close MSGFILE;
+
+ opendir(PID,"data/online/pids/$roomofalias");
+ my @pids = readdir(PID);
+ closedir(PID);
+
+ foreach(@pids) {
+ kill USR1 => $_
+ if (-f "data/online/pids/$roomofalias/$_");
+ }
+
+ return true;
+}
+
+sub post_strmsg { # Einen Befehl an den Chat-Stream-Prozess senden
+ my ($alias,$room, $command,$action) = @_;
+
+ open MSGFILE,">>data/msgs/$room";
+ print MSGFILE "$alias<;".time."<;$command<;$action<;!<;!<;\n";
+ close MSGFILE;
+
+ opendir(PID,"data/online/pids/$room");
+ my @pids = readdir(PID);
+ closedir(PID);
+
+ foreach(@pids) {
+ kill USR1 => $_
+ if (-f "data/online/pids/$room/$_");
+ }
+}
+
+
+sub log { # Protokollieren der Nachrichten etc.
+ my $msg2log = $_[0];
+ my ($secs, $mins, $hours, $days, $months, $years) = &timearray;
+
+ my $js;
+
+ ($msg2log,$js) = split(/<script/, $msg2log);
+
+ open(LOG,">>data/logs/$days.$months.$years");
+ print LOG "<br><font color=ffffef><i>($hours:$mins:$secs)</i></font> $msg2log\n";
+ close LOG;
+}
+
+sub timestring { # Aktuelles Datum und Uhrzeit bestimmen.
+ my ($mins, $hours) = (localtime)[1,2];
+
+ $hours = "0".$hours
+ if ($hours < 10);
+
+ $mins = "0".$mins
+ if ($mins < 10);
+
+
+ return "$hours:$mins";
+}
+
+sub timearray {
+ my ($secs, $mins, $hours, $days, $months, $years) = (localtime)[0..5];
+
+ $months += 1;
+
+ $hours = "0".$hours
+ if ($hours < 10);
+
+ $mins = "0".$mins
+ if ($mins < 10);
+
+ $secs = "0".$secs
+ if ($secs < 10);
+
+ $days = "0".$days
+ if ($days < 10);
+
+ $months = "0".$months
+ if ($months < 10);
+
+ $years = $years - 100;
+
+ if ($years < 10) {
+ $years = "200".$years;
+
+ } else {
+ $years = "20".$years;
+ }
+
+ return ($secs, $mins, $hours, $days, $months, $years);
+}
+
+sub error { # Error-Ausgabe.
+ my $error_msg = $_[0];
+
+ &start_html( "Error: ($error_msg)" );
+
+ print $q->div( "Error: ($error_msg)" ),
+ $q->end_html;
+
+ open(ERROR,">>data/error");
+ print ERROR "Alias: $alias TempID: $tmpid File. $0 PID: $$ Time: ".time." Message: $error_msg \n";
+ close ERROR;
+
+ $client->shutdown(2) if ($client);
+ exit 0;
+}
+
+sub check_online { # Auf alte Räume und Chatter prüfen und ggf. entfernen.
+ open(PROVE,">data/online/prove");
+ print PROVE time;
+ close PROVE;
+
+ opendir(DIR, "data/online/rooms");
+ my @roomdir = readdir(DIR);
+ closedir(DIR);
+
+ foreach my $theroom (@roomdir) {
+ opendir(DIR, "data/online/rooms/$theroom");
+ my @roomusers = readdir(DIR);
+ closedir(DIR);
+
+ my $empty = 1;
+
+ foreach $user (@roomusers) {
+
+ if (-f "data/online/rooms/$theroom/$user") {
+
+ $empty = 0;
+
+ open (USER,"<data/online/rooms/$theroom/$user");
+ my $userstamp = <USER>;
+ close USER;
+
+ if ($userstamp < (time - 40)) {
+
+ unlink("data/online/$theroom/$user");
+
+ open (USER,"<data/online/users/$user");
+ my $userstamp = <USER>;
+ close USER;
+
+ if ($userstamp < (time - 40)) {
+
+ if ($user ne $alias) {
+ &rm_alias($user,$theroom);
+
+ } else {
+ unlink("data/online/rooms/$theroom/$user");
+ }
+ &post($theroom,"<i><font color=ffffff>".&timestring." <b>$user</b> hat den Chat verlassen ... </font></i>");
+ }
+ }
+ }
+ }
+
+ opendir(PIDS,"data/online/pids/$theroom");
+ my @pids = readdir(PIDS);
+ closedir(PIDS);
+
+ if ($empty == 1) { # Falls Raum leer ist => entf.
+ rmdir("data/online/rooms/$theroom");
+ unlink("data/online/rstat/$theroom");
+ unlink("data/online/rstat/$theroom.away");
+ unlink("data/msgs/$theroom");
+
+ foreach(@pids) {
+ unlink("data/online/pids/$theroom/$_")
+ if (-f "data/online/pids/$theroom/$_");
+ }
+ rmdir("data/online/pids/$theroom");
+ }
+ }
+}
+
+sub secure_checkid { # TmpID überprüfen
+ my ($alias2check, $tmpid) = @_;
+ &error("Falsche TempID! $tmpid")
+ unless (-f "data/online/tmpid/$alias.$tmpid");
+}
+
+sub rm_alias { # Falls Benutzer offline gegangen ist
+ my($alias,$room) = @_;
+
+ unlink("data/online/rooms/$room/$alias");
+ unlink("data/online/users/$alias");
+
+ opendir TMPID, "data/online/tmpid";
+ my @tmpid = readdir(TMPID);
+ close(TMPID);
+
+ foreach(@tmpid) {
+ unlink("data/online/tmpid/$_")
+ if (/^$alias\..+$/);
+ }
+
+ unlink("data/online/ident/$alias");
+ &rm_rstat($alias,$room);
+}
+
+sub rm_rstat { # Benutzer als Raumbesetzer austragen
+ my ($alias,$room) = @_;
+
+ open (RSTAT,"<data/online/rstat/$room");
+ my @rstat = <RSTAT>;
+ close RSTAT;
+
+ my @rstat2 = ($rstat[0],$rstat[1]);
+
+ for ($i=2;$i<=$#rstat;$i++) {
+ chomp($rstat[$i]);
+ push(@rstat2,$rstat[$i]."\n")
+ unless ($rstat[$i] =~ /^$alias<;/);
+ }
+
+ open (RSTAT,">data/online/rstat/$room");
+ print RSTAT @rstat2;
+ close RSTAT;
+}
+
+sub rm_away { # Benutzer als Raumbesetzer austragen
+ my ($alias,$room) = @_;
+
+ open (AWAY,"<data/online/rstat/$room.away");
+ my @away = <AWAY>;
+ close AWAY;
+
+ my @away2;
+ foreach (@away) {
+ my @split = split(/<;/);
+ push(@away2, $_) if ($alias ne $split[0]);
+ }
+
+ open (AWAY,">data/online/rstat/$room.away");
+ print AWAY @away2;
+ close AWAY;
+}
+
+sub rm_entry {
+ my ($entry,$file) = @_;
+
+ open ENTRY, "<data/$file";
+ my @entry = <ENTRY>;
+ close ENTRY;
+ my @new;
+
+ foreach(@entry) {
+ push @new,$_
+ if ($entry."\n" ne $_);
+ }
+
+ if (@entry != @new) {
+ open ENTRY, ">data/$file";
+ print ENTRY @new;
+ close ENTRY;
+ return 1;
+
+ } else {
+ return;
+ }
+}
+
+sub add_entry {
+ my ($entry,$file) = @_;
+
+ open ENTRY, "<data/$file";
+ my @entry = <ENTRY>;
+ close ENTRY;
+
+ foreach(@entry) {
+ chomp;
+ return
+ if ($entry eq $_);
+ }
+
+ open ENTRY, ">>data/$file";
+ print ENTRY $entry."\n";
+ close ENTRY;
+
+ return 1;
+}
+
+sub prove_color {
+ my ($alias,$color) = @_;
+ my $length = length($color);
+
+ if ($length > 6 || $length < 6) {
+ &post_prv($alias,"<font color=ffffff>Ungültige Hexadezimalfarbe.</font>");
+ &reload_html;
+ }
+}
+
+sub kill_alias {
+ my ($alias2kill, $alias) = @_;
+ my ($secs, $mins, $hours, $days, $months, $years) = &timearray;
+
+ unlink("data/user/options/$alias2kill");
+ unlink("data/user/profiles/$alias2kill");
+ unlink("data/user/gbooks/$alias2kill");
+ unlink("data/user/counts/$alias2kill");
+ unlink("data/user/counts/$alias2kill.online");
+ unlink("data/user/lastlogin/$alias2kill");
+ unlink("data/user/memos/$alias2kill");
+
+ &rm_entry($alias2kill,'ban');
+
+ open(DEL, ">>data/kill");
+ print DEL "($days.$months.$years $hours:$mins:$secs) $alias2kill wurde von $alias gekillt\n";
+ close DEL;
+}
+
+sub random_color {
+ my @digit = ("F","C","A","B",5..9);
+ my $dig1 = rand(@digit);
+ my $dig2 = rand(@digit);
+ my $dig3 = rand(@digit);
+ my $dig4 = rand(@digit);
+ my $dig5 = rand(@digit);
+ my $dig6 = rand(@digit);
+
+ return $digit[$dig1].$digit[$dig2].$digit[$dig3].$digit[$dig4].$digit[$dig5].$digit[$dig6];
+}
+
+sub url_decode {
+ my $t = shift;
+
+ $t =~ s/\///;
+ $t =~ tr/\+/ /;
+
+ while( $t =~ s/%([a-f0-9][a-f0-9])/chr( hex( $1 ) )/ei ) {};
+
+ return $t;
+}
+
+sub url_encode {
+ my $t = shift;
+ while( $t =~ s/([^\w()'*~!.-])/sprintf '%%%02x', $1/eg ) {};
+ return $t;
+}
+
+sub calculate_hpm {
+ my ($hits, $starttime) = @_;
+ return sprintf( "%.2f", $hits / ( ( time - $starttime ) / 60 ) );
+}
+
+sub calculate_uptime_hours {
+ my $starttime = shift;
+ return sprintf( "%.2f", ( time - $starttime ) / 3600 );
+}
+
+sub private_javascript {
+ my ($alias, $room, $javascript) = @_;
+
+ open MSGFILE,">>data/msgs/$room";
+ print MSGFILE "$alias<;".time."<;!<;!<;<script language=\"JavaScript\">$javascript</script><;\n";
+ close MSGFILE;
+
+ opendir PID,"data/online/pids/$room";
+ my @pids = readdir(PID);
+ closedir(PID);
+
+ foreach(@pids) {
+ kill USR1 => $_
+ if (-f "data/online/pids/$room/$_");
+ }
+}
+
+sub get_theme { # Raumthema eines Raums holen
+ my $room = shift;
+
+ open RSTAT,"data/online/rstat/$room";
+ my @rstat = <RSTAT>;
+ close RSTAT;
+
+ chomp($rstat[1]);
+
+ return "<b>Raumthema:</b>".$rstat[1]
+ if ($rstat[1] ne undef);
+}
+
+sub get_room { # Den Raum finden, wo sich Alias befindet
+ my $alias = shift;
+
+ opendir(DIR,"data/online/rooms");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+
+ foreach my $room (@dir) {
+ opendir(DIR,"data/online/rooms/$room");
+ my @chatter = readdir(DIR);
+ closedir(DIR);
+
+ foreach my $chatter (@chatter) {
+ return $room
+ if ($chatter eq $alias);
+ }
+ }
+}
+
+
+sub debug { open DEBUG,">data/debug"; while(@_) { chomp; print DEBUG "$_\n"; } close DEBUG;}
+1;
diff --git a/0.7.1/start.pm b/0.7.1/start.pm
new file mode 100644
index 0000000..563a3cc
--- /dev/null
+++ b/0.7.1/start.pm
@@ -0,0 +1,506 @@
+
+sub start {
+
+if ($var eq "create_alias_html") {
+ &create_alias_html;
+} elsif ($var eq "create_alias") {
+ &create_alias;
+} elsif ($var eq "login_html") {
+ &login_html;
+} elsif ($var eq "chatiquette_html") {
+ &chatiquette_html;
+} elsif ($alias eq "") {
+ &login_html;
+} else {
+ &checklogin;
+}
+}
+
+sub login_html { # Erste Startseite
+&check_online;
+local $counter = undef;
+open(COUNT,"<data/count");
+ $counter = <COUNT>;
+close COUNT;
+$counter++;
+open(COUNT,">data/count");
+ flock(COUNT, 2);
+ print COUNT $counter;
+close COUNT;
+opendir(USERS,"data/online/users");
+ my @users = readdir(USERS);
+closedir(USERS);
+opendir(REGISTRED,"data/user/options");
+ local @registred = readdir(REGISTRED);
+closedir(REGISTRED);
+my ($logtin,$users) = ($#users-1,$#registred-1);
+&start_html("Created & Copyright by Paul C. Bütow","start");
+print <<END;
+ <center>
+ <table width=500>
+ <tr>
+ <td>
+ <center>
+ <table>
+ <tr>
+ <td>
+ <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0" WIDTH=240 HEIGHT=240>
+ <param name=movie value="$gfxpath/yIntro.swf">
+ <param name=loop value=false>
+ <param name=menu value=false>
+ <param name=quality value=high>
+ <param name=scale value=noborder>
+ <param name=wmode value=opaque>
+ <param name=bgcolor value=$bgcolor>
+ <embed src="$gfxpath/yIntro.swf" loop=false menu=false quality=high scale=noborder wmode=opaque bgcolor=$bgcolor WIDTH=240 HEIGHT=240 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED>
+ </object>
+ </td>
+ <td>
+ <div>
+ yChat: Version $version
+ <br><br>
+ Letztes Update: $datum
+ <br><br>
+ Seitenaufrufe: $counter
+ <br><br>
+ Benutzer registriert: $users
+ <br><br>
+ Benutzer online: $logtin
+ <br><br>
+ Benutzerlimit: $limit
+ <br><br>
+ Server: $localhost:$localport
+ <br><br>
+ Page: <a href="http://www.yChat.org">www.yChat.org</a>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </center>
+ </div>
+ <br>
+ <br>
+END
+ if ($tmp eq "true") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Wahrscheinlich existiert Dein Alias "$alias" nicht,
+ <br>
+ Du hast Dich verschrieben oder das Passwort ist falsch.
+ <br>
+ Versuch es erneuert !
+ </div>
+END
+ } elsif ($tmp eq "quit") {
+print <<END;
+ <div>
+ Du hast soeben den Chat verlassen.
+ <br>
+ Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ } elsif ($tmp eq "autologout") {
+print <<END;
+ <div>
+ Du wurdest automatisch aus dem Chat ausgeloggt. Grund: Du warst 20 Minuten inaktiv.
+ <br>
+ Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ } elsif ($tmp eq "autokick") {
+print <<END;
+ <div>
+ Du wurdest automatisch aus dem Chat katapultiert. Grund: Du hast den Chat geflutet!
+ <br>
+ Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ } elsif ($tmp eq "banned") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wurdest aus dem Chat verbannt!!!
+ <br>
+ Z.z. kannst Du Dich leider nicht in den Chat einloggen.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($tmp eq "kick") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wurdest soeben aus dem Chat katapultiert!
+ <br>
+ Schlechtes Verhalten mag die Ursache hierfür sein.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($tmp eq "selfkill") {
+print <<END;
+ <div>
+ Du hast dich soeben ganz und gar aus dem System gelöscht!
+ <br>
+ Wenn du dir einen neuen Nick angelen willst, dann einfach auf "Registrieren" klicken! :-)
+ </div>
+END
+ } elsif ($tmp eq "selfkill") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Du wurdest soeben aus dem Chat ausgeloggt!
+ <br>
+ Ursache hierfür mag sein, daß der Chat voll war und Du Dich nicht am
+ Geschehen beteiligt- und unnötige Chatkapazitäten in Anspruch
+ genommen hast.
+ <br>
+ Sorry!
+ </div>
+END
+ } elsif ($tmp eq "full") {
+ print "<div class=b>ACHTUNG!</div><div>Der Chat ist leider voll! Bitte versuch Dich später noch mal einzuloggen!</div>";
+ } elsif ($var eq "create_alias") {
+print "<div>Du hast sich soeben in die Datenbank eingetragen. Einfach auf \"Los Geht's\" klicken :-)</div>";
+ } else {
+print <<END;
+ <div>
+ Herzlich willkommen!
+ <br>
+ Einfach Daten eingeben und auf "Los Geht's" klicken :-)
+ </div>
+END
+ }
+
+print <<END;
+ <hr>
+ <form name="login" action="chat" method="GET">
+ <input type="hidden" name="request" value="start">
+ <input type="hidden" name="tmp" value="true">
+ <table>
+ <tr>
+ <td>
+ <div>
+ Dein Alias:
+ <br>
+ <input name="alias" value="$alias">
+ </div>
+ </td>
+ <td>
+ <div>
+ Dein Passwort:
+ <br>
+ <input type="password" name="pw" value="$pw">
+ </div>
+ </td>
+ </tr>
+ </table>
+ <br>
+ <br>
+ <div>
+ Solltest Du noch keinen Nick besitzen, dann auf "Registrieren" klicken!
+ </div>
+ <br>
+ <table>
+ <tr>
+ <td>
+ <font color="ffffff">
+ <input type="submit" value="Los geht's!">
+ </font>
+ </form>
+ </td>
+ <td>
+ <form action="chat">
+ <input type="hidden" name="request" value="start">
+ <input type="hidden" name="var" value="create_alias_html">
+ <font color="ffffff">
+ <input type="submit" value="Registrieren">
+ </font>
+ </form>
+ </td>
+ </tr>
+ </table>
+ <hr>
+END
+if ($logtin > 0) {
+ print "<div>Folgende Personen sind eingeloggt:<br><font size='1'>";
+ foreach(@users) {
+ print "$_ " if (-f "data/online/users/$_");
+ }
+ print "</font></div>";
+}
+print<<END;
+ </td>
+ </tr>
+ </table>
+ </center>
+</body>
+</html>
+END
+ if (-d "data/online/rooms") {
+ } else {
+ mkdir "data/online/rooms", 0777;
+ }
+}
+
+sub create_alias_html { # HTML-Form für Erstellung eines neuen Benutzers.
+ open(BAN,"<data/ban");
+ my @ban = <BAN>;
+ close BAN;
+ foreach(@ban) {
+ chomp;
+ if ($_ eq "ip://".$client->peerhost()) {
+ $tmp = "banned";
+ &login_html;
+ $client->shutdown(2);
+ exit 0;
+ }
+ }
+my $reload = $_[0];
+&start_html("Registration");
+print <<END;
+ <center>
+ <table width=500>
+ <tr>
+ <td>
+END
+ if ($reload eq "alias_exists") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Der von Dir gewählte Benutzername "$alias" existiert in unserer Datenbank bereits. Bitte versuch es erneuert mit
+ einem anderen Benutzernamen !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "pw_wrong") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Deine beiden Passworteingaben stimmen nicht überein. Bitte geb das Passwort erneuert an um sicherzugehen, daß
+ kein falsches Passwort abgespeichert wird !
+ </div>
+ <hr>
+END
+} elsif ($reload eq "alias_prohibited") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein gewählter Benutername "$alias" enthält illegale Zeichen. Bitte versuch einen anderen Benutzernamen!
+ </div>
+ <hr>
+END
+} elsif ($reload eq "alias_length") {
+print <<END;
+ <div class=b>
+ ACHTUNG!
+ </div>
+ <div>
+ Dein gewählter Benutername "$alias" enthält zu viele Zeichen. Es sind maximal 15 Zeichen erlaubt!!
+ </div>
+ <hr>
+END
+} else {
+print <<END;
+ <div>
+ Hier kannst Du Dich registrieren. Bitte beachte, daß die Passworteingabefelder übereinstimmen!
+ </div>
+ <hr>
+END
+}
+print <<END;
+ <form action="chat">
+ <input type="hidden" name="request" value="start">
+ <input type="hidden" name="var" value="create_alias">
+ <div>
+ Dein Alias:
+ <font color="ffa500">
+ (Muß angegeben werden)
+ </font>
+ <br>
+ <input name="alias" VALUE="$alias">
+ </div>
+ <br>
+ <div>
+ Dein gewünschtes Passwort:
+ <br>
+ <input type="password" name="pw" value="$pw">
+ </div>
+ <br>
+ <div>
+ Geb hier Dein Passwort erneuert ein:
+ <br>
+ <input type="password" name="tmp">
+ </div>
+ <br>
+ <font color=ffffff>
+ <input type="submit" value="Registrieren">
+ </font>
+ <br>
+ </form>
+ <hr>
+ <div>
+ Um den Chat zu betreten müssen die Daten nach der Registration auf der Startseite erneuert bestätigt werden !
+ </div>
+ </td>
+ </tr>
+ </table>
+</center>
+</body>
+</html>
+END
+}
+
+sub checklogin { # Überprüfen, ob die Login-Daten korrekt sind.
+opendir(USERS,"data/online/users");
+ my @users = readdir(USERS);
+closedir(USERS);
+ my $users = $#users;
+ my $hierachie = &hierachie($alias);
+ if ($users > $limit && $hierachie ne "wa" && $hierachie ne "ow") {
+ $tmp = "full";
+ &login_html;
+ exit 0;
+ }
+ my $lognotexists = "true";
+ opendir(USERDIR,"data/user/options");
+ my @userdir = readdir(USERDIR);
+ closedir(USERDIR);
+ foreach $user (@userdir) {
+ if ($user eq $alias) {
+ open(OPTIONS,"<data/user/options/$alias");
+ my @options = <OPTIONS>;
+ close OPTIONS;
+ foreach(@options) {
+ chomp $_;
+ }
+ if ($options[0] eq $pw) {
+ open(BAN,"<data/ban");
+ my @ban = <BAN>;
+ close BAN;
+ foreach(@ban) {
+ chomp;
+ if ($_ eq $alias || $_ eq "ip://".$client->peerhost()) {
+ if (-f "data/online/users/$admin") {
+ &post_prv($admin,"<font color=ffffff><font color=ffa500>$_</font> kann sich nicht einloggen (Ist verbannt)!!</font>");
+ }
+ $tmp = "banned";
+ &login_html;
+ exit 0;
+ }
+ }
+ if ($options[1] eq undef) { $col = &random_color;}
+ else { $col = $options[1]; }
+ if ($options[2] eq undef) { $secol = &random_color;}
+ else { $secol = $options[2];}
+ if ($options[3] eq undef) { $maxVerlauf = "10";}
+ else { $maxVerlauf = $options[3];}
+ if ($options[4] eq undef) { $verlaufOrder = "1";}
+ else {$verlaufOrder = $options[4];}
+ my @digit = (A..Z, a..z, 0..9, "-", ".");
+ my $num1 = rand(@digit);
+ my $num2 = rand(@digit);
+ my $num3 = rand(@digit);
+ my $num4 = rand(@digit);
+ my $num5 = rand(@digit);
+ my $num6 = rand(@digit);
+ my $num7 = rand(@digit);
+ my $num8 = rand(@digit);
+ my $num9 = rand(@digit);
+ my $num10 = rand(@digit);
+ $tmpid = $digit[$num1].$digit[$num2].$digit[$num3].$digit[$num4].$digit[$num5].$digit[$num6].$digit[$num7].$digit[$num8].$digit[$num9].$digit[$num10];
+ open TMPID, ">data/online/tmpid/$alias.$tmpid";
+ print TMPID $alias;
+ close TMPID;
+ open IDENT, ">data/online/ident/$alias" ;
+ print IDENT $client->peerhost()."\n$tmpid\n".$client->peerhost().":".$client->peerport();
+ close IDENT;
+ open LASTLOGIN, ">data/user/lastlogin/$alias";
+ print LASTLOGIN time;
+ close LASTLOGIN;
+ &frameset_html;
+ $client->shutdown(2);
+ exit 0;
+ } else {
+ $lognotexists = "false";
+ }
+ }
+ }
+ &login_html; # Falls Login-Daten inkorrekt sind, zurück zur Startseite.
+}
+
+sub create_alias { # Erstellung eines neuen Benutzers.
+ if ($alias =~ /\W/ || $alias eq "") {
+ goto CREATE if ($alias =~ /[-]/ && $alias !~ /\W/);
+ &create_alias_html("alias_prohibited");;
+ $client->shutdown(2);
+ exit 0;
+ } elsif ($pw ne $tmp) {
+ &create_alias_html("pw_wrong");
+ $client->shutdown(2);
+ exit 0;
+ } elsif (length($alias) >= 15) {
+ &create_alias_html("alias_length");
+ $client->shutdown(2);
+ exit 0;
+ }
+CREATE:
+ opendir(USERDIR,"data/user/options");
+ my @user = readdir(USERDIR);
+ close USERDIR;
+ foreach $user (@user) {
+ if ($user eq $alias) {
+ &create_alias_html("alias_exists");
+ $client->shutdown(2);
+ exit 0;
+ }
+ }
+ open(OPTIONS,">data/user/options/$alias");
+ print OPTIONS $pw."\n";
+ close OPTIONS;
+
+ &login_html;
+}
+
+sub frameset_html {
+print <<END;
+<html>
+ <head>
+ <title>
+ $title
+ </title>
+ </head>
+<frameset border=0 frameborder=0 framespacing=0 cols="130,*">
+ <frameset border=0 frameborder=0 framespacing=0 rows="*,55">
+ <frame name="online" src="chat?request=online&room=$loginplace&alias=$alias&tmpid=$tmpid">
+ <frameset border=0 frameborder=0 framespacing=0 cols="70,*">
+ <frame name="logo" src="chat?request=htdocs&var=logo_html" scrolling="no">
+ <frame name="reload" src="chat?request=htdocs" scrolling="no">
+ </frameset>
+ </frameset>
+ <frameset border=0 frameborder=0 framespacing=0 rows="*,55">
+ <frame name='main' src='chat?request=loggedin&alias=$alias&col=$col&secol=$secol&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder'>
+ <frame name="input" src="chat?request=htdocs" scrolling="no">
+ </frameset>
+</frameset>
+</html>
+END
+}
+
+
+1;
diff --git a/0.7.1/stat.pm b/0.7.1/stat.pm
new file mode 100644
index 0000000..7740079
--- /dev/null
+++ b/0.7.1/stat.pm
@@ -0,0 +1,206 @@
+sub stat {
+
+&start_html("Statistiken");
+&menu;
+print $q->div("yChat Statistiken"), $q->hr,
+ $q->div( $q->a( { -href=>"chat?request=stat&var=ranking&alias=$alias&tmpid=$tmpid" }, "Rankings"), " | ",
+ $q->a( { -href=>"chat?request=stat&var=del&alias=$alias&tmpid=$tmpid" }, "Loginstatistiken"), " | ",
+ $q->a( { -href=>"chat?request=stat&var=stat&alias=$alias&tmpid=$tmpid" }, "DB-Statistik"), " | ",
+ $q->a( { -href=>"chat?request=stat&var=code&alias=$alias&tmpid=$tmpid" }, "Programmcode"), " | ",
+ $q->a( { -href=>"chat?request=stat&var=var&alias=$alias&tmpid=$tmpid" }, "Umgebungsvariablen"),), $q->hr;
+
+if ($var eq "ranking") {
+
+ opendir(COUNTS, "data/user/counts");
+ my @counts = readdir(COUNTS);
+ closedir(COUNTS);
+
+ print "<div>";
+
+ my $nr_start = $start;
+ my $nr_end = $end;
+ my %online;
+ my $rank;
+ my $nr;
+
+ foreach(@counts) {
+ if(-f "data/user/counts/$_" ) {
+ if (s#.online##g) {
+ open(TOTAL, "<data/user/counts/$_.online");
+ my $total = <TOTAL>;
+ close TOTAL;
+ $online{sprintf("%.2f",($total / 3600))} = $_;
+ }
+ }
+ }
+
+ print "<div>", $q->b("Rankings:"), $q->br,
+ "<table><tr><td><div><b>#:</b></div></td><td><b><div>St.:</div></b></td><td><b><div>Name:</div></b></td></tr>";
+
+ if (!$nr_start) {
+ $nr_start = 1;
+ } if (!$nr_end) {
+ $nr_end = 20;
+ }
+
+ foreach $wert (reverse(sort { $a <=> $b } keys %online)) {
+ $nr++;
+ if ($online{$wert} eq $alias) {
+ $rank = $nr;
+ last if ($nr > $nr_end);
+ }
+ next if ($nr < $nr_start || $nr > $nr_end);
+ print "<tr><td><font color='ffffff' size='1' face='arial'>".$nr."</font></td><td><font color='ffffff' size='1' face='arial'> ".$wert."h </font></td><td> <a href='chat?request=main2&var=alias_html&alias=$alias&tmp=$online{$wert}&tmpid=$tmpid'><font size='1' face='arial'>$online{$wert}</font></a></td></tr>\n";
+ }
+ print "</table>", $q->hr;
+
+ $nr_start -= 20; $nr_end -= 20;
+ print "Rankings von <a href='chat?request=stat&var=ranking&start=$nr_start&end=$nr_end&alias=$alias&tmpid=$tmpid'>$nr_start bis $nr_end</a> anzeigen ...<br>"
+ if ($nr_start > 0);
+
+ $nr_start += 40; $nr_end += 40;
+ print "Rankings von <a href='chat?request=stat&var=ranking&start=$nr_start&end=$nr_end&alias=$alias&tmpid=$tmpid'>$nr_start bis $nr_end</a> anzeigen ...",
+ $q->br, $q->br, $q->b("$alias, Du befindest Dich auf Rank $rank</div>");
+
+} elsif ($var eq "del") {
+
+ print "<div>", $q->b("Alte Benutzer l&ouml;schen:"), $q->br,
+ "Benutzer, die sich 1440 Stunden (60 Tage) nicht mehr in das System eingeloggt haben, werden gelöscht.", $q->br, $q->br;
+
+ opendir(USER, "data/user/options");
+ my @user = readdir(USER);
+ closedir(USER);
+ @user = sort(@user);
+
+ my $i = 0;
+ my $j;
+ my $k = 0;
+ my $l = 0;
+ my $full = $tmp;
+
+ foreach(@user) {
+ if (-f "data/user/lastlogin/$_") {
+ open(LOGIN,"<data/user/lastlogin/$_");
+ my $login = <LOGIN>;
+ close LOGIN;
+ $login = sprintf("%.2f",((time - $login) / 3600));
+ $j++;
+ if (999 < $login && $login < 1440) { # 1440 = 60 Tage
+ $k++;
+ print $q->font( { -color=>"ffa500" }, $q->b( "$j($k) $_ Letztes Login vor: ".$login."h") ), $q->br, "\n" if ($full ne undef);
+ } elsif ($login < 48) {
+ $l++;
+ print $q->font( { -color=>"ffffef" }, $q->b( "$j($l) $_ Letztes Login vor: ".$login."h") ), $q->br, "\n" if ($full ne undef);
+ } elsif ($login < 1440) {
+ print "$j $_ Letztes Login vor: ".$login."h", $q->br, "\n" if ($full ne undef);
+ } else {
+ $k++;
+ &kill($_,$i++,$login);
+ }
+ } elsif (-f "data/user/options/$_") {
+ &kill($_,$i++);
+ }
+ }
+ print $q->hr if ($full ne undef);
+ print "</div>", $q->div( $q->b(
+ "$j Benutzer befinden sich in der Datenbank!", $q->br,
+ $q->font( { -color=>"ffffef" }, "$l Benutzer haben sich innerhalb der letzten 48 Stunden eingeloggt!"), $q->br,
+ $q->font( { -color=>"ffa500" }, "$k Benutzer haben sich &uuml;ber 1000 Stunden nicht mehr eingeloggt!"), $q->br,
+ $q->font( { -color=>"ff0000" }, "$i Benutzer wurden gerade eben gelöscht!") ), $q->br, $q->br,
+ "PS: Jeder registrierte Benutzername wird nur einmal gez&auml;hlt!" );
+ print $q->br, $q->div( "(", $q->a( { -href=>"chat?request=stat&var=del&tmp=true&alias=$alias&tmpid=$tmpid"}, "Vollst&auml;ndige Ansicht"), ")" ) if ($full eq undef);
+
+} elsif ($var eq "var") {
+
+ print "<div>", $q->b("Server Umgebungsvariablen:"), $q->br, $q->br,
+ "Die Serverumgebungsvariablen k&ouml;nnen nur von Oberw&auml;chtern oder h&ouml;her eingesehen werden!", $q->br, $q->br;
+
+ if (5 <= &hierachie($alias)) {
+ while(($key,$value) = each(%ENV)) {
+ print "$key = $value\n", $q->br;
+ }
+ }
+
+ print "</div>";
+
+} elsif ($var eq "stat") {
+
+ print $q->div( $q->b("yChat-DB Statistik:") ), $q->br;
+ $files = 0;
+ $size = 0;
+ $directorys = 1;
+ &zaehle("data");
+ $size = sprintf("%.2f", ($size/1048576));
+ print $q->div( "Dateien insgesamt: $files", $q->br, "MB insgesamt: $size", $q->br, "Verzeichnisse insgesamt: $directorys");
+
+ } elsif ($var eq "code") {
+
+ print $q->div( $q->b("yChat Programmcode-Statistik:") ), $q->br;
+
+ my ($zeilen,$size,$bytes,$files);
+
+ opendir(DIR,".");
+ my @dir = readdir(DIR);
+ closedir(DIR);
+ $dir = sort(@dir);
+
+ foreach(@dir) {
+ if (/.+[pl]$/ || /.+[pm]$/) {
+ $bytes = (-s);
+ $size += $bytes;
+ open(PL, "<$_");
+ my @pl = <PL>;
+ close PL;
+ local $nr = $#pl+1;
+ $zeilen += $nr;
+ $files++;
+ print $q->div("Datei $files: $nr Zeilen, $bytes Bytes"), $q->br, "\n";
+ }
+ }
+print $q->div( $q->b("Programmcode: $files Dateien, $zeilen Zeilen", $q->br, "Größe: $size Bytes") );
+
+}
+
+print $q->end_html;
+
+sub zaehle {
+ local ($dir,$data) = @_;
+ $dir = "$dir/$data" if ($data ne undef);
+ opendir(DATA,$dir);
+ local @data = readdir(DATA);
+ closedir(DATA);
+ $files2 = 0;
+ foreach(@data) {
+ if (-f "$dir/$_") {
+ $files++;
+ $files2++;
+ $size += (-s "$dir/$_");
+ } elsif (-d "$dir/$_" && $_ ne "." && $_ ne "..") {
+ $directorys++;
+ &zaehle($dir,$_);
+ }
+ }
+}
+
+sub kill {
+ my ($rm,$nr,$login) = @_;
+ $login = "XXXXXX" if ($login eq undef);
+ print $q->font( { -color=>"ff0000" }, $q->b( "$j($nr) $rm Letztes Login vor: ".$login."h (wurde gel&ouml;scht)") ), $q->br, "\n";
+ print "<font size='1'>";
+ print "options " if unlink("data/user/options/$rm");
+ print "profiles " if unlink("data/user/profiles/$rm");
+ print "gbooks " if unlink("data/user/gbooks/$rm");
+ print "counts " if unlink("data/user/counts/$rm");
+ print "counts.online " if unlink("data/user/counts/".$rm.".online");
+ print "lastlogin " if unlink("data/user/lastlogin/$rm");
+ print "memos" if unlink("data/user/memos/$rm");
+ print "</font>", $q->hr, "\n";
+ &zeit;
+ open(DEL, ">>data/kill");
+ print DEL "($day.$month.$year $hours:$min:$sec) $rm wurde automatisch gekillt [$alias]\n";
+ close DEL;
+}
+
+}
+
+1;
diff --git a/0.7.1/stream.pm b/0.7.1/stream.pm
new file mode 100644
index 0000000..4252fbe
--- /dev/null
+++ b/0.7.1/stream.pm
@@ -0,0 +1,250 @@
+sub stream {
+
+# chomp $room;
+ &secure_checkid($alias,$tmpid);
+
+ my $pid = $$;
+ $SIG{CHLD} = 'IGNORE';
+ $|++;
+
+
+ open RSTAT, "<data/online/rstat/$room";
+ my @rstat = <RSTAT>;
+ close RSTAT;
+
+ #Überprüfen, ob Alias Raum betreten darf
+ if ($rstat[0] eq "1\n") {
+ if (3 <= &hierachie($alias)) {
+ print "<font color='ffffff'>Der Raum <font color='ffa500'>$room</font> ist leider abgesperrt! Du wirst in den Ram <b>$standardroom</b> umgeleitet ...</font>";
+ $room = $standardroom;
+ }
+ }
+
+
+print <<END;
+<html>
+ <head>
+<script language="JavaScript">
+<!--
+ open('chat?request=online&room=$room&alias=$alias&tmpid=$tmpid','online');
+ open('chat?request=input&alias=$alias&room=$room&col=$col&secol=$secol&tmp=login&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder','input');
+
+// open('chat?request=input&alias=$alias&room=$room&col=$col&secol=$secol&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder','input');
+
+// Scroll-Routine von Anklepper (http://www.anklepper.de)
+// speziell für yChat (http://www.yChat.de), Copyright 2000
+scrolling = true;
+moves_steps = 4;
+moves_interval = 4;
+function moves()
+{
+ if( scrolling != false )
+ window.scrollBy( 0, moves_steps );
+ window.setTimeout( "moves()", moves_interval );
+}
+moves();
+//-->
+</script>
+</head>
+<body bgcolor="$chatbg">
+END
+unlink("data/online/rooms/$loginplace/$alias");
+&check_online;
+
+print "<font size=1 color=ffffff face=arial>$title - Letzte &Auml;nderung $datum\n; Der Chat wird geladen...\n<br>";
+sleep 1;
+print "<b>Hallo <font color=$col>$alias</font></b>, mit dem Befehl /menu kannst du das Chat-Men&uuml; aufrufen!<br>";
+sleep 1;
+print "Du befindest dich im Raum <b>$room</b>: ".get_theme($room)."<br>\n";
+print "</font>\n";
+
+ if (-f "data/user/memos/$alias") {
+ open(MEMOS,"<data/user/memos/$alias");
+ my @memos = <MEMOS>;
+ close MEMOS;
+ my $memos;
+
+ foreach (@memos) {
+ $memos .= $_;
+ }
+
+ print $memos;
+ unlink("data/user/memos/$alias");
+ }
+
+OPENMSGFILE:
+ my $change_room = 0;
+ my $startime = time;
+ my $flooding = 0;
+ my @ignore;
+ my @flood;
+
+
+ unless (-f "data/online/rstat/$room") {
+ open(DATEI,">data/online/rstat/$room"); # Raumbesetzerstatus setzen
+ print DATEI "0\n\n$alias<;1\n";
+ close DATEI;
+ }
+
+ open(DATEI,">data/online/users/$alias");
+ print DATEI time;
+ close DATEI;
+
+ open(DATEI,">data/online/rooms/$room/$alias");
+ print DATEI time;
+ close DATEI;
+
+ if (-e "data/msgs/$room") {
+ open(MSGFILE,"<data/msgs/$room");
+
+ mkdir "data/online/pids", 0777
+ unless (-d "data/online/pids");
+
+ mkdir "data/online/pids/$room", 0777
+ unless (-d "data/online/pids/$room");
+
+ open(PID,">data/online/pids/$room/$pid");
+ print PID time;
+ close PID;
+
+ } else {
+ sleep 1;
+ goto OPENMSGFILE;
+ }
+
+ &sendmsgs;
+
+ while (-f "data/online/users/$alias") {
+ local $SIG{USR1} = \&sendmsgs;
+
+ goto OPENMSGFILE
+ if ($change_room == 1);
+
+ sleep 15;
+ print "\n";
+ }
+
+ sub sendmsgs {
+ for ($curpos = tell(MSGFILE); <MSGFILE>; $curpos = tell(MSGFILE)) {
+ my ($address, $stamp, $command, $action, $message, $from) = split(/<;/, $_);
+
+ if ($address =~ /$\!/ || $address eq $alias) {
+ if ($stamp > $startime) {
+
+ # Falls die Farben gewechselt wurden
+ if ($command eq "col") {
+ ($col, $secol) = split ";", $action;
+
+ } elsif ($command eq "cr") {
+ unlink("data/online/pids/$room/$pid");
+ $room = $action;
+ close MSGFILE;
+ $change_room = 1;
+
+ # Falls jemand aus der Ignore-Liste eingetragen, oder ausgetragen werden soll
+ } elsif ($command eq "ig") {
+ my @temp;
+ my $add2list = 1;
+
+ foreach (@ignore) {
+ if ($action ne $_) {
+ push @temp, $_;
+
+ } else {
+ $add2list = 0;
+ }
+ }
+
+ if ($add2list == 1) {
+ push @ignore, $action;
+ print "<font color='#ffffff'><font color='#ffa500'>$action</font> wird nun ignoriert!</font><br>\n";
+ &post_prv_extra($action,"<font color='#ff0000'>Du wirst nun von $alias ignoriert!</font>")
+
+ } else {
+ @ignore = @temp;
+ print "<font color='#ffffff'><font color='#ffa500'>$action</font> wird nun nicht mehr ignoriert!</font><br>\n";
+ &post_prv_extra($action,"<font color='#ff0000'>Du wirst nun von $alias nicht mehr ignoriert!</font>")
+ }
+
+ # Falls Liste aller ignorierten Nicknames angezeigt werden soll
+ } elsif ($command eq "igl") {
+ my $ignored;
+ $ignored .= "$_ " foreach (@ignore);
+
+ if ($#ignore == -1) {
+ print "<font color='#ffffff'>Momentan wird keine Person von dir ignoriert!</font><br>\n";
+
+ } else {
+ print "<font color='#ffffff'>Folgende Personen werden von dir ignoriert: <font color='#ffa500'>$ignored</font>!</font><br>\n";
+ }
+
+ # Falls User den Chat, aber nicht das System verlassen will
+ } elsif ($command eq "quit") {
+ print "<script language='JavaScript'>\n";
+ print "open('chat?request=online&room=$loginplace&alias=$alias&tmpid=$tmpid','online');\n";
+ print "open('chat?request=htdocs','input');\n";
+ print "open('chat?request=loggedin&alias=$alias&col=$col&secol=$secol&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder','main');\n";
+ print "</script>\n";
+ last;
+
+ # Nachricht ausgeben falls nicht der Raum gewechselt wird
+ } elsif ($change_room != 1) {
+
+ # Wenn der Benutzer ignoriert wird, die nachricht nicht ausgeben
+ my $ignored = 0;
+ foreach (@ignore) {
+ if ($_ eq $from) {
+ $ignored = 1;
+ last;
+ }
+ }
+
+ if ($ignored != 1) {
+ print "$message\n";
+
+ } else {
+ $address =~ s/\!//;
+
+ &post_prv_extra($from,"<font color='#ff0000'>Du wirst von $alias ignoriert!</font>")
+ if ($address eq $alias);
+ }
+ }
+
+ push(@flood,$address.$command.$action.$message.$from);
+
+ # Falls Jemand den Chat flutet
+ if ($flood[0] eq $flood[1] && $flood[0] eq $flood[2] && $flood[0] eq $flood[3]) {
+ print "<i><font color=red>$from flutet den Chat !</font></i><br>\n";
+
+ if ($from eq $alias && $flooding++ && $flooding >= 4) {
+ print "<script language='JavaScript'>open('chat?request=start&tmp=autokick','_top');</script>\n";
+ &rm_alias($alias,$room);
+ &post($room,"<i><font color='ffffff'>".&timestring." <font color='ffa500'><b>Das System</b></font> katapultiert <b>$alias</b> wegen Fluten des Chats nach draussen ... </font></i>", $alias);
+ }
+
+ } else {
+ $flooding = 0;
+ }
+
+ shift(@flood) if ($#flood > 2);
+ }
+ }
+ }
+
+ seek(MSGFILE, $curpos, 0);
+}
+
+unlink("data/online/pids/$room/$pid");
+}
+
+sub post_prv_extra {
+ my ($alias,$message) = @_;
+ my $helpid = fork();
+
+ if ($helpid == 0) {
+ &post_prv($alias,$message);
+ exit 0;
+ }
+}
+
+1;
diff --git a/0.7.1/ychatd.pl b/0.7.1/ychatd.pl
new file mode 100644
index 0000000..3fce39c
--- /dev/null
+++ b/0.7.1/ychatd.pl
@@ -0,0 +1,109 @@
+#!/usr/bin/perl
+# yChat - Copyright by Paul C. Bütow
+# Dieses yChat-System wurde von Paul C. Bütow alias Snooper eigenhändig programmiert.
+# Es darf kostenlos verwendet und manipuliert werden, allerdings darf dieses System nicht
+# Weiterverkauft werden! Der Hinweis der bei /about erscheind, darf ebenso nicht entfernt werden!
+# Für Fragen/Anregungen/Verbesserungsvorschläge bitte eine E-Mail an untenstehende Adresse senden!
+
+# Programmierer: Paul C. Bütow
+# Seine Homepage: http://buetow.info
+# Seine E-Mail Adresse: mail@buetow.de
+# Projektname: yChat / 2000 - 2001
+# Programmiersprache: Perl 5.6
+# Platttform: Linux
+# Die Adresse des Original-yChats: http://www.yChat.de
+
+
+use CGI;
+$q = new CGI;
+
+# Module einbinden
+use config;
+use commands;
+use changeroom;
+use start;
+use shared;
+use input;
+use main1;
+use main2;
+use online;
+use htdocs;
+use stream;
+use stat;
+use loggedin;
+use hierachie;
+use IO::Socket;
+
+# Forkprozzesse killen, wenn beendet
+$SIG{CHLD} = 'IGNORE';
+
+$mainsocket = IO::Socket::INET->new(LocalHost=>"$localhost",
+ LocalPort=>$localport,
+ Porto=> 'tcp',
+ Listen=> ($limit+10),
+ Reuse=>1,);
+
+die "Kann Server-Socket nicht erzeugen: $!\n"
+ unless ($mainsocket);
+
+print "yChat wurde auf $localhost:$localport gestartet...\n";
+$STARTIME = time;
+
+while ($client = $mainsocket->accept()) {
+ $HITS++;
+ $pid = fork();
+
+ if ($pid == 0) {
+ print $client "HTTP/1.1 200 OK\nContent-type:text/html\n\n";
+ while (defined ($buffer = <$client>)) {
+ my $requeststring;
+
+ my @tmp = split ' ', $buffer;
+
+ # Falls GET request
+ if ($tmp[0] eq "GET") {
+ $requeststring = $tmp[1];
+
+ # Falls POST request
+ } else {
+ print "POST\n";
+ }
+
+ @tmp = split '\?', $requeststring;
+ @tmp = split '&', $tmp[1];
+
+ my %variables;
+ foreach(@tmp) {
+ my @tmp = split "=";
+
+ next
+ if ($tmp[0] eq "admin" || $tmp[0] eq "mogeladmin");
+
+ $tmp[0] =~ s#/##;
+ $variables{$tmp[0]} = &url_decode( $tmp[1] );
+ }
+
+ eval "my \$$_"
+ foreach ( keys %variables );
+
+ eval "\$$_ = '".$variables{$_}."'"
+ foreach ( keys %variables );
+
+ # Ausgabe umleiten
+ STDOUT = $client;
+
+ if ($request) {
+ &secure_checkid($alias,$tmpid) if ($request != "start");
+ eval "\&$request";
+
+ } else {
+ &start;
+ }
+
+ $client->shutdown(2);
+ exit(0);
+ }
+ }
+}
+
+
diff --git a/0.7.2/config.pm b/0.7.2/config.pm
new file mode 100644
index 0000000..e606f01
--- /dev/null
+++ b/0.7.2/config.pm
@@ -0,0 +1,42 @@
+# yChat - Copyright by Paul C. Bütow
+########################### Dieser Teil bestimmt die Standart-Variabeln.
+##STANDART-CONFIGURATION:## (CSS, Farben, Version etc.)
+###########################
+$limit = 50; # Benutzerlimit
+$datum = "27.12.01"; # Datum der letzten Änderung (ändern erwünscht)
+$version = "0.7.0.2"; # Bitte Hauptversionsnummer nicht ändern
+$title = "yChat [$version]"; # Erscheint in der Browser-Leiste oben
+$standardroom = "Cyberbar"; # Standardchatraum
+$loginplace = "Lounge"; # Bezeichnung der Startseite nach dem Login
+$localhost = "212.202.190.233"; # Host oder IP# des Chat-Servers
+$localport = 2000; # Port über den fer Chat-Server läuft
+$gfxpath = "http://$localhost/yChat"; # URL der Binärdaten (Grafiken etc.)
+$bgcolor = "#3E535B"; # Hintergrundfarbe der HTML-Seiten
+$chatbg = "#000000"; # Hintergrundfarbe des Chat-Frames
+
+# PS: Um einen Chat-Administrator anzulegen, dann die Datei data/hierachie
+# anlegen, in eine Zeile muß folgendes eingetragen werden: "Nickname<;7"
+# (Natürlich ohne Anführungsstriche) Nickname ist somit Chat-Administrator
+# und kann Oberwächter und Wächter bestimmen!
+
+sub style {
+print <<ENDCSS;
+<style type="text/css">
+ body { background-color: $bgcolor }
+ body.blank { background-color: $chatbg }
+ body.online { background-color: $chatbg }
+ div { font-family: arial, geneva, verdana, helvetiva; font-size: 12px; color: #ffffff }
+ div.b { font-weight: bold; color: #ffa500 }
+ a { color: #ffffef; }
+ a:hover { color: #ffffff; }
+ p { font-family:verdana, arial, geneva, helvetica, sans-serif; color:#FFFFFF; font-size:12px; }
+</style>
+<style type="text/css" media="all">
+ a { text-decoration: none; }
+ a:hover { text-decoration:underline; }
+ input { border:2px solid #000000; font-size:12px; color:#000000; background-color: #ffffff; height:23px; padding:2px;}
+ select { border:2px solid #000000; font-family:arial, verdana, helvetica; font-size:11px; color:#000000; height:21px; padding:2px;}
+</style>
+ENDCSS
+}
+1;
diff --git a/0.7.2/modules/changeroom.pm b/0.7.2/modules/changeroom.pm
new file mode 100644
index 0000000..35daa00
--- /dev/null
+++ b/0.7.2/modules/changeroom.pm
@@ -0,0 +1,69 @@
+sub change_room {
+ my($method, $newroom, $oldroom, $alias2) = @_;
+ if ($newroom eq $oldroom) {
+ &post_prv($alias, "<font color='ffffff'>Du befindest dich bereits im Raum <font color='ffa500'>$newroom</font>!</font>");
+ &reload_html;
+ }
+ elsif ($newroom eq $loginplace) {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> verl&auml;sst den Chat und geht in die <b>$loginplace</b> ... </font></i>", $alias);
+ &post_strmsg($alias, $room, 'quit');
+ unlink "data/online/rooms/$room/$alias";
+ &rm_rstat($alias, $room);
+ &check_online;
+ &reload_html;
+ }
+ open RSTAT, "<data/online/rstat/$newroom";
+ my(@rstat) = <RSTAT>;
+ close RSTAT;
+ if ($rstat[0] eq "1\n") {
+ if (3 <= &hierachie($alias)) {
+ &post_prv($alias, "<font color='ffffff'>Der Raum <font color='ffa500'>$newroom</font> ist leider abgesperrt!</font>");
+ &reload_html;
+ }
+ }
+ &private_javascript($alias, $room, "parent.input.document.inf.room.value = '$newroom';open('chat?request=online&room=$newroom&alias=$alias&tmpid=$tmpid','online');");
+ open MSGFILE, ">>data/msgs/$newroom";
+ print MSGFILE "$alias<;" . time . "<;!<;!<;<;\n";
+ close MSGFILE;
+ open MSGFILE, ">>data/msgs/$room";
+ if ($method eq 'j') {
+ print MSGFILE "$alias<;" . time . q[<;!<;!<;<i><font color='ffffff'>] . &timestring . " Du wechselst aus dem Raum <b>$oldroom</b> herein nach <b>$newroom</b> ...</font></i><br><;\n";
+ }
+ elsif ($method eq 'ju') {
+ print MSGFILE "$alias<;" . time . q[<;!<;!<;<i><font color='ffffff'>] . &timestring . " Du folgst <b>$alias2</b> aus dem Raum <b>$oldroom</b> herein nach <b>$newroom</b> ...</font></i><br><;\n";
+ }
+ elsif ($method eq 'sep') {
+ print MSGFILE "$alias<;" . time . q[<;!<;!<;<i><font color='ffffff'>] . &timestring . " Du wechselst aus dem Raum <b>$oldroom</b> herein nach <b>$newroom</b> und sperrst ab...</font></i><br><;\n";
+ }
+ elsif ($method eq 'beam') {
+ print MSGFILE "$alias<;" . time . q[<;!<;!<;<i><font color='ffffff'>] . &timestring . " Du wurdest von <b>$alias2</b> in den Raum <b>$newroom</b> gebeamt...</font></i><br><;\n";
+ }
+ close MSGFILE;
+ &post_strmsg($alias, $room, 'cr', $newroom);
+ $room = $oldroom;
+ my $tmpstamp = time;
+ if ($method eq 'j') {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> wechselt in den Raum <b>$newroom</b> ...</font></i>", $alias);
+ $room = $newroom;
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> kommt aus dem Raum <b>$oldroom</b> herein nach <b>$newroom</b> ...</font></i>", $alias);
+ }
+ elsif ($method eq 'ju') {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> folgt <b>$alias2</b> in den Raum <b>$newroom</b> ...</font></i>", $alias);
+ $room = $newroom;
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> kommt aus dem Raum <b>$oldroom</b> und folgt <b>$alias2</b> herein nach <b>$newroom</b> ...</font></i>", $alias);
+ }
+ elsif ($method eq 'sep') {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> wechselt in den Raum <b>$newroom</b> und sperrt ab...</font></i>", $alias);
+ $room = $newroom;
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> kommt aus dem Raum <b>$oldroom</b> herein nach <b>$newroom</b> und sperrt ab...</font></i>", $alias);
+ }
+ elsif ($method eq 'beam') {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias2</font> beamt <b>$alias</b> in den Raum <b>$newroom</b>...</font></i>", $alias2);
+ $room = $newroom;
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias2</font> beamt <b>$alias</b> aus dem Raum <b>$oldroom</b> herein nach <b>$room</b>...</font></i>", $alias2);
+ }
+ unlink "data/online/rooms/$oldroom/$alias";
+ &rm_rstat($alias, $oldroom);
+ &check_online;
+}
+1;
diff --git a/0.7.2/modules/commands.pm b/0.7.2/modules/commands.pm
new file mode 100644
index 0000000..c191f6e
--- /dev/null
+++ b/0.7.2/modules/commands.pm
@@ -0,0 +1,784 @@
+sub command {
+ $_[0] = $_[0] . ' ';
+ $_[0] = substr($_[0], 1, length($_[0]) - 1);
+ my(@cmd) = split(/ /, $_[0], 0);
+ my $cmd = substr($_[0], 0, index($_[0], ' '));
+ my $tmp = $_[1];
+ sub lock {
+ my $method = shift @_;
+ open RSTAT, "data/online/rstat/$room";
+ my(@r_stat) = <RSTAT>;
+ close RSTAT;
+ my $lock = "0\n";
+ if ($room eq $standardroom) {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> sperrt den Raum ohne Erfolg ab ...</font></i>", $alias);
+ }
+ else {
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> sperrt den Raum ab ...</font></i>", $alias) if $method ne 'separee';
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> sperrt den Raum auf ...</font></i>", $alias) if $method ne 'separee';
+ }
+ for ($i = 1; $i <= $#r_stat; ++$i) {
+ $lock = $lock . $r_stat[$i];
+ }
+ open RSTAT, ">data/online/rstat/$room";
+ print RSTAT $lock;
+ close RSTAT;
+ }
+ &reload_html;
+ }
+ if ($cmd eq 'about') {
+ &post_prv($alias, "<font color=ffffff>Aktuelle Version ist $title und wurde am $datum aktuallisiert. Programmiert von Paul C. B\374tow (2000 - 2001).</font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'away') {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $away_msg = $away_msg . ' ' . $cmd[$i];
+ }
+ my $room = &get_room($alias);
+ if ($tmp eq 'autoaway') {
+ $away_msg = "$alias wurde vom System agbemeldet ...";
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='ffa500'><b>Das System</b></font> meldet <b>$alias</b> wegen Inaktivit&auml;t ab ...</i></font>", $alias);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> meldet sich ab (<font color='$col'>$away_msg</font> ) ...</i></font>", $alias);
+ }
+ open AWAY, ">>data/online/rstat/$room.away";
+ print AWAY "$alias<;$away_msg\n";
+ close AWAY;
+ &private_javascript($alias, $room, q[parent.input.document.inf.tmp.value = 'away'; parent.online.location.reload();]);
+ &reload_html;
+ }
+ elsif ($cmd eq 'clear') {
+ &post_prv($alias, "<script language='JavaScript'>window.open('chat?request=stream&alias=$alias&room=$room&col=$col&secol=$secol&tmp=login&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder','main');</script>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'col') {
+ my $col, $secol;
+ if ($cmd[1] ne undef) {
+ $col = $cmd[1];
+ &prove_color($alias, $col);
+ my $tmpsecol = $cmd[2];
+ my $length = length $tmpsecol;
+ if ($tmpsecol eq '' or $length < 6 or $length > 6) {
+ $secol = $col;
+ }
+ else {
+ $secol = $tmpsecol;
+ }
+ }
+ else {
+ $col = &random_color;
+ $secol = &random_color;
+ }
+ open OPTIONS, "<data/user/options/$alias";
+ my(@options) = <OPTIONS>;
+ close OPTIONS;
+ open OPTIONS, ">data/user/options/$alias";
+ print OPTIONS $options[0] . $col . "\n" . $secol;
+ close OPTIONS;
+ &post($room, '<i><font color=ffffff>' . &timestring . "</font> <font color=$col>$alias</font> <font color=$secol> hat die Farbe gewechselt...</font></i>", $alias);
+ &private_javascript($alias, $room, "parent.input.document.inf.col.value = '$col'; parent.input.document.inf.secol.value = '$secol';");
+ &post_strmsg($alias, $room, 'col', "$col;$secol");
+ &reload_html;
+ }
+ elsif ($cmd eq 'date') {
+ my($secs, $mins, $hours, $days, $months, $years) = &timearray;
+ &post_prv($alias, "<font color=ffffff>Heute ist der $days.$months. Jahr $years. Es ist genau $hours:$mins Uhr und $secs Sekunden.</font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'exit') {
+ my $room = &get_room($alias);
+ if ($tmp eq 'autologout') {
+ &private_javascript($alias, $room, q[open('chat?request=start&tmp=autologout','_top');]);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='ffa500'><b>Das System</b></font> loggt <b>$alias</b> wegen Inaktivit&auml;t aus ... </font></i>", $alias);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> loggt sich ganz aus ... </font></i>", $alias);
+ &private_javascript($alias, $room, q[open('chat?request=start&tmp=quit','_top');]);
+ }
+ &rm_alias($alias, $room);
+ &rm_away($alias, $room);
+ &reload_html;
+ }
+ elsif ($cmd eq 'hits' or $cmd eq 'uptime') {
+ &post_prv($alias, "<font color=ffffff>Uptime: $startime " . &calculate_uptime_hours($STARTIME) . "h; $HITS Hits; " . &calculate_hpm($HITS, $STARTIME) . ' Hits pro Minute</font>');
+ &reload_html;
+ }
+ elsif ($cmd eq 'ig') {
+ my $alias2ignore = $cmd[1];
+ if ($alias2ignore) {
+ if (-f "data/user/options/$alias2ignore") {
+ &post_strmsg($alias, $room, 'ig', $alias2ignore);
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2ignore</font> <font color='ffffff'>existiert nicht in der Datenbank!</font>");
+ }
+ }
+ else {
+ &post_strmsg($alias, $room, 'igl');
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'j' or $cmd eq 'sep') {
+ if ($cmd[1] =~ /\W/ or $cmd[1] eq '') {
+ &post_prv($alias, "<font color=ffffff>Der Raum <font color=ffa500>$cmd[1]</font> enth\344lt illegale Zeichen!</font>");
+ &reload_html;
+ }
+ else {
+ if ($cmd eq 'j') {
+ &change_room('j', $cmd[1], $room);
+ &reload_html;
+ }
+ else {
+ if ($cmd[1] eq $standardroom) {
+ &post_prv($alias, "<font color=ffffff>Der Raum <font color=ffa500>$cmd[1]</font> ist ein Standardraum und kann nicht als Separee er&ouml;ffnet werden!</font>");
+ }
+ else {
+ &change_room('sep', $cmd[1], $room);
+ &lock('separee');
+ }
+ &reload_html;
+ }
+ }
+ }
+ elsif ($cmd eq 'me' or $cmd eq 'm') {
+ my $me_msg;
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $me_msg = $me_msg . ' ' . $cmd[$i];
+ }
+ $me_msg =~ s[/me/][<i>$alias</i>]g;
+ $me_msg =~ s[/m/][<i><font color=$col>$alias</font></i>]g;
+ if ($cmd eq 'm') {
+ &post($room, "<b><font color=$col><i>$alias</i> <font color=$secol>$me_msg</font></font></b>", $alias);
+ }
+ else {
+ &post($room, "<b><font color=$col><i>$alias</i> $me_msg</font></b>", $alias);
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'memo') {
+ my $alias2memo = $cmd[1];
+ my($secs, $mins, $hours, $days, $months, $years) = &timearray;
+ if (-f "data/user/options/$alias2memo") {
+ my $memo_msg;
+ for ($i = 2; $i <= $#cmd; ++$i) {
+ $memo_msg = $memo_msg . ' ' . $cmd[$i];
+ }
+ &post_prv($alias, "<font color=ffa500>$alias2memo <font color=ffffff>wurde folgende memo erfolgreich hinterlassen: $memo_msg</font></font>");
+ open MEMO, ">>data/user/memos/$alias2memo";
+ print MEMO "<font color=ffffff>($days.$months.$years - $hours:$mins:$secs) <font color=$col>$alias</font> hat Dir eine Memo hinterlassen: <font color=ffa500>$memo_msg</font></font><br>\n";
+ close MEMO;
+ &reload_html;
+ }
+ &post_prv($alias, "<font color=ffa500>$alias2memo <font color=ffffff>existiert in der Datenbank nicht !</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'menu') {
+ &private_javascript($alias, $room, "window.open('chat?request=htdocs&alias=$alias&var=menu_html&room=$standardroom&col=$col&secol=$secol&tmpid=$tmpid','_new','width=500,height=500,screenX=100,screenY=100,scrollbars');");
+ &reload_html;
+ }
+ elsif ($cmd eq 'online') {
+ my $alias2prove = $cmd[1];
+ if (-f "data/user/options/$alias2prove") {
+ open ONLINE, "<data/user/counts/$alias2prove.online";
+ my $online = <ONLINE>;
+ close ONLINE;
+ my $totaltime = sprintf('%.2f', $online / 3600);
+ &post_prv("$alias", "<font color=ffa500>$alias2prove <font color=ffffff>war insgesamt schon $totaltime Stunden online!</font></font>");
+ }
+ else {
+ &post_prv("$alias", "<font color=ffa500>$alias2prove <font color=ffffff>existiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'q') {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> verl&auml;sst den Chat ... </font></i>", $alias);
+ &post_strmsg($alias, $room, 'quit');
+ unlink "data/online/rooms/$room/$alias";
+ &rm_rstat($alias, $room);
+ &rm_away($alias, $room);
+ &check_online;
+ &reload_html;
+ }
+ elsif ($cmd eq 'rmgb') {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> l\366scht das eigene G\344stebuch ...</font></i>", $alias);
+ unlink "data/user/gbooks/$alias";
+ &reload_html;
+ }
+ elsif ($cmd eq 's') {
+ my $msg2scream;
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2scream = $msg2scream . ' ' . $cmd[$i];
+ }
+ $msg2scream =~ s/\344/\304/g;
+ $msg2scream =~ s/\366/\326/g;
+ $msg2scream =~ s/\374/\334/g;
+ $msg2scream = "\U$msg2scream\E";
+ &post($room, "<b><font color=$col><i>$alias schreit:</i> <font color=$secol>$msg2scream</font></font></b>", $alias);
+ &reload_html;
+ }
+ elsif ($cmd eq 'seen') {
+ my $alias2prove = $cmd[1];
+ if (-f "data/user/options/$alias2prove") {
+ if (-f "data/user/lastlogin/$alias2prove") {
+ open LASTLOGIN, "<data/user/lastlogin/$alias2prove";
+ my $lastlogin = <LASTLOGIN>;
+ close LASTLOGIN;
+ my $timestamp = sprintf('%.2f', (time - $lastlogin) / 3600);
+ &post_prv("$alias", "<font color='ffa500'>$alias2prove <font color=ffffff> hat sich vor $timestamp Stunden zuletzt in das System eingeloggt!</font></font>");
+ }
+ else {
+ &post_prv("$alias", "<font color='ffa500'>$alias2prove <font color=ffffff> hat sich seit der Einf\374hrung dieses Befehls noch nie eingeloggt!</font></font>");
+ }
+ }
+ else {
+ &post_prv("$alias", "<font color='ffa500'>$alias2prove <font color=ffffff> exsistiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'selfkill') {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> entfernt sich ganz und gar aus dem System und loggt sich aus ... </font></i>", $alias);
+ &private_javascript($alias, $room, q[open('chat?request=start&tmp=selfkill','_top');]);
+ &kill_alias($alias);
+ &reload_html;
+ }
+ elsif ($cmd eq 'w') {
+ my $theme = &get_theme($room);
+ my $door = '[<font color=red>Abgesperrt!</font>]' if $rstat[0] eq "1\n";
+ my($is, $nr) = ('t', 0);
+ my $persons;
+ opendir DIR, "data/online/rooms/$room";
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach $_ (@dir) {
+ if (-f "data/online/rooms/$room/$_") {
+ $persons = $persons . ' ' . $_;
+ ++$nr;
+ }
+ }
+ &post_prv($alias, "<font color=ffffff>Der aktuelle <b>Raum:</b> $room $theme $door ($nr): <font color='ffa500'>$persons</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'wc' or $cmd eq 'wc/') {
+ my $raum = $cmd[1];
+ my $persons;
+ if ($raum eq '' and $cmd eq 'wc') {
+ opendir USERS, 'data/online/users';
+ my(@users) = readdir USERS;
+ close USERS;
+ foreach $_ (@users) {
+ $persons = $persons . ' ' . $_ if -f "data/online/users/$_";
+ }
+ my $nr = $#users - 1;
+ my($nrs, $is) = ('', 'ist');
+ if ($nr != 1) {
+ $nrs = 'en';
+ $is = 'sind';
+ }
+ &post_prv("$alias", "<font color=ffffff>$nr Person$nrs $is insgesamt eingeloggt: <font color='ffa500'>$persons</font></font>");
+ }
+ elsif ($raum eq '' and $cmd eq 'wc/') {
+ my $msg2post;
+ opendir DIR, 'data/online/rooms';
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach $_ (@dir) {
+ if (-e "data/online/rooms/$_" and $_ ne '..' and $_ ne '.') {
+ opendir DIR, "data/online/rooms/$_";
+ my(@dir2) = readdir DIR;
+ closedir DIR;
+ open RSTAT, "<data/online/rstat/$_";
+ my(@rstat) = <RSTAT>;
+ close RSTAT;
+ chomp $rstat[1];
+ my $door = '[<font color=red>Abgesperrt!</font>]' if $rstat[0] eq "1\n";
+ my $nr = $#dir2 - 1;
+ $msg2post = $msg2post . "<tr><td><b><font size=2 color='ffffff'>$_ $door ($nr) [" . $rstat[1] . q(]: </font></b></td></tr><tr><td><font size=2 color='ffa500'>);
+ foreach $chatter (@dir2) {
+ $msg2post = $msg2post . "$chatter " if -f "data/online/rooms/$_/$chatter";
+ }
+ print '</font></td>';
+ }
+ }
+ &post_prv($alias, "<font color=ffffff>Folgende R&auml;ume sind offen:</font><table>$msg2post</table>");
+ }
+ elsif ($raum ne '') {
+ my $persons;
+ opendir DIR, "data/online/rooms/$raum";
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach $_ (@dir) {
+ $persons = $persons . ' ' . $_ if -f "data/online/rooms/$raum/$_";
+ }
+ my($nr, $is) = ($#dir - 1, 't');
+ if ($nr != 1) {
+ $nrs = 'en';
+ $is = 'n';
+ }
+ &post_prv($alias, "<font color=ffffff> $nr Person$nrs befinde$is sich im Raum <b>$raum</b> <font color='ffa500'>$persons</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'wj' or $cmd eq 'ju') {
+ my $alias2search = $cmd[1];
+ my $roomofalias = &get_room($alias2search);
+ if ($roomofalias) {
+ if ($cmd eq 'wj') {
+ &post_prv($alias, "<font color='ffa500'>$alias2search <font color=ffffff>befindet sich im Raum <b>$roomofalias</b> !</font></font>");
+ }
+ else {
+ &change_room('ju', $roomofalias, $room, $alias2search);
+ }
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2search <font color=ffffff> ist nicht eingeloggt!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif (1 <= &hierachie($alias, $room)) {
+ if ($cmd eq 'l') {
+ &lock;
+ }
+ elsif ($cmd eq 'su') {
+ my $alias2su = $cmd[1];
+ opendir DIR, "data/online/rooms/$room";
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach $_ (@dir) {
+ if ($_ eq $alias2su) {
+ open DATEI, "<data/online/rstat/$room";
+ my(@rstat) = <DATEI>;
+ close DATEI;
+ if (1 <= hierachie($alias2su, $room)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2su</font> <font color='ffffff'> kann nicht zum Raumbesetzer ernannt werden. (Ist bereits RB, W\304 oder OW)</font>");
+ &reload_html;
+ }
+ open RSTAT, ">>data/online/rstat/$room";
+ print RSTAT "$alias2su<;1\n";
+ close RSTAT;
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> verleiht <b>$alias2su</b> Raumbesetzerrechte ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ &reload_html;
+ }
+ }
+ &post_prv($alias, "<font color='ffa500'>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist nicht anwesend)</font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'rsu') {
+ my $alias2rsu = $cmd[1];
+ if (1 == hierachie($alias2rsu, $room)) {
+ &rm_rstat($alias2rsu, $room);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> entzieht <b>$alias2rsu</b> die Raumbesetzerrechte ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2rsu <font color='ffffff'>ist gar kein Raumbesetzer!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 't') {
+ open RSTAT, "data/online/rstat/$room";
+ my(@r_stat) = <RSTAT>;
+ close RSTAT;
+ my $theme;
+ if ($cmd[1] ne undef) {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $theme = $theme . ' ' . $cmd[$i];
+ }
+ &post($room, q[<i><font color='ffffff'>] . &timestring . qq[ <font color='$col'>$alias</font> gibt dem Raum das Thema "<font color='$col'>$theme</font>" ...</font></i>], $alias);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> l\366scht das Thema des Raums ...</font></i>", $alias);
+ }
+ $theme = $r_stat[0] . $theme . "\n";
+ for ($i = 2; $i <= $#r_stat; ++$i) {
+ $theme = $theme . $r_stat[$i] . "\n";
+ }
+ open RSTAT, ">data/online/rstat/$room";
+ print RSTAT $theme;
+ close RSTAT;
+ &reload_html;
+ }
+ elsif (3 <= &hierachie($alias)) {
+ if ($cmd eq 'ban' or $cmd eq 'banip') {
+ my $alias2ban = $cmd[1];
+ my $hierachie = &hierachie($alias2ban);
+ open BAN, '<data/ban';
+ my(@ban) = <BAN>;
+ close BAN;
+ if ($cmd[1] eq undef) {
+ my $nr = @ban;
+ my $banned;
+ foreach $_ (@ban) {
+ chomp $_;
+ $banned .= " $_";
+ }
+ &post_prv($alias, "<font color=ffffff>Folgende Benutzer sind verbannt [$nr]: <font color='ff0000'>$banned</font></font>");
+ &reload_html;
+ }
+ elsif (-f "data/user/options/$alias2ban") {
+ if (3 <= $hierachie eq 'wa') {
+ &post_prv($alias, "<font color='ffa500'>$alias2ban <font color='ffffff'>kann nicht verbannt werden!</font></font>");
+ &reload_html;
+ }
+ if ($cmd eq 'ban') {
+ if (&add_entry($alias2ban, 'ban') == 1) {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> verbannt <b>$alias2ban</b> aus dem Chat ...</font></i>", $alias);
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2ban <font color=ffffff>ist bereits verbannt!</font></font>");
+ }
+ }
+ elsif ($cmd eq 'banip') {
+ open DATEI, "<data/online/ident/$alias2ban";
+ my $ipnr = <DATEI>;
+ close DATEI;
+ chomp $ipnr;
+ if (add_entry("ip://$ipnr", 'ban') == 1) {
+ &post_prv($alias, "<font color='ffffff'>IP-Nummer von <font color='ffa500'>$alias2ban</font> (<font color='ff0000'>$ipnr</font>) wurde verbannt!</font></i>");
+ }
+ else {
+ &post_prv($alias, "<font color='ffffff'>Die IP-Nummer <font color='ff0000'>$ipnr</font> von <font color='ffa500'>$alias2ban</font> ist bereits verbannt!</font></font>");
+ }
+ &reload_html;
+ }
+ &reload_html;
+ }
+ &post_prv($alias, "<font color='ffa500'>$alias2ban <font color=ffffff> kann nicht verbannt werden, da Benutzername nicht existiert!</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'rban' or $cmd eq 'rbanip') {
+ my $alias2rban = $cmd[1];
+ open BAN, '<data/ban';
+ @ban = <BAN>;
+ close BAN;
+ foreach $ban (@ban) {
+ if (&rm_entry($alias2rban, 'ban') == 1) {
+ if ($alias2rban =~ /ip:/) {
+ &post_prv($alias, "<font color='ffffff'>Die IP-Nummer <font color='ff0000'>$alias2rban</font> wurde aus der Banliste ausgetragen!</font></font>");
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> entbannt <b>$alias2rban</b> ...</font></i>", $alias);
+ }
+ &reload_html;
+ }
+ }
+ &post_prv($alias, "<font color='ff0000'>$alias2rban <font color='ffffff'>ist nicht verbannt!</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'img') {
+ my $hierachie = &hierachie($alias);
+ &hierachie_rm($alias);
+ if ($hierachie % 2 > 0) {
+ &post_prv($alias, q[<font color='ffffff'>Dein Superuserlogo wurde versteckt!</font>]);
+ &hierachie_add($alias, $hierachie + 1);
+ }
+ else {
+ &post_prv("$alias", q[<font color='ffffff'>Dein Superuserlogo wurde wieder sichtbar gemacht!</font></font>]);
+ &hierachie_add($alias, $hierachie - 1);
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'ip') {
+ my $alias2prove = $cmd[1];
+ opendir DIR, 'data/online/ident';
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach $_ (@dir) {
+ if ($_ eq $alias2prove) {
+ open DATEI, "<data/online/ident/$alias2prove";
+ my $ipnr = <DATEI>;
+ close DATEI;
+ chomp $ipnr;
+ &post_prv($alias, "<font color='ffa500'>$_<font color='ffffff'> hat die IP-Nummer <font color='ff0000'>$ipnr</font> !</font></font>");
+ }
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'k' or $cmd eq 'o') {
+ my $alias2kick = $cmd[1];
+ if (-f "data/online/users/$alias2kick") {
+ opendir DIR, 'data/online/rooms';
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach my $raum (@dir) {
+ opendir DIR, "data/online/rooms/$raum";
+ my(@dir2) = readdir DIR;
+ closedir DIR;
+ foreach my $chatter (@dir2) {
+ if ($chatter eq $alias2kick) {
+ my $hierachie2 = &hierachie($alias2kick);
+ if (&hierachie($alias) <= &hierachie($alias2kick)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2kick <font color='ffffff'> besitzt einen h&ouml;heren oder gleichen Rang und kann nicht gekickt/ausgeloggt werden!</font></font>");
+ }
+ else {
+ if ($cmd eq 'k') {
+ &post_prv($alias2kick, '<script language="JavaScript">window.open("chat?request=start&tmp=kick","_top");</script>');
+ }
+ else {
+ &post_prv($alias2kick, '<script language="JavaScript">window.open("chat?request=start&tmp=logout","_top");</script>');
+ }
+ $_ = undef if $room eq $raum;
+ if ($cmd eq 'k') {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> katapultiert <b>$alias2kick</b> aus dem Chat ...</font></i>", $alias, $raum);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> loggt <b>$alias2kick</b> aus dem Chat aus ...</font></i>", $alias, $alias);
+ }
+ &rm_alias($alias2kick, $raum);
+ &check_online;
+ }
+ &reload_html;
+ }
+ }
+ }
+ }
+ &post_prv($alias, "<font color='ffa500'>$alias2kick <font color='ffffff'> ist nicht anwesend und kann nicht aus dem System katapultiert werden werden!</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'sl') {
+ my $sl_room = $cmd[1];
+ if (-e "data/online/rooms/$sl_room") {
+ my $lock = "0\n";
+ open RSTAT, "<data/online/rstat/$sl_room";
+ my(@r_stat) = <RSTAT>;
+ close RSTAT;
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> sperrt den Raum <b>$sl_room</b> von aussen ab ...</font></i>", $alias, $sl_room);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> sperrt den Raum <b>$sl_room</b> von aussen auf ...</font></i>", $alias, $sl_room);
+ }
+ for ($i = 1; $i <= $#r_stat; ++$i) {
+ $lock = $lock . $r_stat[$i];
+ }
+ open RSTAT, ">data/online/rstat/$sl_room";
+ print RSTAT $lock;
+ close RSTAT;
+ }
+ else {
+ &post_prv($alias, "<font color='ffffff'>Der Raum <font color='ffa500'>$sl_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'ss') {
+ my $ss_room = $cmd[1];
+ if (-e "data/online/rooms/$ss_room") {
+ my $ss_msg;
+ for ($i = 2; $i <= $#cmd; ++$i) {
+ $ss_msg = $ss_msg . ' ' . $cmd[$i];
+ }
+ my $msg2scream = "\U$ss_msg\E";
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> ruft in den Raum <b>$ss_room</b> hinein: <b><font color=$col>$msg2scream</font></b> ...</font></i>", $alias, $ss_room);
+ &reload_html;
+ }
+ else {
+ &post_prv($alias, "<font color='ffffff'>Der Raum <font color='ffa500'>$ss_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'st') {
+ my $st_room = $cmd[1];
+ if (-e "data/online/rooms/$st_room") {
+ my $theme;
+ if ($cmd[2] ne undef) {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $theme = $theme . ' ' . $cmd[$i];
+ }
+ &post($room, '<i><font color=ffffff>' . &timestring . qq[ <font color='$col'>$alias</font> gibt dem Raum <b>$st_room</b> das Thema "<font color='$col'>$theme</font>" ...</font></i>], $alias, $st_room);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> l\366scht das Thema des Raums <b>$st_room</b> ...</font></i>", $alias, $st_room);
+ }
+ open RSTAT, "<data/online/rstat/$st_room";
+ my(@r_stat) = <RSTAT>;
+ close RSTAT;
+ $theme = $r_stat[0] . $theme . "\n";
+ for ($i = 2; $i <= $#r_stat; ++$i) {
+ $theme = $theme . $r_stat[$i];
+ }
+ open RSTAT, ">data/online/rstat/$st_room";
+ print RSTAT $theme;
+ close RSTAT;
+ }
+ else {
+ &post_prv($alias, "<font color=ffffff>Der Raum <font color=ffa500>$st_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif (5 <= &hierachie($alias)) {
+ if ($cmd eq 'kill') {
+ my $alias2kill = $cmd[1];
+ if (-f "data/user/options/$alias2kill") {
+ if (5 <= &hierachie($alias2kill)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2kill</font> <font color='ffffff'>hat einen h&ouml;heren Rang und kann nicht aus dem System entfernt werden !</font>");
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col>$alias</font> killt <b>$alias2kill</b> ganz und gar aus dem System ...</font></i>", $alias);
+ &kill_alias($alias2kill, $alias);
+ }
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2kill <font color='ffffff'> existiert nicht in der Datenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'sys') {
+ my $sys_msg;
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $sys_msg = $sys_msg . ' ' . $cmd[$i];
+ }
+ $sys_msg = q[<i><font color='ffffff'>] . &timestring . " </font></i> <b><font size=2 color='red'>SYSTEMNACHRICHT</font></b><i><font color='ffffff'>: $sys_msg ...</font></i>";
+ opendir ROOMS, 'data/msgs';
+ my(@rooms) = readdir ROOMS;
+ close ROOMS;
+ foreach $_ (@rooms) {
+ &post($_, $sys_msg, $alias) unless /\./;
+ }
+ &log($sys_msg);
+ &reload_html;
+ }
+ elsif ($cmd eq 'wa') {
+ my $alias2wa = $cmd[1];
+ if (-f "data/user/options/$alias2wa") {
+ if (3 <= &hierachie($alias2wa)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2wa <font color='ffffff'>kann nicht zum W&auml;chter ernannt werden!</font></font>");
+ }
+ else {
+ &hierachie_add($alias2wa, 3);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> ernennt <b>$alias2wa</b> zum W\344chter ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ &reload_html;
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2wa <font color=ffffff>existiert nicht in der Datenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'rwa') {
+ my $alias2rwa = $cmd[1];
+ my $hierachie = &hierachie($alias2rwa);
+ if (3 == $hierachie or 4 == $hierachie) {
+ &hierachie_rm($alias2rwa);
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> hat <b>$alias2rwa</b> vom W\344chter zum normalen Chatter degradiert ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2rwa <font color=ffffff>ist kein W\344chter und k\366nnen diese Rechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif (7 <= &hierachie($alias)) {
+ if ($cmd eq 'ow') {
+ my $alias2ow = $cmd[1];
+ if (-f "data/user/options/$alias2ow") {
+ if (5 <= &hierachie($alias2ow)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2ow <font color='ffffff'>kann nicht zum Oberw&auml;chter ernannt werden!</font></font>");
+ }
+ else {
+ &hierachie_add($alias2ow, 5);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> ernennt <b>$alias2ow</b> zum Oberw&auml;chter ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ &reload_html;
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2wa <font color=ffffff>existiert nicht in der Datenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'row') {
+ my $alias2row = $cmd[1];
+ my $hierachie = &hierachie($alias2row);
+ if (5 == $hierachie or 6 == $hierachie) {
+ &hierachie_rm($alias2row);
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> hat <b>$alias2row</b> vom Oberw\344chter zum normalen Chatter degradiert ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2row <font color=ffffff>ist kein Oberw\344chter und k\366nnen diese Rechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'pw') {
+ my $pw2show = $cmd[1];
+ if (-f "data/user/options/$pw2show") {
+ open PW, "<data/user/options/$pw2show";
+ my(@pw) = <PW>;
+ close PW;
+ chomp $pw[0];
+ &post_prv($alias, "<font color='ffa500'>$pw2show <font color='ffffff'> hat das Passwort <font color='ff0000'>$pw[0]</font> !</font></font>");
+ &reload_html;
+ }
+ &post_prv($alias, "<font color='ffa500'>$pw2show <font color='ffffff'> existiert nicht in der Benutzerdatenbank!</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'id' or $cmd eq 'agent') {
+ my $id2show = $cmd[1];
+ if (-f "data/online/ident/$id2show") {
+ open ID, "<data/online/ident/$id2show";
+ my(@id) = <ID>;
+ close ID;
+ if ($cmd eq 'id') {
+ chomp $id[1];
+ &post_prv($alias, "<font color='ffa500'>$id2show <font color='ffffff'> hat die Temp-ID <font color='ff0000'>$id[1]</font> !</font></font>");
+ }
+ else {
+ chomp $id[2];
+ &post_prv($alias, "<font color='ffa500'>$id2show <font color='ffffff'> verwendet <font color='ff0000'>$id[2]</font> !</font></font>");
+ }
+ &reload_html;
+ }
+ &post_prv($alias, "<font color='ffa500'>$id2show <font color='ffffff'> ist nicht eingeloggt !</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'cool') {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ &post($room, '<i><font color=ffffff>' . &timestring . " $msg2post</font></i>", $alias);
+ &reload_html;
+ }
+ elsif ($cmd eq 'rev') {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ $msg2post = reverse($msg2post);
+ &post($room, "<b><font color='$col'>$alias: <font color='$secol'>$msg2post</font></font></b>", $alias);
+ &reload_html;
+ }
+ }
+ }
+ }
+ }
+ my($alias2post, $msg2post, $action);
+ if ($cmd eq 'msg') {
+ $alias2post = $cmd[1];
+ for ($i = 2; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ }
+ elsif ($cmd eq '') {
+ $alias2post = $whisper;
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ }
+ else {
+ $alias2post = $cmd;
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ }
+ $msg2post =~ s[/me/][<i>$alias</i>]g;
+ $msg2post =~ s[/m/][<i><font color=$col>$alias</font></i>]g;
+ if (-f "data/online/users/$alias2post" and not -f "data/online/rooms/$loginplace/$alias2post") {
+ &post_prv($alias, "<b><font color='$col'><i>Zu $alias2post gefl\374stert:</i> <font color='$secol'>$msg2post</font></font></i></b>");
+ &post_prv($alias2post, "<b><font color='$col'><i>$alias fl\374stert:</i> <font color='$secol'>$msg2post</font></font></i></b>");
+ &private_javascript($alias, $room, "parent.input.document.inf.whisper.value = '$alias2post';");
+ &reload_html;
+ }
+ &post_prv($alias, qq[ <font color=ffffff>Benutzer oder Befehl <font color=ffa500>$alias2post</font> ist nicht anwesend/verf\374gbar! Bitte den Befehl "/menu" eingeben, um das Chat-Men&uuml zu &ouml;ffnen.</font></font>]);
+ &reload_html;
+}
+1;
diff --git a/0.7.2/modules/divcom.pm b/0.7.2/modules/divcom.pm
new file mode 100644
index 0000000..38685bf
--- /dev/null
+++ b/0.7.2/modules/divcom.pm
@@ -0,0 +1,260 @@
+sub divcom {
+ if ($var eq 'list_alias_html') {
+ &list_alias_html;
+ }
+ elsif ($var eq 'alias_html') {
+ &alias_html;
+ }
+ elsif ($var eq 'edit_profile_html') {
+ &secure_checkid($alias, $tmpid);
+ &edit_html('edit_profile_html');
+ }
+ elsif ($var eq 'edit_options_html') {
+ &secure_checkid($alias, $tmpid);
+ &edit_html('edit_options_html');
+ }
+ elsif ($var eq 'gb_html') {
+ &gb_html;
+ }
+ elsif ($var eq 'post_gb') {
+ &secure_checkid($alias, $tmpid);
+ &post_gb;
+ }
+ elsif ($var eq 'edit_profile') {
+ &secure_checkid($alias, $tmpid);
+ &edit('edit_profile');
+ }
+ elsif ($var eq 'edit_options') {
+ &secure_checkid($alias, $tmpid);
+ &edit('edit_options');
+ }
+ elsif ($var eq 'rm_gb_alias') {
+ &secure_checkid($alias, $tmpid);
+ &rm_gb;
+ }
+ else {
+ &error('Parameter fehlt');
+ }
+}
+sub gb_html {
+ my ($message,$method) = @_;
+ unless ($method eq 'loggedin') {
+ &start_html('Benutzerboard');
+ &menu();
+ }
+ if ($message eq 'post_empty') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Du wolltest soeben einen leeren Eintrag posten. Bitte schreib\n <i>\n zuerst\n </i>\n einen Text und poste\n <u>dann</u>\n !\n </div>\n <hr>\n";
+ }
+ elsif ($message eq 'post_ok') {
+ print " <div class=b>\n Meldung:\n </div>\n <div>\n Vielen Dank f\374r Deinen Beitrag. Wenn Du willst, kannst Du jetzt gleich noch einen Eintrag posten ...\n </div>\n <hr>\n";
+ }
+ else {
+ print " <div>\n Falls Du Anregungen oder Verbesserungsvorschl\344ge f\374r die Community hast, dann poste doch einen kleinen Eintrag :-)\n </div>\n <hr>\n";
+ }
+ print qq[ <form action="chat">\n <input type="hidden" name="col" value="$col">\n<input type="hidden" name="secol" value="$secol">\n<input type="hidden" name="maxVerlauf" value="$maxVerlauf">\n<input type="hidden" name="verlaufOrder" value="$verlaufOrder">\n<input type="hidden" name="request" value="divcom">\n <input type="hidden" name="method" value="$method">\n <input type="hidden" name="var" value="post_gb">\n <input type="hidden" name="alias" value="$alias">\n <input type="hidden" name="tmpid" value="$tmpid">\n <input type="hidden" name="tmp" value="guestbook">\n <input type="hidden" name="id" value="y">\n <input size="40" name="msg">\n <font color="ffffff">\n <input type="submit" value="Hinterlassen ...">\n </font>\n </form>\n <hr>\n];
+ if (-e 'data/guestbook') {
+ &error("Konnte dat/guestbook nicht \366ffnen") unless open DATEI, '<data/guestbook';
+ @datei = <DATEI>;
+ close DATEI;
+ print $q->div(@datei);
+ }
+ print $q->end_html;
+}
+sub post_gb {
+ my($secs, $mins, $hours, $days, $months, $years) = &timearray;
+ if ($msg eq '') {
+ if ($id eq 'y') {
+ if ($method eq 'loggedin') {
+ &loggedin('post_empty');
+ } else {
+ &gb_html('post_empty');
+ }
+ }
+ else {
+ &alias_html('post_empty');
+ }
+ $client->shutdown(2);
+ exit 0;
+ }
+ $msg =~ s/</&lt;/g;
+ $msg =~ s/\n/<br>/g;
+ my $tmpath = '';
+ if ($id eq 'y') {
+ $tmpath = 'data/guestbook';
+ }
+ else {
+ $tmpath = "data/user/gbooks/$tmp";
+ }
+ open GB, "$tmpath";
+ my(@gb) = <GB>;
+ close GB;
+ pop @gb if $#gb > 99;
+ my(@newdatei) = "<br><b>$alias schrieb am $days.$months.$years um $hours:$mins:$secs ...</b><br>$msg<br>\n";
+ push @newdatei, @gb;
+ open GB, ">$tmpath";
+ print GB @newdatei;
+ close GB;
+ if ($id eq 'y') {
+ if ($method eq 'loggedin') {
+ &loggedin('post_ok');
+ } else {
+ &gb_html('post_ok');
+ }
+ $client->shutdown(2);
+ exit 0;
+ }
+ &post_prv ($tmp, "<font color=ffffff>$alias hat soeben einen Pin in Dein Profil geh\344ngt ... </font>");
+ &gb_html('post_ok');###
+ $client->shutdown(2);
+ exit 0;
+}
+sub rm_gb {
+ open GB, "<data/user/gbooks/$alias";
+ my(@gbfile) = <GB>;
+ close GB;
+ my(@newgbfile) = ();
+ for ($i = 0; $i <= $#gbfile; ++$i) {
+ push @newgbfile, $gbfile[$i] if $i != $id;
+ }
+ open GB, ">data/user/gbooks/$alias";
+ print GB @newgbfile;
+ close GB;
+ &alias_html('rm_ok');
+}
+sub list_alias_html {
+ &start_html('Alle Benutzer');
+ opendir REGISTERED, 'data/user/options';
+ my(@users) = readdir REGISTERED;
+ closedir REGISTERED;
+ my(@liste) = sort(@users);
+ my $nr = $#users - 1;
+ &menu();
+ print " <div>\n Es sind z.Z. genau $nr Benutzernamen in der Datenbank vorhanden! (Sortiert nach #, A-Z, a-z)\n </div>\n <hr>\n <div>\n";
+ foreach $_ (@liste) {
+ if (-f "data/user/options/$_") {
+ print $q->a({-'href', "chat?request=divcom&var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid"}, "$_"), ' ';
+ }
+ }
+ print " </div>\n</body>\n</html>\n";
+}
+sub alias_html {
+ my $message = $_[0];
+ open COUNTS, "<data/user/counts/$tmp";
+ local $counter = <COUNTS>;
+ close COUNTS;
+ ++$counter;
+ open COUNTS, ">data/user/counts/$tmp";
+ print COUNTS $counter;
+ close COUNTS;
+ &start_html($tmp);
+ &menu();
+ print "";
+ if ($message eq 'rm_ok') {
+ print " <div class=b>\n Meldung:\n </div>\n <div>\n Der von Dir gew\344hlte Eintrag wurde erfolgreich gel\366scht.\n </div>\n <hr>\n";
+ }
+ elsif ($message eq 'post_empty') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Du wolltest soeben einen leeren Eintrag posten. Bitte schreib\n <i>\n zuerst\n </u>\n einen Text und poste\n <u>dann</u>\n !\n <hr>\n";
+ }
+ open PROFILE, "<data/user/profiles/$tmp";
+ @data = <PROFILE>;
+ close PROFILE;
+ print qq[ <div>\n Dieses Profil wurde insgesamt schon $counter mal aufgerufen !\n <br><br>Alias: $tmp\n <br><br>Nachname: $data[0]\n <br><br>Vorname: $data[1]\n <br><br>Alter: $data[2]\n <br><br>Wohnort: $data[3]\n <br><br>E-Mail:\n <a href="mailto:$data[4]">$data[4]</a>\n <br><br>ICQ-Nummer: $data[5]\n <br><br>Homepage: <a href="$data[6]" target="_new">$data[6]</a>\n <br><br>Weiteres:<br>$data[7]\n <hr>\n Hier kannst Du $tmp eine Nachricht hinterlassen!\n <form action="chat">\n <input type="hidden" name="request" value="divcom">\n <input type="hidden" name="var" value="post_gb">\n <input type="hidden" name="alias" value="$alias">\n <input type="hidden" name="tmpid" value="$tmpid">\n <input type="hidden" name="tmp" value="$tmp">\n <input type="text" size="40" name="msg">\n <font color="ffffff">\n <input type="submit" value="Hinterlassen ...">\n </font>\n </form>\n <hr>\n];
+ if (-e "data/user/gbooks/$tmp") {
+ &error("Konnte data/user/gbooks/$tmp nicht \366ffnen") unless open DATEI, "<data/user/gbooks/$tmp";
+ @datei = <DATEI>;
+ close DATEI;
+ my $nr = 1;
+ if ($alias ne $tmp) {
+ foreach $_ (@datei) {
+ print "<br>Eintrag # $nr: $_";
+ ++$nr;
+ }
+ }
+ else {
+ print qq[ <table>\n <form action="chat">\n <input type="hidden" name="request" value="divcom">\n <input type="hidden" name="var" value="rm_gb_alias">\n <input type="hidden" name="alias" value="$alias">\n <input type="hidden" name="tmpid" value="$tmpid">\n <input type="hidden" name="tmp" value="$tmp">\n];
+ for ($i = 0; $i <= $#datei; ++$i) {
+ print qq[ <tr>\n <td>\n <input type="radio" name="id" value="$i">\n </td>\n <td>\n <div class=q>\n <br>\n Eintrag # $nr:\n $datei[$i]\n </div>\n </td>\n </tr>\n];
+ ++$nr;
+ }
+ print qq[ </table>\n <table>\n <tr>\n <td>\n <font color=ffffff>\n <input type="submit" value="Markierten Eintrag l\366schen">\n </font>\n </td>\n <td>\n <font color=ffffff>\n <input type="reset" value="Markierung r\374ckg\344ngig machen">\n </font>\n </td>\n </tr>\n </table>\n </form>\n];
+ }
+ }
+ print $q->end_html;
+}
+sub edit_html {
+ my($method, $message) = @_;
+ &start_html("Benutzerprofil \344ndern");
+ if ($method eq 'edit_options_html') {
+ open DATEI, "<data/user/options/$alias";
+ }
+ elsif ($method eq 'edit_profile_html') {
+ open DATEI, "<data/user/profiles/$alias";
+ }
+ @data = <DATEI>;
+ close DATEI;
+ foreach $_ (@data) {
+ chomp $_;
+ }
+ &menu();
+ if ($method eq 'edit_options_html') {
+ if ($message eq 'edit_options_ok') {
+ print "<div class=b>\n Hinweis:\n</div>\n<div>\n Du hast soeben Deine Chat-Optionen erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren. Um\n weiterzuchatten einfach Fenster schliessen!\n</div>\n<hr>\n";
+ }
+ elsif ($message eq 'edit_pw_wrong') {
+ print "<div class=b>\n ACHTUNG!\n</div>\n<div>\n Du hast soeben versucht, dein Passwort zu \344ndern. Jedoch stimmte die Erste Eingabe nicht mit der Zweiten \374berein.\n Bitte versuch es erneuert ...\n</div>\n<hr>\n";
+ }
+ else {
+ print $q->div('Hier kannst Du Deine Chat-Optionen editieren!'), $q->hr;
+ }
+ print qq[<script lang="javascript" type="text/javascript">\n<!--\n\nfunction radioWert(rObj) {\n for (var i=0; i<rObj.length; i++) if (rObj[i].checked) return rObj[i].value;\n return false;\n}\n\nfunction insertcode( code ) {\n document.optionen.elements[radioWert(document.optionen.eingabe)].value = code;\n}\n\n//-->\n</script>\n\n<form name="optionen" action="chat">\n <input type="hidden" name="var" value="edit_options">\n <table>\n <tr>\n <td>\n <div>\n Dein Passwort\n <font color=ffa500>\n (Gut merken !!)\n </font>\n <br>\n <input type="password" name="id" value="$data[0]">\n </div>\n </td>\n <td width=20>\n </td>\n <td>\n <div>\n Geb hier das Passwort erneuert ein:\n <br>\n <input type="password" name="tmp" value="$data[0]">\n </div>\n </td>\n </tr>\n </table>\n <hr>\n <div>Einstellungen f\374r den Nachrichten-Verlauf</div>\n <table>\n <tr>\n <td>\n <br>\n <div>Anzahl der Nachrichten im Verlauf (Standart = 10)</div>\n <font color=ffffff>\n <select name="maxVerlauf" size="1">\n <option value="$data[3]">$data[3]\n];
+ for ($i = 1; $i <= 50; ++$i) {
+ print qq[<option value="$i">$i];
+ }
+ print qq[ </select>\n </font>\n </td>\n </tr>\n <tr>\n <td>\n <br>\n<div>Wie sollen die Nachrichten im Verlauf angeordnet sein?</div>\n <font color=ffffff>\n <select name="verlaufOrder" size="1">\n <option value="$data[4]">Bisherige Einstellung ($data[4])\n <option value="0">Neue Verlaufnachrichten oben (0)\n <option value="1">Neue Verlaufnachrichten unten (1)\n </select>\n </font>\n </td>\n </tr>\n </table>\n<br>\n <div>PS: Einstellungen des Nachrichten-Verlaufs werden erst nach einem Neueinloggen aktualisiert.</div>\n <hr>\n <table>\n <tr>\n <td>\n <div>\n <input type="radio" name="eingabe" value="col" checked>\n Auswahl von Farbe 1\n <br>\n (Farbe Deines Nicks):\n <br>\n <input name="col" size="6" maxlength="6" value="$data[1]">\n </div>\n </td>\n <td width=20>\n </td>\n <td>\n <div>\n <input type="radio" name="eingabe" value="secol">\n Auswahl von Farbe 2\n <br>\n (Farbe Deiner Nachrichten):\n <br>\n <input name="secol" size="6" maxlength="6" value="$data[2]">\n </div>\n </td>\n </tr>\n </table>\n<br>\n <div>\n Beliebige Auswahl markieren und Farbe w\344hlen. Um Deine Optionen abzuspeichern,\n auf "Daten \344ndern" klicken!\n </div>\n <br>\n];
+ open COLORS, '<templates/colors.sno';
+ @colors = <COLORS>;
+ close COLORS;
+ print @colors;
+ }
+ elsif ($method eq 'edit_profile_html') {
+ if ($message eq 'edit_profile_ok') {
+ print " <div class=b>\n Hinweis:\n </div>\n <div>\n Du hast soeben Dein Profil erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren:\n <hr>\n";
+ }
+ else {
+ print $q->div('Hier kannst Du Dein Profil editieren!'), $q->hr;
+ }
+ print qq[ <form action="chat">\n <input type="hidden" name="var" value="edit_profile">\n <div>\n Dein Nachname:\n <br>\n <input name="nachname" value="$data[0]">\n </div>\n <br>\n <div>\n Dein Vorname:\n <br>\n <input name="vorname" value="$data[1]">\n </div>\n <br>\n <div>\n Dein Alter:\n <br>\n <input name="alter" value="$data[2]">\n </div>\n <br>\n <div>\n Dein Wohnort:\n <br>\n <input name="wohnort" value="$data[3]">\n </div>\n <br>\n <div>\n Deine E-Mail Adresse:\n <br>\n <input name="email" value="$data[4]">\n </div>\n <br>\n <div>\n Deine ICQ-Nummer:\n <br>\n <input name="icq" value="$data[5]">\n </div>\n <br>\n <div>\n Deine Homepage:\n <br>\n <input name="homepage" value="$data[6]">\n </div>\n <br>\n <div>\n Weiteres:\n <br>\n <textarea rows="5" cols="40"name="weiteres" wrap="virtual">$data[7]</textarea>\n </div>\n];
+ }
+ print qq[ <hr>\n <font color=ffffff>\n <input type="hidden" name="request" value="divcom">\n <input type="hidden" name="alias" value="$alias">\n <input type="hidden" name="tmpid" value="$tmpid">\n <input type="hidden" name="room" value="$room">\n <input type="submit" value="Daten \344ndern ...">\n </font>\n </form>\n</body>\n</html>\n];
+}
+sub edit {
+ my $method = $_[0];
+ if ($method eq 'edit_profile') {
+ my $url = $homepage;
+ $url =~ s[^http://*][];
+ open PROFILE, ">data/user/profiles/$alias";
+ my $profile = "$nachname\n$vorname\n$alter\n$wohnort\n$email\n$icq\nhttp://$url\n$weiteres";
+ $profile =~ s/</&lt;/g;
+ print PROFILE $profile;
+ close PROFILE;
+ &edit_html('edit_profile_html', 'edit_profile_ok');
+ }
+ elsif ($method eq 'edit_options') {
+ if ($id ne $tmp) {
+ &edit_html('edit_options_html', 'edit_pw_wrong');
+ $client->shutdown(2);
+ exit 0;
+ }
+ open OPTIONS, ">data/user/options/$alias";
+ my $options = "$id\n$col\n$secol\n$maxVerlauf\n$verlaufOrder";
+ $options =~ s/</&lt;/g;
+ print OPTIONS $options;
+ close OPTIONS;
+ my $room = &get_room($alias);
+ &private_javascript($alias, $room, "parent.input.document.inf.col.value = '$col'; parent.input.document.inf.secol.value = '$secol';");
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> <font color='$secol'>hat seine Chat-Einstellungen ge&auml;ndert</font> ...</font></i>", $alias);
+ &post_strmsg($alias, $room, 'col', "$col;$secol");
+ &edit_html('edit_options_html', 'edit_options_ok');
+ }
+}
+1;
diff --git a/0.7.2/modules/hierachie.pm b/0.7.2/modules/hierachie.pm
new file mode 100644
index 0000000..3a9e13c
--- /dev/null
+++ b/0.7.2/modules/hierachie.pm
@@ -0,0 +1,74 @@
+sub hierachie {
+ my($alias, $room) = @_;
+ open FILE, "<data/online/rstat/$room";
+ my(@rstat) = <FILE>;
+ close FILE;
+ shift @rstat;
+ shift @rstat;
+ open FILE, '<data/hierachie';
+ my(@hierachie) = <FILE>;
+ close FILE;
+ my(@userlevels) = (@hierachie, @rstat);
+ foreach $_ (@userlevels) {
+ my($name, $level) = split(/<;/, $_, 3);
+ if ($name eq $alias) {
+ chomp $level;
+ return $level;
+ }
+ }
+}
+sub hierachie_rm {
+ my $alias = shift @_;
+ my @return;
+ open FILE, '<data/hierachie';
+ my(@hierachie) = <FILE>;
+ close FILE;
+ foreach $_ (@hierachie) {
+ push @return, $_ unless /^$alias<;/;
+ }
+ open FILE, '>data/hierachie';
+ print FILE @return;
+ close FILE;
+}
+sub hierachie_rm_rstat {
+ my($alias, $room) = @_;
+ my @return;
+ return unless open FILE, "<data/online/rstat/$room";
+ my(@hierachie) = <FILE>;
+ close FILE;
+ foreach $_ (@hierachie) {
+ push @return, $_ unless /^$alias<;/;
+ }
+ open FILE, ">data/online/rstat/$room";
+ print FILE @return;
+ close FILE;
+}
+sub hierachie_add {
+ my($alias, $level) = @_;
+ &hierachie_rm($alias);
+ open FILE, '>>data/hierachie';
+ print FILE "$alias<;$level\n";
+ close FILE;
+}
+sub hierachie_add_rstat {
+ my($alias, $level, $room) = @_;
+ &hierachie_rm_rstat($alias, $room);
+ return unless open FILE, ">>data/online/rstat/$room";
+ print FILE "$alias<;$level\n";
+ close FILE;
+}
+sub prove_away {
+ my($alias, $room) = @_;
+ return unless open AWAY, "<data/online/rstat/$room.away";
+ @away = <AWAY>;
+ close AWAY;
+ my $name, $away;
+ foreach $_ (@away) {
+ if (/^$alias.*/) {
+ ($name, $away) = split(/<; /, $_, 3);
+ chomp $away;
+ return $away;
+ }
+ }
+}
+1;
diff --git a/0.7.2/modules/htdocs.pm b/0.7.2/modules/htdocs.pm
new file mode 100644
index 0000000..51c28ba
--- /dev/null
+++ b/0.7.2/modules/htdocs.pm
@@ -0,0 +1,127 @@
+sub htdocs {
+ if ($var eq 'help_html') {
+ &printfile('templates/help.sno', 'Alle Chatbefehle');
+ }
+ elsif ($var eq 'logo_html') {
+ &start_html('Logo');
+ &logo_html;
+ }
+ elsif ($var eq 'menu_html') {
+ &menu_html;
+ }
+ elsif ($var eq 'logs_html') {
+ &logs_html;
+ }
+ elsif ($var eq 'view_logs_html') {
+ &secure_checkid($alias, $tmpid);
+ &printfile("data/logs/$tmp", 'Logdatei', 'blank') if 5 <= &hierachie($alias);
+ }
+ elsif ($var eq 'superuser_html') {
+ &secure_checkid($alias, $tmpid);
+ &superuser_html;
+ }
+ elsif ($var eq 'chatiquette_html') {
+ &printfile('templates/chatiq.sno', 'Chatiquette');
+ print $q->end_html;
+ }
+ else {
+ print $q->start_html(-'bgcolor', '000000'), $q->end_html;
+ }
+}
+sub menu_html {
+ &start_html("Men\374");
+ print "<div>\n Von hier aus kannst du alle Untermen\374punkte des Systems erreichen:\n</div>\n<hr>\n";
+ &menu();
+ print "</body>\n</html>";
+}
+sub logo_html {
+ print qq[ <layer top=-3 left=0><div style="position:absolute; top:5; left:10">\n <OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"\n codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0"\n WIDTH=48 HEIGHT=48>\n <PARAM NAME=movie VALUE="$gfxpath/ySymbol.swf">\n <PARAM NAME=loop VALUE=false>\n <PARAM NAME=menu VALUE=false>\n <PARAM NAME=quality VALUE=high>\n <PARAM NAME=scale VALUE=noborder>\n <PARAM NAME=wmode VALUE=opaque>\n <PARAM NAME=bgcolor VALUE=$bgcolor>\n <EMBED src="$gfxpath/ySymbol.swf" loop=false menu=false quality=high scale=noborder wmode=opaque bgcolor=$bgcolor WIDTH=48 HEIGHT=48 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED>\n </OBJECT>\n </div></layer>\n];
+ print $q->end_html;
+}
+sub logs_html {
+ &start_html('Logdateien');
+ &menu;
+ print "<div>\n Hier befinden sich alle Logdateien\n</div>\n<hr>\n";
+ if (5 <= &hierachie($alias)) {
+ print $q->div(qq[Folgende Logdateien des Raumes "$standardroom" k\366nnen nur von Oberw\344chtern oder h\366her gelesen werden (Sortiert nach A-Z, a-z):]), $q->br;
+ opendir LOGS, 'data/logs';
+ my(@logs) = readdir LOGS;
+ closedir LOGS;
+ my(@sortedir) = sort(@logs);
+ foreach $_ (@sortedir) {
+ if (-f "data/logs/$_") {
+ print $q->a({-'href', "chat?request=htdocs&alias=$alias&var=view_logs_html&tmp=$_&tmpid=$tmpid", -'target', '_new'}, "$_"), ' ';
+ }
+ }
+ }
+ else {
+ print $q->div("Logdateien k\366nnen nur von Oberw\344chtern (OW) gelesen werden. Du bist jedoch ein W\344chter (W\304) oder ein", qq["Normaler Chatter". Oberw\344chter k\366nnen alles nachlesen, was \366ffentlich im Raum "Cyberbar" gechattet wurde.]), $q->hr;
+ }
+ print $q->end_html;
+}
+sub superuser_html {
+ &start_html ('Superuser');
+ &menu;
+ print "<div>Hallo $alias. Du bist als ";
+ my $hierachie = &hierachie($alias);
+ if (7 <= $hierachie) {
+ print $q->b('Administrator'), ' (AD) eingetragen.</div><br>', $q->br;
+ }
+ elsif (5 <= $hierachie) {
+ print $q->b("Oberw\344chter"), ' (OW) eingetragen.</div><br>', $q->br;
+ }
+ elsif (3 <= $hierachie) {
+ print $q->b("W\344chter"), " (W\304) eingetragen.</div><br>", $q->br;
+ }
+ else {
+ print $q->b('normaler Chatter'), ' (NC) eingetragen.</div><br>', $q->br;
+ }
+ open FILE, 'data/hierachie';
+ my(@hierachie) = <FILE>;
+ close FILE;
+ my @ows, @was, @ads;
+ foreach $_ (@hierachie) {
+ my($name, $level) = split(/<;/, $_, 3);
+ chomp $level;
+ if ($level == 3) {
+ push @was, $name;
+ }
+ elsif ($level == 5) {
+ push @ows, $name;
+ }
+ elsif ($level == 7) {
+ push @ads, $name;
+ }
+ if (3 <= $hierachie) {
+ if ($level == 4) {
+ push @was, "$name!";
+ }
+ elsif ($level == 6) {
+ push @ows, "$name!";
+ }
+ elsif ($level == 8) {
+ push @ads, "$name!";
+ }
+ }
+ }
+ my $nads = $#ads + 1;
+ print '<div>', $q->b('AD'), "s ($nads St\374ck)";
+ foreach $_ (@ads) {
+ print $q->font({-'color', 'ffa500'}, ' ' . $_);
+ }
+ my $nrow = $#ows + 1;
+ print '</div><br><br><div>', $q->b('OW'), "s ($nrow St\374ck)";
+ foreach $_ (@ows) {
+ print $q->font({-'color', 'ffa500'}, ' ' . $_);
+ }
+ my $nrwa = $#was + 1;
+ print '</div><br>', $q->br, '<div>', $q->b("W\304"), "s ($nrwa St\374ck)";
+ foreach $_ (@was) {
+ print $q->font({-'color', 'FFA500'}, ' ' . $_);
+ }
+ print qq[<hr>\n Die jeweiligen F\344higkeiten der Oberw\344chter (OW) und der W\344chter (W\304) sind unter\n "<a href="chat?request=htdocs&var=help_html">Chat-Befehle</a>"\n dokumentiert. Versteckte Superuser k\366nnen nur von anderen Superusern auf\ndieser Liste eingesehen werden!\n</div>\n</body>\n</html>\n];
+}
+sub menu {
+ print "<div>\n <a href='chat?request=divcom&var=edit_profile_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Profil \344ndern</a>\n <a href='chat?request=divcom&var=edit_options_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Optionen</a>\n <a href='chat?request=divcom&var=list_alias_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Benutzer</a>\n <a href='chat?request=htdocs&var=help_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Befehle</a>\n <a href='chat?request=divcom&var=gb_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Board</a>\n <a href='chat?request=htdocs&var=superuser_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Superuser</a>\n <a href='chat?request=htdocs&var=logs_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Logs</a>\n <a href='chat?request=statistic&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Statistik</a>\n <a href='chat?request=htdocs&var=chatiquette_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Chatiquette</a>\n</div>\n<hr>\n";
+}
+1;
diff --git a/0.7.2/modules/input.pm b/0.7.2/modules/input.pm
new file mode 100644
index 0000000..48df243
--- /dev/null
+++ b/0.7.2/modules/input.pm
@@ -0,0 +1,14 @@
+sub input {
+ &rm_away($alias, $room);
+ $maxVerlauf = '10' if $maxVerlauf eq undef;
+ $verlaufOrder = '1' if $verlaufOrder eq undef;
+ if ($tmp eq 'login') {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> hat den Chat im Raum <b>$room</b> betreten ...</font></i>");
+ }
+ print qq[<html>\n<head>\n<script language="JavaScript"><!--\n\n// Einstellungsvariablen\nmaxVerlauf = $maxVerlauf; // Anzahl der Eintr\344ge des Verlaufs\nmaxPreview = 20; // Zeichenl\344nge der Verlaufsvorschau\nverlaufOrder = $verlaufOrder; // Neue Nachrichten von: 0=oben, 1=unten\n//autoAwayTimeout = 5; // Sekunden, nach denen der User 'Away' gesetzt wird\n//autoQuitTimeout = 10; // Sekunden, nach denen der User den Chat verl\344sst\nautoAwayTimeout = 300; // Sekunden, nach denen der User 'Away' gesetzt wird\nautoQuitTimeout = 1200; // Sekunden, nach denen der User den Chat verl\344sst\n\n// Interne Variablen\nuserNotFocused = false; // Wenn User nicht schreibt\nuserAway = false; // Wenn User automatisch auf 'Away' gesetzt ist\nuserAwayTime = 0; // Sekunden, die User 'Away' ist\nfullVerlauf = new Array( maxVerlauf ); // Verlaufspuffer\n\nfunction delout()\n{\n addVerlauf (document.inf.msg.value); // Dem Verlauf eine Nachricht anh\344ngen\n document.inf.msg.focus(); // Fukus in das Eingabeform\n document.inf.msg.select(); // Text im Eigabeform markieren\n document.inf.submit(); // Formular absenden\n return false; // Abbrechen, damit das Frame nicht neu geladen wird\n}\n\nfunction CheckAuswahl()\n{\n id=document.verlaufform.verlauf.selectedIndex; // ID des ausgew\344hlten Feldes\n\n if (fullVerlauf[id-1] != null) // Nur, wenn das Feld nicht leer ist\n {\n document.inf.msg.value = fullVerlauf[id-1]; // Eintrag ins Textfeld\n }\n\n document.verlaufform.verlauf.selectedIndex = 0; // Ersten Eintrag (\334berschrift) ausw\344hlen\n document.inf.msg.focus(); // Eingabefeld fokusieren\n\n return true;\n}\n\nfunction addVerlauf (msg)\n{\n if (msg == "") // Falls msg leer\n return false; // Aufruf ignorieren\n\n if (verlaufOrder) // neue Nachrichten von unten\n {\n for (i=0; i<(maxVerlauf-1); i++) // Alle Eintr\344ge einen aufrutschen\n {\n document.verlaufform.verlauf.options[i+1].text = document.verlaufform.verlauf.options[i+2].text;\n fullVerlauf[i] = fullVerlauf[i+1];\n }\n }\n else // neue Nachrichten von oben\n {\n for (i=(maxVerlauf-2); i>=0; i--) // Alle Eintr\344ge einen aufrutschen\n {\n document.verlaufform.verlauf.options[i+2].text = document.verlaufform.verlauf.options[i+1].text;\n fullVerlauf[i+1] = fullVerlauf[i];\n }\n }\n\n if (msg.length > maxPreview) // Vorschau zuschneiden\n pre = msg.slice(0, maxPreview-3) + "...";\n else\n pre = msg;\n\n if (verlaufOrder) // pos = Position des neuen Eintrags\n pos = maxVerlauf-1;\n else\n pos = 0\n\n document.verlaufform.verlauf.options[pos+1].text = pre; // Neue Vorschau anf\374gen\n fullVerlauf[pos] = msg; // Neuen Eintrag an den Verlauf anf\374gen\n\n// document.verlaufform.verlauf.selectedIndex = maxVerlauf; // Fokus auf den letzten Eintrag\n document.verlaufform.verlauf.selectedIndex = 0; // Fokus auf den ersten Eintrag (\334berschrift)\n}\n\nfunction msgBlur()\n{\n userNotFocused = true;\n userAwayTime = 0;\n userAway = false;\n}\n\nfunction msgFocus()\n{\n userNotFocused = false;\n if (userAway) // Wird ausgef\374hrt, falls User 'Away' war\n {\n ; // nop\n }\n userAwayTime = 0;\n userAway = false;\n}\n\nfunction checkInterval()\n{\n// status = "userNotFocused=" + userNotFocused + "; userAway=" + userAway + "; userAwayTime=" + userAwayTime + ""; // Debug\n if (userNotFocused)\n {\n userAwayTime += 5; // Addiere 5, da nur alle 5Sek ausgef\374hrt\n if (!userAway)\n {\n if (autoAwayTimeout < userAwayTime) // Falls Zeit abgelaufen\n {\n if (document.inf.tmp.value != "away")\n open ("chat?request=postmessage&alias=$alias&tmpid=$tmpid&msg=%2faway&tmp=autoaway","reload"); // 'Away' setzen\n userAway = true;\n }\n }\n else\n {\n if (autoQuitTimeout < userAwayTime) // Falls Zeit abgelaufen\n {\n open ("chat?request=postmessage&alias=$alias&tmpid=$tmpid&msg=%2fexit&tmp=autologout","reload"); // Chat beenden\n }\n }\n }\n\n window.setTimeout("checkInterval()",5000); // In 5 Sekunden wieder aufrufen\n}\n\nfunction initFrame()\n{\n window.setTimeout("checkInterval()",5000); // In 5 Sekunden aufrufen\n document.inf.msg.focus(); // Eingabefeld fokusieren\n}\n//-->\n</script>\n];
+ &style;
+ print qq[</head>\n<body class="blank" onload="initFrame();">\n <div align="left">\n <table border="0" cellpadding="0" cellspacing="0">\n <tr>\n <td>\n <form name="inf" target="reload" action="chat" onsubmit="return delout();">\n <input type="hidden" name="request" value="postmessage">\n <input type="hidden" name="alias" value="$alias">\n <input type="hidden" name="room" value="$room">\n <input type="hidden" name="col" value="$col">\n <input type="hidden" name="secol" value="$secol">\n <input type="hidden" name="tmpid" value="$tmpid">\n <input type="hidden" name="whisper" value="$whisper">\n <input type="hidden" name="tmp" value="$tmp">\n <input size="40" maxlength="300" name="msg" onBlur="msgBlur();" onFocus="msgFocus();">\n </form>\n </td>\n <td><form name="verlaufform">\n <script language="JavaScript"><!--\n document.write("<select size='1' name='verlauf' size='40' onChange='CheckAuswahl();'>");\n document.write("<option>- Nachrichten-Verlauf -</option>");\n for(i=0; i<maxVerlauf; i++) // Leere Verlaufsfelder generieren\n document.write("<option value>(leer)</option>");\n document.write("</select>");\n //-->\n </script>\n </form>\n </td>\n </tr>\n </table>\n </div>\n</body>\n</html>\n];
+ $client->$shutdown(2);
+ exit 0;
+}
+1;
diff --git a/0.7.2/modules/loggedin.pm b/0.7.2/modules/loggedin.pm
new file mode 100644
index 0000000..52315d6
--- /dev/null
+++ b/0.7.2/modules/loggedin.pm
@@ -0,0 +1,37 @@
+sub loggedin {
+ &start_html($loginplace, 'blank');
+ print qq[<div>\n <font color='$col'>$alias</font>, sch\366n da\337 Du da bist :-), <a href='chat?request=loggedin&alias=$alias&col=$col&secol=$secol&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder'>hier</a> kannst du die Seite aktualisieren.\n</div>\n<hr>\n<div>\n<a href="chat?request=stream&alias=$alias&room=$standardroom&col=$col&secol=$secol&tmp=login&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder">Hier</a>\nkannst du den Standardraum $standardroom betreten. <br><br>\n];
+ opendir ROOMDIRS, 'data/online/rooms';
+ local(@roomdirs) = readdir ROOMDIRS;
+ close ROOMDIRS;
+ foreach $_ (@roomdirs) {
+ if (-e "data/online/rooms/$_" and $_ ne '..' and $_ ne '.') {
+ my $room = $_;
+ open RSTAT, "<data/online/rstat/$room";
+ my(@rstat) = <RSTAT>;
+ close RSTAT;
+ my $door = '[<font color=red>Abgesperrt!</font>]' if $rstat[0] eq "1\n";
+ opendir ROOMDIR, "data/online/rooms/$room";
+ my(@roomdir) = readdir ROOMDIR;
+ close ROOMDIR;
+ my $nr = $#roomdir - 1;
+ if ($door or $_ eq $loginplace) {
+ print $q->b($_), " $door ($nr) ";
+ }
+ else {
+ print $q->b($q->a({-'href', "chat?request=stream&alias=$alias&room=$_&col=$col&secol=$secol&tmp=login&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder"}, "$_")), " ($nr)";
+ }
+ print " Raumthema: $rstat[1]" if $rstat[1] ne "\n";
+ print $q->br;
+ foreach $_ (@roomdir) {
+ if ($_ ne '..' and $_ ne '.') {
+ print "<a href='chat?request=divcom&var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid' target='$_'>$_</a> ";
+ }
+ }
+ print $q->br, $q->br;
+ }
+ }
+ &gb_html($_[0],'loggedin');
+# print $q->br, $q->br, $q->b($q->font({-'color', 'ffa500'}, 'Aktuelles:')), $q->br, "Wie ihr seht, ist der neue yChat da. Allerdings ist es gut M\366glich, da\337 diese Version einige Bugs beinhaltet! ", q[Solltest du welche entdecken, dann schick doch bitte eine Mail an <a href='mailto:snooper@ychat.de'>snooper@ychat.de</a>.], '<br><br>Leider konnten noch nicht alle geplanten Features eingebaut werden. Dazu fehlte leider die Zeit.', " Denn mit steigendem Sourcecode leidet leider auch das schnelle Anpassungsverm\366gen neuer Ideen.<br><br>", "Aber egal, hauptsache der Chat l\344uft wieder :-) Mfg, Snooper ...</div>", $q->end_html;
+}
+1;
diff --git a/0.7.2/modules/online.pm b/0.7.2/modules/online.pm
new file mode 100644
index 0000000..6c5f8a6
--- /dev/null
+++ b/0.7.2/modules/online.pm
@@ -0,0 +1,104 @@
+sub online {
+ &secure_checkid($alias, $tmpid);
+ my(@away) = &prove_away($alias, $room, 'return_list');
+ for (;;) {
+ for ($i = 0; $i <= $#away; $i += 2) {
+ last if $away[$i] eq $alias or $room eq $loginplace;
+ }
+ open DATEI, "<data/online/users/$alias";
+ my $oldstamp = <DATEI>;
+ close DATEI;
+ if ($oldstamp > time - 100) {
+ open DATEI, "<data/user/counts/$alias.online";
+ my $online = <DATEI>;
+ close DATEI;
+ my $total = time - $oldstamp + $online;
+ open DATEI, ">data/user/counts/$alias.online";
+ print DATEI $total;
+ close DATEI;
+ }
+ last;
+ }
+ unless (-d "data/online/rooms/$room") {
+ mkdir "data/online/rooms/$room", 511;
+ }
+ open DATEI, ">data/online/users/$alias";
+ print DATEI time;
+ close DATEI;
+ open DATEI, ">data/online/rooms/$room/$alias";
+ print DATEI time;
+ close DATEI;
+ open DATEI, '<data/online/prove';
+ my $provetime = <DATEI>;
+ close DATEI;
+ &check_online if $provetime < time - 40;
+ print qq[<html>\n <head>\n <meta http-equiv="refresh" content="20" URL="chat?request=online&room=$room&alias=$alias&tmpid=$tmpid">\n <style type="text/css">\n a { font-family: arial; font-size:11px; color: #ffffef; }\n a:hover { color: #ffffff; }\n </style>\n <style type="text/css" media="all">\n a { text-decoration: none; }\n a:hover { text-decoration:underline; }\n </style>\n </head>\n <body bgcolor="$chatbg">\n];
+ opendir ROOM, 'data/online/rooms/' . $room;
+ my(@room) = sort(readdir ROOM);
+ closedir ROOM;
+ my $chatter = $#room - 1;
+ print "<font size='1' color='ffffff' face='arial'>$room ($chatter):</font><table>\n";
+ open FILE, "<data/online/rstat/$room";
+ my(@rstat) = <FILE>;
+ close FILE;
+ shift @rstat;
+ shift @rstat;
+ open FILE, '<data/hierachie';
+ my(@userlevels) = (<FILE>, @rstat);
+ close FILE;
+ open FILE, "<data/online/rstat/$room.away";
+ my(@away) = <FILE>;
+ close FILE;
+ foreach my $nick (@room) {
+ if (-f "data/online/rooms/$room/$nick") {
+ my $inside = 0;
+ foreach $_ (@away) {
+ my($name, $awaymessage) = split(/<;/, $_, 3);
+ if ($name eq $nick) {
+ chomp $awaymessage;
+ print "<tr><td><img title='$awaymessage' alt='$awaymessage' src='$gfxpath/away.gif'></td>";
+ $inside = 2;
+ }
+ }
+ if ($inside == 0) {
+ foreach $_ (@userlevels) {
+ my($name, $level) = split(/<;/, $_, 3);
+ if ($nick eq $name) {
+ chomp $level;
+ $inside = 1;
+ if ($level == 1) {
+ print "<tr><td><img title='Raumbesetzer' alt='Raumbesetzer' src='$gfxpath/rb.gif'></td>";
+ last;
+ }
+ elsif ($level == 2) {
+ print "<tr><td><img title='Die Unschuld vom Land' alt='Die Unschuld vom Land' src='$gfxpath/uvl.gif'></td>";
+ last;
+ }
+ elsif ($level == 3) {
+ print "<tr><td><img title='W&auml;chter' alt='W&auml;chter' src='$gfxpath/wa.gif'></td>";
+ last;
+ }
+ elsif ($level == 5) {
+ print "<tr><td><img title='oberw&auml;chter' alt='Oberw&auml;chter' src='$gfxpath/ow.gif'></td>";
+ last;
+ }
+ elsif ($level == 7) {
+ print "<tr><td><img title='Administrator' alt='Administrator' src='$gfxpath/adm.gif'></td>";
+ last;
+ }
+ else {
+ print '<tr><td></td>';
+ last;
+ }
+ }
+ }
+ }
+ if ($inside == 0) {
+ print '<tr><td></td>';
+ }
+ print "<td><a href='chat?request=divcom&var=alias_html&alias=$alias&tmp=$nick&tmpid=$tmpid' target='$nick'>$nick</a></td></tr>\n";
+ }
+ }
+ print '</table></body></html>';
+}
+1;
diff --git a/0.7.2/modules/postmessage.pm b/0.7.2/modules/postmessage.pm
new file mode 100644
index 0000000..5172b4f
--- /dev/null
+++ b/0.7.2/modules/postmessage.pm
@@ -0,0 +1,90 @@
+sub postmessage {
+ if (not -e "data/online/rooms/$room/$alias" and $tmp ne 'autoaway' and $tmp ne 'autologout') {
+ &post_prv($alias, "<font color=ffffff>Du befindest Dich nicht im Raum <font color=ffa500>$room</font> und kannst dort auch keine Nachrichten posten!</font>");
+ &reload_html;
+ }
+ elsif (length $msg > 300) {
+ &post_prv($alias, "<font color=ffffff>Deine Nachricht enth\344lt zu viele Zeichen. Maximal sind 300 Zeichen erlaubt.</font>");
+ &reload_html;
+ }
+ if ($tmp eq 'away') {
+ &rm_away($alias, $room);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> hat sich zur\374ck gemeldet ... </font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ &private_javascript($alias, $room, q[parent.input.document.inf.tmp.value = 'notaway';]);
+ }
+ $msg =~ s/</&lt;/g;
+ if (substr($msg, 0, 1) ne '/') {
+ unless ($tmp eq 'autoaway') {
+ foreach $_ ($col, $secol) {
+ &prove_color($alias, $_);
+ }
+ }
+ open MSGFILE, ">>data/msgs/$room";
+ if (not $msg =~ s[/me/][<i>$alias</i>]g || $msg =~ s[/m/][<i><font color=$col>$alias</font></i>]g) {
+ print MSGFILE '!<;' . time . "<;!<;!<;<b><font color='$col'>$alias: <font color='$secol'>$msg<br></font></font></b><;$alias<;\n";
+ }
+ else {
+ $msg =~ s[/me/][<i>$alias</i>]g;
+ $msg =~ s[/m/][<i><font color=$col>$alias</font></i>]g;
+ print MSGFILE '!<;' . time . "<;!<;!<;<b><font color=$secol>$msg</font></font></b><br><;$alias<;\n";
+ }
+ close MSGFILE;
+ opendir PID, "data/online/pids/$room";
+ my(@pids) = readdir PID;
+ closedir PID;
+ foreach $_ (@pids) {
+ kill 'USR1', $_ if -f "data/online/pids/$room/$_";
+ }
+ &log("<b><font color=$col>$alias: <font color=$secol>$msg</font></font></b>") if $room eq $standardroom;
+ &reload_html;
+ }
+ else {
+ &command($msg, $tmp);
+ }
+}
+sub post {
+ my($room, $msg2post, $alias, $secroom) = @_;
+ my(@rooms) = $room;
+ @rooms = ($room, $secroom) if $room ne $secroom;
+ foreach my $theroom (@rooms) {
+ open MSGFILE, ">>data/msgs/$theroom";
+ print MSGFILE '!<;' . time . "<;!<;!<;$msg2post<br><;$alias<;\n";
+ close MSGFILE;
+ opendir PID, "data/online/pids/$theroom";
+ my(@pids) = readdir PID;
+ closedir PID;
+ foreach $_ (@pids) {
+ kill 'USR1', $_ if -f "data/online/pids/$theroom/$_";
+ }
+ }
+ &log($msg2post) if $room eq $standardroom;
+}
+sub post_prv {
+ my($alias2post, $msg2post) = @_;
+ my $roomofalias = &get_room($alias2post);
+ return 'false' if not $roomofalias;
+ open MSGFILE, ">>data/msgs/$roomofalias";
+ print MSGFILE "$alias2post<;" . time . "<;!<;!<;$msg2post<br><;$alias<;\n";
+ close MSGFILE;
+ opendir PID, "data/online/pids/$roomofalias";
+ my(@pids) = readdir PID;
+ closedir PID;
+ foreach $_ (@pids) {
+ kill 'USR1', $_ if -f "data/online/pids/$roomofalias/$_";
+ }
+ return 'true';
+}
+sub post_strmsg {
+ my($alias, $room, $command, $action) = @_;
+ open MSGFILE, ">>data/msgs/$room";
+ print MSGFILE "$alias<;" . time . "<;$command<;$action<;!<;!<;\n";
+ close MSGFILE;
+ opendir PID, "data/online/pids/$room";
+ my(@pids) = readdir PID;
+ closedir PID;
+ foreach $_ (@pids) {
+ kill 'USR1', $_ if -f "data/online/pids/$room/$_";
+ }
+}
+
+1;
diff --git a/0.7.2/modules/shared.pm b/0.7.2/modules/shared.pm
new file mode 100644
index 0000000..de98172
--- /dev/null
+++ b/0.7.2/modules/shared.pm
@@ -0,0 +1,307 @@
+sub reload_html {
+ print "<html><body bgcolor='$chatbg'></body></html>";
+ $client->shutdown(2);
+ exit 0;
+}
+sub printfile {
+ my($file2print, $pagetitle, $bodyclass) = @_;
+ &start_html($pagetitle, $bodyclass) if $pagetitle ne '';
+ &menu unless $bodyclass eq 'blank';
+ open FILE2PRINT, "<$file2print";
+ print "$_\n" while defined($_ = <FILE2PRINT>);
+ close FILE2PRINT;
+}
+sub start_html {
+ print "<html><head><title>$title - $_[0]</title>$_[2]";
+ &style;
+ print '</head>';
+ if ($_[1] eq 'start') {
+ print '<body onload="document.login.alias.focus();">';
+ }
+ elsif ($_[1] ne '') {
+ print "<body class=$_[1]>";
+ }
+ else {
+ print '<body>';
+ }
+}
+sub log {
+ my $msg2log = $_[0];
+ my($secs, $mins, $hours, $days, $months, $years) = &timearray;
+ my $js;
+ ($msg2log, $js) = split(/<script/, $msg2log, 3);
+ open LOG, ">>data/logs/$days.$months.$years";
+ print LOG "<br><font color=ffffef><i>($hours:$mins:$secs)</i></font> $msg2log\n";
+ close LOG;
+}
+sub timestring {
+ my($mins, $hours) = (localtime)[1, 2];
+ $hours = '0' . $hours if $hours < 10;
+ $mins = '0' . $mins if $mins < 10;
+ return "$hours:$mins";
+}
+sub timearray {
+ my($secs, $mins, $hours, $days, $months, $years) = (localtime)[(0, 1, 2, 3, 4, 5)];
+ $months += 1;
+ $hours = '0' . $hours if $hours < 10;
+ $mins = '0' . $mins if $mins < 10;
+ $secs = '0' . $secs if $secs < 10;
+ $days = '0' . $days if $days < 10;
+ $months = '0' . $months if $months < 10;
+ $years = $years - 100;
+ if ($years < 10) {
+ $years = '200' . $years;
+ }
+ else {
+ $years = '20' . $years;
+ }
+ return $secs, $mins, $hours, $days, $months, $years;
+}
+sub error {
+ my $error_msg = $_[0];
+ &start_html("Error: ($error_msg)");
+ print $q->div("Error: ($error_msg)"), $q->end_html;
+ open ERROR, '>>data/error';
+ print ERROR "Alias: $alias TempID: $tmpid File. $0 PID: $$ Time: " . time . " Message: $error_msg \n";
+ close ERROR;
+ $client->shutdown(2) if $client;
+ exit 0;
+}
+sub check_online {
+ open PROVE, '>data/online/prove';
+ print PROVE time;
+ close PROVE;
+ opendir DIR, 'data/online/rooms';
+ my(@roomdir) = readdir DIR;
+ closedir DIR;
+ foreach my $theroom (@roomdir) {
+ opendir DIR, "data/online/rooms/$theroom";
+ my(@roomusers) = readdir DIR;
+ closedir DIR;
+ my $empty = 1;
+ foreach $user (@roomusers) {
+ if (-f "data/online/rooms/$theroom/$user") {
+ $empty = 0;
+ open USER, "<data/online/rooms/$theroom/$user";
+ my $userstamp = <USER>;
+ close USER;
+ if ($userstamp < time - 40) {
+ unlink "data/online/$theroom/$user";
+ open USER, "<data/online/users/$user";
+ my $userstamp = <USER>;
+ close USER;
+ if ($userstamp < time - 40) {
+ if ($user ne $alias) {
+ &rm_alias($user, $theroom);
+ }
+ else {
+ unlink "data/online/rooms/$theroom/$user";
+ }
+ &post($theroom, '<i><font color=ffffff>' . &timestring . " <b>$user</b> hat den Chat verlassen ... </font></i>");
+ }
+ }
+ }
+ }
+ opendir PIDS, "data/online/pids/$theroom";
+ my(@pids) = readdir PIDS;
+ closedir PIDS;
+ if ($empty == 1) {
+ rmdir "data/online/rooms/$theroom";
+ unlink "data/online/rstat/$theroom";
+ unlink "data/online/rstat/$theroom.away";
+ unlink "data/msgs/$theroom";
+ foreach $_ (@pids) {
+ unlink "data/online/pids/$theroom/$_" if -f "data/online/pids/$theroom/$_";
+ }
+ rmdir "data/online/pids/$theroom";
+ }
+ }
+}
+sub rm_if_loggedin {
+ my $alias = shift;
+ my $room = &get_room($alias);
+ while ($room ne undef) {
+ &rm_alias($alias, $room);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$user</font> hat den Chat verlassen ... </font></i>");
+ $room = &get_room($alias);
+ }
+}
+sub secure_checkid {
+ my($alias2check, $tmpid) = @_;
+ &error("Falsche TempID! $tmpid") unless -f "data/online/tmpid/$alias.$tmpid";
+}
+sub rm_alias {
+ my($alias, $room) = @_;
+ unlink "data/online/rooms/$room/$alias";
+ unlink "data/online/users/$alias";
+ opendir TMPID, 'data/online/tmpid';
+ my(@tmpid) = readdir TMPID;
+ close TMPID;
+ foreach $_ (@tmpid) {
+ unlink "data/online/tmpid/$_" if /^$alias\..+$/;
+ }
+ unlink "data/online/ident/$alias";
+ &rm_rstat($alias, $room);
+}
+sub rm_rstat {
+ my($alias, $room) = @_;
+ open RSTAT, "<data/online/rstat/$room";
+ my(@rstat) = <RSTAT>;
+ close RSTAT;
+ my(@rstat2) = ($rstat[0], $rstat[1]);
+ for ($i = 2; $i <= $#rstat; ++$i) {
+ chomp $rstat[$i];
+ push @rstat2, $rstat[$i] . "\n" unless $rstat[$i] =~ /^$alias<;/;
+ }
+ open RSTAT, ">data/online/rstat/$room";
+ print RSTAT @rstat2;
+ close RSTAT;
+}
+sub rm_away {
+ my($alias, $room) = @_;
+ open AWAY, "<data/online/rstat/$room.away";
+ my(@away) = <AWAY>;
+ close AWAY;
+ my @away2;
+ foreach $_ (@away) {
+ my(@split) = split(/<;/, $_, 0);
+ push @away2, $_ if $alias ne $split[0];
+ }
+ open AWAY, ">data/online/rstat/$room.away";
+ print AWAY @away2;
+ close AWAY;
+}
+sub rm_entry {
+ my($entry, $file) = @_;
+ open ENTRY, "<data/$file";
+ my(@entry) = <ENTRY>;
+ close ENTRY;
+ my @new;
+ foreach $_ (@entry) {
+ push @new, $_ if $entry . "\n" ne $_;
+ }
+ if (@entry != @new) {
+ open ENTRY, ">data/$file";
+ print ENTRY @new;
+ close ENTRY;
+ return 1;
+ }
+ else {
+ return;
+ }
+}
+sub add_entry {
+ my($entry, $file) = @_;
+ open ENTRY, "<data/$file";
+ my(@entry) = <ENTRY>;
+ close ENTRY;
+ foreach $_ (@entry) {
+ chomp $_;
+ return if $entry eq $_;
+ }
+ open ENTRY, ">>data/$file";
+ print ENTRY $entry . "\n";
+ close ENTRY;
+ return 1;
+}
+sub prove_color {
+ my($alias, $color) = @_;
+ my $length = length $color;
+ if ($length > 6 or $length < 6) {
+ &post_prv($alias, "<font color=ffffff>Ung\374ltige Hexadezimalfarbe.</font>");
+ &reload_html;
+ }
+}
+sub kill_alias {
+ my($alias2kill, $alias) = @_;
+ my($secs, $mins, $hours, $days, $months, $years) = &timearray;
+ unlink "data/user/options/$alias2kill";
+ unlink "data/user/profiles/$alias2kill";
+ unlink "data/user/gbooks/$alias2kill";
+ unlink "data/user/counts/$alias2kill";
+ unlink "data/user/counts/$alias2kill.online";
+ unlink "data/user/lastlogin/$alias2kill";
+ unlink "data/user/memos/$alias2kill";
+ &rm_entry($alias2kill, 'ban');
+ open DEL, '>>data/kill';
+ print DEL "($days.$months.$years $hours:$mins:$secs) $alias2kill wurde von $alias gekillt\n";
+ close DEL;
+}
+sub random_color {
+ my(@digit) = ('F', 'C', 'A', 'B', (5, 6, 7, 8, 9));
+ my $dig1 = rand @digit;
+ my $dig2 = rand @digit;
+ my $dig3 = rand @digit;
+ my $dig4 = rand @digit;
+ my $dig5 = rand @digit;
+ my $dig6 = rand @digit;
+ return $digit[$dig1] . $digit[$dig2] . $digit[$dig3] . $digit[$dig4] . $digit[$dig5] . $digit[$dig6];
+}
+sub url_decode {
+ my $t = shift @_;
+ $t =~ s[/][];
+ $t =~ tr/+/ /;
+ while ($t =~ s/%([a-f0-9][a-f0-9])/chr hex $1;/ie) {
+ ();
+ }
+ return $t;
+}
+sub url_encode {
+ my $t = shift @_;
+ while ($t =~ s/([^\w()'*~!.-])/sprintf '%%%02x', $1;/eg) {
+ ();
+ }
+ return $t;
+}
+sub calculate_hpm {
+ my($hits, $starttime) = @_;
+ return sprintf('%.2f', $hits / ((time - $starttime) / 60));
+}
+sub calculate_uptime_hours {
+ my $starttime = shift @_;
+ return sprintf('%.2f', (time - $starttime) / 3600);
+}
+sub private_javascript {
+ my($alias, $room, $javascript) = @_;
+ open MSGFILE, ">>data/msgs/$room";
+ print MSGFILE "$alias<;" . time . qq[<;!<;!<;<script language="JavaScript">$javascript</script><;\n];
+ close MSGFILE;
+ opendir PID, "data/online/pids/$room";
+ my(@pids) = readdir PID;
+ closedir PID;
+ foreach $_ (@pids) {
+ kill 'USR1', $_ if -f "data/online/pids/$room/$_";
+ }
+}
+sub get_theme {
+ my $room = shift @_;
+ open RSTAT, "data/online/rstat/$room";
+ my(@rstat) = <RSTAT>;
+ close RSTAT;
+ chomp $rstat[1];
+ return '<b>Raumthema:</b>' . $rstat[1] if $rstat[1] ne undef;
+}
+sub get_room {
+ my $alias = shift @_;
+ opendir DIR, 'data/online/rooms';
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach my $room (@dir) {
+ opendir DIR, "data/online/rooms/$room";
+ my(@chatter) = readdir DIR;
+ closedir DIR;
+ foreach my $chatter (@chatter) {
+ return $room if $chatter eq $alias;
+ }
+ }
+ return undef;
+}
+sub debug {
+ open DEBUG, '>data/debug';
+ while (@_) {
+ chomp $_;
+ print DEBUG "$_\n";
+ }
+ close DEBUG;
+}
+1;
diff --git a/0.7.2/modules/start.pm b/0.7.2/modules/start.pm
new file mode 100644
index 0000000..6b1ce0f
--- /dev/null
+++ b/0.7.2/modules/start.pm
@@ -0,0 +1,254 @@
+sub start {
+ if ($var eq 'create_alias_html') {
+ &create_alias_html;
+ }
+ elsif ($var eq 'create_alias') {
+ &create_alias;
+ }
+ elsif ($var eq 'login_html') {
+ &login_html;
+ }
+ elsif ($var eq 'chatiquette_html') {
+ &chatiquette_html;
+ }
+ elsif ($alias eq '') {
+ &login_html;
+ }
+ else {
+ &checklogin;
+ }
+}
+sub login_html {
+ &check_online;
+ local $counter = undef;
+ open COUNT, '<data/count';
+ $counter = <COUNT>;
+ close COUNT;
+ ++$counter;
+ open COUNT, '>data/count';
+ flock COUNT, 2;
+ print COUNT $counter;
+ close COUNT;
+ opendir USERS, 'data/online/users';
+ my(@users) = readdir USERS;
+ closedir USERS;
+ opendir REGISTRED, 'data/user/options';
+ local(@registred) = readdir REGISTRED;
+ closedir REGISTRED;
+ my($logtin, $users) = ($#users - 1, $#registred - 1);
+ &start_html("Created & Copyright by Paul C. B\374tow", 'start');
+ print qq[ <center>\n <table width=500>\n <tr>\n <td>\n <center>\n <table>\n <tr>\n <td>\n <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0" WIDTH=240 HEIGHT=240>\n <param name=movie value="$gfxpath/yIntro.swf">\n <param name=loop value=false>\n <param name=menu value=false>\n <param name=quality value=high>\n <param name=scale value=noborder>\n <param name=wmode value=opaque>\n <param name=bgcolor value=$bgcolor>\n <embed src="$gfxpath/yIntro.swf" loop=false menu=false quality=high scale=noborder wmode=opaque bgcolor=$bgcolor WIDTH=240 HEIGHT=240 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED>\n </object>\n </td>\n <td>\n <div>\n yChat: Version $version\n <br><br>\n Letztes Update: $datum\n <br><br>\n Seitenaufrufe: $counter\n <br><br>\n Benutzer registriert: $users\n <br><br>\n Benutzer online: $logtin\n <br><br>\n Benutzerlimit: $limit\n <br><br>\n Server: $localhost:$localport\n <br><br>\n Page: <a href="http://www.yChat.org">www.yChat.org</a>\n </div>\n </td>\n </tr>\n </table>\n </center>\n </div>\n <br>\n <br>\n];
+ if ($tmp eq 'true') {
+ print qq[ <div class=b>\n ACHTUNG!\n </div>\n <div>\n Wahrscheinlich existiert Dein Alias "$alias" nicht,\n <br>\n Du hast Dich verschrieben oder das Passwort ist falsch.\n <br>\n Versuch es erneuert !\n </div>\n];
+ }
+ elsif ($tmp eq 'quit') {
+ print qq[ <div>\n Du hast soeben den Chat verlassen.\n <br>\n Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)\n </div>\n];
+ }
+ elsif ($tmp eq 'autologout') {
+ print qq[ <div>\n Du wurdest automatisch aus dem Chat ausgeloggt. Grund: Du warst 20 Minuten inaktiv.\n <br>\n Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)\n </div>\n];
+ }
+ elsif ($tmp eq 'autokick') {
+ print qq[ <div>\n Du wurdest automatisch aus dem Chat katapultiert. Grund: Du hast den Chat geflutet!\n <br>\n Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)\n </div>\n];
+ }
+ elsif ($tmp eq 'banned') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Du wurdest aus dem Chat verbannt!!!\n <br>\n Z.z. kannst Du Dich leider nicht in den Chat einloggen.\n <br>\n Sorry!\n </div>\n";
+ }
+ elsif ($tmp eq 'kick') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Du wurdest soeben aus dem Chat katapultiert!\n <br>\n Schlechtes Verhalten mag die Ursache hierf\374r sein.\n <br>\n Sorry!\n </div>\n";
+ }
+ elsif ($tmp eq 'selfkill') {
+ print qq[ <div>\n Du hast dich soeben ganz und gar aus dem System gel\366scht!\n <br>\n Wenn du dir einen neuen Nick angelen willst, dann einfach auf "Registrieren" klicken! :-)\n </div>\n];
+ }
+ elsif ($tmp eq 'selfkill') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Du wurdest soeben aus dem Chat ausgeloggt!\n <br>\n Ursache hierf\374r mag sein, da\337 der Chat voll war und Du Dich nicht am\n Geschehen beteiligt- und unn\366tige Chatkapazit\344ten in Anspruch\n genommen hast.\n <br>\n Sorry!\n </div>\n";
+ }
+ elsif ($tmp eq 'full') {
+ print "<div class=b>ACHTUNG!</div><div>Der Chat ist leider voll! Bitte versuch Dich sp\344ter noch mal einzuloggen!</div>";
+ }
+ elsif ($var eq 'create_alias') {
+ print q[<div>Du hast sich soeben in die Datenbank eingetragen. Einfach auf "Los Geht's" klicken :-)</div>];
+ }
+ else {
+ print qq[ <div>\n Herzlich willkommen!\n <br>\n Einfach Daten eingeben und auf "Los Geht's" klicken :-)\n </div>\n];
+ }
+ print qq[ <hr>\n <form name="login" action="chat" method="GET">\n <input type="hidden" name="request" value="start">\n <input type="hidden" name="tmp" value="true">\n <table>\n <tr>\n <td>\n <div>\n Dein Alias:\n <br>\n <input name="alias" value="$alias">\n </div>\n </td>\n <td>\n <div>\n Dein Passwort:\n <br>\n <input type="password" name="pw" value="$pw">\n </div>\n </td>\n </tr>\n </table>\n <br>\n <br>\n <div>\n Solltest Du noch keinen Nick besitzen, dann auf "Registrieren" klicken!\n </div>\n <br>\n <table>\n <tr>\n <td>\n <font color="ffffff">\n <input type="submit" value="Los geht's!">\n </font>\n </form>\n </td>\n <td>\n <form action="chat">\n <input type="hidden" name="request" value="start">\n <input type="hidden" name="var" value="create_alias_html">\n <font color="ffffff">\n <input type="submit" value="Registrieren">\n </font>\n </form>\n </td>\n </tr>\n </table>\n <hr>\n];
+ if ($logtin > 0) {
+ print q[<div>Folgende Personen sind eingeloggt:<br><font size='1'>];
+ foreach $_ (@users) {
+ print "$_ " if -f "data/online/users/$_";
+ }
+ print '</font></div>';
+ }
+ print " </td>\n </tr>\n </table>\n </center>\n</body>\n</html>\n";
+ if (-d 'data/online/rooms') {
+ ();
+ }
+ else {
+ mkdir 'data/online/rooms', 511;
+ }
+}
+sub create_alias_html {
+ open BAN, '<data/ban';
+ my(@ban) = <BAN>;
+ close BAN;
+ foreach $_ (@ban) {
+ chomp $_;
+ if ($_ eq 'ip://' . $client->peerhost) {
+ $tmp = 'banned';
+ &login_html;
+ $client->shutdown(2);
+ exit 0;
+ }
+ }
+ my $reload = $_[0];
+ &start_html('Registration');
+ print " <center>\n <table width=500>\n <tr>\n <td>\n";
+ if ($reload eq 'alias_exists') {
+ print qq[ <div class=b>\n ACHTUNG!\n </div>\n <div>\n Der von Dir gew\344hlte Benutzername "$alias" existiert in unserer Datenbank bereits. Bitte versuch es erneuert mit\n einem anderen Benutzernamen !\n </div>\n <hr>\n];
+ }
+ elsif ($reload eq 'pw_wrong') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Deine beiden Passworteingaben stimmen nicht \374berein. Bitte geb das Passwort erneuert an um sicherzugehen, da\337\n kein falsches Passwort abgespeichert wird !\n </div>\n <hr>\n";
+ }
+ elsif ($reload eq 'alias_prohibited') {
+ print qq[ <div class=b>\n ACHTUNG!\n </div>\n <div>\n Dein gew\344hlter Benutername "$alias" enth\344lt illegale Zeichen. Bitte versuch einen anderen Benutzernamen!\n </div>\n <hr>\n];
+ }
+ elsif ($reload eq 'alias_length') {
+ print qq[ <div class=b>\n ACHTUNG!\n </div>\n <div>\n Dein gew\344hlter Benutername "$alias" enth\344lt zu viele Zeichen. Es sind maximal 15 Zeichen erlaubt!!\n </div>\n <hr>\n];
+ }
+ else {
+ print " <div>\n Hier kannst Du Dich registrieren. Bitte beachte, da\337 die Passworteingabefelder \374bereinstimmen!\n </div>\n <hr>\n";
+ }
+ print qq[ <form action="chat">\n <input type="hidden" name="request" value="start">\n <input type="hidden" name="var" value="create_alias">\n <div>\n Dein Alias:\n <font color="ffa500">\n (Mu\337 angegeben werden)\n </font>\n <br>\n <input name="alias" VALUE="$alias">\n </div>\n <br>\n <div>\n Dein gew\374nschtes Passwort:\n <br>\n <input type="password" name="pw" value="$pw">\n </div>\n <br>\n <div>\n Geb hier Dein Passwort erneuert ein:\n <br>\n <input type="password" name="tmp">\n </div>\n <br>\n <font color=ffffff>\n <input type="submit" value="Registrieren">\n </font>\n <br>\n </form>\n <hr>\n <div>\n Um den Chat zu betreten m\374ssen die Daten nach der Registration auf der Startseite erneuert best\344tigt werden !\n </div>\n </td>\n </tr>\n </table>\n</center>\n</body>\n</html>\n];
+}
+sub checklogin {
+ opendir USERS, 'data/online/users';
+ my(@users) = readdir USERS;
+ closedir USERS;
+ my $users = $#users;
+ if ($users > $limit && 3 > &hierachie($alias)) {
+ $tmp = 'full';
+ &login_html;
+ $client->shutdown(2);
+ exit 0;
+ }
+ my $lognotexists = 'true';
+ opendir USERDIR, 'data/user/options';
+ my(@userdir) = readdir USERDIR;
+ closedir USERDIR;
+ foreach $user (@userdir) {
+ if ($user eq $alias) {
+ open OPTIONS, "<data/user/options/$alias";
+ my(@options) = <OPTIONS>;
+ close OPTIONS;
+ foreach $_ (@options) {
+ chomp $_;
+ }
+ if ($options[0] eq $pw) {
+ open BAN, '<data/ban';
+ my(@ban) = <BAN>;
+ close BAN;
+ foreach $_ (@ban) {
+ chomp $_;
+ if ($_ eq $alias or $_ eq 'ip://' . $client->peerhost) {
+ if (-f "data/online/users/$admin") {
+ &post_prv($admin, "<font color=ffffff><font color=ffa500>$_</font> kann sich nicht einloggen (Ist verbannt)!!</font>");
+ }
+ $tmp = 'banned';
+ &login_html;
+ $client->shutdown(2);
+ exit 0;
+ }
+ }
+ if ($options[1] eq undef) {
+ $col = &random_color;
+ }
+ else {
+ $col = $options[1];
+ }
+ if ($options[2] eq undef) {
+ $secol = &random_color;
+ }
+ else {
+ $secol = $options[2];
+ }
+ if ($options[3] eq undef) {
+ $maxVerlauf = '10';
+ }
+ else {
+ $maxVerlauf = $options[3];
+ }
+ if ($options[4] eq undef) {
+ $verlaufOrder = '1';
+ }
+ else {
+ $verlaufOrder = $options[4];
+ }
+ &rm_if_loggedin($alias);
+ my(@digit) = (('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'), (0, 1, 2, 3, 4, 5, 6, 7, 8, 9), '-', '.');
+ my $num1 = rand @digit;
+ my $num2 = rand @digit;
+ my $num3 = rand @digit;
+ my $num4 = rand @digit;
+ my $num5 = rand @digit;
+ my $num6 = rand @digit;
+ my $num7 = rand @digit;
+ my $num8 = rand @digit;
+ my $num9 = rand @digit;
+ my $num10 = rand @digit;
+ $tmpid = $digit[$num1] . $digit[$num2] . $digit[$num3] . $digit[$num4] . $digit[$num5] . $digit[$num6] . $digit[$num7] . $digit[$num8] . $digit[$num9] . $digit[$num10];
+ open TMPID, ">data/online/tmpid/$alias.$tmpid";
+ print TMPID $alias;
+ close TMPID;
+ open IDENT, ">data/online/ident/$alias";
+ print IDENT $client->peerhost . "\n$tmpid\n" . $client->peerhost . ':' . $client->peerport;
+ close IDENT;
+ open LASTLOGIN, ">data/user/lastlogin/$alias";
+ print LASTLOGIN time;
+ close LASTLOGIN;
+ &frameset_html;
+ $client->shutdown(2);
+ exit 0;
+ }
+ else {
+ $lognotexists = 'false';
+ }
+ }
+ }
+ &login_html;
+}
+sub create_alias {
+ if ($alias =~ /\W/ or $alias eq '') {
+ goto CREATE if $alias =~ /[-]/ and not $alias =~ /\W/;
+ &create_alias_html('alias_prohibited');
+ $client->shutdown(2);
+ exit 0;
+ }
+ elsif ($pw ne $tmp) {
+ &create_alias_html('pw_wrong');
+ $client->shutdown(2);
+ exit 0;
+ }
+ elsif (length $alias >= 15) {
+ &create_alias_html('alias_length');
+ $client->shutdown(2);
+ exit 0;
+ }
+ CREATE: opendir USERDIR, 'data/user/options';
+ my(@user) = readdir USERDIR;
+ close USERDIR;
+ foreach $user (@user) {
+ if ($user eq $alias) {
+ &create_alias_html('alias_exists');
+ $client->shutdown(2);
+ exit 0;
+ }
+ }
+ open OPTIONS, ">data/user/options/$alias";
+ print OPTIONS $pw . "\n";
+ close OPTIONS;
+ &login_html;
+}
+sub frameset_html {
+ print qq[<html>\n <head>\n <title>\n $title\n </title>\n </head>\n<frameset border=0 frameborder=0 framespacing=0 cols="130,*">\n <frameset border=0 frameborder=0 framespacing=0 rows="*,55">\n <frame name="online" src="chat?request=online&room=$loginplace&alias=$alias&tmpid=$tmpid">\n <frameset border=0 frameborder=0 framespacing=0 cols="70,*">\n <frame name="logo" src="chat?request=htdocs&var=logo_html" scrolling="no">\n <frame name="reload" src="chat?request=htdocs" scrolling="no">\n </frameset>\n </frameset>\n <frameset border=0 frameborder=0 framespacing=0 rows="*,55">\n <frame name='main' src='chat?request=loggedin&alias=$alias&col=$col&secol=$secol&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder'>\n <frame name="input" src="chat?request=htdocs" scrolling="no">\n </frameset>\n</frameset>\n</html>\n];
+}
+'???';
diff --git a/0.7.2/modules/statistic.pm b/0.7.2/modules/statistic.pm
new file mode 100644
index 0000000..cb98c3a
--- /dev/null
+++ b/0.7.2/modules/statistic.pm
@@ -0,0 +1,148 @@
+sub statistic {
+ &start_html('Statistiken');
+ &menu;
+ print $q->div('yChat Statistiken'), $q->hr, $q->div($q->a({-'href', "chat?request=statistic&var=ranking&alias=$alias&tmpid=$tmpid"}, 'Rankings'), ' | ', $q->a({-'href', "chat?request=statistic&var=del&alias=$alias&tmpid=$tmpid"}, 'Loginstatistiken'), ' | ', $q->a({-'href', "chat?request=statistic&var=statistic&alias=$alias&tmpid=$tmpid"}, 'DB-Statistik'), ' | ', $q->a({-'href', "chat?request=statistic&var=var&alias=$alias&tmpid=$tmpid"}, 'Umgebungsvariablen')), $q->hr;
+ if ($var eq 'ranking') {
+ opendir COUNTS, 'data/user/counts';
+ my(@counts) = readdir COUNTS;
+ closedir COUNTS;
+ print '<div>';
+ my $nr_start = $start;
+ my $nr_end = $end;
+ my %online;
+ my $rank;
+ my $nr;
+ foreach $_ (@counts) {
+ if (-f "data/user/counts/$_") {
+ if (s/.online//g) {
+ open TOTAL, "<data/user/counts/$_.online";
+ my $total = <TOTAL>;
+ close TOTAL;
+ $online{sprintf '%.2f', $total / 3600} = $_;
+ }
+ }
+ }
+ print '<div>', $q->b('Rankings:'), $q->br, '<table><tr><td><div><b>#:</b></div></td><td><b><div>St.:</div></b></td><td><b><div>Name:</div></b></td></tr>';
+ if (not $nr_start) {
+ $nr_start = 1;
+ }
+ if (not $nr_end) {
+ $nr_end = 20;
+ }
+ foreach $wert (reverse (sort { $a <=> $b } keys %online)) {
+ ++$nr;
+ if ($online{$wert} eq $alias) {
+ $rank = $nr;
+ last if $nr > $nr_end;
+ }
+ next if ($nr < $nr_start or $nr > $nr_end);
+ print q[<tr><td><font color='ffffff' size='1' face='arial'>] . $nr . q[</font></td><td><font color='ffffff' size='1' face='arial'> ] . $wert . "h </font></td><td> <a href='chat?request=divcom&var=alias_html&alias=$alias&tmp=$online{$wert}&tmpid=$tmpid'><font size='1' face='arial'>$online{$wert}</font></a></td></tr>\n";
+ }
+ print '</table>', $q->hr;
+ $nr_start -= 20;
+ $nr_end -= 20;
+ print "Rankings von <a href='chat?request=statistic&var=ranking&start=$nr_start&end=$nr_end&alias=$alias&tmpid=$tmpid'>$nr_start bis $nr_end</a> anzeigen ...<br>" if $nr_start > 0;
+ $nr_start += 40;
+ $nr_end += 40;
+ print "Rankings von <a href='chat?request=statistic&var=ranking&start=$nr_start&end=$nr_end&alias=$alias&tmpid=$tmpid'>$nr_start bis $nr_end</a> anzeigen ...", $q->br, $q->br, $q->b("$alias, Du befindest Dich auf Rank $rank</div>");
+ }
+ elsif ($var eq 'del') {
+ print '<div>', $q->b('Alte Benutzer l&ouml;schen:'), $q->br, "Benutzer, die sich 1440 Stunden (60 Tage) nicht mehr in das System eingeloggt haben, werden gel\366scht.", $q->br, $q->br;
+ opendir USER, 'data/user/options';
+ my(@user) = readdir USER;
+ closedir USER;
+ @user = sort(@user);
+ my $i = 0;
+ my $j;
+ my $k = 0;
+ my $l = 0;
+ my $full = $tmp;
+ foreach $_ (@user) {
+ if (-f "data/user/lastlogin/$_") {
+ open LOGIN, "<data/user/lastlogin/$_";
+ my $login = <LOGIN>;
+ close LOGIN;
+ $login = sprintf('%.2f', (time - $login) / 3600);
+ ++$j;
+ if (999 < $login and $login < 1440) {
+ ++$k;
+ print $q->font({-'color', 'ffa500'}, $q->b("$j($k) $_ Letztes Login vor: " . $login . 'h')), $q->br, "\n" if $full ne undef;
+ }
+ elsif ($login < 48) {
+ ++$l;
+ print $q->font({-'color', 'ffffef'}, $q->b("$j($l) $_ Letztes Login vor: " . $login . 'h')), $q->br, "\n" if $full ne undef;
+ }
+ elsif ($login < 1440) {
+ print "$j $_ Letztes Login vor: " . $login . 'h', $q->br, "\n" if $full ne undef;
+ }
+ else {
+ ++$k;
+ &kill_it($_, $i++, $login);
+ }
+ }
+ elsif (-f "data/user/options/$_") {
+ &kill_it($_, $i++);
+ }
+ }
+ print $q->hr if $full ne undef;
+ print '</div>', $q->div($q->b("$j Benutzer befinden sich in der Datenbank!", $q->br, $q->font({-'color', 'ffffef'}, "$l Benutzer haben sich innerhalb der letzten 48 Stunden eingeloggt!"), $q->br, $q->font({-'color', 'ffa500'}, "$k Benutzer haben sich &uuml;ber 1000 Stunden nicht mehr eingeloggt!"), $q->br, $q->font({-'color', 'ff0000'}, "$i Benutzer wurden gerade eben gel\366scht!")), $q->br, $q->br, 'PS: Jeder registrierte Benutzername wird nur einmal gez&auml;hlt!');
+ print $q->br, $q->div('(', $q->a({-'href', "chat?request=statistic&var=del&tmp=true&alias=$alias&tmpid=$tmpid"}, 'Vollst&auml;ndige Ansicht'), ')') if $full eq undef;
+ }
+ elsif ($var eq 'var') {
+ print '<div>', $q->b('Server Umgebungsvariablen:'), $q->br, $q->br, 'Die Serverumgebungsvariablen k&ouml;nnen nur von Oberw&auml;chtern oder h&ouml;her eingesehen werden!', $q->br, $q->br;
+ if (5 <= &hierachie($alias)) {
+ while (($key, $value) = each %ENV) {
+ print "$key = $value\n", $q->br;
+ }
+ }
+ print '</div>';
+ }
+ elsif ($var eq 'statistic') {
+ print $q->div($q->b('yChat-DB Statistik:')), $q->br;
+ $files = 0;
+ $size = 0;
+ $directorys = 1;
+ &zaehle('data');
+ $size = sprintf('%.2f', $size / 1048576);
+ print $q->div("Dateien insgesamt: $files", $q->br, "MB insgesamt: $size", $q->br, "Verzeichnisse insgesamt: $directorys");
+ }
+ print $q->end_html;
+}
+sub zaehle {
+ local($dir, $data) = @_;
+ $dir = "$dir/$data" if $data ne undef;
+ opendir DATA, $dir;
+ local(@data) = readdir DATA;
+ closedir DATA;
+ $files2 = 0;
+ foreach $_ (@data) {
+ if (-f "$dir/$_") {
+ ++$files;
+ ++$files2;
+ $size += -s "$dir/$_";
+ }
+ elsif (-d "$dir/$_" and $_ ne '.' and $_ ne '..') {
+ ++$directorys;
+ &zaehle($dir, $_);
+ }
+ }
+}
+sub kill_it {
+ my($rm, $nr, $login) = @_;
+ $login = 'XXXXXX' if $login eq undef;
+ print $q->font({-'color', 'ff0000'}, $q->b("$j($nr) $rm Letztes Login vor: " . $login . 'h (wurde gel&ouml;scht)')), $q->br, "\n";
+ print q[<font size='1'>];
+ print 'options ' if unlink "data/user/options/$rm";
+ print 'profiles ' if unlink "data/user/profiles/$rm";
+ print 'gbooks ' if unlink "data/user/gbooks/$rm";
+ print 'counts ' if unlink "data/user/counts/$rm";
+ print 'counts.online ' if unlink 'data/user/counts/' . $rm . '.online';
+ print 'lastlogin ' if unlink "data/user/lastlogin/$rm";
+ print 'memos' if unlink "data/user/memos/$rm";
+ print '</font>', $q->hr, "\n";
+ &zeit;
+ open DEL, '>>data/kill';
+ print DEL "($day.$month.$year $hours:$min:$sec) $rm wurde automatisch gekillt [$alias]\n";
+ close DEL;
+}
+1;
diff --git a/0.7.2/modules/stream.pm b/0.7.2/modules/stream.pm
new file mode 100644
index 0000000..af380bb
--- /dev/null
+++ b/0.7.2/modules/stream.pm
@@ -0,0 +1,170 @@
+sub stream {
+ &secure_checkid($alias, $tmpid);
+ my $pid = $$;
+ $SIG{'CHLD'} = 'IGNORE';
+ ++$|;
+ open RSTAT, "<data/online/rstat/$room";
+ my(@rstat) = <RSTAT>;
+ close RSTAT;
+ if ($rstat[0] eq "1\n") {
+ if (3 <= &hierachie($alias)) {
+ print "<font color='ffffff'>Der Raum <font color='ffa500'>$room</font> ist leider abgesperrt! Du wirst in den Ram <b>$standardroom</b> umgeleitet ...</font>";
+ $room = $standardroom;
+ }
+ }
+ print qq[<html>\n <head>\n<script language="JavaScript">\n<!--\n open('chat?request=online&room=$room&alias=$alias&tmpid=$tmpid','online');\n open('chat?request=input&alias=$alias&room=$room&col=$col&secol=$secol&tmp=login&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder','input');\n\n// open('chat?request=input&alias=$alias&room=$room&col=$col&secol=$secol&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder','input');\n\n// Scroll-Routine von Anklepper (http://www.anklepper.de)\n// speziell f\374r yChat (http://www.yChat.de), Copyright 2000\nscrolling = true;\nmoves_steps = 4;\nmoves_interval = 4;\nfunction moves()\n{\n if( scrolling != false )\n window.scrollBy( 0, moves_steps );\n window.setTimeout( "moves()", moves_interval );\n}\nmoves();\n//-->\n</script>\n</head>\n<body bgcolor="$chatbg">\n];
+ unlink "data/online/rooms/$loginplace/$alias";
+ &check_online;
+ print "<font size=1 color=ffffff face=arial>$title - Letzte &Auml;nderung $datum\n; Der Chat wird geladen...\n<br>";
+ sleep 1;
+ print "<b>Hallo <font color=$col>$alias</font></b>, mit dem Befehl /menu kannst du das Chat-Men&uuml; aufrufen!<br>";
+ sleep 1;
+ print "Du befindest dich im Raum <b>$room</b>: " . get_theme($room) . "<br>\n";
+ print "</font>\n";
+ if (-f "data/user/memos/$alias") {
+ open MEMOS, "<data/user/memos/$alias";
+ my(@memos) = <MEMOS>;
+ close MEMOS;
+ my $memos;
+ foreach $_ (@memos) {
+ $memos .= $_;
+ }
+ print $memos;
+ unlink "data/user/memos/$alias";
+ }
+ OPENMSGFILE: my $change_room = 0;
+ my $startime = time;
+ my $flooding = 0;
+ my @ignore;
+ my @flood;
+ unless (-f "data/online/rstat/$room") {
+ open DATEI, ">data/online/rstat/$room";
+ print DATEI "0\n\n$alias<;1\n";
+ close DATEI;
+ }
+ open DATEI, ">data/online/users/$alias";
+ print DATEI time;
+ close DATEI;
+ open DATEI, ">data/online/rooms/$room/$alias";
+ print DATEI time;
+ close DATEI;
+ if (-e "data/msgs/$room") {
+ open MSGFILE, "<data/msgs/$room";
+ mkdir 'data/online/pids', 511 unless -d 'data/online/pids';
+ mkdir "data/online/pids/$room", 511 unless -d "data/online/pids/$room";
+ open PID, ">data/online/pids/$room/$pid";
+ print PID time;
+ close PID;
+ }
+ else {
+ sleep 1;
+ goto OPENMSGFILE;
+ }
+ &sendmsgs;
+ while (-f "data/online/users/$alias") {
+ local $SIG{'USR1'} = \&sendmsgs;
+ goto OPENMSGFILE if $change_room == 1;
+ sleep 15;
+ print "\n";
+ }
+ sub sendmsgs {
+ for ($curpos = tell MSGFILE; defined($_ = <MSGFILE>); $curpos = tell MSGFILE) {
+ my($address, $stamp, $command, $action, $message, $from) = split(/<;/, $_, 7);
+ if ($address =~ /$\!/ or $address eq $alias) {
+ if ($stamp > $startime) {
+ if ($command eq 'col') {
+ ($col, $secol) = split(/;/, $action, 3);
+ }
+ elsif ($command eq 'cr') {
+ unlink "data/online/pids/$room/$pid";
+ $room = $action;
+ close MSGFILE;
+ $change_room = 1;
+ }
+ elsif ($command eq 'ig') {
+ my @temp;
+ my $add2list = 1;
+ foreach $_ (@ignore) {
+ if ($action ne $_) {
+ push @temp, $_;
+ }
+ else {
+ $add2list = 0;
+ }
+ }
+ if ($add2list == 1) {
+ push @ignore, $action;
+ print "<font color='#ffffff'><font color='#ffa500'>$action</font> wird nun ignoriert!</font><br>\n";
+ &post_prv_extra($action, "<font color='#ff0000'>Du wirst nun von $alias ignoriert!</font>");
+ }
+ else {
+ @ignore = @temp;
+ print "<font color='#ffffff'><font color='#ffa500'>$action</font> wird nun nicht mehr ignoriert!</font><br>\n";
+ &post_prv_extra($action, "<font color='#ff0000'>Du wirst nun von $alias nicht mehr ignoriert!</font>");
+ }
+ }
+ elsif ($command eq 'igl') {
+ my $ignored;
+ foreach $_ (@ignore) {
+ $ignored .= "$_ ";
+ }
+ if ($#ignore == -1) {
+ print "<font color='#ffffff'>Momentan wird keine Person von dir ignoriert!</font><br>\n";
+ }
+ else {
+ print "<font color='#ffffff'>Folgende Personen werden von dir ignoriert: <font color='#ffa500'>$ignored</font>!</font><br>\n";
+ }
+ }
+ elsif ($command eq 'quit') {
+ print "<script language='JavaScript'>\n";
+ print "open('chat?request=online&room=$loginplace&alias=$alias&tmpid=$tmpid','online');\n";
+ print "open('chat?request=htdocs','input');\n";
+ print "open('chat?request=loggedin&alias=$alias&col=$col&secol=$secol&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder','main');\n";
+ print "</script>\n";
+ last;
+ }
+ elsif ($change_room != 1) {
+ my $ignored = 0;
+ foreach $_ (@ignore) {
+ if ($_ eq $from) {
+ $ignored = 1;
+ last;
+ }
+ }
+ if ($ignored != 1) {
+ print "$message\n";
+ }
+ else {
+ $address =~ s/!//;
+ &post_prv_extra($from, "<font color='#ff0000'>Du wirst von $alias ignoriert!</font>") if $address eq $alias;
+ }
+ }
+ push @flood, $address . $command . $action . $message . $from;
+ if ($flood[0] eq $flood[1] and $flood[0] eq $flood[2] and $flood[0] eq $flood[3]) {
+ print "<i><font color=red>$from flutet den Chat !</font></i><br>\n";
+ if ($from eq $alias and $flooding++ and $flooding >= 4) {
+ print "<script language='JavaScript'>open('chat?request=start&tmp=autokick','_top');</script>\n";
+ &rm_alias($alias, $room);
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='ffa500'><b>Das System</b></font> katapultiert <b>$alias</b> wegen Fluten des Chats nach draussen ... </font></i>", $alias);
+ }
+ }
+ else {
+ $flooding = 0;
+ }
+ shift @flood if $#flood > 2;
+ }
+ }
+ }
+ seek MSGFILE, $curpos, 0;
+ }
+ unlink "data/online/pids/$room/$pid";
+}
+sub post_prv_extra {
+ my($alias, $message) = @_;
+ my $helpid = fork;
+ if ($helpid == 0) {
+ &post_prv($alias, $message);
+ exit 0;
+ }
+}
+1;
diff --git a/0.7.2/setup.sh b/0.7.2/setup.sh
new file mode 100644
index 0000000..342e9c7
--- /dev/null
+++ b/0.7.2/setup.sh
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+mke2fs /dev/ram0
+mke2fs /dev/ram1
+
+mkdir data
+cd data
+mkdir {logs,msgs,user,online}
+mount /dev/ram0 msgs
+mount /dev/ram1 online
+cd user
+mkdir {counts,memos,options,profiles,gbooks,lastlogin}
+cd ../online
+mkdir {rstat,rooms,pids,users,ident,tmpid}
+cd ..
+cdhmod 777 * -R
+chown paul * -R
+
diff --git a/0.7.2/templates/chatiq.sno b/0.7.2/templates/chatiq.sno
new file mode 100644
index 0000000..2a024f5
--- /dev/null
+++ b/0.7.2/templates/chatiq.sno
@@ -0,0 +1 @@
+<div><h2>Chatiquette</h2></div><hr><div>Hier einige Grundlagen ...</div><style type="text/css"> li { color: #ffffff }</style><ul><li><div>Vergiss nie, dass am anderen Ende auch nur Menschen sitzen. Diese m&ouml;gen es gar nicht, angep&ouml;belt, beleidigt oder in sonstiger Weise angegriffen zu werden.</div></li><li><div>St&ouml;rend ist auch immer, wenn ein privater Streit im Chat ausgetragen wird. Tragt eure privaten Sachen ausserhalb des Chats aus.<br>Selbst wenn es nur Spass ist - weiss der Rest im Chat das?</div></li><li><div>Dauergeschrei f&auml;llt auch immer wieder st&ouml;rend auf. Was in Grossbuchstaben geschrieben wird, wird als Schreien bezeichnet.</div></li><li><div>Unsere ganz besonderen Spezialisten wollen auch immer wieder rausfliegen. Um das zu erreichen, senden sie die ganze Zeit Unsinn.</div></li><li><div>Diskussionen sind dagegen kein Problem. Daf&uuml;r ist ein Chat ja da. Sobald allerdings das Thema der Diskussion zu sehr entgleist, sollte die Diskussion in einen etwas weniger &ouml;ffentlichen Raum verlegt werden.</div></li></ul><div>Daraus ergeben sich folgende Regeln:</div><ul><li><div>keinen beleidigenden Wortschatz verwenden</div></li><li><div>obz&ouml;ner und verfassungsfeindlicher Wortschatz f&auml;llt auch weg</div></li><li><div>streitet euch woanders oder in einem privaten Raum</div></li><li><div>schreit nich so viel</div></li><li><div>schreibt keinen Unsinn, der so aussieht, als ob eure Katze über die Tastatur gelaufen ist</div></li><li><div>schreibt nicht zu schnell hintereinander, besonders nicht dasselbe</div></li><li><div>verlagert die Diskussion, wenn sich jemand gest&ouml;rt f&uuml;hlt</div></li><li><div>Diese Liste ist nicht vollst&auml;ndig. Mit dem gesunden Menschenverstand sollte es eigentlich m&ouml;glich sein, sich die nicht aufgef&uuml;hrten Punkte zu denken.</div></li></ul><div>So - nach den ganzen "lass-es-bessers" noch ein paar &Uuml;berlebenstips:</div><ul><li><div>beachte die oben stehenden Punkte ;-)</div></li><li><div>es macht sich immer gut, beim Reinkommen mal zu gr&uuml;ssen</div></li><li><div>warte nicht, bis man/frau dich anspricht - werde selbst aktiv und gib deinen Senf dazu</div></li><li><div>es gibt meist kein allgemein anerkanntes Gespr&auml;chsthema - lies dich einfach rein</div></li><li><div>die frage &quot;wer will chatten&quot; ist eigentlich &uuml;berfl&uuml;ssig in einem Chat (wir warten doch alle nur aufs Ufo ;-)</div></li><li><div>fang nich sofort mit den W-Fragen (woher, wie alt, weiblich oder männlich?) an - es st&ouml;rt einige Leute</div></li></ul><div>Problematisch f&uuml;r die W&auml;chter und Oberw&auml;chter ist:</div><ul><li><div>&quot;der nervt mich - schmeiss den mal raus&quot; ist oft nicht nachvollziehbar, weil der W&Auml; oder OW die Vorgeschichte - die vielleicht ausserhalb des yChat stattgefunden hat - nicht kennt oder keinen Beweis daf&uuml;r hat.</div></li></ul><hr><div><h2>Richtlinien f&uuml;r den gestressten W&Auml; und OW:</h2></div><ul><li><div>Du hast die Macht - aber mi&szlig;brauche sie nicht!</div></li><li><div>Leute, die ganz offensichtlich st&ouml;ren wollen und dabei den Chatbetrieb massiv behindern, sofort rausschmeissen! Kriterien dazu:</div><ul><li><div>Fluten des Chats</div></li><li><div>Wiederholung von Parolen</div></li><li><div>Exzessive Nutzung von zuf&auml;lligen Buchstaben-/Zeichenfolgen</div></li><li><div>usw...</div></li></ul></li><li><div>Bei den anderen vorher noch eine Warnung aussprechen...</div></li><li><div>Nicht vergessen: auch f&uuml;r euch gelten die oben aufgef&uuml;hrten Regeln!</div></li><li><div>Vergabe von Raumbesetzer- und W&auml;chterrechten:<br>(dies gilt f&uuml;r RB-Vergabe in der Cyberbar, W&Auml; allgemein)</div><ul><li><div>Um RB oder W&Auml; betteln wird schon mal gar nicht beachtet.</div></li><li><div>Wer W&Auml; wird, soll sichs verdienen - z.B. durch h&auml;ufiges Helfen bei Neulingen.</div></li><li><div>Ein W&Auml; sollte schon &ouml;fter im Chat sein.</div></li><li><div>Oberw&auml;chter zu werden ist sehr schwierig. Frag gar nicht erst danach ;-)</div></li></ul></ul><div>Wer meint, von einem W&auml;chter oder Oberw&auml;chter ungerecht behandelt worden zu sein (z.B. weil dieser wegen persönlichen Streitigkeiten rausschmeisst), richte seine Klage an einen Oberw&auml;chter oder direkt an den obersten Boss: Snooper (<a href="mailto:admin@ychat.de">admin@ychat.de</a>).</div> \ No newline at end of file
diff --git a/0.7.2/templates/colors.sno b/0.7.2/templates/colors.sno
new file mode 100644
index 0000000..3640b9e
--- /dev/null
+++ b/0.7.2/templates/colors.sno
@@ -0,0 +1,290 @@
+ <table cellspacing=0 cellpadding=5 border=0>
+ <tr>
+ <td bgcolor="000000"><span style="color:#FFFFFF; text-decoration:line-through;">000000</span></td>
+ <td bgcolor="000033"><span style="color:#FFFFFF; text-decoration:line-through;">000033</span></td>
+ <td bgcolor="000066"><span style="color:#FFFFFF; text-decoration:line-through;">000066</span></td>
+ <td bgcolor="000099"><span style="color:#FFFFFF; text-decoration:line-through;">000099</span></td>
+ <td bgcolor="0000CC"><span style="color:#FFFFFF; text-decoration:line-through;">0000CC</span></td>
+ <td bgcolor="0000FF"><a href="javascript:insertcode('0000FF');" style="color:#FFFFFF;">0000FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="003300"><span style="color:#FFFFFF; text-decoration:line-through;">003300</span></td>
+ <td bgcolor="003333"><span style="color:#FFFFFF; text-decoration:line-through;">003333</span></td>
+ <td bgcolor="003366"><span style="color:#FFFFFF; text-decoration:line-through;">003366</span></td>
+ <td bgcolor="003399"><a href="javascript:insertcode('003399');" style="color:#FFFFFF;">003399</a></td>
+ <td bgcolor="0033CC"><a href="javascript:insertcode('0033CC');" style="color:#FFFFFF;">0033CC</a></td>
+ <td bgcolor="0033FF"><a href="javascript:insertcode('0033FF');" style="color:#FFFFFF;">0033FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="006600"><span style="color:#FFFFFF; text-decoration:line-through;">006600</span></td>
+ <td bgcolor="006633"><span style="color:#FFFFFF; text-decoration:line-through;">006633</span></td>
+ <td bgcolor="006666"><a href="javascript:insertcode('006666');" style="color:#FFFFFF;">006666</a></td>
+ <td bgcolor="006699"><a href="javascript:insertcode('006699');" style="color:#FFFFFF;">006699</a></td>
+ <td bgcolor="0066CC"><a href="javascript:insertcode('0066CC');" style="color:#FFFFFF;">0066CC</a></td>
+ <td bgcolor="0066FF"><a href="javascript:insertcode('0066FF');" style="color:#FFFFFF;">0066FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="009900"><a href="javascript:insertcode('009900');" style="color:#FFFFFF;">009900</a></td>
+ <td bgcolor="009933"><a href="javascript:insertcode('009933');" style="color:#FFFFFF;">009933</a></td>
+ <td bgcolor="009966"><a href="javascript:insertcode('009966');" style="color:#FFFFFF;">009966</a></td>
+ <td bgcolor="009999"><a href="javascript:insertcode('009999');" style="color:#FFFFFF;">009999</a></td>
+ <td bgcolor="0099CC"><a href="javascript:insertcode('0099CC');" style="color:#FFFFFF;">0099CC</a></td>
+ <td bgcolor="0099FF"><a href="javascript:insertcode('0099FF');" style="color:#FFFFFF;">0099FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00CC00"><a href="javascript:insertcode('00CC00');" style="color:#000000;">00CC00</a></td>
+ <td bgcolor="00CC33"><a href="javascript:insertcode('00CC33');" style="color:#000000;">00CC33</a></td>
+ <td bgcolor="00CC66"><a href="javascript:insertcode('00CC66');" style="color:#000000;">00CC66</a></td>
+ <td bgcolor="00CC99"><a href="javascript:insertcode('00CC99');" style="color:#000000;">00CC99</a></td>
+ <td bgcolor="00CCCC"><a href="javascript:insertcode('00CCCC');" style="color:#000000;">00CCCC</a></td>
+ <td bgcolor="00CCFF"><a href="javascript:insertcode('00CCFF');" style="color:#000000;">00CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00FF00"><a href="javascript:insertcode('00FF00');" style="color:#000000;">00FF00</a></td>
+ <td bgcolor="00FF33"><a href="javascript:insertcode('00FF33');" style="color:#000000;">00FF33</a></td>
+ <td bgcolor="00FF66"><a href="javascript:insertcode('00FF66');" style="color:#000000;">00FF66</a></td>
+ <td bgcolor="00FF99"><a href="javascript:insertcode('00FF99');" style="color:#000000;">00FF99</a></td>
+ <td bgcolor="00FFCC"><a href="javascript:insertcode('00FFCC');" style="color:#000000;">00FFCC</a></td>
+ <td bgcolor="00FFFF"><a href="javascript:insertcode('00FFFF');" style="color:#000000;">00FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="330000"><span style="color:#FFFFFF; text-decoration:line-through;">330000</span></td>
+ <td bgcolor="330033"><span style="color:#FFFFFF; text-decoration:line-through;">330033</span></td>
+ <td bgcolor="330066"><span style="color:#FFFFFF; text-decoration:line-through;">330066</span></td>
+ <td bgcolor="330099"><a href="javascript:insertcode('330099');" style="color:#FFFFFF;">330099</a></td>
+ <td bgcolor="3300CC"><a href="javascript:insertcode('3300CC');" style="color:#FFFFFF;">3300CC</a></td>
+ <td bgcolor="3300FF"><a href="javascript:insertcode('3300FF');" style="color:#FFFFFF;">3300FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="333300"><span style="color:#FFFFFF; text-decoration:line-through;">333300</span></td>
+ <td bgcolor="333333"><span style="color:#FFFFFF; text-decoration:line-through;">333333</span></td>
+ <td bgcolor="333366"><a href="javascript:insertcode('333366');" style="color:#FFFFFF;">333366</a></td>
+ <td bgcolor="333399"><a href="javascript:insertcode('333399');" style="color:#FFFFFF;">333399</a></td>
+ <td bgcolor="3333CC"><a href="javascript:insertcode('3333CC');" style="color:#FFFFFF;">3333CC</a></td>
+ <td bgcolor="3333FF"><a href="javascript:insertcode('3333FF');" style="color:#FFFFFF;">3333FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="336600"><a href="javascript:insertcode('336600');" style="color:#FFFFFF;">336600</a></td>
+ <td bgcolor="336633"><a href="javascript:insertcode('336633');" style="color:#FFFFFF;">336633</a></td>
+ <td bgcolor="336666"><a href="javascript:insertcode('336666');" style="color:#FFFFFF;">336666</a></td>
+ <td bgcolor="336699"><a href="javascript:insertcode('336699');" style="color:#FFFFFF;">336699</a></td>
+ <td bgcolor="3366CC"><a href="javascript:insertcode('3366CC');" style="color:#FFFFFF;">3366CC</a></td>
+ <td bgcolor="3366FF"><a href="javascript:insertcode('3366FF');" style="color:#FFFFFF;">3366FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="339900"><a href="javascript:insertcode('339900');" style="color:#FFFFFF;">339900</a></td>
+ <td bgcolor="339933"><a href="javascript:insertcode('339933');" style="color:#FFFFFF;">339933</a></td>
+ <td bgcolor="339966"><a href="javascript:insertcode('339966');" style="color:#FFFFFF;">339966</a></td>
+ <td bgcolor="339999"><a href="javascript:insertcode('339999');" style="color:#FFFFFF;">339999</a></td>
+ <td bgcolor="3399CC"><a href="javascript:insertcode('3399CC');" style="color:#FFFFFF;">3399CC</a></td>
+ <td bgcolor="3399FF"><a href="javascript:insertcode('3399FF');" style="color:#FFFFFF;">3399FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33CC00"><a href="javascript:insertcode('33CC00');" style="color:#000000;">33CC00</a></td>
+ <td bgcolor="33CC33"><a href="javascript:insertcode('33CC33');" style="color:#000000;">33CC33</a></td>
+ <td bgcolor="33CC66"><a href="javascript:insertcode('33CC66');" style="color:#000000;">33CC66</a></td>
+ <td bgcolor="33CC99"><a href="javascript:insertcode('33CC99');" style="color:#000000;">33CC99</a></td>
+ <td bgcolor="33CCCC"><a href="javascript:insertcode('33CCCC');" style="color:#000000;">33CCCC</a></td>
+ <td bgcolor="33CCFF"><a href="javascript:insertcode('33CCFF');" style="color:#000000;">33CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33FF00"><a href="javascript:insertcode('33FF00');" style="color:#000000;">33FF00</a></td>
+ <td bgcolor="33FF33"><a href="javascript:insertcode('33FF33');" style="color:#000000;">33FF33</a></td>
+ <td bgcolor="33FF66"><a href="javascript:insertcode('33FF66');" style="color:#000000;">33FF66</a></td>
+ <td bgcolor="33FF99"><a href="javascript:insertcode('33FF99');" style="color:#000000;">33FF99</a></td>
+ <td bgcolor="33FFCC"><a href="javascript:insertcode('33FFCC');" style="color:#000000;">33FFCC</a></td>
+ <td bgcolor="33FFFF"><a href="javascript:insertcode('33FFFF');" style="color:#000000;">33FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="660000"><span style="color:#FFFFFF; text-decoration:line-through;">660000</span></td>
+ <td bgcolor="660033"><span style="color:#FFFFFF; text-decoration:line-through;">660033</span></td>
+ <td bgcolor="660066"><a href="javascript:insertcode('660066');" style="color:#FFFFFF;">660066</a></td>
+ <td bgcolor="660099"><a href="javascript:insertcode('660099');" style="color:#FFFFFF;">660099</a></td>
+ <td bgcolor="6600CC"><a href="javascript:insertcode('6600CC');" style="color:#FFFFFF;">6600CC</a></td>
+ <td bgcolor="6600FF"><a href="javascript:insertcode('6600FF');" style="color:#FFFFFF;">6600FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="663300"><a href="javascript:insertcode('663300');" style="color:#FFFFFF;">663300</a></td>
+ <td bgcolor="663333"><a href="javascript:insertcode('663333');" style="color:#FFFFFF;">663333</a></td>
+ <td bgcolor="663366"><a href="javascript:insertcode('663366');" style="color:#FFFFFF;">663366</a></td>
+ <td bgcolor="663399"><a href="javascript:insertcode('663399');" style="color:#FFFFFF;">663399</a></td>
+ <td bgcolor="6633CC"><a href="javascript:insertcode('6633CC');" style="color:#FFFFFF;">6633CC</a></td>
+ <td bgcolor="6633FF"><a href="javascript:insertcode('6633FF');" style="color:#FFFFFF;">6633FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="666600"><a href="javascript:insertcode('666600');" style="color:#FFFFFF;">666600</a></td>
+ <td bgcolor="666633"><a href="javascript:insertcode('666633');" style="color:#FFFFFF;">666633</a></td>
+ <td bgcolor="666666"><a href="javascript:insertcode('666666');" style="color:#FFFFFF;">666666</a></td>
+ <td bgcolor="666699"><a href="javascript:insertcode('666699');" style="color:#FFFFFF;">666699</a></td>
+ <td bgcolor="6666CC"><a href="javascript:insertcode('6666CC');" style="color:#FFFFFF;">6666CC</a></td>
+ <td bgcolor="6666FF"><a href="javascript:insertcode('6666FF');" style="color:#FFFFFF;">6666FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="669900"><a href="javascript:insertcode('669900');" style="color:#000000;">669900</a></td>
+ <td bgcolor="669933"><a href="javascript:insertcode('669933');" style="color:#000000;">669933</a></td>
+ <td bgcolor="669966"><a href="javascript:insertcode('669966');" style="color:#000000;">669966</a></td>
+ <td bgcolor="669999"><a href="javascript:insertcode('669999');" style="color:#000000;">669999</a></td>
+ <td bgcolor="6699CC"><a href="javascript:insertcode('6699CC');" style="color:#000000;">6699CC</a></td>
+ <td bgcolor="6699FF"><a href="javascript:insertcode('6699FF');" style="color:#000000;">6699FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66CC00"><a href="javascript:insertcode('66CC00');" style="color:#000000;">66CC00</a></td>
+ <td bgcolor="66CC33"><a href="javascript:insertcode('66CC33');" style="color:#000000;">66CC33</a></td>
+ <td bgcolor="66CC66"><a href="javascript:insertcode('66CC66');" style="color:#000000;">66CC66</a></td>
+ <td bgcolor="66CC99"><a href="javascript:insertcode('66CC99');" style="color:#000000;">66CC99</a></td>
+ <td bgcolor="66CCCC"><a href="javascript:insertcode('66CCCC');" style="color:#000000;">66CCCC</a></td>
+ <td bgcolor="66CCFF"><a href="javascript:insertcode('66CCFF');" style="color:#000000;">66CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66FF00"><a href="javascript:insertcode('66FF00');" style="color:#000000;">66FF00</a></td>
+ <td bgcolor="66FF33"><a href="javascript:insertcode('66FF33');" style="color:#000000;">66FF33</a></td>
+ <td bgcolor="66FF66"><a href="javascript:insertcode('66FF66');" style="color:#000000;">66FF66</a></td>
+ <td bgcolor="66FF99"><a href="javascript:insertcode('66FF99');" style="color:#000000;">66FF99</a></td>
+ <td bgcolor="66FFCC"><a href="javascript:insertcode('66FFCC');" style="color:#000000;">66FFCC</a></td>
+ <td bgcolor="66FFFF"><a href="javascript:insertcode('66FFFF');" style="color:#000000;">66FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="990000"><a href="javascript:insertcode('990000');" style="color:#FFFFFF;">990000</a></td>
+ <td bgcolor="990033"><a href="javascript:insertcode('990033');" style="color:#FFFFFF;">990033</a></td>
+ <td bgcolor="990066"><a href="javascript:insertcode('990066');" style="color:#FFFFFF;">990066</a></td>
+ <td bgcolor="990099"><a href="javascript:insertcode('990099');" style="color:#FFFFFF;">990099</a></td>
+ <td bgcolor="9900CC"><a href="javascript:insertcode('9900CC');" style="color:#FFFFFF;">9900CC</a></td>
+ <td bgcolor="9900FF"><a href="javascript:insertcode('9900FF');" style="color:#FFFFFF;">9900FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="993300"><a href="javascript:insertcode('993300');" style="color:#FFFFFF;">993300</a></td>
+ <td bgcolor="993333"><a href="javascript:insertcode('993333');" style="color:#FFFFFF;">993333</a></td>
+ <td bgcolor="993366"><a href="javascript:insertcode('993366');" style="color:#FFFFFF;">993366</a></td>
+ <td bgcolor="993399"><a href="javascript:insertcode('993399');" style="color:#FFFFFF;">993399</a></td>
+ <td bgcolor="9933CC"><a href="javascript:insertcode('9933CC');" style="color:#FFFFFF;">9933CC</a></td>
+ <td bgcolor="9933FF"><a href="javascript:insertcode('9933FF');" style="color:#FFFFFF;">9933FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="996600"><a href="javascript:insertcode('996600');" style="color:#FFFFFF;">996600</a></td>
+ <td bgcolor="996633"><a href="javascript:insertcode('996633');" style="color:#FFFFFF;">996633</a></td>
+ <td bgcolor="996666"><a href="javascript:insertcode('996666');" style="color:#FFFFFF;">996666</a></td>
+ <td bgcolor="996699"><a href="javascript:insertcode('996699');" style="color:#FFFFFF;">996699</a></td>
+ <td bgcolor="9966CC"><a href="javascript:insertcode('9966CC');" style="color:#FFFFFF;">9966CC</a></td>
+ <td bgcolor="9966FF"><a href="javascript:insertcode('9966FF');" style="color:#FFFFFF;">9966FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="999900"><a href="javascript:insertcode('999900');" style="color:#000000;">999900</a></td>
+ <td bgcolor="999933"><a href="javascript:insertcode('999933');" style="color:#000000;">999933</a></td>
+ <td bgcolor="999966"><a href="javascript:insertcode('999966');" style="color:#000000;">999966</a></td>
+ <td bgcolor="999999"><a href="javascript:insertcode('999999');" style="color:#000000;">999999</a></td>
+ <td bgcolor="9999CC"><a href="javascript:insertcode('9999CC');" style="color:#000000;">9999CC</a></td>
+ <td bgcolor="9999FF"><a href="javascript:insertcode('9999FF');" style="color:#000000;">9999FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99CC00"><a href="javascript:insertcode('99CC00');" style="color:#000000;">99CC00</a></td>
+ <td bgcolor="99CC33"><a href="javascript:insertcode('99CC33');" style="color:#000000;">99CC33</a></td>
+ <td bgcolor="99CC66"><a href="javascript:insertcode('99CC66');" style="color:#000000;">99CC66</a></td>
+ <td bgcolor="99CC99"><a href="javascript:insertcode('99CC99');" style="color:#000000;">99CC99</a></td>
+ <td bgcolor="99CCCC"><a href="javascript:insertcode('99CCCC');" style="color:#000000;">99CCCC</a></td>
+ <td bgcolor="99CCFF"><a href="javascript:insertcode('99CCFF');" style="color:#000000;">99CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99FF00"><a href="javascript:insertcode('99FF00');" style="color:#000000;">99FF00</a></td>
+ <td bgcolor="99FF33"><a href="javascript:insertcode('99FF33');" style="color:#000000;">99FF33</a></td>
+ <td bgcolor="99FF66"><a href="javascript:insertcode('99FF66');" style="color:#000000;">99FF66</a></td>
+ <td bgcolor="99FF99"><a href="javascript:insertcode('99FF99');" style="color:#000000;">99FF99</a></td>
+ <td bgcolor="99FFCC"><a href="javascript:insertcode('99FFCC');" style="color:#000000;">99FFCC</a></td>
+ <td bgcolor="99FFFF"><a href="javascript:insertcode('99FFFF');" style="color:#000000;">99FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC0000"><a href="javascript:insertcode('CC0000');" style="color:#FFFFFF;">CC0000</a></td>
+ <td bgcolor="CC0033"><a href="javascript:insertcode('CC0033');" style="color:#FFFFFF;">CC0033</a></td>
+ <td bgcolor="CC0066"><a href="javascript:insertcode('CC0066');" style="color:#FFFFFF;">CC0066</a></td>
+ <td bgcolor="CC0099"><a href="javascript:insertcode('CC0099');" style="color:#FFFFFF;">CC0099</a></td>
+ <td bgcolor="CC00CC"><a href="javascript:insertcode('CC00CC');" style="color:#FFFFFF;">CC00CC</a></td>
+ <td bgcolor="CC00FF"><a href="javascript:insertcode('CC00FF');" style="color:#FFFFFF;">CC00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC3300"><a href="javascript:insertcode('CC3300');" style="color:#FFFFFF;">CC3300</a></td>
+ <td bgcolor="CC3333"><a href="javascript:insertcode('CC3333');" style="color:#FFFFFF;">CC3333</a></td>
+ <td bgcolor="CC3366"><a href="javascript:insertcode('CC3366');" style="color:#FFFFFF;">CC3366</a></td>
+ <td bgcolor="CC3399"><a href="javascript:insertcode('CC3399');" style="color:#FFFFFF;">CC3399</a></td>
+ <td bgcolor="CC33CC"><a href="javascript:insertcode('CC33CC');" style="color:#FFFFFF;">CC33CC</a></td>
+ <td bgcolor="CC33FF"><a href="javascript:insertcode('CC33FF');" style="color:#FFFFFF;">CC33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC6600"><a href="javascript:insertcode('CC6600');" style="color:#000000;">CC6600</a></td>
+ <td bgcolor="CC6633"><a href="javascript:insertcode('CC6633');" style="color:#000000;">CC6633</a></td>
+ <td bgcolor="CC6666"><a href="javascript:insertcode('CC6666');" style="color:#000000;">CC6666</a></td>
+ <td bgcolor="CC6699"><a href="javascript:insertcode('CC6699');" style="color:#000000;">CC6699</a></td>
+ <td bgcolor="CC66CC"><a href="javascript:insertcode('CC66CC');" style="color:#000000;">CC66CC</a></td>
+ <td bgcolor="CC66FF"><a href="javascript:insertcode('CC66FF');" style="color:#000000;">CC66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC9900"><a href="javascript:insertcode('CC9900');" style="color:#000000;">CC9900</a></td>
+ <td bgcolor="CC9933"><a href="javascript:insertcode('CC9933');" style="color:#000000;">CC9933</a></td>
+ <td bgcolor="CC9966"><a href="javascript:insertcode('CC9966');" style="color:#000000;">CC9966</a></td>
+ <td bgcolor="CC9999"><a href="javascript:insertcode('CC9999');" style="color:#000000;">CC9999</a></td>
+ <td bgcolor="CC99CC"><a href="javascript:insertcode('CC99CC');" style="color:#000000;">CC99CC</a></td>
+ <td bgcolor="CC99FF"><a href="javascript:insertcode('CC99FF');" style="color:#000000;">CC99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCCC00"><a href="javascript:insertcode('CCCC00');" style="color:#000000;">CCCC00</a></td>
+ <td bgcolor="CCCC33"><a href="javascript:insertcode('CCCC33');" style="color:#000000;">CCCC33</a></td>
+ <td bgcolor="CCCC66"><a href="javascript:insertcode('CCCC66');" style="color:#000000;">CCCC66</a></td>
+ <td bgcolor="CCCC99"><a href="javascript:insertcode('CCCC99');" style="color:#000000;">CCCC99</a></td>
+ <td bgcolor="CCCCCC"><a href="javascript:insertcode('CCCCCC');" style="color:#000000;">CCCCCC</a></td>
+ <td bgcolor="CCCCFF"><a href="javascript:insertcode('CCCCFF');" style="color:#000000;">CCCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCFF00"><a href="javascript:insertcode('CCFF00');" style="color:#000000;">CCFF00</a></td>
+ <td bgcolor="CCFF33"><a href="javascript:insertcode('CCFF33');" style="color:#000000;">CCFF33</a></td>
+ <td bgcolor="CCFF66"><a href="javascript:insertcode('CCFF66');" style="color:#000000;">CCFF66</a></td>
+ <td bgcolor="CCFF99"><a href="javascript:insertcode('CCFF99');" style="color:#000000;">CCFF99</a></td>
+ <td bgcolor="CCFFCC"><a href="javascript:insertcode('CCFFCC');" style="color:#000000;">CCFFCC</a></td>
+ <td bgcolor="CCFFFF"><a href="javascript:insertcode('CCFFFF');" style="color:#000000;">CCFFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF0000"><a href="javascript:insertcode('FF0000');" style="color:#FFFFFF;">FF0000</a></td>
+ <td bgcolor="FF0033"><a href="javascript:insertcode('FF0033');" style="color:#FFFFFF;">FF0033</a></td>
+ <td bgcolor="FF0066"><a href="javascript:insertcode('FF0066');" style="color:#FFFFFF;">FF0066</a></td>
+ <td bgcolor="FF0099"><a href="javascript:insertcode('FF0099');" style="color:#FFFFFF;">FF0099</a></td>
+ <td bgcolor="FF00CC"><a href="javascript:insertcode('FF00CC');" style="color:#FFFFFF;">FF00CC</a></td>
+ <td bgcolor="FF00FF"><a href="javascript:insertcode('FF00FF');" style="color:#FFFFFF;">FF00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF3300"><a href="javascript:insertcode('FF3300');" style="color:#FFFFFF;">FF3300</a></td>
+ <td bgcolor="FF3333"><a href="javascript:insertcode('FF3333');" style="color:#FFFFFF;">FF3333</a></td>
+ <td bgcolor="FF3366"><a href="javascript:insertcode('FF3366');" style="color:#FFFFFF;">FF3366</a></td>
+ <td bgcolor="FF3399"><a href="javascript:insertcode('FF3399');" style="color:#FFFFFF;">FF3399</a></td>
+ <td bgcolor="FF33CC"><a href="javascript:insertcode('FF33CC');" style="color:#FFFFFF;">FF33CC</a></td>
+ <td bgcolor="FF33FF"><a href="javascript:insertcode('FF33FF');" style="color:#FFFFFF;">FF33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF6600"><a href="javascript:insertcode('FF6600');" style="color:#000000;">FF6600</a></td>
+ <td bgcolor="FF6633"><a href="javascript:insertcode('FF6633');" style="color:#000000;">FF6633</a></td>
+ <td bgcolor="FF6666"><a href="javascript:insertcode('FF6666');" style="color:#000000;">FF6666</a></td>
+ <td bgcolor="FF6699"><a href="javascript:insertcode('FF6699');" style="color:#000000;">FF6699</a></td>
+ <td bgcolor="FF66CC"><a href="javascript:insertcode('FF66CC');" style="color:#000000;">FF66CC</a></td>
+ <td bgcolor="FF66FF"><a href="javascript:insertcode('FF66FF');" style="color:#000000;">FF66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF9900"><a href="javascript:insertcode('FF9900');" style="color:#000000;">FF9900</a></td>
+ <td bgcolor="FF9933"><a href="javascript:insertcode('FF9933');" style="color:#000000;">FF9933</a></td>
+ <td bgcolor="FF9966"><a href="javascript:insertcode('FF9966');" style="color:#000000;">FF9966</a></td>
+ <td bgcolor="FF9999"><a href="javascript:insertcode('FF9999');" style="color:#000000;">FF9999</a></td>
+ <td bgcolor="FF99CC"><a href="javascript:insertcode('FF99CC');" style="color:#000000;">FF99CC</a></td>
+ <td bgcolor="FF99FF"><a href="javascript:insertcode('FF99FF');" style="color:#000000;">FF99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFCC00"><a href="javascript:insertcode('FFCC00');" style="color:#000000;">FFCC00</a></td>
+ <td bgcolor="FFCC33"><a href="javascript:insertcode('FFCC33');" style="color:#000000;">FFCC33</a></td>
+ <td bgcolor="FFCC66"><a href="javascript:insertcode('FFCC66');" style="color:#000000;">FFCC66</a></td>
+ <td bgcolor="FFCC99"><a href="javascript:insertcode('FFCC99');" style="color:#000000;">FFCC99</a></td>
+ <td bgcolor="FFCCCC"><a href="javascript:insertcode('FFCCCC');" style="color:#000000;">FFCCCC</a></td>
+ <td bgcolor="FFCCFF"><a href="javascript:insertcode('FFCCFF');" style="color:#000000;">FFCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFFF00"><a href="javascript:insertcode('FFFF00');" style="color:#000000;">FFFF00</a></td>
+ <td bgcolor="FFFF33"><a href="javascript:insertcode('FFFF33');" style="color:#000000;">FFFF33</a></td>
+ <td bgcolor="FFFF66"><a href="javascript:insertcode('FFFF66');" style="color:#000000;">FFFF66</a></td>
+ <td bgcolor="FFFF99"><a href="javascript:insertcode('FFFF99');" style="color:#000000;">FFFF99</a></td>
+ <td bgcolor="FFFFCC"><a href="javascript:insertcode('FFFFCC');" style="color:#000000;">FFFFCC</a></td>
+ <td bgcolor="FFFFFF"><a href="javascript:insertcode('FFFFFF');" style="color:#000000;">FFFFFF</a></td>
+ </tr>
+</table> \ No newline at end of file
diff --git a/0.7.2/templates/help.sno b/0.7.2/templates/help.sno
new file mode 100644
index 0000000..2239eac
--- /dev/null
+++ b/0.7.2/templates/help.sno
@@ -0,0 +1,75 @@
+<div>
+ Alle Chat-Befehle:
+</div>
+<hr>
+<table border=1>
+<tr><th><div>SU</div></th><th><div>Befehl</div></th><th><div>Beschreibung</div></th></tr>
+<tr><td><div>NC</div></td><td><div>/about</div></td><td><div>Zeigt aktuelle Version und andere Infos der Community an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/away <font color=red>Nachricht</font></div></td><td><div>Abmelden mit einer<font color=red>Abmeldenachricht</font></div></td></tr>
+<tr><td><div>NC</div></td><td><div>/clear</div></td><td><div>Bildschirm wird gelöscht</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/col <font color=red>XXXXXX</font> <font color=ffa500>XXXXXX</font></div></td><td><div>Farbe/n (<font color=red>Namensfarbe</font> / <font color=ffa500>Textfarbe</font>) wechseln. Angabe in Hexadezimal. Wird gar keine Farbe angegeben, dann wird eine zufällige generiert!</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/date</div></td><td><div>Zeigt aktuelles Datum und Urzeit an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/exit</div></td><td><div>Komplett aus dem System ausloggen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/hits</div></td><td><div>Zeigt an vor wieviel Stunden der Chat-Server neugestartet wurde und die Hits und Hits per Minute seit dieser Zeit</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ig <font color=red>Alias</font></div></td><td><div>Setzt/entfernt <font color=red>Alias</font> auf/aus die/der Ignorierliste. Wird das Argument weggelassen, so wird die Liste aller ignorierten Personen angezeigt</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/j <font color=red>Raumname</font></div></td><td><div>Raum wechseln/erstellen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ju <font color=red>Alias</font></div></td><td><div>In den Raum wechseln/folgen, wo sich <font color=red>Alias</font> befindet.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/m <font color=red>Aktion</font></div></td><td><div>Handeln mit 2 Farben</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/me <font color=red>Aktion</font></div></td><td><div>Handeln mit einer Farbe</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/memo <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine <font color=ffa500>Memonachricht</font> hinterlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/msg <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine private <font color=ffa500>Nachricht</font> flüstern</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ <font color=ffa500>Nachricht</font></div></td><td><div>Eine private <font color=ffa500>Nachricht</font> demjenigen flüstern, dem zuletzt eine geflüstert wurde</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/online <font color=red>Alias</font></div></td><td><div>Zeigt Onlineminuten von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/q</div></td><td><div>Chat verlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/rmgb</div></td><td><div>Das eigene Gästebuch komplett weglöschen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/s <font color=red>Nachricht</font></div></td><td><div><font color=red>Nachricht</font> schreien</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/seen <font color=red>Alias</font></div></td><td><div>Zeigt an, vor wieviel Stunden sich <font color=red>Nachricht</font> zum letzten Mal in das System eingelogt hat</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/selfkill</div></td><td><div>Sich selbst ganz und gar aus dem System entfernen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/sep <font color=red>Raumname</font></div></td><td><div>In den Raum <font color=red>Raumnamen</font> wechseln und gleichzeitig absperren</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/uptime</div></td><td><div>Siehe Befehl "/hits"</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/w</div></td><td><div>Zeigt an, wer sich im aktuellen Raum befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc <font color=red>Raum</font></div></td><td><div>Zeigt an, wer sich im <font color=red>Raum</font> befindet. Wird kein Raum angegeben, dann wird ledeglich angezeigt, wer sich im System befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc/</div></td><td><div>Zeigt alle offenen Räume und deren Chatter an</div></td></tr>
+<tr><td><div>NC</div></td><td> <div>/wj <font color=red>Alias</font></div></td><td><div>Zeigt an, in welchen Raum sich <font color=red>Alias</font> befindet</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/l</div></td><td><div>Der aktuelle Raum wird ab- bzw. aufgesperrt</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/rsu <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> die Raumbesetzerrechte entnehmen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/su <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Raumbesetzer ernennen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/t <font color=red>Thema</font></div></td><td><div>Dem aktuellen Raum wird ein <font color=red>Thema</font> gegeben</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban</div></td><td><div>Zeigt alle verbannten Benutzer an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> verbannen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/rban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> "entbannen"</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/banip <font color=red>Alias</font></div></td><td><div>Die IP-Nummer von <font color=red>Alias</font> verbannen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/rbanip ip://<font color=red>x.x.x.x</font></div></td><td><div>Die IP-Nummer <font color=red>x.x.x.x</font> "entbannen"</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ip <font color=red>Alias</font></div></td><td><div>Zeigt die IP-Nummer von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/img</div></td><td><div>Versteckt/reaktiviert das eigene Superuser-Logo im Online-Frame</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/k <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird aus dem Chat katapultiert!</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/o <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird aus dem Chat ausgeloggt!</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/sl <font color=red>Raum</font></div></td><td><div>Einen anderen <font color=ffa500>Raum</font> absperren</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ss <font color=red>Raum</font> <font color=ffa500>Nachricht</font></div></td><td><div>Eine <font color=ffa500>Nachricht</font> in <font color=red>Raum</font> hinüber rufen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/st <font color=red>Raum</font> <font color=ffa500>Thema</font></div></td><td><div>Einem anderen <font color=ffa500>Raum</font> ein <font color=ffa500>Thema</font > geben</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/kill <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird ganz und gar aus dem System entfernt</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/wa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Wächter ernennen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/rwa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom Wächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/sys <font color=red>Nachricht</font></div></td><td><div>Systemnachricht schreiben. (Erscheint in allen existierenden Räumen)</div></td></tr>
+<tr><td><div><font color=red>AD</font></div></td><td><div>/cool <font color=red>Nachricht</font></div></td><td><div>Gibt für den aktuellen Raum eine Systemmeldung aus</div></td></tr>
+<tr><td><div><font color=red>AD</font></div></td><td><div>/id <font color=red>Alias</font></div></td><td><div>Zeigt TempID von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div><font color=red>AD</font></div></td><td><div>/ow <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Oberwächter ernennen</div></td></tr>
+<tr><td><div><font color=red>AD</font></div></td><td><div>/row <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom Oberwächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=red>AD</font></div></td><td><div>/pw <font color=red>Alias</font></div></td><td><div>Zeigt das Passwort von <font color=red>Alias</font> an</div></td></tr>
+
+</table><hr>
+<div>
+ Zur Erklärung: NC steht für "Normale Chatter", RB für "Raumbesetzer", WÄ für "Wächter" und OW für "Oberwächter".
+ Obrige Befehle können nur von der/den jeweiligen Benutzergruppe/n ausgeführt werden.<br><br>
+ Allerdings gibt es folgendes zu beachten: Oberwächter verfügen über alle Chatbefehle. Normale Wächter über alle Chatbefehle, außer über die der Oberwächter.
+ Raumbesetzer können nur Raumbesetzerbefehle und die Befehle der normalen Chatter durchführen. Normale Chatter haben ledeglich die Standardbefehle zu verwenden.<br><br>
+ Weitere Besonderheiten der Wächter und Oberwächter:<br><br>
+ Wächter und Oberwächter können ....<br>
+ ... abgesperrte Chaträume problemlos betreten.<br>
+ ... nicht gekickt, verbannt oder gekillt werden.<br><br>
+ Nur Oberwächer können Logdateien der Cyberbar lesen!<br><br>
+ Oberwächter ernennt nur der Systemadministrator! Dieser wiederum hat weitere spezielle Befehle die geheim sind und die nur ihm
+ vorbehalten sind und ihm das Administrieren erleichtert.
+</div>
+</body>
+</html>
diff --git a/0.7.2/ychatd.pl b/0.7.2/ychatd.pl
new file mode 100644
index 0000000..31880b4
--- /dev/null
+++ b/0.7.2/ychatd.pl
@@ -0,0 +1,59 @@
+#!/usr/bin/perl
+use CGI;
+$q = new CGI;
+use config;
+use modules::commands;
+use modules::changeroom;
+use modules::divcom;
+use modules::hierachie;
+use modules::htdocs;
+use modules::input;
+use modules::loggedin;
+use modules::online;
+use modules::postmessage;
+use modules::shared;
+use modules::start;
+use modules::statistic;
+use modules::stream;
+use IO::Socket;
+$SIG{'CHLD'} = 'IGNORE';
+$mainsocket = 'IO::Socket::INET'->new('LocalHost', "$localhost", 'LocalPort', $localport, 'Porto', 'tcp', 'Listen', $limit + 10, 'Reuse', 1);
+die "Kann Server-Socket nicht erzeugen: $!\n" unless $mainsocket;
+print "yChat wurde auf $localhost:$localport gestartet...\n";
+$STARTIME = time;
+while ($client = $mainsocket->accept) {
+ ++$HITS;
+ $pid = fork;
+ if ($pid == 0) {
+ print $client "HTTP/1.1 200 OK\nContent-type:text/html\n\n";
+ while (defined($buffer = <$client>)) {
+ my $requeststring;
+ my(@tmp) = split(/\s+/, $buffer, 0);
+ if ($tmp[0] eq 'GET') {
+ $requeststring = $tmp[1];
+ }
+ @tmp = split(/\?/, $requeststring, 0);
+ @tmp = split(/&/, $tmp[1], 0);
+ my %variables;
+ foreach $_ (@tmp) {
+ my(@tmp) = split(/=/, $_, 0);
+ next if $tmp[0] eq 'admin' or $tmp[0] eq 'mogeladmin';
+ $tmp[0] =~ s[/][];
+ $variables{$tmp[0]} = &url_decode($tmp[1]);
+ }
+ foreach $_ (keys %variables) {
+ eval "\$$_ = '" . $variables{$_} . q['];
+ }
+ *STDOUT = $client;
+ if ($request) {
+ &secure_checkid($alias, $tmpid) if $request != 'start';
+ eval "&$request";
+ }
+ else {
+ &start;
+ }
+ $client->shutdown(2);
+ exit 0;
+ }
+ }
+}
diff --git a/0.7.6/config.pm b/0.7.6/config.pm
new file mode 100644
index 0000000..ac19aff
--- /dev/null
+++ b/0.7.6/config.pm
@@ -0,0 +1,42 @@
+# yChat - Copyright by Paul C. Bütow
+########################### Dieser Teil bestimmt die Standart-Variabeln.
+##STANDART-CONFIGURATION:## (CSS, Farben, Version etc.)
+###########################
+$limit = 50; # Benutzerlimit
+$datum = "03.01.02"; # Datum der letzten Änderung (ändern erwünscht)
+$version = "0.7.6"; # Bitte Hauptversionsnummer nicht ändern
+$title = "yChat [$version]"; # Erscheint in der Browser-Leiste oben
+$standardroom = "Bar"; # Standardchatraum
+$loginplace = "Lounge"; # Bezeichnung der Startseite nach dem Login
+$localhost = "snooper.dyndns.org";# Host oder IP# des Chat-Servers
+$localport = 2000; # Port über den fer Chat-Server läuft
+$gfxpath = "http://$localhost/yChat"; # URL der Binärdaten (Grafiken etc.)
+$bgcolor = "#3E535B"; # Hintergrundfarbe der HTML-Seiten
+$chatbg = "#000000"; # Hintergrundfarbe des Chat-Frames
+
+# PS: Um einen Chat-Administrator anzulegen, dann die Datei data/hierachie
+# anlegen, in eine Zeile muß folgendes eingetragen werden: "Nickname<;7"
+# (Natürlich ohne Anführungsstriche) Nickname ist somit Chat-Administrator
+# und kann Oberwächter und Wächter bestimmen!
+
+sub style {
+print <<ENDCSS;
+<style type="text/css">
+ body { background-color: $bgcolor }
+ body.blank { background-color: $chatbg }
+ body.online { background-color: $chatbg }
+ div { font-family: arial, geneva, verdana, helvetiva; font-size: 12px; color: #ffffff }
+ div.b { font-weight: bold; color: #ffa500 }
+ a { color: #ffffef; }
+ a:hover { color: #ffffff; }
+ p { font-family:verdana, arial, geneva, helvetica, sans-serif; color:#FFFFFF; font-size:12px; }
+</style>
+<style type="text/css" media="all">
+ a { text-decoration: none; }
+ a:hover { text-decoration:underline; }
+ input { border:2px solid #000000; font-size:12px; color:#000000; background-color: #ffffff; height:23px; padding:2px;}
+ select { border:2px solid #000000; font-family:arial, verdana, helvetica; font-size:11px; color:#000000; height:21px; padding:2px;}
+</style>
+ENDCSS
+}
+1;
diff --git a/0.7.6/gfx/adm-i.gif b/0.7.6/gfx/adm-i.gif
new file mode 100644
index 0000000..3f45598
--- /dev/null
+++ b/0.7.6/gfx/adm-i.gif
Binary files differ
diff --git a/0.7.6/gfx/adm.gif b/0.7.6/gfx/adm.gif
new file mode 100644
index 0000000..d7b68d9
--- /dev/null
+++ b/0.7.6/gfx/adm.gif
Binary files differ
diff --git a/0.7.6/gfx/away.gif b/0.7.6/gfx/away.gif
new file mode 100644
index 0000000..c001883
--- /dev/null
+++ b/0.7.6/gfx/away.gif
Binary files differ
diff --git a/0.7.6/gfx/ow-i.gif b/0.7.6/gfx/ow-i.gif
new file mode 100644
index 0000000..71584dd
--- /dev/null
+++ b/0.7.6/gfx/ow-i.gif
Binary files differ
diff --git a/0.7.6/gfx/ow.gif b/0.7.6/gfx/ow.gif
new file mode 100644
index 0000000..b30e8f9
--- /dev/null
+++ b/0.7.6/gfx/ow.gif
Binary files differ
diff --git a/0.7.6/gfx/rb.gif b/0.7.6/gfx/rb.gif
new file mode 100644
index 0000000..321341c
--- /dev/null
+++ b/0.7.6/gfx/rb.gif
Binary files differ
diff --git a/0.7.6/gfx/twa.gif b/0.7.6/gfx/twa.gif
new file mode 100644
index 0000000..b80cea4
--- /dev/null
+++ b/0.7.6/gfx/twa.gif
Binary files differ
diff --git a/0.7.6/gfx/unten.gif b/0.7.6/gfx/unten.gif
new file mode 100644
index 0000000..285fb53
--- /dev/null
+++ b/0.7.6/gfx/unten.gif
Binary files differ
diff --git a/0.7.6/gfx/uvl.gif b/0.7.6/gfx/uvl.gif
new file mode 100644
index 0000000..b9208d6
--- /dev/null
+++ b/0.7.6/gfx/uvl.gif
Binary files differ
diff --git a/0.7.6/gfx/wa-i.gif b/0.7.6/gfx/wa-i.gif
new file mode 100644
index 0000000..9e9a113
--- /dev/null
+++ b/0.7.6/gfx/wa-i.gif
Binary files differ
diff --git a/0.7.6/gfx/wa.gif b/0.7.6/gfx/wa.gif
new file mode 100644
index 0000000..553984c
--- /dev/null
+++ b/0.7.6/gfx/wa.gif
Binary files differ
diff --git a/0.7.6/gfx/yIntro.swf b/0.7.6/gfx/yIntro.swf
new file mode 100644
index 0000000..81d9015
--- /dev/null
+++ b/0.7.6/gfx/yIntro.swf
Binary files differ
diff --git a/0.7.6/gfx/ySymbol.swf b/0.7.6/gfx/ySymbol.swf
new file mode 100644
index 0000000..2b899bb
--- /dev/null
+++ b/0.7.6/gfx/ySymbol.swf
Binary files differ
diff --git a/0.7.6/modules/changeroom.pm b/0.7.6/modules/changeroom.pm
new file mode 100644
index 0000000..4a5e787
--- /dev/null
+++ b/0.7.6/modules/changeroom.pm
@@ -0,0 +1,67 @@
+sub change_room {
+ my($method, $newroom, $oldroom, $alias2) = @_;
+ if ($newroom eq $oldroom) {
+ &post_prv($alias, "<font color='ffffff'>Du befindest dich bereits im Raum <font color='ffa500'>$newroom</font>!</font>");
+ &reload_html;
+ }
+ elsif ($newroom eq $loginplace) {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> verl&auml;sst den Chat und geht in die <b>$loginplace</b> ... </font></i>", $alias);
+ &post_strmsg($alias, $room, 'quit');
+ unlink "data/online/rooms/$room/$alias";
+ &rm_rstat($alias, $room);
+ &check_online;
+ &reload_html;
+ }
+ open RSTAT, "<data/online/rstat/$newroom";
+ my(@rstat) = <RSTAT>;
+ close RSTAT;
+ if ($rstat[0] eq "1\n") {
+ if (3 <= &hierachie($alias)) {
+ &post_prv($alias, "<font color='ffffff'>Der Raum <font color='ffa500'>$newroom</font> ist leider abgesperrt!</font>");
+ &reload_html;
+ }
+ }
+ &private_javascript($alias, $room, "parent.input.document.inf.room.value = '$newroom';open('chat?request=online&room=$newroom&alias=$alias&tmpid=$tmpid','online');");
+ open MSGFILE, ">>data/msgs/$newroom";
+ print MSGFILE "$alias<;" . time . "<;!<;!<;<;\n";
+ close MSGFILE;
+ open MSGFILE, ">>data/msgs/$room";
+ if ($method eq 'j') {
+ print MSGFILE "$alias<;" . time . q[<;!<;!<;<i><font color='ffffff'>] . &timestring . " Du wechselst aus dem Raum <b>$oldroom</b> herein nach <b>$newroom</b> ...</font></i><br><;\n";
+ }
+ elsif ($method eq 'ju') {
+ print MSGFILE "$alias<;" . time . q[<;!<;!<;<i><font color='ffffff'>] . &timestring . " Du folgst <font color='".&get_ident($alias2,3)."'>$alias2</font> aus dem Raum <b>$oldroom</b> herein nach <b>$newroom</b> ...</font></i><br><;\n";
+ }
+ elsif ($method eq 'sep') {
+ print MSGFILE "$alias<;" . time . q[<;!<;!<;<i><font color='ffffff'>] . &timestring . " Du wechselst aus dem Raum <b>$oldroom</b> herein nach <b>$newroom</b> und sperrst ab...</font></i><br><;\n";
+ }
+ close MSGFILE;
+ &post_strmsg($alias, $room, 'cr', $newroom);
+ $room = $oldroom;
+ my $tmpstamp = time;
+ if ($method eq 'j') {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> wechselt in den Raum <b>$newroom</b> ...</font></i>", $alias);
+ $room = $newroom;
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> kommt aus dem Raum <b>$oldroom</b> herein nach <b>$newroom</b> ...</font></i>", $alias);
+ }
+ elsif ($method eq 'ju') {
+ my $col2 = &get_ident($alias2,3);
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> folgt <font color='$col2'>$alias2</font> in den Raum <b>$newroom</b> ...</font></i>", $alias);
+ $room = $newroom;
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> kommt aus dem Raum <b>$oldroom</b> und folgt <font color='$col2'>$alias2</font> herein nach <b>$newroom</b> ...</font></i>", $alias);
+ }
+ elsif ($method eq 'sep') {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> wechselt in den Raum <b>$newroom</b> und sperrt ab...</font></i>", $alias);
+ $room = $newroom;
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> kommt aus dem Raum <b>$oldroom</b> herein nach <b>$newroom</b> und sperrt ab...</font></i>", $alias);
+ }
+ elsif ($method eq 'beam') {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias2</font> beamt <b>$alias</b> in den Raum <b>$newroom</b>...</font></i>", $alias2);
+ $room = $newroom;
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias2</font> beamt <b>$alias</b> aus dem Raum <b>$oldroom</b> herein nach <b>$room</b>...</font></i>", $alias2);
+ }
+ unlink "data/online/rooms/$oldroom/$alias";
+ &rm_rstat($alias, $oldroom);
+ &check_online;
+}
+1;
diff --git a/0.7.6/modules/commands.pm b/0.7.6/modules/commands.pm
new file mode 100644
index 0000000..349524c
--- /dev/null
+++ b/0.7.6/modules/commands.pm
@@ -0,0 +1,870 @@
+sub command {
+ $_[0] = $_[0] . ' ';
+ $_[0] = substr($_[0], 1, length($_[0]) - 1);
+ my(@cmd) = split(/ /, $_[0], 0);
+ my $cmd = substr($_[0], 0, index($_[0], ' '));
+ my $tmp = $_[1];
+ sub lock {
+ my $method = shift @_;
+ open RSTAT, "data/online/rstat/$room";
+ my(@r_stat) = <RSTAT>;
+ close RSTAT;
+ my $lock = "0\n";
+ if ($room eq $standardroom) {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> sperrt den Raum ohne Erfolg ab ...</font></i>", $alias);
+ }
+ else {
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> sperrt den Raum ab ...</font></i>", $alias) if $method ne 'separee';
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> sperrt den Raum auf ...</font></i>", $alias) if $method ne 'separee';
+ }
+ for ($i = 1; $i <= $#r_stat; ++$i) {
+ $lock = $lock . $r_stat[$i];
+ }
+ open RSTAT, ">data/online/rstat/$room";
+ print RSTAT $lock;
+ close RSTAT;
+ }
+ &reload_html;
+ }
+ if ($cmd eq 'about') {
+ &post_prv($alias, "<font color=ffffff>Aktuelle Version ist $title und wurde am $datum aktuallisiert. Programmiert von Paul C. B\374tow (2000 - 2002).</font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'away') {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $away_msg = $away_msg . ' ' . $cmd[$i];
+ }
+ my $room = &get_room($alias);
+ if ($tmp eq 'autoaway') {
+ $away_msg = "$alias wurde vom System agbemeldet ...";
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='ffa500'><b>Das System</b></font> meldet <font color='".&get_ident($alias,3)."'>$alias</font> wegen Inaktivit&auml;t ab ...</i></font>", $alias);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> meldet sich ab (<font color='$col'>$away_msg</font> ) ...</i></font>", $alias);
+ }
+ open AWAY, ">>data/online/rstat/$room.away";
+ print AWAY "$alias<;$away_msg\n";
+ close AWAY;
+ &private_javascript($alias, $room, q[parent.input.document.inf.tmp.value = 'away'; parent.online.location.reload();]);
+ &reload_html;
+ }
+ elsif ($cmd eq 'clear') {
+ &post_prv($alias, "<script language='JavaScript'>window.open('chat?request=stream&alias=$alias&room=$room&col=$col&secol=$secol&tmp=login&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder','main');</script>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'col') {
+ my $col, $secol;
+ if ($cmd[1] ne undef) {
+ $col = $cmd[1];
+ &prove_color($alias, $col);
+ my $tmpsecol = $cmd[2];
+ my $length = length $tmpsecol;
+ if ($tmpsecol eq '' or $length < 6 or $length > 6) {
+ $secol = $col;
+ }
+ else {
+ $secol = $tmpsecol;
+ }
+ }
+ else {
+ $col = &random_color;
+ $secol = &random_color;
+ }
+ open OPTIONS, "<data/user/options/$alias";
+ my(@options) = <OPTIONS>;
+ close OPTIONS;
+ open OPTIONS, ">data/user/options/$alias";
+ print OPTIONS $options[0] . $col . "\n" . $secol;
+ close OPTIONS;
+ open IDENT, "<data/online/ident/$alias";
+ my(@ident) = <IDENT>;
+ close IDENT;
+ open IDENT, ">data/online/ident/$alias";
+ print IDENT $ident[0] . $ident[1] . $ident[2] . "$col\n$secol";
+ close IDENT;
+ &post($room, '<i><font color=ffffff>' . &timestring . "</font> <font color=$col>$alias</font> <font color=$secol> hat die Farbe gewechselt...</font></i>", $alias);
+ &private_javascript($alias, $room, "parent.input.document.inf.col.value = '$col'; parent.input.document.inf.secol.value = '$secol';");
+ &post_strmsg($alias, $room, 'col', "$col;$secol");
+ &reload_html;
+ }
+ elsif ($cmd eq 'date') {
+ my($secs, $mins, $hours, $days, $months, $years) = &timearray;
+ &post_prv($alias, "<font color=ffffff>Heute ist der $days.$months. Jahr $years. Es ist genau $hours:$mins Uhr und $secs Sekunden.</font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'exit') {
+ my $room = &get_room($alias);
+ if ($tmp eq 'autologout') {
+ &private_javascript($alias, $room, q[open('chat?request=start&tmp=autologout','_top');]);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='ffa500'><b>Das System</b></font> loggt <font color='".&get_ident($alias,3)."'>$alias</font> wegen Inaktivit&auml;t aus ... </font></i>", $alias);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> loggt sich ganz aus ... </font></i>", $alias);
+ &private_javascript($alias, $room, q[open('chat?request=start&tmp=quit','_top');]);
+ }
+ &rm_alias($alias, $room);
+ &rm_away($alias, $room);
+ &reload_html;
+ }
+ elsif ($cmd eq 'getcol') {
+ my $cols2show = $cmd[1];
+ if (-f "data/user/options/$cols2show") {
+ open FILE, "<data/user/options/$cols2show";
+ my(@file) = <FILE>;
+ close FILE;
+ chomp $file[1];
+ chomp $file[2];
+ &post_prv($alias, "<font color='ffa500'>$cols2show <font color='ffffff'> verwendet als 1. Farbe <font color='$file[1]'>$file[1]</font> und als 2. Farbe <font color='$file[2]'>$file[2]</font> !</font></font>");
+ &reload_html;
+ }
+ &post_prv($alias, "<font color='ffa500'>$cols2show <font color='ffffff'> existiert nicht in der Benutzerdatenbank!</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'hits' or $cmd eq 'uptime') {
+ &post_prv($alias, "<font color=ffffff>Uptime: $startime " . &calculate_uptime_hours($STARTIME) . "h; $HITS Hits; " . &calculate_hpm($HITS, $STARTIME) . ' Hits pro Minute</font>');
+ &reload_html;
+ }
+ elsif ($cmd eq 'ig') {
+ my $alias2ignore = $cmd[1];
+ if ($alias2ignore) {
+ if (-f "data/user/options/$alias2ignore") {
+ if (3 <= &hierachie($alias2ignore)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2ignore</font> <font color='ffffff'> kann nicht ignoriert werden!</font>");
+ }
+ else {
+ &post_strmsg($alias, $room, 'ig', $alias2ignore);
+ }
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2ignore</font> <font color='ffffff'>existiert nicht in der Datenbank!</font>");
+ }
+ }
+ else {
+ &post_strmsg($alias, $room, 'igl');
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'j' or $cmd eq 'sep') {
+ if ($cmd[1] =~ /\W/ or $cmd[1] eq '') {
+ &post_prv($alias, "<font color=ffffff>Der Raum <font color=ffa500>$cmd[1]</font> enth\344lt illegale Zeichen!</font>");
+ &reload_html;
+ }
+ else {
+ if ($cmd eq 'j') {
+ &change_room('j', $cmd[1], $room);
+ &reload_html;
+ }
+ else {
+ if ($cmd[1] eq $standardroom) {
+ &post_prv($alias, "<font color=ffffff>Der Raum <font color=ffa500>$cmd[1]</font> ist ein Standardraum und kann nicht als Separee er&ouml;ffnet werden!</font>");
+ }
+ else {
+ &change_room('sep', $cmd[1], $room);
+ &lock('separee');
+ }
+ &reload_html;
+ }
+ }
+ }
+ elsif ($cmd eq 'me' or $cmd eq 'm') {
+ my $me_msg;
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $me_msg = $me_msg . ' ' . $cmd[$i];
+ }
+ $me_msg =~ s[/me/][<i>$alias</i>]g;
+ $me_msg =~ s[/m/][<i><font color=$col>$alias</font></i>]g;
+ if ($cmd eq 'm') {
+ &post($room, "<b><font color=$col><i>$alias</i> <font color=$secol>$me_msg</font></font></b>", $alias);
+ }
+ else {
+ &post($room, "<b><font color=$col><i>$alias</i> $me_msg</font></b>", $alias);
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'memo') {
+ my $alias2memo = $cmd[1];
+ my($secs, $mins, $hours, $days, $months, $years) = &timearray;
+ if (-f "data/user/options/$alias2memo") {
+ my $memo_msg;
+ for ($i = 2; $i <= $#cmd; ++$i) {
+ $memo_msg = $memo_msg . ' ' . $cmd[$i];
+ }
+ &post_prv($alias, "<font color=ffa500>$alias2memo <font color=ffffff>wurde folgende memo erfolgreich hinterlassen: $memo_msg</font></font>");
+ open MEMO, ">>data/user/memos/$alias2memo";
+ print MEMO "<font color=ffffff>($days.$months.$years - $hours:$mins:$secs) <font color=$col>$alias</font> hat Dir eine Memo hinterlassen: <font color=ffa500>$memo_msg</font></font><br>\n";
+ close MEMO;
+ &reload_html;
+ }
+ &post_prv($alias, "<font color=ffa500>$alias2memo <font color=ffffff>existiert in der Datenbank nicht !</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'menu') {
+ &private_javascript($alias, $room, "window.open('chat?request=htdocs&alias=$alias&var=menu_html&room=$standardroom&col=$col&secol=$secol&tmpid=$tmpid','_new','width=500,height=500,screenX=100,screenY=100,scrollbars');");
+ &reload_html;
+ }
+ elsif ($cmd eq 'online') {
+ my $alias2prove = $cmd[1];
+ if (-f "data/user/options/$alias2prove") {
+ open ONLINE, "<data/user/counts/$alias2prove.online";
+ my $online = <ONLINE>;
+ close ONLINE;
+ my $totaltime = sprintf('%.2f', $online / 3600);
+ &post_prv("$alias", "<font color=ffa500>$alias2prove <font color=ffffff>war insgesamt schon $totaltime Stunden online!</font></font>");
+ }
+ else {
+ &post_prv("$alias", "<font color=ffa500>$alias2prove <font color=ffffff>existiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'q') {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> verl&auml;sst den Chat ... </font></i>", $alias);
+ &post_strmsg($alias, $room, 'quit');
+ unlink "data/online/rooms/$room/$alias";
+ &rm_rstat($alias, $room);
+ &rm_away($alias, $room);
+ &check_online;
+ &reload_html;
+ }
+ elsif ($cmd eq 'rmgb') {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> l\366scht das eigene G\344stebuch ...</font></i>", $alias);
+ unlink "data/user/gbooks/$alias";
+ &reload_html;
+ }
+ elsif ($cmd eq 's') {
+ my $msg2scream;
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2scream = $msg2scream . ' ' . $cmd[$i];
+ }
+ $msg2scream =~ s/\344/\304/g;
+ $msg2scream =~ s/\366/\326/g;
+ $msg2scream =~ s/\374/\334/g;
+ $msg2scream = "\U$msg2scream\E";
+ &post($room, "<b><font color=$col><i>$alias schreit:</i> <font color=$secol>$msg2scream</font></font></b>", $alias);
+ &reload_html;
+ }
+ elsif ($cmd eq 'seen') {
+ my $alias2prove = $cmd[1];
+ if (-f "data/user/options/$alias2prove") {
+ if (-f "data/user/lastlogin/$alias2prove") {
+ open LASTLOGIN, "<data/user/lastlogin/$alias2prove";
+ my $lastlogin = <LASTLOGIN>;
+ close LASTLOGIN;
+ my $timestamp = sprintf('%.2f', (time - $lastlogin) / 3600);
+ &post_prv("$alias", "<font color='ffa500'>$alias2prove <font color=ffffff> hat sich vor $timestamp Stunden zuletzt in das System eingeloggt!</font></font>");
+ }
+ else {
+ &post_prv("$alias", "<font color='ffa500'>$alias2prove <font color=ffffff> hat sich seit der Einf\374hrung dieses Befehls noch nie eingeloggt!</font></font>");
+ }
+ }
+ else {
+ &post_prv("$alias", "<font color='ffa500'>$alias2prove <font color=ffffff> exsistiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'selfkill') {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> entfernt sich ganz und gar aus dem System und loggt sich aus ... </font></i>", $alias);
+ &private_javascript($alias, $room, q[open('chat?request=start&tmp=selfkill','_top');]);
+ &kill_alias($alias);
+ &reload_html;
+ }
+ elsif ($cmd eq 'w') {
+ my $theme = &get_theme($room);
+ my $door = '[<font color=red>Abgesperrt!</font>]' if $rstat[0] eq "1\n";
+ my($is, $nr) = ('t', 0);
+ my $persons;
+ opendir DIR, "data/online/rooms/$room";
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach $_ (@dir) {
+ if (-f "data/online/rooms/$room/$_") {
+ $persons = $persons . ' ' . "<font color='".&get_ident($_,3)."'>$_</font>";
+ ++$nr;
+ }
+ }
+ &post_prv($alias, "<font color=ffffff>Der aktuelle <b>Raum:</b> $room $theme $door ($nr): $persons</font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'wc' or $cmd eq 'wc/') {
+ my $raum = $cmd[1];
+ my $persons;
+ if ($raum eq '' and $cmd eq 'wc') {
+ opendir USERS, 'data/online/users';
+ my(@users) = readdir USERS;
+ close USERS;
+ foreach $_ (@users) {
+ $persons = $persons . ' ' . "<font color='".&get_ident($_,3)."'>$_</font>" if -f "data/online/users/$_";
+ }
+ my $nr = $#users - 1;
+ my($nrs, $is) = ('', 'ist');
+ if ($nr != 1) {
+ $nrs = 'en';
+ $is = 'sind';
+ }
+ &post_prv("$alias", "<font color=ffffff>$nr Person$nrs $is insgesamt eingeloggt: $persons</font>");
+ }
+ elsif ($raum eq '' and $cmd eq 'wc/') {
+ my $msg2post;
+ opendir DIR, 'data/online/rooms';
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach $_ (@dir) {
+ if (-e "data/online/rooms/$_" and $_ ne '..' and $_ ne '.') {
+ opendir DIR, "data/online/rooms/$_";
+ my(@dir2) = readdir DIR;
+ closedir DIR;
+ open RSTAT, "<data/online/rstat/$_";
+ my(@rstat) = <RSTAT>;
+ close RSTAT;
+ chomp $rstat[1];
+ my $door = '[<font color=red>Abgesperrt!</font>]' if $rstat[0] eq "1\n";
+ my $nr = $#dir2 - 1;
+ $msg2post = $msg2post . "<tr><td><b><font size=2 color='ffffff'>$_ $door ($nr) [" . $rstat[1] . q(]: </font></b></td></tr><tr><td><font size=2 color='ffa500'>);
+ foreach $chatter (@dir2) {
+ $msg2post = $msg2post . "<font color='".&get_ident($chatter,3)."'>$chatter</font> " if -f "data/online/rooms/$_/$chatter";
+ }
+ print '</font></td>';
+ }
+ }
+ &post_prv($alias, "<font color=ffffff>Folgende R&auml;ume sind offen:</font><table>$msg2post</table>");
+ }
+ elsif ($raum ne '') {
+ my $persons;
+ opendir DIR, "data/online/rooms/$raum";
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach $_ (@dir) {
+ $persons = $persons . ' ' . "<font color='".&get_ident($chatter,3)."'>$_</font>" if -f "data/online/rooms/$raum/$_";
+ }
+ my($nr, $is) = ($#dir - 1, 't');
+ if ($nr != 1) {
+ $nrs = 'en';
+ $is = 'n';
+ }
+ &post_prv($alias, "<font color=ffffff> $nr Person$nrs befinde$is sich im Raum <b>$raum</b> $persons</font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'wj' or $cmd eq 'ju') {
+ my $alias2search = $cmd[1];
+ my $roomofalias = &get_room($alias2search);
+ if ($roomofalias) {
+ if ($cmd eq 'wj') {
+ &post_prv($alias, "<font color='ffa500'>$alias2search <font color=ffffff>befindet sich im Raum <b>$roomofalias</b> !</font></font>");
+ }
+ else {
+ &change_room('ju', $roomofalias, $room, $alias2search);
+ }
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2search <font color=ffffff> ist nicht eingeloggt!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif (1 <= &hierachie($alias, $room)) {
+ if ($cmd eq 'l') {
+ &lock;
+ }
+ elsif ($cmd eq 'su') {
+ my $alias2su = $cmd[1];
+ opendir DIR, "data/online/rooms/$room";
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach $_ (@dir) {
+ if ($_ eq $alias2su) {
+ open DATEI, "<data/online/rstat/$room";
+ my(@rstat) = <DATEI>;
+ close DATEI;
+ if (1 <= hierachie($alias2su, $room)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2su</font> <font color='ffffff'> kann nicht zum Raumbesetzer ernannt werden. (Ist bereits RB, W\304 oder OW)</font>");
+ &reload_html;
+ }
+ open RSTAT, ">>data/online/rstat/$room";
+ print RSTAT "$alias2su<;1\n";
+ close RSTAT;
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> verleiht <font color='".&get_ident($alias2su,3)."'>$alias2su</font> Raumbesetzerrechte ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ &reload_html;
+ }
+ }
+ &post_prv($alias, "<font color='ffa500'>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist nicht anwesend)</font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'rsu') {
+ my $alias2rsu = $cmd[1];
+ if (1 == hierachie($alias2rsu, $room)) {
+ &rm_rstat($alias2rsu, $room);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> entzieht <font color='".&get_ident($alias2rsu,3)."'>$alias2rsu</font> die Raumbesetzerrechte ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2rsu <font color='ffffff'>ist gar kein Raumbesetzer!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 't') {
+ open RSTAT, "data/online/rstat/$room";
+ my(@r_stat) = <RSTAT>;
+ close RSTAT;
+ my $theme;
+ if ($cmd[1] ne undef) {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $theme = $theme . ' ' . $cmd[$i];
+ }
+ &post($room, q[<i><font color='ffffff'>] . &timestring . qq[ <font color='$col'>$alias</font> gibt dem Raum das Thema "<font color='$col'>$theme</font>" ...</font></i>], $alias);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> l\366scht das Thema des Raums ...</font></i>", $alias);
+ }
+ $theme = $r_stat[0] . $theme . "\n";
+ for ($i = 2; $i <= $#r_stat; ++$i) {
+ $theme = $theme . $r_stat[$i] . "\n";
+ }
+ open RSTAT, ">data/online/rstat/$room";
+ print RSTAT $theme;
+ close RSTAT;
+ &reload_html;
+ }
+ elsif (3 <= &hierachie($alias, $room)) {
+ if ($cmd eq 'ban' or $cmd eq 'banip') {
+ my $alias2ban = $cmd[1];
+ my $hierachie = &hierachie($alias2ban);
+ open BAN, '<data/ban';
+ my(@ban) = <BAN>;
+ close BAN;
+ if ($cmd[1] eq undef) {
+ my $nr = @ban;
+ my $banned;
+ foreach $_ (@ban) {
+ chomp $_;
+ $banned .= " $_";
+ }
+ &post_prv($alias, "<font color=ffffff>Folgende Benutzer sind verbannt [$nr]: <font color='ff0000'>$banned</font></font>");
+ &reload_html;
+ }
+ elsif (-f "data/user/options/$alias2ban") {
+ if (3 <= $hierachie) {
+ &post_prv($alias, "<font color='ffa500'>$alias2ban <font color='ffffff'>kann nicht verbannt werden!</font></font>");
+ &reload_html;
+ }
+ if ($cmd eq 'ban') {
+ if (&add_entry($alias2ban, 'ban') == 1) {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> verbannt <b>$alias2ban</b> aus dem Chat ...</font></i>", $alias);
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2ban <font color=ffffff>ist bereits verbannt!</font></font>");
+ }
+ }
+ elsif ($cmd eq 'banip') {
+ open DATEI, "<data/online/ident/$alias2ban";
+ my $ipnr = <DATEI>;
+ close DATEI;
+ chomp $ipnr;
+ if (add_entry("ip://$ipnr", 'ban') == 1) {
+ &post_prv($alias, "<font color='ffffff'>IP-Nummer von <font color='ffa500'>$alias2ban</font> (<font color='ff0000'>$ipnr</font>) wurde verbannt!</font></i>");
+ }
+ else {
+ &post_prv($alias, "<font color='ffffff'>Die IP-Nummer <font color='ff0000'>$ipnr</font> von <font color='ffa500'>$alias2ban</font> ist bereits verbannt!</font></font>");
+ }
+ &reload_html;
+ }
+ &reload_html;
+ }
+ &post_prv($alias, "<font color='ffa500'>$alias2ban <font color=ffffff> kann nicht verbannt werden, da Benutzername nicht existiert!</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'rban' or $cmd eq 'rbanip') {
+ my $alias2rban = $cmd[1];
+ open BAN, '<data/ban';
+ @ban = <BAN>;
+ close BAN;
+ foreach $ban (@ban) {
+ if (&rm_entry($alias2rban, 'ban') == 1) {
+ if ($alias2rban =~ /ip:/) {
+ &post_prv($alias, "<font color='ffffff'>Die IP-Nummer <font color='ff0000'>$alias2rban</font> wurde aus der Banliste ausgetragen!</font></font>");
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> entbannt <font color='".&get_ident($alias2rban,3)."'>$alias2rban</font> ...</font></i>", $alias);
+ }
+ &reload_html;
+ }
+ }
+ &post_prv($alias, "<font color='ff0000'>$alias2rban <font color='ffffff'>ist nicht verbannt!</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'img') {
+ my $hierachie = &hierachie($alias, $room);
+ &hierachie_rm($alias);
+ if ($hierachie == 3) {
+ &post_prv($alias, q[<font color='ffffff'>Als tempor&auml;rer W&auml;chter kannst du dein Superuserlogo nicht verstecken!</font>]);
+ }
+ elsif ($hierachie % 2 > 0) {
+ &post_prv($alias, q[<font color='ffffff'>Dein Superuserlogo wurde versteckt!</font>]);
+ &hierachie_add($alias, $hierachie + 1);
+ }
+ else {
+ &post_prv("$alias", q[<font color='ffffff'>Dein Superuserlogo wurde wieder sichtbar gemacht!</font></font>]);
+ &hierachie_add($alias, $hierachie - 1);
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'ip') {
+ my $alias2prove = $cmd[1];
+ opendir DIR, 'data/online/ident';
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach $_ (@dir) {
+ if ($_ eq $alias2prove) {
+ open DATEI, "<data/online/ident/$alias2prove";
+ my $ipnr = <DATEI>;
+ close DATEI;
+ chomp $ipnr;
+ &post_prv($alias, "<font color='ffa500'>$_<font color='ffffff'> hat die IP-Nummer <font color='ff0000'>$ipnr</font> !</font></font>");
+ }
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'k' or $cmd eq 'o') {
+ my $alias2kick = $cmd[1];
+ if (-f "data/online/users/$alias2kick") {
+ opendir DIR, 'data/online/rooms';
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach my $raum (@dir) {
+ opendir DIR, "data/online/rooms/$raum";
+ my(@dir2) = readdir DIR;
+ closedir DIR;
+ foreach my $chatter (@dir2) {
+ if ($chatter eq $alias2kick) {
+ my $hierachie2 = &hierachie($alias2kick);
+ if (&hierachie($alias) <= &hierachie($alias2kick)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2kick <font color='ffffff'> besitzt einen h&ouml;heren oder gleichen Rang und kann nicht gekickt/ausgeloggt werden!</font></font>");
+ }
+ else {
+ if ($cmd eq 'k') {
+ &post_prv($alias2kick, '<script language="JavaScript">window.open("chat?request=start&tmp=kick","_top");</script>');
+ }
+ else {
+ &post_prv($alias2kick, '<script language="JavaScript">window.open("chat?request=start&tmp=logout","_top");</script>');
+ }
+ $_ = undef if $room eq $raum;
+ if ($cmd eq 'k') {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> katapultiert <font color='".&get_ident($alias2kick,3)."'>$alias2kick</font> aus dem Chat ...</font></i>", $alias, $raum);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> loggt <font color='".&get_ident($alias2kick,3)."'>$alias2kick</font> aus dem Chat aus ...</font></i>", $alias, $alias);
+ }
+ &rm_alias($alias2kick, $raum);
+ &check_online;
+ }
+ &reload_html;
+ }
+ }
+ }
+ }
+ &post_prv($alias, "<font color='ffa500'>$alias2kick <font color='ffffff'> ist nicht anwesend und kann nicht aus dem System katapultiert werden werden!</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'sl') {
+ my $sl_room = $cmd[1];
+ if (-e "data/online/rooms/$sl_room") {
+ my $lock = "0\n";
+ open RSTAT, "<data/online/rstat/$sl_room";
+ my(@r_stat) = <RSTAT>;
+ close RSTAT;
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> sperrt den Raum <b>$sl_room</b> von aussen ab ...</font></i>", $alias, $sl_room);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> sperrt den Raum <b>$sl_room</b> von aussen auf ...</font></i>", $alias, $sl_room);
+ }
+ for ($i = 1; $i <= $#r_stat; ++$i) {
+ $lock = $lock . $r_stat[$i];
+ }
+ open RSTAT, ">data/online/rstat/$sl_room";
+ print RSTAT $lock;
+ close RSTAT;
+ }
+ else {
+ &post_prv($alias, "<font color='ffffff'>Der Raum <font color='ffa500'>$sl_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'ss') {
+ my $ss_room = $cmd[1];
+ if (-e "data/online/rooms/$ss_room") {
+ my $ss_msg;
+ for ($i = 2; $i <= $#cmd; ++$i) {
+ $ss_msg = $ss_msg . ' ' . $cmd[$i];
+ }
+ my $msg2scream = "\U$ss_msg\E";
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> ruft in den Raum <b>$ss_room</b> hinein: <b><font color=$col>$msg2scream</font></b> ...</font></i>", $alias, $ss_room);
+ &reload_html;
+ }
+ else {
+ &post_prv($alias, "<font color='ffffff'>Der Raum <font color='ffa500'>$ss_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'st') {
+ my $st_room = $cmd[1];
+ if (-e "data/online/rooms/$st_room") {
+ my $theme;
+ if ($cmd[2] ne undef) {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $theme = $theme . ' ' . $cmd[$i];
+ }
+ &post($room, '<i><font color=ffffff>' . &timestring . qq[ <font color='$col'>$alias</font> gibt dem Raum <b>$st_room</b> das Thema "<font color='$col'>$theme</font>" ...</font></i>], $alias, $st_room);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> l\366scht das Thema des Raums <b>$st_room</b> ...</font></i>", $alias, $st_room);
+ }
+ open RSTAT, "<data/online/rstat/$st_room";
+ my(@r_stat) = <RSTAT>;
+ close RSTAT;
+ $theme = $r_stat[0] . $theme . "\n";
+ for ($i = 2; $i <= $#r_stat; ++$i) {
+ $theme = $theme . $r_stat[$i];
+ }
+ open RSTAT, ">data/online/rstat/$st_room";
+ print RSTAT $theme;
+ close RSTAT;
+ }
+ else {
+ &post_prv($alias, "<font color=ffffff>Der Raum <font color=ffa500>$st_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'status') {
+ my $alias2level = $cmd[1];
+ &post_prv($alias, "<font color='ffa500'>$alias2level <font color='ffffff'>hat den Superuserstatus <font color='ff0000'>".&hierachie($alias2level, &get_room($alias2level))."</font> !</font></font>");
+ &reload_html;
+ }
+ elsif (7 <= &hierachie($alias)) {
+ if ($cmd eq 'kill') {
+ my $alias2kill = $cmd[1];
+ if (-f "data/user/options/$alias2kill") {
+ if (7 <= &hierachie($alias2kill)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2kill</font> <font color='ffffff'>hat einen h&ouml;heren Rang und kann nicht aus dem System entfernt werden !</font>");
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col>$alias</font> killt <b>$alias2kill</b> ganz und gar aus dem System ...</font></i>", $alias);
+ &kill_alias($alias2kill, $alias);
+ }
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2kill <font color='ffffff'> existiert nicht in der Datenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'sys') {
+ my $sys_msg;
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $sys_msg = $sys_msg . ' ' . $cmd[$i];
+ }
+ $sys_msg = q[<i><font color='ffffff'>] . &timestring . " </font></i> <b><font size=2 color='red'>SYSTEMNACHRICHT</font></b><i><font color='ffffff'>: $sys_msg ...</font></i>";
+ opendir ROOMS, 'data/msgs';
+ my(@rooms) = readdir ROOMS;
+ close ROOMS;
+ foreach $_ (@rooms) {
+ &post($_, $sys_msg, $alias) unless /\./;
+ }
+ &log($sys_msg);
+ &reload_html;
+ }
+ elsif ($cmd eq 'twa') {
+ my $alias2wa = $cmd[1];
+ if (-f "data/user/options/$alias2wa") {
+ my $room2 = &get_room($alias2wa);
+ if (3 <= &hierachie($alias2wa, $room2)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2wa <font color='ffffff'>kann nicht zum tempor&auml;ren W&auml;chter ernannt werden!</font></font>");
+ }
+ else {
+ &hierachie_add_rstat($alias2wa, 3, $room2);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> ernennt <font color='".&get_ident($alias2wa,3)."'>$alias2wa</font> zum <font color='ff0000'>tempor&auml;ren</font> W\344chter ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ &reload_html;
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2wa <font color=ffffff>existiert nicht in der Datenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'rtwa') {
+ my $alias2rwa = $cmd[1];
+ my $room2 = &get_room($alias2rwa);
+ if (3 == &hierachie($alias2rwa, $room2)) {
+ &hierachie_rm_rstat($alias2rwa, $room2);
+
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> hat <font color='".&get_ident($alias2rwa,3)."'>$alias2rwa</font> vom <font color='ff0000'>tempor&auml;ren</font> W\344chter zum normalen Chatter degradiert ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2rwa <font color=ffffff>ist kein tempor&auml;rer W\344chter und k\366nnen diese Rechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'wa') {
+ my $alias2wa = $cmd[1];
+ if (-f "data/user/options/$alias2wa") {
+ if (5 <= &hierachie($alias2wa)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2wa <font color='ffffff'>kann nicht zum W&auml;chter ernannt werden!</font></font>");
+ }
+ else {
+ &hierachie_add($alias2wa, 5);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> ernennt <font color='".&get_ident($alias2wa,3)."'>$alias2wa</font> zum W\344chter ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ &reload_html;
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2wa <font color=ffffff>existiert nicht in der Datenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'rwa') {
+ my $alias2rwa = $cmd[1];
+ my $hierachie = &hierachie($alias2rwa);
+ if (5 == $hierachie or 6 == $hierachie) {
+ &hierachie_rm($alias2rwa);
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> hat <font color='".&get_ident($alias2rwa,3)."'>$alias2rwa</font> vom W\344chter zum normalen Chatter degradiert ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2rwa <font color=ffffff>ist kein W\344chter und k\366nnen diese Rechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif (9 <= &hierachie($alias)) {
+ if ($cmd eq 'ow') {
+ my $alias2ow = $cmd[1];
+ if (-f "data/user/options/$alias2ow") {
+ if (7 <= &hierachie($alias2ow)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2ow <font color='ffffff'>kann nicht zum Oberw&auml;chter ernannt werden!</font></font>");
+ }
+ else {
+ &hierachie_add($alias2ow, 7);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> ernennt <font color='".&get_ident($alias2ow,3)."'>$alias2ow</font> zum Oberw&auml;chter ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ &reload_html;
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2wa <font color=ffffff>existiert nicht in der Datenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'row') {
+ my $alias2row = $cmd[1];
+ my $hierachie = &hierachie($alias2row);
+ if (7 == $hierachie or 8 == $hierachie) {
+ &hierachie_rm($alias2row);
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> hat <font color='".&get_ident($alias2row,3)."'>$alias2row</font> vom Oberw\344chter zum normalen Chatter degradiert ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2row <font color=ffffff>ist kein Oberw\344chter und k\366nnen diese Rechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'pw') {
+ my $pw2show = $cmd[1];
+ if (-f "data/user/options/$pw2show") {
+ open PW, "<data/user/options/$pw2show";
+ my(@pw) = <PW>;
+ close PW;
+ chomp $pw[0];
+ &post_prv($alias, "<font color='ffa500'>$pw2show <font color='ffffff'> hat das Passwort <font color='ff0000'>$pw[0]</font> !</font></font>");
+ &reload_html;
+ }
+ &post_prv($alias, "<font color='ffa500'>$pw2show <font color='ffffff'> existiert nicht in der Benutzerdatenbank!</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'id' or $cmd eq 'agent') {
+ my $id2show = $cmd[1];
+ if (-f "data/online/ident/$id2show") {
+ if ($cmd eq 'id') {
+ &post_prv($alias, "<font color='ffa500'>$id2show <font color='ffffff'> hat die Temp-ID <font color='ff0000'>".&get_ident($id2show, 1)."</font> !</font></font>");
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$id2show <font color='ffffff'> verwendet <font color='ff0000'>".&get_ident($id2show, 2)."</font> !</font></font>");
+ }
+ &reload_html;
+ }
+ &post_prv($alias, "<font color='ffa500'>$id2show <font color='ffffff'> ist nicht eingeloggt !</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'cool') {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ &post($room, '<i><font color=ffffff>' . &timestring . " $msg2post</font></i>", $alias);
+ &reload_html;
+ }
+ elsif ($cmd eq 'rev') {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ $msg2post = reverse($msg2post);
+ &post($room, "<b><font color='$col'>$alias: <font color='$secol'>$msg2post</font></font></b>", $alias);
+ &reload_html;
+ }
+ elsif ($cmd eq 'arks') {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ $msg2post =~ s/i/1/gi;
+ $msg2post =~ s/e/3/gi;
+ $msg2post =~ s/a/4/gi;
+ $msg2post =~ s/s/5/gi;
+ $msg2post =~ s/g/6/gi;
+ $msg2post =~ s/t/7/gi;
+ $msg2post =~ s/b/8/gi;
+ $msg2post =~ s/o/0/gi;
+ &post($room, "<b><font color='$col'>$alias: <font color='$secol'>$msg2post</font></font></b>", $alias);
+ &reload_html;
+ }
+ elsif ($cmd eq 'ultra') {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ my @letters = split '', "$alias: $msg2post";
+ $msg2post = undef;
+ foreach (@letters) {
+ $msg2post .= "<font color='".&random_color."'>$_</font>";
+ }
+ &post($room, "<b>$msg2post</b>", $alias);
+ &reload_html;
+ }
+ }
+ }
+ }
+ }
+ my($alias2post, $msg2post, $action);
+ if ($cmd eq 'msg') {
+ $alias2post = $cmd[1];
+ for ($i = 2; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ }
+ elsif ($cmd eq '') {
+ $alias2post = $whisper;
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ }
+ else {
+ $alias2post = $cmd;
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ }
+ $msg2post =~ s[/me/][<i>$alias</i>]g;
+ $msg2post =~ s[/m/][<i><font color=$col>$alias</font></i>]g;
+ if (-f "data/online/users/$alias2post" and not -f "data/online/rooms/$loginplace/$alias2post") {
+ &post_prv($alias, "<b><font color='$col'><i>Zu $alias2post gefl\374stert:</i> <font color='$secol'>$msg2post</font></font></i></b>");
+ &post_prv($alias2post, "<b><font color='$col'><i>$alias fl\374stert:</i> <font color='$secol'>$msg2post</font></font></i></b>");
+ &private_javascript($alias, $room, "parent.input.document.inf.whisper.value = '$alias2post';");
+ &reload_html;
+ }
+ &post_prv($alias, qq[ <font color=ffffff>Benutzer oder Befehl <font color=ffa500>$alias2post</font> ist nicht anwesend/verf\374gbar! Bitte den Befehl "/menu" eingeben, um das Chat-Men&uuml zu &ouml;ffnen.</font></font>]);
+ &reload_html;
+}
+1;
diff --git a/0.7.6/modules/divcom.pm b/0.7.6/modules/divcom.pm
new file mode 100644
index 0000000..57c4def
--- /dev/null
+++ b/0.7.6/modules/divcom.pm
@@ -0,0 +1,266 @@
+sub divcom {
+ if ($var eq 'list_alias_html') {
+ &list_alias_html;
+ }
+ elsif ($var eq 'alias_html') {
+ &alias_html;
+ }
+ elsif ($var eq 'edit_profile_html') {
+ &secure_checkid($alias, $tmpid);
+ &edit_html('edit_profile_html');
+ }
+ elsif ($var eq 'edit_options_html') {
+ &secure_checkid($alias, $tmpid);
+ &edit_html('edit_options_html');
+ }
+ elsif ($var eq 'gb_html') {
+ &gb_html;
+ }
+ elsif ($var eq 'post_gb') {
+ &secure_checkid($alias, $tmpid);
+ &post_gb;
+ }
+ elsif ($var eq 'edit_profile') {
+ &secure_checkid($alias, $tmpid);
+ &edit('edit_profile');
+ }
+ elsif ($var eq 'edit_options') {
+ &secure_checkid($alias, $tmpid);
+ &edit('edit_options');
+ }
+ elsif ($var eq 'rm_gb_alias') {
+ &secure_checkid($alias, $tmpid);
+ &rm_gb;
+ }
+ else {
+ &error('Parameter fehlt');
+ }
+}
+sub gb_html {
+ my ($message,$method) = @_;
+ unless ($method eq 'loggedin') {
+ &start_html('Benutzerboard');
+ &menu();
+ }
+ if ($message eq 'post_empty') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Du wolltest soeben einen leeren Eintrag posten. Bitte schreib\n <i>\n zuerst\n </i>\n einen Text und poste\n <u>dann</u>\n !\n </div>\n <hr>\n";
+ }
+ elsif ($message eq 'post_ok') {
+ print " <div class=b>\n Meldung:\n </div>\n <div>\n Vielen Dank f\374r Deinen Beitrag. Wenn Du willst, kannst Du jetzt gleich noch einen Eintrag posten ...\n </div>\n <hr>\n";
+ }
+ else {
+ print " <div>\n Falls Du Anregungen oder Verbesserungsvorschl\344ge f\374r die Community hast, dann poste doch einen kleinen Eintrag :-)\n </div>\n <hr>\n";
+ }
+ print qq[ <form action="chat">\n <input type="hidden" name="col" value="$col">\n<input type="hidden" name="secol" value="$secol">\n<input type="hidden" name="maxVerlauf" value="$maxVerlauf">\n<input type="hidden" name="verlaufOrder" value="$verlaufOrder">\n<input type="hidden" name="request" value="divcom">\n <input type="hidden" name="method" value="$method">\n <input type="hidden" name="var" value="post_gb">\n <input type="hidden" name="alias" value="$alias">\n <input type="hidden" name="tmpid" value="$tmpid">\n <input type="hidden" name="tmp" value="guestbook">\n <input type="hidden" name="id" value="y">\n <input size="40" name="msg">\n <font color="ffffff">\n <input type="submit" value="Hinterlassen ...">\n </font>\n </form>\n <hr>\n];
+ if (-e 'data/guestbook') {
+ &error("Konnte dat/guestbook nicht \366ffnen") unless open DATEI, '<data/guestbook';
+ @datei = <DATEI>;
+ close DATEI;
+ print $q->div(@datei);
+ }
+ print $q->end_html;
+}
+sub post_gb {
+ my($secs, $mins, $hours, $days, $months, $years) = &timearray;
+ if ($msg eq '') {
+ if ($id eq 'y') {
+ if ($method eq 'loggedin') {
+ &loggedin('post_empty');
+ } else {
+ &gb_html('post_empty');
+ }
+ }
+ else {
+ &alias_html('post_empty');
+ }
+ $client->shutdown(2);
+ exit 0;
+ }
+ $msg =~ s/</&lt;/g;
+ $msg =~ s/\n/<br>/g;
+ my $tmpath = '';
+ if ($id eq 'y') {
+ $tmpath = 'data/guestbook';
+ }
+ else {
+ $tmpath = "data/user/gbooks/$tmp";
+ }
+ open GB, "$tmpath";
+ my(@gb) = <GB>;
+ close GB;
+ pop @gb if $#gb > 99;
+ my(@newdatei) = "<br><b>$alias schrieb am $days.$months.$years um $hours:$mins:$secs ...</b><br>$msg<br>\n";
+ push @newdatei, @gb;
+ open GB, ">$tmpath";
+ print GB @newdatei;
+ close GB;
+ if ($id eq 'y') {
+ if ($method eq 'loggedin') {
+ &loggedin('post_ok');
+ } else {
+ &gb_html('post_ok');
+ }
+ $client->shutdown(2);
+ exit 0;
+ }
+ &post_prv ($tmp, "<font color=ffffff>$alias hat soeben einen Pin in Dein Profil geh\344ngt ... </font>");
+ &alias_html;
+ $client->shutdown(2);
+ exit 0;
+}
+sub rm_gb {
+ open GB, "<data/user/gbooks/$alias";
+ my(@gbfile) = <GB>;
+ close GB;
+ my(@newgbfile) = ();
+ for ($i = 0; $i <= $#gbfile; ++$i) {
+ push @newgbfile, $gbfile[$i] if $i != $id;
+ }
+ open GB, ">data/user/gbooks/$alias";
+ print GB @newgbfile;
+ close GB;
+ &alias_html('rm_ok');
+}
+sub list_alias_html {
+ &start_html('Alle Benutzer');
+ opendir REGISTERED, 'data/user/options';
+ my(@users) = readdir REGISTERED;
+ closedir REGISTERED;
+ my(@liste) = sort(@users);
+ my $nr = $#users - 1;
+ &menu();
+ print " <div>\n Es sind z.Z. genau $nr Benutzernamen in der Datenbank vorhanden! (Sortiert nach #, A-Z, a-z)\n </div>\n <hr>\n <div>\n";
+ foreach $_ (@liste) {
+ if (-f "data/user/options/$_") {
+ print $q->a({-'href', "chat?request=divcom&var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid"}, "$_"), ' ';
+ }
+ }
+ print " </div>\n</body>\n</html>\n";
+}
+sub alias_html {
+ my $message = $_[0];
+ open COUNTS, "<data/user/counts/$tmp";
+ local $counter = <COUNTS>;
+ close COUNTS;
+ ++$counter;
+ open COUNTS, ">data/user/counts/$tmp";
+ print COUNTS $counter;
+ close COUNTS;
+ &start_html($tmp);
+ &menu();
+ print "";
+ if ($message eq 'rm_ok') {
+ print " <div class=b>\n Meldung:\n </div>\n <div>\n Der von Dir gew\344hlte Eintrag wurde erfolgreich gel\366scht.\n </div>\n <hr>\n";
+ }
+ elsif ($message eq 'post_empty') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Du wolltest soeben einen leeren Eintrag posten. Bitte schreib\n <i>\n zuerst\n </u>\n einen Text und poste\n <u>dann</u>\n !\n <hr>\n";
+ }
+ open PROFILE, "<data/user/profiles/$tmp";
+ @data = <PROFILE>;
+ close PROFILE;
+ print qq[ <div>\n Dieses Profil wurde insgesamt schon $counter mal aufgerufen !\n <br><br>Alias: $tmp\n <br><br>Nachname: $data[0]\n <br><br>Vorname: $data[1]\n <br><br>Alter: $data[2]\n <br><br>Wohnort: $data[3]\n <br><br>E-Mail:\n <a href="mailto:$data[4]">$data[4]</a>\n <br><br>ICQ-Nummer: $data[5]\n <br><br>Homepage: <a href="$data[6]" target="_new">$data[6]</a>\n <br><br>Weiteres:<br>$data[7]\n <hr>\n Hier kannst Du $tmp eine Nachricht hinterlassen!\n <form action="chat">\n <input type="hidden" name="request" value="divcom">\n <input type="hidden" name="var" value="post_gb">\n <input type="hidden" name="alias" value="$alias">\n <input type="hidden" name="tmpid" value="$tmpid">\n <input type="hidden" name="tmp" value="$tmp">\n <input type="text" size="40" name="msg">\n <font color="ffffff">\n <input type="submit" value="Hinterlassen ...">\n </font>\n </form>\n <hr>\n];
+ if (-e "data/user/gbooks/$tmp") {
+ &error("Konnte data/user/gbooks/$tmp nicht \366ffnen") unless open DATEI, "<data/user/gbooks/$tmp";
+ @datei = <DATEI>;
+ close DATEI;
+ my $nr = 1;
+ if ($alias ne $tmp) {
+ foreach $_ (@datei) {
+ print "<br>Eintrag # $nr: $_";
+ ++$nr;
+ }
+ }
+ else {
+ print qq[ <table>\n <form action="chat">\n <input type="hidden" name="request" value="divcom">\n <input type="hidden" name="var" value="rm_gb_alias">\n <input type="hidden" name="alias" value="$alias">\n <input type="hidden" name="tmpid" value="$tmpid">\n <input type="hidden" name="tmp" value="$tmp">\n];
+ for ($i = 0; $i <= $#datei; ++$i) {
+ print qq[ <tr>\n <td>\n <input type="radio" name="id" value="$i">\n </td>\n <td>\n <div class=q>\n <br>\n Eintrag # $nr:\n $datei[$i]\n </div>\n </td>\n </tr>\n];
+ ++$nr;
+ }
+ print qq[ </table>\n <table>\n <tr>\n <td>\n <font color=ffffff>\n <input type="submit" value="Markierten Eintrag l\366schen">\n </font>\n </td>\n <td>\n <font color=ffffff>\n <input type="reset" value="Markierung r\374ckg\344ngig machen">\n </font>\n </td>\n </tr>\n </table>\n </form>\n];
+ }
+ }
+ print $q->end_html;
+}
+sub edit_html {
+ my($method, $message) = @_;
+ &start_html("Benutzerprofil \344ndern");
+ if ($method eq 'edit_options_html') {
+ open DATEI, "<data/user/options/$alias";
+ }
+ elsif ($method eq 'edit_profile_html') {
+ open DATEI, "<data/user/profiles/$alias";
+ }
+ @data = <DATEI>;
+ close DATEI;
+ foreach $_ (@data) {
+ chomp $_;
+ }
+ &menu();
+ if ($method eq 'edit_options_html') {
+ if ($message eq 'edit_options_ok') {
+ print "<div class=b>\n Hinweis:\n</div>\n<div>\n Du hast soeben Deine Chat-Optionen erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren. Um\n weiterzuchatten einfach Fenster schliessen!\n</div>\n<hr>\n";
+ }
+ elsif ($message eq 'edit_pw_wrong') {
+ print "<div class=b>\n ACHTUNG!\n</div>\n<div>\n Du hast soeben versucht, dein Passwort zu \344ndern. Jedoch stimmte die Erste Eingabe nicht mit der Zweiten \374berein.\n Bitte versuch es erneuert ...\n</div>\n<hr>\n";
+ }
+ else {
+ print $q->div('Hier kannst Du Deine Chat-Optionen editieren!'), $q->hr;
+ }
+ print qq[<script lang="javascript" type="text/javascript">\n<!--\n\nfunction radioWert(rObj) {\n for (var i=0; i<rObj.length; i++) if (rObj[i].checked) return rObj[i].value;\n return false;\n}\n\nfunction insertcode( code ) {\n document.optionen.elements[radioWert(document.optionen.eingabe)].value = code;\n}\n\n//-->\n</script>\n\n<form name="optionen" action="chat">\n <input type="hidden" name="var" value="edit_options">\n <table>\n <tr>\n <td>\n <div>\n Dein Passwort\n <font color=ffa500>\n (Gut merken !!)\n </font>\n <br>\n <input type="password" name="id" value="$data[0]">\n </div>\n </td>\n <td width=20>\n </td>\n <td>\n <div>\n Geb hier das Passwort erneuert ein:\n <br>\n <input type="password" name="tmp" value="$data[0]">\n </div>\n </td>\n </tr>\n </table>\n <hr>\n <div>Einstellungen f\374r den Nachrichten-Verlauf</div>\n <table>\n <tr>\n <td>\n <br>\n <div>Anzahl der Nachrichten im Verlauf (Standart = 10)</div>\n <font color=ffffff>\n <select name="maxVerlauf" size="1">\n <option value="$data[3]">$data[3]\n];
+ for ($i = 1; $i <= 50; ++$i) {
+ print qq[<option value="$i">$i];
+ }
+ print qq[ </select>\n </font>\n </td>\n </tr>\n <tr>\n <td>\n <br>\n<div>Wie sollen die Nachrichten im Verlauf angeordnet sein?</div>\n <font color=ffffff>\n <select name="verlaufOrder" size="1">\n <option value="$data[4]">Bisherige Einstellung ($data[4])\n <option value="0">Neue Verlaufnachrichten oben (0)\n <option value="1">Neue Verlaufnachrichten unten (1)\n </select>\n </font>\n </td>\n </tr>\n </table>\n<br>\n <div>PS: Einstellungen des Nachrichten-Verlaufs werden erst nach einem Neueinloggen aktualisiert.</div>\n <hr>\n <table>\n <tr>\n <td>\n <div>\n <input type="radio" name="eingabe" value="col" checked>\n Auswahl von Farbe 1\n <br>\n (Farbe Deines Nicks):\n <br>\n <input name="col" size="6" maxlength="6" value="$data[1]">\n </div>\n </td>\n <td width=20>\n </td>\n <td>\n <div>\n <input type="radio" name="eingabe" value="secol">\n Auswahl von Farbe 2\n <br>\n (Farbe Deiner Nachrichten):\n <br>\n <input name="secol" size="6" maxlength="6" value="$data[2]">\n </div>\n </td>\n </tr>\n </table>\n<br>\n <div>\n Beliebige Auswahl markieren und Farbe w\344hlen. Um Deine Optionen abzuspeichern,\n auf "Daten \344ndern" klicken!\n </div>\n <br>\n];
+ open COLORS, '<templates/colors.sno';
+ @colors = <COLORS>;
+ close COLORS;
+ print @colors;
+ }
+ elsif ($method eq 'edit_profile_html') {
+ if ($message eq 'edit_profile_ok') {
+ print " <div class=b>\n Hinweis:\n </div>\n <div>\n Du hast soeben Dein Profil erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren:\n <hr>\n";
+ }
+ else {
+ print $q->div('Hier kannst Du Dein Profil editieren!'), $q->hr;
+ }
+ print qq[ <form action="chat">\n <input type="hidden" name="var" value="edit_profile">\n <div>\n Dein Nachname:\n <br>\n <input name="nachname" value="$data[0]">\n </div>\n <br>\n <div>\n Dein Vorname:\n <br>\n <input name="vorname" value="$data[1]">\n </div>\n <br>\n <div>\n Dein Alter:\n <br>\n <input name="alter" value="$data[2]">\n </div>\n <br>\n <div>\n Dein Wohnort:\n <br>\n <input name="wohnort" value="$data[3]">\n </div>\n <br>\n <div>\n Deine E-Mail Adresse:\n <br>\n <input name="email" value="$data[4]">\n </div>\n <br>\n <div>\n Deine ICQ-Nummer:\n <br>\n <input name="icq" value="$data[5]">\n </div>\n <br>\n <div>\n Deine Homepage:\n <br>\n <input name="homepage" value="$data[6]">\n </div>\n <br>\n <div>\n Weiteres:\n <br>\n <textarea rows="5" cols="40"name="weiteres" wrap="virtual">$data[7]</textarea>\n </div>\n];
+ }
+ print qq[ <hr>\n <font color=ffffff>\n <input type="hidden" name="request" value="divcom">\n <input type="hidden" name="alias" value="$alias">\n <input type="hidden" name="tmpid" value="$tmpid">\n <input type="hidden" name="room" value="$room">\n <input type="submit" value="Daten \344ndern ...">\n </font>\n </form>\n</body>\n</html>\n];
+}
+sub edit {
+ my $method = $_[0];
+ if ($method eq 'edit_profile') {
+ my $url = $homepage;
+ $url =~ s[^http://*][];
+ open PROFILE, ">data/user/profiles/$alias";
+ my $profile = "$nachname\n$vorname\n$alter\n$wohnort\n$email\n$icq\nhttp://$url\n$weiteres";
+ $profile =~ s/</&lt;/g;
+ print PROFILE $profile;
+ close PROFILE;
+ &edit_html('edit_profile_html', 'edit_profile_ok');
+ }
+ elsif ($method eq 'edit_options') {
+ if ($id ne $tmp) {
+ &edit_html('edit_options_html', 'edit_pw_wrong');
+ $client->shutdown(2);
+ exit 0;
+ }
+ open OPTIONS, ">data/user/options/$alias";
+ my $options = "$id\n$col\n$secol\n$maxVerlauf\n$verlaufOrder";
+ $options =~ s/</&lt;/g;
+ print OPTIONS $options;
+ close OPTIONS;
+ open IDENT, "<data/online/ident/$alias";
+ my (@ident) = <IDENT>;
+ close IDENT;
+ open IDENT, ">data/online/ident/$alias";
+ print IDENT $ident[0] . $ident[1] . $ident[2] . "$col\n$secol";
+ close IDENT;
+ my $room = &get_room($alias);
+ &private_javascript($alias, $room, "parent.input.document.inf.col.value = '$col'; parent.input.document.inf.secol.value = '$secol';");
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> <font color='$secol'>hat seine Chat-Einstellungen ge&auml;ndert</font> ...</font></i>", $alias);
+ &post_strmsg($alias, $room, 'col', "$col;$secol");
+ &edit_html('edit_options_html', 'edit_options_ok');
+ }
+}
+1;
diff --git a/0.7.6/modules/hierachie.pm b/0.7.6/modules/hierachie.pm
new file mode 100644
index 0000000..b6f5732
--- /dev/null
+++ b/0.7.6/modules/hierachie.pm
@@ -0,0 +1,77 @@
+sub hierachie {
+ my($alias, $room) = @_;
+ open FILE, "<data/online/rstat/$room";
+ flock FILE, 2;
+ my(@rstat) = <FILE>;
+ close FILE;
+ shift @rstat;
+ shift @rstat;
+ open FILE, '<data/hierachie';
+ flock FILE, 2;
+ my(@hierachie) = <FILE>;
+ close FILE;
+ my(@userlevels) = (@hierachie, @rstat);
+ foreach $_ (@userlevels) {
+ my($name, $level) = split(/<;/, $_, 3);
+ if ($name eq $alias) {
+ chomp $level;
+ return $level;
+ }
+ }
+ return 0;
+}
+sub hierachie_rm {
+ my $alias = shift @_;
+ my @return;
+ open FILE, '<data/hierachie';
+ my(@hierachie) = <FILE>;
+ close FILE;
+ foreach $_ (@hierachie) {
+ push @return, $_ unless /^$alias<;/;
+ }
+ open FILE, '>data/hierachie';
+ print FILE @return;
+ close FILE;
+}
+sub hierachie_rm_rstat {
+ my($alias, $room) = @_;
+ my @return;
+ return unless open FILE, "<data/online/rstat/$room";
+ my(@hierachie) = <FILE>;
+ close FILE;
+ foreach $_ (@hierachie) {
+ push @return, $_ unless /^$alias<;/;
+ }
+ open FILE, ">data/online/rstat/$room";
+ print FILE @return;
+ close FILE;
+}
+sub hierachie_add {
+ my($alias, $level) = @_;
+ &hierachie_rm($alias);
+ open FILE, '>>data/hierachie';
+ print FILE "$alias<;$level\n";
+ close FILE;
+}
+sub hierachie_add_rstat {
+ my($alias, $level, $room) = @_;
+ &hierachie_rm_rstat($alias, $room);
+ return unless open FILE, ">>data/online/rstat/$room";
+ print FILE "$alias<;$level\n";
+ close FILE;
+}
+sub prove_away {
+ my($alias, $room) = @_;
+ return unless open AWAY, "<data/online/rstat/$room.away";
+ @away = <AWAY>;
+ close AWAY;
+ my $name, $away;
+ foreach $_ (@away) {
+ if (/^$alias.*/) {
+ ($name, $away) = split(/<; /, $_, 3);
+ chomp $away;
+ return $away;
+ }
+ }
+}
+1;
diff --git a/0.7.6/modules/htdocs.pm b/0.7.6/modules/htdocs.pm
new file mode 100644
index 0000000..4f1bbeb
--- /dev/null
+++ b/0.7.6/modules/htdocs.pm
@@ -0,0 +1,127 @@
+sub htdocs {
+ if ($var eq 'help_html') {
+ &printfile('templates/help.sno', 'Alle Chatbefehle');
+ }
+ elsif ($var eq 'logo_html') {
+ &start_html('Logo');
+ &logo_html;
+ }
+ elsif ($var eq 'menu_html') {
+ &menu_html;
+ }
+ elsif ($var eq 'logs_html') {
+ &logs_html;
+ }
+ elsif ($var eq 'view_logs_html') {
+ &secure_checkid($alias, $tmpid);
+ &printfile("data/logs/$tmp", 'Logdatei', 'blank') if 7 <= &hierachie($alias);
+ }
+ elsif ($var eq 'superuser_html') {
+ &secure_checkid($alias, $tmpid);
+ &superuser_html;
+ }
+ elsif ($var eq 'chatiquette_html') {
+ &printfile('templates/chatiq.sno', 'Chatiquette');
+ print $q->end_html;
+ }
+ else {
+ print $q->start_html(-'bgcolor', '000000'), $q->end_html;
+ }
+}
+sub menu_html {
+ &start_html("Men\374");
+ print "<div>\n Von hier aus kannst du alle Untermen\374punkte des Systems erreichen:\n</div>\n<hr>\n";
+ &menu();
+ print "</body>\n</html>";
+}
+sub logo_html {
+ print qq[ <layer top=-3 left=0><div style="position:absolute; top:5; left:10">\n <OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"\n codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0"\n WIDTH=48 HEIGHT=48>\n <PARAM NAME=movie VALUE="$gfxpath/ySymbol.swf">\n <PARAM NAME=loop VALUE=false>\n <PARAM NAME=menu VALUE=false>\n <PARAM NAME=quality VALUE=high>\n <PARAM NAME=scale VALUE=noborder>\n <PARAM NAME=wmode VALUE=opaque>\n <PARAM NAME=bgcolor VALUE=$bgcolor>\n <EMBED src="$gfxpath/ySymbol.swf" loop=false menu=false quality=high scale=noborder wmode=opaque bgcolor=$bgcolor WIDTH=48 HEIGHT=48 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED>\n </OBJECT>\n </div></layer>\n];
+ print $q->end_html;
+}
+sub logs_html {
+ &start_html('Logdateien');
+ &menu;
+ print "<div>\n Hier befinden sich alle Logdateien\n</div>\n<hr>\n";
+ if (5 <= &hierachie($alias)) {
+ print $q->div(qq[Folgende Logdateien des Raumes "$standardroom" k\366nnen nur von Oberw\344chtern oder h\366her gelesen werden (Sortiert nach A-Z, a-z):]), $q->br;
+ opendir LOGS, 'data/logs';
+ my(@logs) = readdir LOGS;
+ closedir LOGS;
+ my(@sortedir) = sort(@logs);
+ foreach $_ (@sortedir) {
+ if (-f "data/logs/$_") {
+ print $q->a({-'href', "chat?request=htdocs&alias=$alias&var=view_logs_html&tmp=$_&tmpid=$tmpid", -'target', '_new'}, "$_"), ' ';
+ }
+ }
+ }
+ else {
+ print $q->div("Logdateien k\366nnen nur von Oberw\344chtern (OW) gelesen werden. Du bist jedoch ein W\344chter (W\304) oder ein", qq["Normaler Chatter". Oberw\344chter k\366nnen alles nachlesen, was \366ffentlich im Raum "Cyberbar" gechattet wurde.]), $q->hr;
+ }
+ print $q->end_html;
+}
+sub superuser_html {
+ &start_html ('Superuser');
+ &menu;
+ print "<div>Hallo $alias. Du bist als ";
+ my $hierachie = &hierachie($alias);
+ if (9 <= $hierachie) {
+ print $q->b('Administrator'), ' (AD) eingetragen.</div><br>', $q->br;
+ }
+ elsif (7 <= $hierachie) {
+ print $q->b("Oberw\344chter"), ' (OW) eingetragen.</div><br>', $q->br;
+ }
+ elsif (5 <= $hierachie) {
+ print $q->b("W\344chter"), " (W\304) eingetragen.</div><br>", $q->br;
+ }
+ else {
+ print $q->b('normaler Chatter'), ' (NC) eingetragen.</div><br>', $q->br;
+ }
+ open FILE, 'data/hierachie';
+ my(@hierachie) = <FILE>;
+ close FILE;
+ my @ows, @was, @ads;
+ foreach $_ (@hierachie) {
+ my($name, $level) = split(/<;/, $_, 3);
+ chomp $level;
+ if ($level == 5) {
+ push @was, $name;
+ }
+ elsif ($level == 7) {
+ push @ows, $name;
+ }
+ elsif ($level == 9) {
+ push @ads, $name;
+ }
+ if (3 <= $hierachie) {
+ if ($level == 6) {
+ push @was, "$name!";
+ }
+ elsif ($level == 8) {
+ push @ows, "$name!";
+ }
+ elsif ($level == 10) {
+ push @ads, "$name!";
+ }
+ }
+ }
+ my $nads = $#ads + 1;
+ print '<div>', $q->b('AD'), "s ($nads St\374ck)";
+ foreach $_ (@ads) {
+ print $q->font({-'color', 'ffa500'}, ' ' . $_);
+ }
+ my $nrow = $#ows + 1;
+ print '</div><br><br><div>', $q->b('OW'), "s ($nrow St\374ck)";
+ foreach $_ (@ows) {
+ print $q->font({-'color', 'ffa500'}, ' ' . $_);
+ }
+ my $nrwa = $#was + 1;
+ print '</div><br>', $q->br, '<div>', $q->b("W\304"), "s ($nrwa St\374ck)";
+ foreach $_ (@was) {
+ print $q->font({-'color', 'FFA500'}, ' ' . $_);
+ }
+ print qq[<hr>\n Die jeweiligen F\344higkeiten der Oberw\344chter (OW) und der W\344chter (W\304) sind unter\n "<a href="chat?request=htdocs&var=help_html">Chat-Befehle</a>"\n dokumentiert. Versteckte Superuser k\366nnen nur von anderen Superusern auf\ndieser Liste eingesehen werden!\n</div>\n</body>\n</html>\n];
+}
+sub menu {
+ print "<div>\n <a href='chat?request=divcom&var=edit_profile_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Profil \344ndern</a>\n <a href='chat?request=divcom&var=edit_options_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Optionen</a>\n <a href='chat?request=divcom&var=list_alias_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Benutzer</a>\n <a href='chat?request=htdocs&var=help_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Befehle</a>\n <a href='chat?request=divcom&var=gb_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Board</a>\n <a href='chat?request=htdocs&var=superuser_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Superuser</a>\n <a href='chat?request=htdocs&var=logs_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Logs</a>\n <a href='chat?request=statistic&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Statistik</a>\n <a href='chat?request=htdocs&var=chatiquette_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Chatiquette</a>\n</div>\n<hr>\n";
+}
+1;
diff --git a/0.7.6/modules/input.pm b/0.7.6/modules/input.pm
new file mode 100644
index 0000000..48df243
--- /dev/null
+++ b/0.7.6/modules/input.pm
@@ -0,0 +1,14 @@
+sub input {
+ &rm_away($alias, $room);
+ $maxVerlauf = '10' if $maxVerlauf eq undef;
+ $verlaufOrder = '1' if $verlaufOrder eq undef;
+ if ($tmp eq 'login') {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> hat den Chat im Raum <b>$room</b> betreten ...</font></i>");
+ }
+ print qq[<html>\n<head>\n<script language="JavaScript"><!--\n\n// Einstellungsvariablen\nmaxVerlauf = $maxVerlauf; // Anzahl der Eintr\344ge des Verlaufs\nmaxPreview = 20; // Zeichenl\344nge der Verlaufsvorschau\nverlaufOrder = $verlaufOrder; // Neue Nachrichten von: 0=oben, 1=unten\n//autoAwayTimeout = 5; // Sekunden, nach denen der User 'Away' gesetzt wird\n//autoQuitTimeout = 10; // Sekunden, nach denen der User den Chat verl\344sst\nautoAwayTimeout = 300; // Sekunden, nach denen der User 'Away' gesetzt wird\nautoQuitTimeout = 1200; // Sekunden, nach denen der User den Chat verl\344sst\n\n// Interne Variablen\nuserNotFocused = false; // Wenn User nicht schreibt\nuserAway = false; // Wenn User automatisch auf 'Away' gesetzt ist\nuserAwayTime = 0; // Sekunden, die User 'Away' ist\nfullVerlauf = new Array( maxVerlauf ); // Verlaufspuffer\n\nfunction delout()\n{\n addVerlauf (document.inf.msg.value); // Dem Verlauf eine Nachricht anh\344ngen\n document.inf.msg.focus(); // Fukus in das Eingabeform\n document.inf.msg.select(); // Text im Eigabeform markieren\n document.inf.submit(); // Formular absenden\n return false; // Abbrechen, damit das Frame nicht neu geladen wird\n}\n\nfunction CheckAuswahl()\n{\n id=document.verlaufform.verlauf.selectedIndex; // ID des ausgew\344hlten Feldes\n\n if (fullVerlauf[id-1] != null) // Nur, wenn das Feld nicht leer ist\n {\n document.inf.msg.value = fullVerlauf[id-1]; // Eintrag ins Textfeld\n }\n\n document.verlaufform.verlauf.selectedIndex = 0; // Ersten Eintrag (\334berschrift) ausw\344hlen\n document.inf.msg.focus(); // Eingabefeld fokusieren\n\n return true;\n}\n\nfunction addVerlauf (msg)\n{\n if (msg == "") // Falls msg leer\n return false; // Aufruf ignorieren\n\n if (verlaufOrder) // neue Nachrichten von unten\n {\n for (i=0; i<(maxVerlauf-1); i++) // Alle Eintr\344ge einen aufrutschen\n {\n document.verlaufform.verlauf.options[i+1].text = document.verlaufform.verlauf.options[i+2].text;\n fullVerlauf[i] = fullVerlauf[i+1];\n }\n }\n else // neue Nachrichten von oben\n {\n for (i=(maxVerlauf-2); i>=0; i--) // Alle Eintr\344ge einen aufrutschen\n {\n document.verlaufform.verlauf.options[i+2].text = document.verlaufform.verlauf.options[i+1].text;\n fullVerlauf[i+1] = fullVerlauf[i];\n }\n }\n\n if (msg.length > maxPreview) // Vorschau zuschneiden\n pre = msg.slice(0, maxPreview-3) + "...";\n else\n pre = msg;\n\n if (verlaufOrder) // pos = Position des neuen Eintrags\n pos = maxVerlauf-1;\n else\n pos = 0\n\n document.verlaufform.verlauf.options[pos+1].text = pre; // Neue Vorschau anf\374gen\n fullVerlauf[pos] = msg; // Neuen Eintrag an den Verlauf anf\374gen\n\n// document.verlaufform.verlauf.selectedIndex = maxVerlauf; // Fokus auf den letzten Eintrag\n document.verlaufform.verlauf.selectedIndex = 0; // Fokus auf den ersten Eintrag (\334berschrift)\n}\n\nfunction msgBlur()\n{\n userNotFocused = true;\n userAwayTime = 0;\n userAway = false;\n}\n\nfunction msgFocus()\n{\n userNotFocused = false;\n if (userAway) // Wird ausgef\374hrt, falls User 'Away' war\n {\n ; // nop\n }\n userAwayTime = 0;\n userAway = false;\n}\n\nfunction checkInterval()\n{\n// status = "userNotFocused=" + userNotFocused + "; userAway=" + userAway + "; userAwayTime=" + userAwayTime + ""; // Debug\n if (userNotFocused)\n {\n userAwayTime += 5; // Addiere 5, da nur alle 5Sek ausgef\374hrt\n if (!userAway)\n {\n if (autoAwayTimeout < userAwayTime) // Falls Zeit abgelaufen\n {\n if (document.inf.tmp.value != "away")\n open ("chat?request=postmessage&alias=$alias&tmpid=$tmpid&msg=%2faway&tmp=autoaway","reload"); // 'Away' setzen\n userAway = true;\n }\n }\n else\n {\n if (autoQuitTimeout < userAwayTime) // Falls Zeit abgelaufen\n {\n open ("chat?request=postmessage&alias=$alias&tmpid=$tmpid&msg=%2fexit&tmp=autologout","reload"); // Chat beenden\n }\n }\n }\n\n window.setTimeout("checkInterval()",5000); // In 5 Sekunden wieder aufrufen\n}\n\nfunction initFrame()\n{\n window.setTimeout("checkInterval()",5000); // In 5 Sekunden aufrufen\n document.inf.msg.focus(); // Eingabefeld fokusieren\n}\n//-->\n</script>\n];
+ &style;
+ print qq[</head>\n<body class="blank" onload="initFrame();">\n <div align="left">\n <table border="0" cellpadding="0" cellspacing="0">\n <tr>\n <td>\n <form name="inf" target="reload" action="chat" onsubmit="return delout();">\n <input type="hidden" name="request" value="postmessage">\n <input type="hidden" name="alias" value="$alias">\n <input type="hidden" name="room" value="$room">\n <input type="hidden" name="col" value="$col">\n <input type="hidden" name="secol" value="$secol">\n <input type="hidden" name="tmpid" value="$tmpid">\n <input type="hidden" name="whisper" value="$whisper">\n <input type="hidden" name="tmp" value="$tmp">\n <input size="40" maxlength="300" name="msg" onBlur="msgBlur();" onFocus="msgFocus();">\n </form>\n </td>\n <td><form name="verlaufform">\n <script language="JavaScript"><!--\n document.write("<select size='1' name='verlauf' size='40' onChange='CheckAuswahl();'>");\n document.write("<option>- Nachrichten-Verlauf -</option>");\n for(i=0; i<maxVerlauf; i++) // Leere Verlaufsfelder generieren\n document.write("<option value>(leer)</option>");\n document.write("</select>");\n //-->\n </script>\n </form>\n </td>\n </tr>\n </table>\n </div>\n</body>\n</html>\n];
+ $client->$shutdown(2);
+ exit 0;
+}
+1;
diff --git a/0.7.6/modules/loggedin.pm b/0.7.6/modules/loggedin.pm
new file mode 100644
index 0000000..dee4d97
--- /dev/null
+++ b/0.7.6/modules/loggedin.pm
@@ -0,0 +1,41 @@
+sub loggedin {
+ &start_html($loginplace, 'blank');
+ print qq[<div>\n <font color='$col'>$alias</font>, sch\366n da\337 Du da bist :-), <a href='chat?request=loggedin&alias=$alias&col=$col&secol=$secol&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder' style="text-decoration: underline; color: red">hier</a> kannst du die Seite aktualisieren.\n</div>\n<hr>\n<div>\n<a href="chat?request=stream&alias=$alias&room=$standardroom&col=$col&secol=$secol&tmp=login&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder" style="text-decoration: underline; color: red">Hier</a>\nkannst du den Standardraum $standardroom betreten. <br><br>\n];
+ opendir ROOMDIRS, 'data/online/rooms';
+ local(@roomdirs) = readdir ROOMDIRS;
+ close ROOMDIRS;
+ foreach $_ (@roomdirs) {
+ if (-e "data/online/rooms/$_" and $_ ne '..' and $_ ne '.') {
+ my $room = $_;
+
+ open RSTAT, "<data/online/rstat/$room";
+ my(@rstat) = <RSTAT>;
+ close RSTAT;
+
+ my $door = '[<font color=red>Abgesperrt!</font>]' if $rstat[0] eq "1\n";
+
+ opendir ROOMDIR, "data/online/rooms/$room";
+ my(@roomdir) = readdir ROOMDIR;
+ close ROOMDIR;
+
+ my $nr = $#roomdir - 1;
+ if ($door or $_ eq $loginplace) {
+ print $q->b($_), " $door ($nr) ";
+ }
+ else {
+ print $q->b($q->a({-'href', "chat?request=stream&alias=$alias&room=$_&col=$col&secol=$secol&tmp=login&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder"}, "$_")), " ($nr)";
+ }
+ print " Raumthema: $rstat[1]" if $rstat[1] ne "\n";
+ print $q->br;
+ foreach $_ (@roomdir) {
+ if ($_ ne '..' and $_ ne '.') {
+ my $col = &get_ident($_,3);
+ print "<a href='chat?request=divcom&var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid' target='$_' style='color: $col'>$_</a> ";
+ }
+ }
+ print $q->br, $q->br;
+ }
+ }
+ &gb_html($_[0],'loggedin');
+}
+1;
diff --git a/0.7.6/modules/online.pm b/0.7.6/modules/online.pm
new file mode 100644
index 0000000..b59ae6e
--- /dev/null
+++ b/0.7.6/modules/online.pm
@@ -0,0 +1,148 @@
+sub online {
+ &secure_checkid($alias, $tmpid);
+ my(@away) = &prove_away($alias, $room, 'return_list');
+ for (;;) {
+ for ($i = 0; $i <= $#away; $i += 2) {
+ last if $away[$i] eq $alias or $room eq $loginplace;
+ }
+ open DATEI, "<data/online/users/$alias";
+ my $oldstamp = <DATEI>;
+ close DATEI;
+ if ($oldstamp > time - 100) {
+ open DATEI, "<data/user/counts/$alias.online";
+ my $online = <DATEI>;
+ close DATEI;
+ my $total = time - $oldstamp + $online;
+ open DATEI, ">data/user/counts/$alias.online";
+ print DATEI $total;
+ close DATEI;
+ }
+ last;
+ }
+ unless (-d "data/online/rooms/$room") {
+ mkdir "data/online/rooms/$room", 511;
+ }
+ open DATEI, ">data/online/users/$alias";
+ print DATEI time;
+ close DATEI;
+
+ open DATEI, ">data/online/rooms/$room/$alias";
+ print DATEI time;
+ close DATEI;
+ open DATEI, '<data/online/prove';
+ my $provetime = <DATEI>;
+ close DATEI;
+
+ &check_online if $provetime < time - 40;
+ print <<END;
+ <html>
+ <head>
+ <meta http-equiv="refresh" content="20" URL="chat?request=online&room=$room&alias=$alias&tmpid=$tmpid">
+ <style type="text/css">\n a { font-family: arial; font-size:11px; color: #ffffef; }\n a:hover { color: #ffffff; }\n </style>\n <style type="text/css" media="all">\n a { text-decoration: none; }\n a:hover { text-decoration:underline; }
+ </style>
+ </head>
+ <body bgcolor="$chatbg">
+END
+
+ opendir ROOM, 'data/online/rooms/' . $room;
+ my(@room) = sort(readdir ROOM);
+ closedir ROOM;
+
+ my $chatter = $#room - 1;
+ print "<font size='1' color='ffffff' face='arial'>$room ($chatter):</font><table>\n";
+
+ open FILE, "<data/online/rstat/$room";
+ my(@rstat) = <FILE>;
+ close FILE;
+ shift @rstat;
+ shift @rstat;
+
+ open FILE, '<data/hierachie';
+ my(@userlevels) = (<FILE>, @rstat);
+ close FILE;
+
+ open FILE, "<data/online/rstat/$room.away";
+ my(@away) = <FILE>;
+ close FILE;
+
+ my $hierachie;
+ foreach (@userlevels) {
+ my($name, $level) = split(/<;/, $_, 3);
+ if ($name eq $alias) {
+ $hierachie = $level;
+ last;
+ }
+ }
+
+ foreach my $nick (@room) {
+ if (-f "data/online/rooms/$room/$nick") {
+ my $inside = 0;
+ my $col = &get_ident($nick,3);
+ foreach $_ (@away) {
+ my($name, $awaymessage) = split(/<;/, $_, 3);
+ if ($name eq $nick) {
+ chomp $awaymessage;
+ print "<tr><td><a href=\"javascript:alert('$nick ist aus folgendem Grund abwesend:\n\n$awaymessage');\"><img border='0' title='$awaymessage' alt='$awaymessage' src='$gfxpath/away.gif'></a></td>";
+ $inside = 2;
+ }
+ }
+ if ($inside == 0) {
+ foreach $_ (@userlevels) {
+ my($name, $level) = split(/<;/, $_, 3);
+ if ($nick eq $name) {
+ chomp $level;
+ $inside = 1;
+ if ($level == 1) {
+ print "<tr><td><img title='Raumbesetzer' alt='Raumbesetzer' src='$gfxpath/rb.gif'></td>";
+ last;
+ }
+ elsif ($level == 2) {
+ print "<tr><td><img title='Die Unschuld vom Land' alt='Die Unschuld vom Land' src='$gfxpath/uvl.gif'></td>";
+ last;
+ }
+ elsif ($level == 3) {
+ print "<tr><td><img title='Tempor&auml;rer W&auml;chter' alt='Tempor&auml;rer W&auml;chter' src='$gfxpath/twa.gif'></td>";
+ last;
+ }
+ elsif ($level == 5) {
+ print "<tr><td><img title='W&auml;chter' alt='W&auml;chter' src='$gfxpath/wa.gif'></td>";
+ last;
+ }
+ elsif ($level == 7) {
+ print "<tr><td><img title='oberw&auml;chter' alt='Oberw&auml;chter' src='$gfxpath/ow.gif'></td>";
+ last;
+ }
+ elsif ($level == 9) {
+ print "<tr><td><img title='Administrator' alt='Administrator' src='$gfxpath/adm.gif'></td>";
+ last;
+ }
+
+ if (5 <= $hierachie) {
+ if ($level == 6) {
+ print "<tr><td><img title='W&auml;chter' alt='Unsichtbarer W&auml;chter' src='$gfxpath/wa-i.gif'></td>";
+ last;
+ }
+ elsif ($level == 8) {
+ print "<tr><td><img title='oberw&auml;chter' alt='Unsichtbarer Oberw&auml;chter' src='$gfxpath/ow-i.gif'></td>";
+ last;
+ }
+ elsif ($level == 10) {
+ print "<tr><td><img title='Administrator' alt='Unsichtbarer Administrator' src='$gfxpath/adm-i.gif'></td>";
+ last;
+ }
+
+ }
+ print '<tr><td></td>';
+ last;
+ }
+ }
+ }
+ if ($inside == 0) {
+ print '<tr><td></td>';
+ }
+ print "<td><a href='chat?request=divcom&var=alias_html&alias=$alias&tmp=$nick&tmpid=$tmpid' target='$nick' style='color: $col'>$nick</a></td></tr>\n";
+ }
+ }
+ print '</table></body></html>';
+}
+1;
diff --git a/0.7.6/modules/postmessage.pm b/0.7.6/modules/postmessage.pm
new file mode 100644
index 0000000..5172b4f
--- /dev/null
+++ b/0.7.6/modules/postmessage.pm
@@ -0,0 +1,90 @@
+sub postmessage {
+ if (not -e "data/online/rooms/$room/$alias" and $tmp ne 'autoaway' and $tmp ne 'autologout') {
+ &post_prv($alias, "<font color=ffffff>Du befindest Dich nicht im Raum <font color=ffa500>$room</font> und kannst dort auch keine Nachrichten posten!</font>");
+ &reload_html;
+ }
+ elsif (length $msg > 300) {
+ &post_prv($alias, "<font color=ffffff>Deine Nachricht enth\344lt zu viele Zeichen. Maximal sind 300 Zeichen erlaubt.</font>");
+ &reload_html;
+ }
+ if ($tmp eq 'away') {
+ &rm_away($alias, $room);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> hat sich zur\374ck gemeldet ... </font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ &private_javascript($alias, $room, q[parent.input.document.inf.tmp.value = 'notaway';]);
+ }
+ $msg =~ s/</&lt;/g;
+ if (substr($msg, 0, 1) ne '/') {
+ unless ($tmp eq 'autoaway') {
+ foreach $_ ($col, $secol) {
+ &prove_color($alias, $_);
+ }
+ }
+ open MSGFILE, ">>data/msgs/$room";
+ if (not $msg =~ s[/me/][<i>$alias</i>]g || $msg =~ s[/m/][<i><font color=$col>$alias</font></i>]g) {
+ print MSGFILE '!<;' . time . "<;!<;!<;<b><font color='$col'>$alias: <font color='$secol'>$msg<br></font></font></b><;$alias<;\n";
+ }
+ else {
+ $msg =~ s[/me/][<i>$alias</i>]g;
+ $msg =~ s[/m/][<i><font color=$col>$alias</font></i>]g;
+ print MSGFILE '!<;' . time . "<;!<;!<;<b><font color=$secol>$msg</font></font></b><br><;$alias<;\n";
+ }
+ close MSGFILE;
+ opendir PID, "data/online/pids/$room";
+ my(@pids) = readdir PID;
+ closedir PID;
+ foreach $_ (@pids) {
+ kill 'USR1', $_ if -f "data/online/pids/$room/$_";
+ }
+ &log("<b><font color=$col>$alias: <font color=$secol>$msg</font></font></b>") if $room eq $standardroom;
+ &reload_html;
+ }
+ else {
+ &command($msg, $tmp);
+ }
+}
+sub post {
+ my($room, $msg2post, $alias, $secroom) = @_;
+ my(@rooms) = $room;
+ @rooms = ($room, $secroom) if $room ne $secroom;
+ foreach my $theroom (@rooms) {
+ open MSGFILE, ">>data/msgs/$theroom";
+ print MSGFILE '!<;' . time . "<;!<;!<;$msg2post<br><;$alias<;\n";
+ close MSGFILE;
+ opendir PID, "data/online/pids/$theroom";
+ my(@pids) = readdir PID;
+ closedir PID;
+ foreach $_ (@pids) {
+ kill 'USR1', $_ if -f "data/online/pids/$theroom/$_";
+ }
+ }
+ &log($msg2post) if $room eq $standardroom;
+}
+sub post_prv {
+ my($alias2post, $msg2post) = @_;
+ my $roomofalias = &get_room($alias2post);
+ return 'false' if not $roomofalias;
+ open MSGFILE, ">>data/msgs/$roomofalias";
+ print MSGFILE "$alias2post<;" . time . "<;!<;!<;$msg2post<br><;$alias<;\n";
+ close MSGFILE;
+ opendir PID, "data/online/pids/$roomofalias";
+ my(@pids) = readdir PID;
+ closedir PID;
+ foreach $_ (@pids) {
+ kill 'USR1', $_ if -f "data/online/pids/$roomofalias/$_";
+ }
+ return 'true';
+}
+sub post_strmsg {
+ my($alias, $room, $command, $action) = @_;
+ open MSGFILE, ">>data/msgs/$room";
+ print MSGFILE "$alias<;" . time . "<;$command<;$action<;!<;!<;\n";
+ close MSGFILE;
+ opendir PID, "data/online/pids/$room";
+ my(@pids) = readdir PID;
+ closedir PID;
+ foreach $_ (@pids) {
+ kill 'USR1', $_ if -f "data/online/pids/$room/$_";
+ }
+}
+
+1;
diff --git a/0.7.6/modules/shared.pm b/0.7.6/modules/shared.pm
new file mode 100644
index 0000000..f68cc80
--- /dev/null
+++ b/0.7.6/modules/shared.pm
@@ -0,0 +1,338 @@
+sub reload_html {
+ print "<html><body bgcolor='$chatbg'></body></html>";
+ $client->shutdown(2);
+ exit 0;
+}
+sub printfile {
+ my($file2print, $pagetitle, $bodyclass) = @_;
+ &start_html($pagetitle, $bodyclass) if $pagetitle ne '';
+ &menu unless $bodyclass eq 'blank';
+ open FILE2PRINT, "<$file2print";
+ print "$_\n" while defined($_ = <FILE2PRINT>);
+ close FILE2PRINT;
+}
+sub start_html {
+ print "<html><head><title>$title - $_[0]</title>$_[2]";
+ &style;
+ print '</head>';
+ if ($_[1] eq 'start') {
+ print '<body onload="document.login.alias.focus();">';
+ }
+ elsif ($_[1] ne '') {
+ print "<body class=$_[1]>";
+ }
+ else {
+ print '<body>';
+ }
+}
+sub log {
+ my $msg2log = $_[0];
+ my($secs, $mins, $hours, $days, $months, $years) = &timearray;
+ my $js;
+ ($msg2log, $js) = split(/<script/, $msg2log, 3);
+ open LOG, ">>data/logs/$days.$months.$years";
+ print LOG "<br><font color=ffffef><i>($hours:$mins:$secs)</i></font> $msg2log\n";
+ close LOG;
+}
+sub timestring {
+ my($mins, $hours) = (localtime)[1, 2];
+ $hours = '0' . $hours if $hours < 10;
+ $mins = '0' . $mins if $mins < 10;
+ return "$hours:$mins";
+}
+sub timearray {
+ my($secs, $mins, $hours, $days, $months, $years) = (localtime)[(0, 1, 2, 3, 4, 5)];
+ $months += 1;
+ $hours = '0' . $hours if $hours < 10;
+ $mins = '0' . $mins if $mins < 10;
+ $secs = '0' . $secs if $secs < 10;
+ $days = '0' . $days if $days < 10;
+ $months = '0' . $months if $months < 10;
+ $years = $years - 100;
+ if ($years < 10) {
+ $years = '200' . $years;
+ }
+ else {
+ $years = '20' . $years;
+ }
+ return $secs, $mins, $hours, $days, $months, $years;
+}
+sub error {
+ my $error_msg = $_[0];
+ &start_html("Error: ($error_msg)");
+ print $q->div("Error: ($error_msg)"), $q->end_html;
+ open ERROR, '>>data/error';
+ print ERROR "Alias: $alias TempID: $tmpid File. $0 PID: $$ Time: " . time . " Message: $error_msg \n";
+ close ERROR;
+ $client->shutdown(2) if $client;
+ exit 0;
+}
+sub check_online {
+ open PROVE, '>data/online/prove';
+ print PROVE time;
+ close PROVE;
+ opendir DIR, 'data/online/rooms';
+ my(@roomdir) = readdir DIR;
+ closedir DIR;
+ foreach my $theroom (@roomdir) {
+ opendir DIR, "data/online/rooms/$theroom";
+ my(@roomusers) = readdir DIR;
+ closedir DIR;
+ my $empty = 1;
+ foreach $user (@roomusers) {
+ if (-f "data/online/rooms/$theroom/$user") {
+ $empty = 0;
+ open USER, "<data/online/rooms/$theroom/$user";
+ my $userstamp = <USER>;
+ close USER;
+ if ($userstamp < time - 40) {
+ unlink "data/online/$theroom/$user";
+ open USER, "<data/online/users/$user";
+ my $userstamp = <USER>;
+ close USER;
+ if ($userstamp < time - 40) {
+ &post($theroom, '<i><font color=ffffff>' . &timestring . " <font color='".&get_ident($user,3)."'>$user</font> hat den Chat verlassen ... </font></i>");
+ if ($user ne $alias) {
+ &rm_alias($user, $theroom);
+ }
+ else {
+ unlink "data/online/rooms/$theroom/$user";
+ }
+ }
+ }
+ }
+ }
+ opendir PIDS, "data/online/pids/$theroom";
+ my(@pids) = readdir PIDS;
+ closedir PIDS;
+ if ($empty == 1) {
+ rmdir "data/online/rooms/$theroom";
+ unlink "data/online/rstat/$theroom";
+ unlink "data/online/rstat/$theroom.away";
+ unlink "data/msgs/$theroom";
+ foreach $_ (@pids) {
+ unlink "data/online/pids/$theroom/$_" if -f "data/online/pids/$theroom/$_";
+ }
+ rmdir "data/online/pids/$theroom";
+ }
+ }
+}
+sub rm_if_loggedin {
+ my $alias = shift;
+ my $room = &get_room($alias);
+ while ($room ne undef) {
+ &rm_alias($alias, $room);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$user</font> hat den Chat verlassen ... </font></i>");
+ $room = &get_room($alias);
+ }
+}
+sub secure_checkid {
+ my($alias2check, $tmpid) = @_;
+ &error("Falsche TempID! $tmpid") unless -f "data/online/tmpid/$alias.$tmpid";
+}
+sub rm_alias {
+ my($alias, $room) = @_;
+ unlink "data/online/rooms/$room/$alias";
+ unlink "data/online/users/$alias";
+ opendir TMPID, 'data/online/tmpid';
+ my(@tmpid) = readdir TMPID;
+ close TMPID;
+ foreach $_ (@tmpid) {
+ unlink "data/online/tmpid/$_" if /^$alias\..+$/;
+ }
+ unlink "data/online/ident/$alias";
+ &rm_rstat($alias, $room);
+}
+sub rm_rstat {
+ my($alias, $room) = @_;
+ open RSTAT, "<data/online/rstat/$room";
+ my(@rstat) = <RSTAT>;
+ close RSTAT;
+ my(@rstat2) = ($rstat[0], $rstat[1]);
+ for ($i = 2; $i <= $#rstat; ++$i) {
+ chomp $rstat[$i];
+ push @rstat2, $rstat[$i] . "\n" unless $rstat[$i] =~ /^$alias<;/;
+ }
+ open RSTAT, ">data/online/rstat/$room";
+ print RSTAT @rstat2;
+ close RSTAT;
+}
+sub rm_away {
+ my($alias, $room) = @_;
+ open AWAY, "<data/online/rstat/$room.away";
+ my(@away) = <AWAY>;
+ close AWAY;
+ my @away2;
+ foreach $_ (@away) {
+ my(@split) = split(/<;/, $_, 0);
+ push @away2, $_ if $alias ne $split[0];
+ }
+ open AWAY, ">data/online/rstat/$room.away";
+ print AWAY @away2;
+ close AWAY;
+}
+sub rm_entry {
+ my($entry, $file) = @_;
+ open ENTRY, "<data/$file";
+ my(@entry) = <ENTRY>;
+ close ENTRY;
+ my @new;
+ foreach $_ (@entry) {
+ push @new, $_ if $entry . "\n" ne $_;
+ }
+ if (@entry != @new) {
+ open ENTRY, ">data/$file";
+ print ENTRY @new;
+ close ENTRY;
+ return 1;
+ }
+ else {
+ return;
+ }
+}
+sub add_entry {
+ my($entry, $file) = @_;
+ open ENTRY, "<data/$file";
+ my(@entry) = <ENTRY>;
+ close ENTRY;
+ foreach $_ (@entry) {
+ chomp $_;
+ return if $entry eq $_;
+ }
+ open ENTRY, ">>data/$file";
+ print ENTRY $entry . "\n";
+ close ENTRY;
+ return 1;
+}
+sub prove_color {
+ my($alias, $color) = @_;
+ my $length = length $color;
+ if ($length > 6 or $length < 6) {
+ &post_prv($alias, "<font color=ffffff>Ung\374ltige Hexadezimalfarbe.</font>");
+ &reload_html;
+ }
+}
+sub kill_alias {
+ my($alias2kill, $alias) = @_;
+ my($secs, $mins, $hours, $days, $months, $years) = &timearray;
+ unlink "data/user/options/$alias2kill";
+ unlink "data/user/profiles/$alias2kill";
+ unlink "data/user/gbooks/$alias2kill";
+ unlink "data/user/counts/$alias2kill";
+ unlink "data/user/counts/$alias2kill.online";
+ unlink "data/user/lastlogin/$alias2kill";
+ unlink "data/user/memos/$alias2kill";
+ &rm_entry($alias2kill, 'ban');
+ open DEL, '>>data/kill';
+ print DEL "($days.$months.$years $hours:$mins:$secs) $alias2kill wurde von $alias gekillt\n";
+ close DEL;
+}
+sub random_color {
+ my(@digit) = ('F', 'C', 'A', 'B', (5, 6, 7, 8, 9));
+ my $dig1 = rand @digit;
+ my $dig2 = rand @digit;
+ my $dig3 = rand @digit;
+ my $dig4 = rand @digit;
+ my $dig5 = rand @digit;
+ my $dig6 = rand @digit;
+ return $digit[$dig1] . $digit[$dig2] . $digit[$dig3] . $digit[$dig4] . $digit[$dig5] . $digit[$dig6];
+}
+sub url_decode {
+ my $t = shift @_;
+ $t =~ s[/][];
+ $t =~ tr/+/ /;
+ while ($t =~ s/%([a-f0-9][a-f0-9])/chr hex $1;/ie) {
+ ();
+ }
+ return $t;
+}
+sub url_encode {
+ my $t = shift @_;
+ while ($t =~ s/([^\w()'*~!.-])/sprintf '%%%02x', $1;/eg) {
+ ();
+ }
+ return $t;
+}
+sub calculate_hpm {
+ my($hits, $starttime) = @_;
+ return sprintf('%.2f', $hits / ((time - $starttime) / 60));
+}
+sub calculate_uptime_hours {
+ my $starttime = shift @_;
+ return sprintf('%.2f', (time - $starttime) / 3600);
+}
+sub private_javascript {
+ my($alias, $room, $javascript) = @_;
+ open MSGFILE, ">>data/msgs/$room";
+ print MSGFILE "$alias<;" . time . qq[<;!<;!<;<script language="JavaScript">$javascript</script><;\n];
+ close MSGFILE;
+ opendir PID, "data/online/pids/$room";
+ my(@pids) = readdir PID;
+ closedir PID;
+ foreach $_ (@pids) {
+ kill 'USR1', $_ if -f "data/online/pids/$room/$_";
+ }
+}
+sub get_theme {
+ my $room = shift @_;
+ open RSTAT, "data/online/rstat/$room";
+ my(@rstat) = <RSTAT>;
+ close RSTAT;
+ chomp $rstat[1];
+ return '<b>Raumthema:</b>' . $rstat[1] if $rstat[1] ne undef;
+}
+sub get_room {
+ my $alias = shift @_;
+ opendir DIR, 'data/online/rooms';
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach my $room (@dir) {
+ opendir DIR, "data/online/rooms/$room";
+ my(@chatter) = readdir DIR;
+ closedir DIR;
+ foreach my $chatter (@chatter) {
+ return $room if $chatter eq $alias;
+ }
+ }
+ return undef;
+}
+sub get_ident {
+ my ($alias,$line) = @_;
+ open IDENT, "data/online/ident/$alias";
+ my (@ident) = <IDENT>;
+ close IDENT;
+ chomp $ident[$line];
+ return $ident[$line];
+}
+sub get_online_users {
+ my @dir = &diropen('data/online/rooms');
+ my @users;
+
+ foreach my $room (@dir) {
+ next if $room =~ /\./;
+ my @room = &diropen("data/online/rooms/$room");
+
+ foreach (@room) {
+ push @users, $_ unless /\./;
+ }
+ }
+ return @users;
+}
+sub diropen {
+ my $dir = shift;
+
+ opendir DIR, $dir;
+ my @dir = readdir(DIR);
+ closedir(DIR);
+
+ return @dir;
+}
+sub debug {
+ open DEBUG, '>data/debug';
+ while (@_) {
+ chomp $_;
+ print DEBUG "$_\n";
+ }
+ close DEBUG;
+}
+1;
diff --git a/0.7.6/modules/start.pm b/0.7.6/modules/start.pm
new file mode 100644
index 0000000..3f0e435
--- /dev/null
+++ b/0.7.6/modules/start.pm
@@ -0,0 +1,252 @@
+sub start {
+ if ($var eq 'create_alias_html') {
+ &create_alias_html;
+ }
+ elsif ($var eq 'create_alias') {
+ &create_alias;
+ }
+ elsif ($var eq 'login_html') {
+ &login_html;
+ }
+ elsif ($var eq 'chatiquette_html') {
+ &chatiquette_html;
+ }
+ elsif ($alias eq '') {
+ &login_html;
+ }
+ else {
+ &checklogin;
+ }
+}
+sub login_html {
+ &check_online;
+ my $counter = undef;
+ open COUNT, '<data/count';
+ $counter = <COUNT>;
+ close COUNT;
+ ++$counter;
+ open COUNT, '>data/count';
+ flock COUNT, 2;
+ print COUNT $counter;
+ close COUNT;
+
+ my(@users) = &get_online_users;
+
+ opendir REGISTRED, 'data/user/options';
+ my(@registred) = readdir REGISTRED;
+ closedir REGISTRED;
+
+ my($logtin, $users) = ($#users + 1, $#registred - 1);
+ &start_html("Created & Copyright by Paul C. B\374tow", 'start');
+ print qq[ <center>\n <table width=500>\n <tr>\n <td>\n <center>\n <table>\n <tr>\n <td>\n <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0" WIDTH=240 HEIGHT=240>\n <param name=movie value="$gfxpath/yIntro.swf">\n <param name=loop value=false>\n <param name=menu value=false>\n <param name=quality value=high>\n <param name=scale value=noborder>\n <param name=wmode value=opaque>\n <param name=bgcolor value=$bgcolor>\n <embed src="$gfxpath/yIntro.swf" loop=false menu=false quality=high scale=noborder wmode=opaque bgcolor=$bgcolor WIDTH=240 HEIGHT=240 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED>\n </object>\n </td>\n <td>\n <div>\n yChat: Version $version\n <br><br>\n Letztes Update: $datum\n <br><br>\n Seitenaufrufe: $counter\n <br><br>\n Benutzer registriert: $users\n <br><br>\n Benutzer online: $logtin\n <br><br>\n Benutzerlimit: $limit\n <br><br>\n Page: <a href="http://www.yChat.org">www.yChat.org</a>\n <br><br><a href="http://www.webchat.de" target="_new"> <img src="http://www.webchat.de/webchat.gif" alt="[webchat]" title="[webchat]" border="0"></a><br>\n<img src="http://stats.topwebmaster.net/extern/de/snooper"></div></td>\n </tr>\n </table>\n </center>\n </div>\n <br>\n <br>\n];
+ if ($tmp eq 'true') {
+ print qq[ <div class=b>\n ACHTUNG!\n </div>\n <div>\n Wahrscheinlich existiert Dein Alias "$alias" nicht,\n <br>\n Du hast Dich verschrieben oder das Passwort ist falsch.\n <br>\n Versuch es erneuert !\n </div>\n];
+ }
+ elsif ($tmp eq 'quit') {
+ print qq[ <div>\n Du hast soeben den Chat verlassen.\n <br>\n Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)\n </div>\n];
+ }
+ elsif ($tmp eq 'autologout') {
+ print qq[ <div>\n Du wurdest automatisch aus dem Chat ausgeloggt. Grund: Du warst 20 Minuten inaktiv.\n <br>\n Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)\n </div>\n];
+ }
+ elsif ($tmp eq 'autokick') {
+ print qq[ <div>\n Du wurdest automatisch aus dem Chat katapultiert. Grund: Du hast den Chat geflutet!\n <br>\n Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)\n </div>\n];
+ }
+ elsif ($tmp eq 'banned') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Du wurdest aus dem Chat verbannt!!!\n <br>\n Z.z. kannst Du Dich leider nicht in den Chat einloggen.\n <br>\n Sorry!\n </div>\n";
+ }
+ elsif ($tmp eq 'kick') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Du wurdest soeben aus dem Chat katapultiert!\n <br>\n Schlechtes Verhalten mag die Ursache hierf\374r sein.\n <br>\n Sorry!\n </div>\n";
+ }
+ elsif ($tmp eq 'selfkill') {
+ print qq[ <div>\n Du hast dich soeben ganz und gar aus dem System gel\366scht!\n <br>\n Wenn du dir einen neuen Nick angelen willst, dann einfach auf "Registrieren" klicken! :-)\n </div>\n];
+ }
+ elsif ($tmp eq 'selfkill') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Du wurdest soeben aus dem Chat ausgeloggt!\n <br>\n Ursache hierf\374r mag sein, da\337 der Chat voll war und Du Dich nicht am\n Geschehen beteiligt- und unn\366tige Chatkapazit\344ten in Anspruch\n genommen hast.\n <br>\n Sorry!\n </div>\n";
+ }
+ elsif ($tmp eq 'full') {
+ print "<div class=b>ACHTUNG!</div><div>Der Chat ist leider voll! Bitte versuch Dich sp\344ter noch mal einzuloggen!</div>";
+ }
+ elsif ($var eq 'create_alias') {
+ print q[<div>Du hast sich soeben in die Datenbank eingetragen. Einfach auf "Los Geht's" klicken :-)</div>];
+ }
+ else {
+ print qq[ <div>\n Herzlich willkommen!\n <br>\n Einfach Daten eingeben und auf "Los Geht's" klicken :-)\n </div>\n];
+ }
+ print qq[ <hr>\n <form name="login" action="chat" method="GET">\n <input type="hidden" name="request" value="start">\n <input type="hidden" name="tmp" value="true">\n <table>\n <tr>\n <td>\n <div>\n Dein Alias:\n <br>\n <input name="alias" value="$alias">\n </div>\n </td>\n <td>\n <div>\n Dein Passwort:\n <br>\n <input type="password" name="pw" value="$pw">\n </div>\n </td>\n </tr>\n </table>\n <br>\n <br>\n <div>\n Solltest Du noch keinen Nick besitzen, dann auf "Registrieren" klicken!\n </div>\n <br>\n <table>\n <tr>\n <td>\n <font color="ffffff">\n <input type="submit" value="Los geht's!">\n </font>\n </form>\n </td>\n <td>\n <form action="chat">\n <input type="hidden" name="request" value="start">\n <input type="hidden" name="var" value="create_alias_html">\n <font color="ffffff">\n <input type="submit" value="Registrieren">\n </font>\n </form>\n </td>\n </tr>\n </table>\n <hr>\n];
+ if ($logtin > 0) {
+ print q[<div>Folgende Personen sind eingeloggt:<br><font size='1'>];
+ foreach $_ (@users) {
+ print "$_ " if -f "data/online/users/$_";
+ }
+ print '</font></div>';
+ }
+ print " </td>\n </tr>\n </table>\n </center>\n</body>\n</html>\n";
+ unless (-d 'data/online/rooms') {
+ mkdir 'data/online/rooms', 511;
+ }
+}
+sub create_alias_html {
+ open BAN, '<data/ban';
+ my(@ban) = <BAN>;
+ close BAN;
+ foreach $_ (@ban) {
+ chomp $_;
+ if ($_ eq 'ip://' . $client->peerhost) {
+ $tmp = 'banned';
+ &login_html;
+ $client->shutdown(2);
+ exit 0;
+ }
+ }
+ my $reload = $_[0];
+ &start_html('Registration');
+ print " <center>\n <table width=500>\n <tr>\n <td>\n";
+ if ($reload eq 'alias_exists') {
+ print qq[ <div class=b>\n ACHTUNG!\n </div>\n <div>\n Der von Dir gew\344hlte Benutzername "$alias" existiert in unserer Datenbank bereits. Bitte versuch es erneuert mit\n einem anderen Benutzernamen !\n </div>\n <hr>\n];
+ }
+ elsif ($reload eq 'pw_wrong') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Deine beiden Passworteingaben stimmen nicht \374berein. Bitte geb das Passwort erneuert an um sicherzugehen, da\337\n kein falsches Passwort abgespeichert wird !\n </div>\n <hr>\n";
+ }
+ elsif ($reload eq 'alias_prohibited') {
+ print qq[ <div class=b>\n ACHTUNG!\n </div>\n <div>\n Dein gew\344hlter Benutername "$alias" enth\344lt illegale Zeichen. Bitte versuch einen anderen Benutzernamen!\n </div>\n <hr>\n];
+ }
+ elsif ($reload eq 'alias_length') {
+ print qq[ <div class=b>\n ACHTUNG!\n </div>\n <div>\n Dein gew\344hlter Benutername "$alias" enth\344lt zu viele Zeichen. Es sind maximal 15 Zeichen erlaubt!!\n </div>\n <hr>\n];
+ }
+ else {
+ print " <div>\n Hier kannst Du Dich registrieren. Bitte beachte, da\337 die Passworteingabefelder \374bereinstimmen!\n </div>\n <hr>\n";
+ }
+ print qq[ <form action="chat">\n <input type="hidden" name="request" value="start">\n <input type="hidden" name="var" value="create_alias">\n <div>\n Dein Alias:\n <font color="ffa500">\n (Mu\337 angegeben werden)\n </font>\n <br>\n <input name="alias" VALUE="$alias">\n </div>\n <br>\n <div>\n Dein gew\374nschtes Passwort:\n <br>\n <input type="password" name="pw" value="$pw">\n </div>\n <br>\n <div>\n Geb hier Dein Passwort erneuert ein:\n <br>\n <input type="password" name="tmp">\n </div>\n <br>\n <font color=ffffff>\n <input type="submit" value="Registrieren">\n </font>\n <br>\n </form>\n <hr>\n <div>\n Um den Chat zu betreten m\374ssen die Daten nach der Registration auf der Startseite erneuert best\344tigt werden !\n </div>\n </td>\n </tr>\n </table>\n</center>\n</body>\n</html>\n];
+}
+sub checklogin {
+ opendir USERS, 'data/online/users';
+ my(@users) = readdir USERS;
+ closedir USERS;
+ my $users = $#users;
+ if ($users > $limit && 3 > &hierachie($alias)) {
+ $tmp = 'full';
+ &login_html;
+ $client->shutdown(2);
+ exit 0;
+ }
+ my $lognotexists = 'true';
+ opendir USERDIR, 'data/user/options';
+ my(@userdir) = readdir USERDIR;
+ closedir USERDIR;
+ foreach $user (@userdir) {
+ if ($user eq $alias) {
+ open OPTIONS, "<data/user/options/$alias";
+ my(@options) = <OPTIONS>;
+ close OPTIONS;
+ foreach $_ (@options) {
+ chomp $_;
+ }
+ if ($options[0] eq $pw) {
+ open BAN, '<data/ban';
+ my(@ban) = <BAN>;
+ close BAN;
+ foreach $_ (@ban) {
+ chomp $_;
+ if ($_ eq $alias or $_ eq 'ip://' . $client->peerhost) {
+ if (-f "data/online/users/$admin") {
+ &post_prv($admin, "<font color=ffffff><font color=ffa500>$_</font> kann sich nicht einloggen (Ist verbannt)!!</font>");
+ }
+ $tmp = 'banned';
+ &login_html;
+ $client->shutdown(2);
+ exit 0;
+ }
+ }
+ if ($options[1] eq undef) {
+ $col = &random_color;
+ }
+ else {
+ $col = $options[1];
+ }
+ if ($options[2] eq undef) {
+ $secol = &random_color;
+ }
+ else {
+ $secol = $options[2];
+ }
+ if ($options[3] eq undef) {
+ $maxVerlauf = '10';
+ }
+ else {
+ $maxVerlauf = $options[3];
+ }
+ if ($options[4] eq undef) {
+ $verlaufOrder = '1';
+ }
+ else {
+ $verlaufOrder = $options[4];
+ }
+ &rm_if_loggedin($alias);
+ my(@digit) = (('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'), (0, 1, 2, 3, 4, 5, 6, 7, 8, 9), '-', '.');
+ my $num1 = rand @digit;
+ my $num2 = rand @digit;
+ my $num3 = rand @digit;
+ my $num4 = rand @digit;
+ my $num5 = rand @digit;
+ my $num6 = rand @digit;
+ my $num7 = rand @digit;
+ my $num8 = rand @digit;
+ my $num9 = rand @digit;
+ my $num10 = rand @digit;
+ $tmpid = $digit[$num1] . $digit[$num2] . $digit[$num3] . $digit[$num4] . $digit[$num5] . $digit[$num6] . $digit[$num7] . $digit[$num8] . $digit[$num9] . $digit[$num10];
+ open TMPID, ">data/online/tmpid/$alias.$tmpid";
+ print TMPID $alias;
+ close TMPID;
+ open IDENT, ">data/online/ident/$alias";
+ print IDENT $client->peerhost . "\n$tmpid\n" . $client->peerhost . ':' . $client->peerport . "\n$col\n$secol";
+ close IDENT;
+ open LASTLOGIN, ">data/user/lastlogin/$alias";
+ print LASTLOGIN time;
+ close LASTLOGIN;
+ &frameset_html;
+ $client->shutdown(2);
+ exit 0;
+ }
+ else {
+ $lognotexists = 'false';
+ }
+ }
+ }
+ &login_html;
+}
+sub create_alias {
+ if ($alias =~ /\W/ or $alias eq '') {
+ goto CREATE if $alias =~ /[-]/ and not $alias =~ /\W/;
+ &create_alias_html('alias_prohibited');
+ $client->shutdown(2);
+ exit 0;
+ }
+ elsif ($pw ne $tmp) {
+ &create_alias_html('pw_wrong');
+ $client->shutdown(2);
+ exit 0;
+ }
+ elsif (length $alias >= 15) {
+ &create_alias_html('alias_length');
+ $client->shutdown(2);
+ exit 0;
+ }
+ CREATE: opendir USERDIR, 'data/user/options';
+ my(@user) = readdir USERDIR;
+ close USERDIR;
+ foreach $user (@user) {
+ if ($user eq $alias) {
+ &create_alias_html('alias_exists');
+ $client->shutdown(2);
+ exit 0;
+ }
+ }
+ open OPTIONS, ">data/user/options/$alias";
+ print OPTIONS $pw . "\n";
+ close OPTIONS;
+ &login_html;
+}
+sub frameset_html {
+ print qq[<html>\n <head>\n <title>\n $title\n </title>\n </head>\n<frameset border=0 frameborder=0 framespacing=0 cols="130,*">\n <frameset border=0 frameborder=0 framespacing=0 rows="*,55">\n <frame name="online" src="chat?request=online&room=$loginplace&alias=$alias&tmpid=$tmpid">\n <frameset border=0 frameborder=0 framespacing=0 cols="70,*">\n <frame name="logo" src="chat?request=htdocs&var=logo_html" scrolling="no">\n <frame name="reload" src="chat?request=htdocs" scrolling="no">\n </frameset>\n </frameset>\n <frameset border=0 frameborder=0 framespacing=0 rows="*,55">\n <frame name='main' src='chat?request=loggedin&alias=$alias&col=$col&secol=$secol&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder'>\n <frame name="input" src="chat?request=htdocs" scrolling="no">\n </frameset>\n</frameset>\n</html>\n];
+}
+1;
diff --git a/0.7.6/modules/statistic.pm b/0.7.6/modules/statistic.pm
new file mode 100644
index 0000000..a0aad73
--- /dev/null
+++ b/0.7.6/modules/statistic.pm
@@ -0,0 +1,148 @@
+sub statistic {
+ &start_html('Statistiken');
+ &menu;
+ print $q->div('yChat Statistiken'), $q->hr, $q->div($q->a({-'href', "chat?request=statistic&var=ranking&alias=$alias&tmpid=$tmpid"}, 'Rankings'), ' | ', $q->a({-'href', "chat?request=statistic&var=del&alias=$alias&tmpid=$tmpid"}, 'Loginstatistiken'), ' | ', $q->a({-'href', "chat?request=statistic&var=statistic&alias=$alias&tmpid=$tmpid"}, 'DB-Statistik'), ' | ', $q->a({-'href', "chat?request=statistic&var=var&alias=$alias&tmpid=$tmpid"}, 'Umgebungsvariablen')), $q->hr;
+ if ($var eq 'ranking') {
+ opendir COUNTS, 'data/user/counts';
+ my(@counts) = readdir COUNTS;
+ closedir COUNTS;
+ print '<div>';
+ my $nr_start = $start;
+ my $nr_end = $end;
+ my %online;
+ my $rank;
+ my $nr;
+ foreach $_ (@counts) {
+ if (-f "data/user/counts/$_") {
+ if (s/.online//g) {
+ open TOTAL, "<data/user/counts/$_.online";
+ my $total = <TOTAL>;
+ close TOTAL;
+ $online{sprintf '%.2f', $total / 3600} = $_;
+ }
+ }
+ }
+ print '<div>', $q->b('Rankings:'), $q->br, '<table><tr><td><div><b>#:</b></div></td><td><b><div>St.:</div></b></td><td><b><div>Name:</div></b></td></tr>';
+ if (not $nr_start) {
+ $nr_start = 1;
+ }
+ if (not $nr_end) {
+ $nr_end = 20;
+ }
+ foreach $wert (reverse (sort { $a <=> $b } keys %online)) {
+ ++$nr;
+ if ($online{$wert} eq $alias) {
+ $rank = $nr;
+ last if $nr > $nr_end;
+ }
+ next if ($nr < $nr_start or $nr > $nr_end);
+ print q[<tr><td><font color='ffffff' size='1' face='arial'>] . $nr . q[</font></td><td><font color='ffffff' size='1' face='arial'> ] . $wert . "h </font></td><td> <a href='chat?request=divcom&var=alias_html&alias=$alias&tmp=$online{$wert}&tmpid=$tmpid'><font size='1' face='arial'>$online{$wert}</font></a></td></tr>\n";
+ }
+ print '</table>', $q->hr;
+ $nr_start -= 20;
+ $nr_end -= 20;
+ print "Rankings von <a href='chat?request=statistic&var=ranking&start=$nr_start&end=$nr_end&alias=$alias&tmpid=$tmpid'>$nr_start bis $nr_end</a> anzeigen ...<br>" if $nr_start > 0;
+ $nr_start += 40;
+ $nr_end += 40;
+ print "Rankings von <a href='chat?request=statistic&var=ranking&start=$nr_start&end=$nr_end&alias=$alias&tmpid=$tmpid'>$nr_start bis $nr_end</a> anzeigen ...", $q->br, $q->br, $q->b("$alias, Du befindest Dich auf Rank $rank</div>");
+ }
+ elsif ($var eq 'del') {
+ print '<div>', $q->b('Alte Benutzer l&ouml;schen:'), $q->br, "Benutzer, die sich 1440 Stunden (60 Tage) nicht mehr in das System eingeloggt haben, werden gel\366scht.", $q->br, $q->br;
+ opendir USER, 'data/user/options';
+ my(@user) = readdir USER;
+ closedir USER;
+ @user = sort(@user);
+ my $i = 0;
+ my $j;
+ my $k = 0;
+ my $l = 0;
+ my $full = $tmp;
+ foreach $_ (@user) {
+ if (-f "data/user/lastlogin/$_") {
+ open LOGIN, "<data/user/lastlogin/$_";
+ my $login = <LOGIN>;
+ close LOGIN;
+ $login = sprintf('%.2f', (time - $login) / 3600);
+ ++$j;
+ if (999 < $login and $login < 1440) {
+ ++$k;
+ print $q->font({-'color', 'ffa500'}, $q->b("$j($k) $_ Letztes Login vor: " . $login . 'h')), $q->br, "\n" if $full ne undef;
+ }
+ elsif ($login < 48) {
+ ++$l;
+ print $q->font({-'color', 'ffffef'}, $q->b("$j($l) $_ Letztes Login vor: " . $login . 'h')), $q->br, "\n" if $full ne undef;
+ }
+ elsif ($login < 1440) {
+ print "$j $_ Letztes Login vor: " . $login . 'h', $q->br, "\n" if $full ne undef;
+ }
+ else {
+ ++$k;
+ &kill_it($_, $i++, $login);
+ }
+ }
+ elsif (-f "data/user/options/$_") {
+ &kill_it($_, $i++);
+ }
+ }
+ print $q->hr if $full ne undef;
+ print '</div>', $q->div($q->b("$j Benutzer befinden sich in der Datenbank!", $q->br, $q->font({-'color', 'ffffef'}, "$l Benutzer haben sich innerhalb der letzten 48 Stunden eingeloggt!"), $q->br, $q->font({-'color', 'ffa500'}, "$k Benutzer haben sich &uuml;ber 1000 Stunden nicht mehr eingeloggt!"), $q->br, $q->font({-'color', 'ff0000'}, "$i Benutzer wurden gerade eben gel\366scht!")), $q->br, $q->br, 'PS: Jeder registrierte Benutzername wird nur einmal gez&auml;hlt!');
+ print $q->br, $q->div('(', $q->a({-'href', "chat?request=statistic&var=del&tmp=true&alias=$alias&tmpid=$tmpid"}, 'Vollst&auml;ndige Ansicht'), ')') if $full eq undef;
+ }
+ elsif ($var eq 'var') {
+ print '<div>', $q->b('Server Umgebungsvariablen:'), $q->br, $q->br, 'Die Serverumgebungsvariablen k&ouml;nnen nur von Oberw&auml;chtern oder h&ouml;her eingesehen werden!', $q->br, $q->br;
+ if (7 <= &hierachie($alias)) {
+ while (($key, $value) = each %ENV) {
+ print "$key = $value\n", $q->br;
+ }
+ }
+ print '</div>';
+ }
+ elsif ($var eq 'statistic') {
+ print $q->div($q->b('yChat-DB Statistik:')), $q->br;
+ $files = 0;
+ $size = 0;
+ $directorys = 1;
+ &zaehle('data');
+ $size = sprintf('%.2f', $size / 1048576);
+ print $q->div("Dateien insgesamt: $files", $q->br, "MB insgesamt: $size", $q->br, "Verzeichnisse insgesamt: $directorys");
+ }
+ print $q->end_html;
+}
+sub zaehle {
+ local($dir, $data) = @_;
+ $dir = "$dir/$data" if $data ne undef;
+ opendir DATA, $dir;
+ local(@data) = readdir DATA;
+ closedir DATA;
+ $files2 = 0;
+ foreach $_ (@data) {
+ if (-f "$dir/$_") {
+ ++$files;
+ ++$files2;
+ $size += -s "$dir/$_";
+ }
+ elsif (-d "$dir/$_" and $_ ne '.' and $_ ne '..') {
+ ++$directorys;
+ &zaehle($dir, $_);
+ }
+ }
+}
+sub kill_it {
+ my($rm, $nr, $login) = @_;
+ $login = 'XXXXXX' if $login eq undef;
+ print $q->font({-'color', 'ff0000'}, $q->b("$j($nr) $rm Letztes Login vor: " . $login . 'h (wurde gel&ouml;scht)')), $q->br, "\n";
+ print q[<font size='1'>];
+ print 'options ' if unlink "data/user/options/$rm";
+ print 'profiles ' if unlink "data/user/profiles/$rm";
+ print 'gbooks ' if unlink "data/user/gbooks/$rm";
+ print 'counts ' if unlink "data/user/counts/$rm";
+ print 'counts.online ' if unlink 'data/user/counts/' . $rm . '.online';
+ print 'lastlogin ' if unlink "data/user/lastlogin/$rm";
+ print 'memos' if unlink "data/user/memos/$rm";
+ print '</font>', $q->hr, "\n";
+ &zeit;
+ open DEL, '>>data/kill';
+ print DEL "($day.$month.$year $hours:$min:$sec) $rm wurde automatisch gekillt [$alias]\n";
+ close DEL;
+}
+1;
diff --git a/0.7.6/modules/stream.pm b/0.7.6/modules/stream.pm
new file mode 100644
index 0000000..2885d8b
--- /dev/null
+++ b/0.7.6/modules/stream.pm
@@ -0,0 +1,170 @@
+sub stream {
+ unlink "data/online/rooms/$loginplace/$alias";
+ &secure_checkid($alias, $tmpid);
+ my $pid = $$;
+ $SIG{'CHLD'} = 'IGNORE';
+ ++$|;
+ print qq[<html>\n <head>\n<script language="JavaScript">\n<!--\n open('chat?request=online&room=$room&alias=$alias&tmpid=$tmpid','online');\n open('chat?request=input&alias=$alias&room=$room&col=$col&secol=$secol&tmp=login&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder','input');\n\n// open('chat?request=input&alias=$alias&room=$room&col=$col&secol=$secol&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder','input');\n\n// Scroll-Routine von Anklepper (http://www.anklepper.de)\n// speziell f\374r yChat (http://www.yChat.de), Copyright 2000\nscrolling = true;\nmoves_steps = 4;\nmoves_interval = 4;\nfunction moves()\n{\n if( scrolling != false )\n window.scrollBy( 0, moves_steps );\n window.setTimeout( "moves()", moves_interval );\n}\nmoves();\n//-->\n</script>\n</head>\n<body bgcolor="$chatbg">\n];
+ &check_online;
+ print "<font size=1 color=ffffff face=arial>$title - Letzte &Auml;nderung $datum\n; Der Chat wird geladen...\n<br>";
+ sleep 1;
+ print "<b>Hallo <font color=$col>$alias</font></b>, mit dem Befehl /menu kannst du das Chat-Men&uuml; aufrufen!<br>";
+ sleep 1;
+ print "Du befindest dich im Raum <b>$room</b>: " . get_theme($room) . "<br>\n";
+ print "</font>\n";
+
+ if (-f "data/user/memos/$alias") {
+ open MEMOS, "<data/user/memos/$alias";
+ my(@memos) = <MEMOS>;
+ close MEMOS;
+ my $memos;
+ foreach $_ (@memos) {
+ $memos .= $_;
+ }
+ print $memos;
+ unlink "data/user/memos/$alias";
+ }
+
+ my ($change_room,
+ $startime,
+ $flooding,
+ @ignore,
+ @flood);
+
+ OPENMSGFILE:
+ $change_room = 0;
+ $startime = time;
+ $flooding = 0;
+ unless (-f "data/online/rstat/$room") {
+ open DATEI, ">data/online/rstat/$room";
+ print DATEI "0\n\n$alias<;1\n";
+ close DATEI;
+ }
+ open DATEI, ">data/online/users/$alias";
+ print DATEI time;
+ close DATEI;
+ open DATEI, ">data/online/rooms/$room/$alias";
+ print DATEI time;
+ close DATEI;
+ if (-e "data/msgs/$room") {
+ open MSGFILE, "<data/msgs/$room";
+ mkdir 'data/online/pids', 511 unless -d 'data/online/pids';
+ mkdir "data/online/pids/$room", 511 unless -d "data/online/pids/$room";
+ open PID, ">data/online/pids/$room/$pid";
+ print PID time;
+ close PID;
+ }
+ else {
+ sleep 1;
+ goto OPENMSGFILE;
+ }
+ &sendmsgs;
+ while (-f "data/online/users/$alias") {
+ local $SIG{'USR1'} = \&sendmsgs;
+ goto OPENMSGFILE if $change_room == 1;
+ unlink "data/online/rooms/$loginplace/$alias"
+ if (-f "data/online/rooms/$loginplace/$alias");
+ sleep 15;
+ print "\n";
+ }
+ sub sendmsgs {
+ for ($curpos = tell MSGFILE; defined($_ = <MSGFILE>); $curpos = tell MSGFILE) {
+ my($address, $stamp, $command, $action, $message, $from) = split(/<;/, $_, 7);
+ if ($address =~ /$\!/ or $address eq $alias) {
+ if ($stamp > $startime) {
+ if ($command eq 'col') {
+ ($col, $secol) = split(/;/, $action, 3);
+ }
+ elsif ($command eq 'cr') {
+ unlink "data/online/pids/$room/$pid";
+ $room = $action;
+ close MSGFILE;
+ $change_room = 1;
+ }
+ elsif ($command eq 'ig') {
+ my @temp;
+ my $add2list = 1;
+ foreach $_ (@ignore) {
+ if ($action ne $_) {
+ push @temp, $_;
+ }
+ else {
+ $add2list = 0;
+ }
+ }
+ if ($add2list == 1) {
+ push @ignore, $action;
+ print "<font color='#ffffff'><font color='#ffa500'>$action</font> wird nun ignoriert!</font><br>\n";
+ &post_prv_extra($action, "<font color='#ff0000'>Du wirst nun von $alias ignoriert!</font>");
+ }
+ else {
+ @ignore = @temp;
+ print "<font color='#ffffff'><font color='#ffa500'>$action</font> wird nun nicht mehr ignoriert!</font><br>\n";
+ &post_prv_extra($action, "<font color='#ff0000'>Du wirst nun von $alias nicht mehr ignoriert!</font>");
+ }
+ }
+ elsif ($command eq 'igl') {
+ my $ignored;
+ foreach $_ (@ignore) {
+ $ignored .= "$_ ";
+ }
+ if ($#ignore == -1) {
+ print "<font color='#ffffff'>Momentan wird keine Person von dir ignoriert!</font><br>\n";
+ }
+ else {
+ print "<font color='#ffffff'>Folgende Personen werden von dir ignoriert: <font color='#ffa500'>$ignored</font>!</font><br>\n";
+ }
+ }
+ elsif ($command eq 'quit') {
+ print "<script language='JavaScript'>\n";
+ print "open('chat?request=online&room=$loginplace&alias=$alias&tmpid=$tmpid','online');\n";
+ print "open('chat?request=htdocs','input');\n";
+ print "open('chat?request=loggedin&alias=$alias&col=$col&secol=$secol&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder','main');\n";
+ print "</script>\n";
+ last;
+ }
+ elsif ($change_room != 1) {
+ my $ignored = 0;
+ foreach $_ (@ignore) {
+ if ($_ eq $from) {
+ $ignored = 1;
+ last;
+ }
+ }
+ if ($ignored != 1) {
+ print "$message\n";
+ }
+ else {
+ $address =~ s/!//;
+ &post_prv_extra($from, "<font color='#ff0000'>Du wirst von $alias ignoriert!</font>") if $address eq $alias;
+ }
+ }
+ push @flood, $address . $command . $action . $message . $from;
+ if ($flood[0] eq $flood[1] and $flood[0] eq $flood[2] and $flood[0] eq $flood[3]) {
+ print "<i><font color=red>$from flutet den Chat !</font></i><br>\n";
+ if ($from eq $alias and $flooding++ and $flooding >= 4) {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='ffa500'><b>Das System</b></font> katapultiert <font color='".&get_ident($alias,3)."'>$alias</font>> wegen Fluten des Chats nach draussen ... </font></i>", $alias);
+ print "<script language='JavaScript'>open('chat?request=start&tmp=autokick','_top');</script>\n";
+ &rm_alias($alias, $room);
+ }
+ }
+ else {
+ $flooding = 0;
+ }
+ shift @flood if $#flood > 2;
+ }
+ }
+ }
+ seek MSGFILE, $curpos, 0;
+ }
+ unlink "data/online/pids/$room/$pid";
+}
+sub post_prv_extra {
+ my($alias, $message) = @_;
+ my $helpid = fork;
+ if ($helpid == 0) {
+ &post_prv($alias, $message);
+ exit 0;
+ }
+}
+1;
diff --git a/0.7.6/modules/webchat.pm b/0.7.6/modules/webchat.pm
new file mode 100644
index 0000000..90f8731
--- /dev/null
+++ b/0.7.6/modules/webchat.pm
@@ -0,0 +1,22 @@
+sub webchat {
+ my @rooms = &diropen('data/online/rooms');
+ my $output;
+
+ foreach my $room (@rooms) {
+ next if ($room =~ /\./);
+ my @users = &diropen("data/online/rooms/$room") or print "$!\n";
+
+ foreach my $user (@users) {
+ next if ($user =~ /\./);
+ open FILE, "data/online/rooms/$room/$user";
+ my $timestamp = <FILE>;
+ close FILE;
+ chomp $timestamp;
+
+ $output = $output . "($user)($timestamp)($room)\n";
+ }
+ }
+
+ print $output;
+}
+1;
diff --git a/0.7.6/setup.sh b/0.7.6/setup.sh
new file mode 100644
index 0000000..342e9c7
--- /dev/null
+++ b/0.7.6/setup.sh
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+mke2fs /dev/ram0
+mke2fs /dev/ram1
+
+mkdir data
+cd data
+mkdir {logs,msgs,user,online}
+mount /dev/ram0 msgs
+mount /dev/ram1 online
+cd user
+mkdir {counts,memos,options,profiles,gbooks,lastlogin}
+cd ../online
+mkdir {rstat,rooms,pids,users,ident,tmpid}
+cd ..
+cdhmod 777 * -R
+chown paul * -R
+
diff --git a/0.7.6/templates/chatiq.sno b/0.7.6/templates/chatiq.sno
new file mode 100644
index 0000000..2a024f5
--- /dev/null
+++ b/0.7.6/templates/chatiq.sno
@@ -0,0 +1 @@
+<div><h2>Chatiquette</h2></div><hr><div>Hier einige Grundlagen ...</div><style type="text/css"> li { color: #ffffff }</style><ul><li><div>Vergiss nie, dass am anderen Ende auch nur Menschen sitzen. Diese m&ouml;gen es gar nicht, angep&ouml;belt, beleidigt oder in sonstiger Weise angegriffen zu werden.</div></li><li><div>St&ouml;rend ist auch immer, wenn ein privater Streit im Chat ausgetragen wird. Tragt eure privaten Sachen ausserhalb des Chats aus.<br>Selbst wenn es nur Spass ist - weiss der Rest im Chat das?</div></li><li><div>Dauergeschrei f&auml;llt auch immer wieder st&ouml;rend auf. Was in Grossbuchstaben geschrieben wird, wird als Schreien bezeichnet.</div></li><li><div>Unsere ganz besonderen Spezialisten wollen auch immer wieder rausfliegen. Um das zu erreichen, senden sie die ganze Zeit Unsinn.</div></li><li><div>Diskussionen sind dagegen kein Problem. Daf&uuml;r ist ein Chat ja da. Sobald allerdings das Thema der Diskussion zu sehr entgleist, sollte die Diskussion in einen etwas weniger &ouml;ffentlichen Raum verlegt werden.</div></li></ul><div>Daraus ergeben sich folgende Regeln:</div><ul><li><div>keinen beleidigenden Wortschatz verwenden</div></li><li><div>obz&ouml;ner und verfassungsfeindlicher Wortschatz f&auml;llt auch weg</div></li><li><div>streitet euch woanders oder in einem privaten Raum</div></li><li><div>schreit nich so viel</div></li><li><div>schreibt keinen Unsinn, der so aussieht, als ob eure Katze über die Tastatur gelaufen ist</div></li><li><div>schreibt nicht zu schnell hintereinander, besonders nicht dasselbe</div></li><li><div>verlagert die Diskussion, wenn sich jemand gest&ouml;rt f&uuml;hlt</div></li><li><div>Diese Liste ist nicht vollst&auml;ndig. Mit dem gesunden Menschenverstand sollte es eigentlich m&ouml;glich sein, sich die nicht aufgef&uuml;hrten Punkte zu denken.</div></li></ul><div>So - nach den ganzen "lass-es-bessers" noch ein paar &Uuml;berlebenstips:</div><ul><li><div>beachte die oben stehenden Punkte ;-)</div></li><li><div>es macht sich immer gut, beim Reinkommen mal zu gr&uuml;ssen</div></li><li><div>warte nicht, bis man/frau dich anspricht - werde selbst aktiv und gib deinen Senf dazu</div></li><li><div>es gibt meist kein allgemein anerkanntes Gespr&auml;chsthema - lies dich einfach rein</div></li><li><div>die frage &quot;wer will chatten&quot; ist eigentlich &uuml;berfl&uuml;ssig in einem Chat (wir warten doch alle nur aufs Ufo ;-)</div></li><li><div>fang nich sofort mit den W-Fragen (woher, wie alt, weiblich oder männlich?) an - es st&ouml;rt einige Leute</div></li></ul><div>Problematisch f&uuml;r die W&auml;chter und Oberw&auml;chter ist:</div><ul><li><div>&quot;der nervt mich - schmeiss den mal raus&quot; ist oft nicht nachvollziehbar, weil der W&Auml; oder OW die Vorgeschichte - die vielleicht ausserhalb des yChat stattgefunden hat - nicht kennt oder keinen Beweis daf&uuml;r hat.</div></li></ul><hr><div><h2>Richtlinien f&uuml;r den gestressten W&Auml; und OW:</h2></div><ul><li><div>Du hast die Macht - aber mi&szlig;brauche sie nicht!</div></li><li><div>Leute, die ganz offensichtlich st&ouml;ren wollen und dabei den Chatbetrieb massiv behindern, sofort rausschmeissen! Kriterien dazu:</div><ul><li><div>Fluten des Chats</div></li><li><div>Wiederholung von Parolen</div></li><li><div>Exzessive Nutzung von zuf&auml;lligen Buchstaben-/Zeichenfolgen</div></li><li><div>usw...</div></li></ul></li><li><div>Bei den anderen vorher noch eine Warnung aussprechen...</div></li><li><div>Nicht vergessen: auch f&uuml;r euch gelten die oben aufgef&uuml;hrten Regeln!</div></li><li><div>Vergabe von Raumbesetzer- und W&auml;chterrechten:<br>(dies gilt f&uuml;r RB-Vergabe in der Cyberbar, W&Auml; allgemein)</div><ul><li><div>Um RB oder W&Auml; betteln wird schon mal gar nicht beachtet.</div></li><li><div>Wer W&Auml; wird, soll sichs verdienen - z.B. durch h&auml;ufiges Helfen bei Neulingen.</div></li><li><div>Ein W&Auml; sollte schon &ouml;fter im Chat sein.</div></li><li><div>Oberw&auml;chter zu werden ist sehr schwierig. Frag gar nicht erst danach ;-)</div></li></ul></ul><div>Wer meint, von einem W&auml;chter oder Oberw&auml;chter ungerecht behandelt worden zu sein (z.B. weil dieser wegen persönlichen Streitigkeiten rausschmeisst), richte seine Klage an einen Oberw&auml;chter oder direkt an den obersten Boss: Snooper (<a href="mailto:admin@ychat.de">admin@ychat.de</a>).</div> \ No newline at end of file
diff --git a/0.7.6/templates/colors.sno b/0.7.6/templates/colors.sno
new file mode 100644
index 0000000..3640b9e
--- /dev/null
+++ b/0.7.6/templates/colors.sno
@@ -0,0 +1,290 @@
+ <table cellspacing=0 cellpadding=5 border=0>
+ <tr>
+ <td bgcolor="000000"><span style="color:#FFFFFF; text-decoration:line-through;">000000</span></td>
+ <td bgcolor="000033"><span style="color:#FFFFFF; text-decoration:line-through;">000033</span></td>
+ <td bgcolor="000066"><span style="color:#FFFFFF; text-decoration:line-through;">000066</span></td>
+ <td bgcolor="000099"><span style="color:#FFFFFF; text-decoration:line-through;">000099</span></td>
+ <td bgcolor="0000CC"><span style="color:#FFFFFF; text-decoration:line-through;">0000CC</span></td>
+ <td bgcolor="0000FF"><a href="javascript:insertcode('0000FF');" style="color:#FFFFFF;">0000FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="003300"><span style="color:#FFFFFF; text-decoration:line-through;">003300</span></td>
+ <td bgcolor="003333"><span style="color:#FFFFFF; text-decoration:line-through;">003333</span></td>
+ <td bgcolor="003366"><span style="color:#FFFFFF; text-decoration:line-through;">003366</span></td>
+ <td bgcolor="003399"><a href="javascript:insertcode('003399');" style="color:#FFFFFF;">003399</a></td>
+ <td bgcolor="0033CC"><a href="javascript:insertcode('0033CC');" style="color:#FFFFFF;">0033CC</a></td>
+ <td bgcolor="0033FF"><a href="javascript:insertcode('0033FF');" style="color:#FFFFFF;">0033FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="006600"><span style="color:#FFFFFF; text-decoration:line-through;">006600</span></td>
+ <td bgcolor="006633"><span style="color:#FFFFFF; text-decoration:line-through;">006633</span></td>
+ <td bgcolor="006666"><a href="javascript:insertcode('006666');" style="color:#FFFFFF;">006666</a></td>
+ <td bgcolor="006699"><a href="javascript:insertcode('006699');" style="color:#FFFFFF;">006699</a></td>
+ <td bgcolor="0066CC"><a href="javascript:insertcode('0066CC');" style="color:#FFFFFF;">0066CC</a></td>
+ <td bgcolor="0066FF"><a href="javascript:insertcode('0066FF');" style="color:#FFFFFF;">0066FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="009900"><a href="javascript:insertcode('009900');" style="color:#FFFFFF;">009900</a></td>
+ <td bgcolor="009933"><a href="javascript:insertcode('009933');" style="color:#FFFFFF;">009933</a></td>
+ <td bgcolor="009966"><a href="javascript:insertcode('009966');" style="color:#FFFFFF;">009966</a></td>
+ <td bgcolor="009999"><a href="javascript:insertcode('009999');" style="color:#FFFFFF;">009999</a></td>
+ <td bgcolor="0099CC"><a href="javascript:insertcode('0099CC');" style="color:#FFFFFF;">0099CC</a></td>
+ <td bgcolor="0099FF"><a href="javascript:insertcode('0099FF');" style="color:#FFFFFF;">0099FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00CC00"><a href="javascript:insertcode('00CC00');" style="color:#000000;">00CC00</a></td>
+ <td bgcolor="00CC33"><a href="javascript:insertcode('00CC33');" style="color:#000000;">00CC33</a></td>
+ <td bgcolor="00CC66"><a href="javascript:insertcode('00CC66');" style="color:#000000;">00CC66</a></td>
+ <td bgcolor="00CC99"><a href="javascript:insertcode('00CC99');" style="color:#000000;">00CC99</a></td>
+ <td bgcolor="00CCCC"><a href="javascript:insertcode('00CCCC');" style="color:#000000;">00CCCC</a></td>
+ <td bgcolor="00CCFF"><a href="javascript:insertcode('00CCFF');" style="color:#000000;">00CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00FF00"><a href="javascript:insertcode('00FF00');" style="color:#000000;">00FF00</a></td>
+ <td bgcolor="00FF33"><a href="javascript:insertcode('00FF33');" style="color:#000000;">00FF33</a></td>
+ <td bgcolor="00FF66"><a href="javascript:insertcode('00FF66');" style="color:#000000;">00FF66</a></td>
+ <td bgcolor="00FF99"><a href="javascript:insertcode('00FF99');" style="color:#000000;">00FF99</a></td>
+ <td bgcolor="00FFCC"><a href="javascript:insertcode('00FFCC');" style="color:#000000;">00FFCC</a></td>
+ <td bgcolor="00FFFF"><a href="javascript:insertcode('00FFFF');" style="color:#000000;">00FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="330000"><span style="color:#FFFFFF; text-decoration:line-through;">330000</span></td>
+ <td bgcolor="330033"><span style="color:#FFFFFF; text-decoration:line-through;">330033</span></td>
+ <td bgcolor="330066"><span style="color:#FFFFFF; text-decoration:line-through;">330066</span></td>
+ <td bgcolor="330099"><a href="javascript:insertcode('330099');" style="color:#FFFFFF;">330099</a></td>
+ <td bgcolor="3300CC"><a href="javascript:insertcode('3300CC');" style="color:#FFFFFF;">3300CC</a></td>
+ <td bgcolor="3300FF"><a href="javascript:insertcode('3300FF');" style="color:#FFFFFF;">3300FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="333300"><span style="color:#FFFFFF; text-decoration:line-through;">333300</span></td>
+ <td bgcolor="333333"><span style="color:#FFFFFF; text-decoration:line-through;">333333</span></td>
+ <td bgcolor="333366"><a href="javascript:insertcode('333366');" style="color:#FFFFFF;">333366</a></td>
+ <td bgcolor="333399"><a href="javascript:insertcode('333399');" style="color:#FFFFFF;">333399</a></td>
+ <td bgcolor="3333CC"><a href="javascript:insertcode('3333CC');" style="color:#FFFFFF;">3333CC</a></td>
+ <td bgcolor="3333FF"><a href="javascript:insertcode('3333FF');" style="color:#FFFFFF;">3333FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="336600"><a href="javascript:insertcode('336600');" style="color:#FFFFFF;">336600</a></td>
+ <td bgcolor="336633"><a href="javascript:insertcode('336633');" style="color:#FFFFFF;">336633</a></td>
+ <td bgcolor="336666"><a href="javascript:insertcode('336666');" style="color:#FFFFFF;">336666</a></td>
+ <td bgcolor="336699"><a href="javascript:insertcode('336699');" style="color:#FFFFFF;">336699</a></td>
+ <td bgcolor="3366CC"><a href="javascript:insertcode('3366CC');" style="color:#FFFFFF;">3366CC</a></td>
+ <td bgcolor="3366FF"><a href="javascript:insertcode('3366FF');" style="color:#FFFFFF;">3366FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="339900"><a href="javascript:insertcode('339900');" style="color:#FFFFFF;">339900</a></td>
+ <td bgcolor="339933"><a href="javascript:insertcode('339933');" style="color:#FFFFFF;">339933</a></td>
+ <td bgcolor="339966"><a href="javascript:insertcode('339966');" style="color:#FFFFFF;">339966</a></td>
+ <td bgcolor="339999"><a href="javascript:insertcode('339999');" style="color:#FFFFFF;">339999</a></td>
+ <td bgcolor="3399CC"><a href="javascript:insertcode('3399CC');" style="color:#FFFFFF;">3399CC</a></td>
+ <td bgcolor="3399FF"><a href="javascript:insertcode('3399FF');" style="color:#FFFFFF;">3399FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33CC00"><a href="javascript:insertcode('33CC00');" style="color:#000000;">33CC00</a></td>
+ <td bgcolor="33CC33"><a href="javascript:insertcode('33CC33');" style="color:#000000;">33CC33</a></td>
+ <td bgcolor="33CC66"><a href="javascript:insertcode('33CC66');" style="color:#000000;">33CC66</a></td>
+ <td bgcolor="33CC99"><a href="javascript:insertcode('33CC99');" style="color:#000000;">33CC99</a></td>
+ <td bgcolor="33CCCC"><a href="javascript:insertcode('33CCCC');" style="color:#000000;">33CCCC</a></td>
+ <td bgcolor="33CCFF"><a href="javascript:insertcode('33CCFF');" style="color:#000000;">33CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33FF00"><a href="javascript:insertcode('33FF00');" style="color:#000000;">33FF00</a></td>
+ <td bgcolor="33FF33"><a href="javascript:insertcode('33FF33');" style="color:#000000;">33FF33</a></td>
+ <td bgcolor="33FF66"><a href="javascript:insertcode('33FF66');" style="color:#000000;">33FF66</a></td>
+ <td bgcolor="33FF99"><a href="javascript:insertcode('33FF99');" style="color:#000000;">33FF99</a></td>
+ <td bgcolor="33FFCC"><a href="javascript:insertcode('33FFCC');" style="color:#000000;">33FFCC</a></td>
+ <td bgcolor="33FFFF"><a href="javascript:insertcode('33FFFF');" style="color:#000000;">33FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="660000"><span style="color:#FFFFFF; text-decoration:line-through;">660000</span></td>
+ <td bgcolor="660033"><span style="color:#FFFFFF; text-decoration:line-through;">660033</span></td>
+ <td bgcolor="660066"><a href="javascript:insertcode('660066');" style="color:#FFFFFF;">660066</a></td>
+ <td bgcolor="660099"><a href="javascript:insertcode('660099');" style="color:#FFFFFF;">660099</a></td>
+ <td bgcolor="6600CC"><a href="javascript:insertcode('6600CC');" style="color:#FFFFFF;">6600CC</a></td>
+ <td bgcolor="6600FF"><a href="javascript:insertcode('6600FF');" style="color:#FFFFFF;">6600FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="663300"><a href="javascript:insertcode('663300');" style="color:#FFFFFF;">663300</a></td>
+ <td bgcolor="663333"><a href="javascript:insertcode('663333');" style="color:#FFFFFF;">663333</a></td>
+ <td bgcolor="663366"><a href="javascript:insertcode('663366');" style="color:#FFFFFF;">663366</a></td>
+ <td bgcolor="663399"><a href="javascript:insertcode('663399');" style="color:#FFFFFF;">663399</a></td>
+ <td bgcolor="6633CC"><a href="javascript:insertcode('6633CC');" style="color:#FFFFFF;">6633CC</a></td>
+ <td bgcolor="6633FF"><a href="javascript:insertcode('6633FF');" style="color:#FFFFFF;">6633FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="666600"><a href="javascript:insertcode('666600');" style="color:#FFFFFF;">666600</a></td>
+ <td bgcolor="666633"><a href="javascript:insertcode('666633');" style="color:#FFFFFF;">666633</a></td>
+ <td bgcolor="666666"><a href="javascript:insertcode('666666');" style="color:#FFFFFF;">666666</a></td>
+ <td bgcolor="666699"><a href="javascript:insertcode('666699');" style="color:#FFFFFF;">666699</a></td>
+ <td bgcolor="6666CC"><a href="javascript:insertcode('6666CC');" style="color:#FFFFFF;">6666CC</a></td>
+ <td bgcolor="6666FF"><a href="javascript:insertcode('6666FF');" style="color:#FFFFFF;">6666FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="669900"><a href="javascript:insertcode('669900');" style="color:#000000;">669900</a></td>
+ <td bgcolor="669933"><a href="javascript:insertcode('669933');" style="color:#000000;">669933</a></td>
+ <td bgcolor="669966"><a href="javascript:insertcode('669966');" style="color:#000000;">669966</a></td>
+ <td bgcolor="669999"><a href="javascript:insertcode('669999');" style="color:#000000;">669999</a></td>
+ <td bgcolor="6699CC"><a href="javascript:insertcode('6699CC');" style="color:#000000;">6699CC</a></td>
+ <td bgcolor="6699FF"><a href="javascript:insertcode('6699FF');" style="color:#000000;">6699FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66CC00"><a href="javascript:insertcode('66CC00');" style="color:#000000;">66CC00</a></td>
+ <td bgcolor="66CC33"><a href="javascript:insertcode('66CC33');" style="color:#000000;">66CC33</a></td>
+ <td bgcolor="66CC66"><a href="javascript:insertcode('66CC66');" style="color:#000000;">66CC66</a></td>
+ <td bgcolor="66CC99"><a href="javascript:insertcode('66CC99');" style="color:#000000;">66CC99</a></td>
+ <td bgcolor="66CCCC"><a href="javascript:insertcode('66CCCC');" style="color:#000000;">66CCCC</a></td>
+ <td bgcolor="66CCFF"><a href="javascript:insertcode('66CCFF');" style="color:#000000;">66CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66FF00"><a href="javascript:insertcode('66FF00');" style="color:#000000;">66FF00</a></td>
+ <td bgcolor="66FF33"><a href="javascript:insertcode('66FF33');" style="color:#000000;">66FF33</a></td>
+ <td bgcolor="66FF66"><a href="javascript:insertcode('66FF66');" style="color:#000000;">66FF66</a></td>
+ <td bgcolor="66FF99"><a href="javascript:insertcode('66FF99');" style="color:#000000;">66FF99</a></td>
+ <td bgcolor="66FFCC"><a href="javascript:insertcode('66FFCC');" style="color:#000000;">66FFCC</a></td>
+ <td bgcolor="66FFFF"><a href="javascript:insertcode('66FFFF');" style="color:#000000;">66FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="990000"><a href="javascript:insertcode('990000');" style="color:#FFFFFF;">990000</a></td>
+ <td bgcolor="990033"><a href="javascript:insertcode('990033');" style="color:#FFFFFF;">990033</a></td>
+ <td bgcolor="990066"><a href="javascript:insertcode('990066');" style="color:#FFFFFF;">990066</a></td>
+ <td bgcolor="990099"><a href="javascript:insertcode('990099');" style="color:#FFFFFF;">990099</a></td>
+ <td bgcolor="9900CC"><a href="javascript:insertcode('9900CC');" style="color:#FFFFFF;">9900CC</a></td>
+ <td bgcolor="9900FF"><a href="javascript:insertcode('9900FF');" style="color:#FFFFFF;">9900FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="993300"><a href="javascript:insertcode('993300');" style="color:#FFFFFF;">993300</a></td>
+ <td bgcolor="993333"><a href="javascript:insertcode('993333');" style="color:#FFFFFF;">993333</a></td>
+ <td bgcolor="993366"><a href="javascript:insertcode('993366');" style="color:#FFFFFF;">993366</a></td>
+ <td bgcolor="993399"><a href="javascript:insertcode('993399');" style="color:#FFFFFF;">993399</a></td>
+ <td bgcolor="9933CC"><a href="javascript:insertcode('9933CC');" style="color:#FFFFFF;">9933CC</a></td>
+ <td bgcolor="9933FF"><a href="javascript:insertcode('9933FF');" style="color:#FFFFFF;">9933FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="996600"><a href="javascript:insertcode('996600');" style="color:#FFFFFF;">996600</a></td>
+ <td bgcolor="996633"><a href="javascript:insertcode('996633');" style="color:#FFFFFF;">996633</a></td>
+ <td bgcolor="996666"><a href="javascript:insertcode('996666');" style="color:#FFFFFF;">996666</a></td>
+ <td bgcolor="996699"><a href="javascript:insertcode('996699');" style="color:#FFFFFF;">996699</a></td>
+ <td bgcolor="9966CC"><a href="javascript:insertcode('9966CC');" style="color:#FFFFFF;">9966CC</a></td>
+ <td bgcolor="9966FF"><a href="javascript:insertcode('9966FF');" style="color:#FFFFFF;">9966FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="999900"><a href="javascript:insertcode('999900');" style="color:#000000;">999900</a></td>
+ <td bgcolor="999933"><a href="javascript:insertcode('999933');" style="color:#000000;">999933</a></td>
+ <td bgcolor="999966"><a href="javascript:insertcode('999966');" style="color:#000000;">999966</a></td>
+ <td bgcolor="999999"><a href="javascript:insertcode('999999');" style="color:#000000;">999999</a></td>
+ <td bgcolor="9999CC"><a href="javascript:insertcode('9999CC');" style="color:#000000;">9999CC</a></td>
+ <td bgcolor="9999FF"><a href="javascript:insertcode('9999FF');" style="color:#000000;">9999FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99CC00"><a href="javascript:insertcode('99CC00');" style="color:#000000;">99CC00</a></td>
+ <td bgcolor="99CC33"><a href="javascript:insertcode('99CC33');" style="color:#000000;">99CC33</a></td>
+ <td bgcolor="99CC66"><a href="javascript:insertcode('99CC66');" style="color:#000000;">99CC66</a></td>
+ <td bgcolor="99CC99"><a href="javascript:insertcode('99CC99');" style="color:#000000;">99CC99</a></td>
+ <td bgcolor="99CCCC"><a href="javascript:insertcode('99CCCC');" style="color:#000000;">99CCCC</a></td>
+ <td bgcolor="99CCFF"><a href="javascript:insertcode('99CCFF');" style="color:#000000;">99CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99FF00"><a href="javascript:insertcode('99FF00');" style="color:#000000;">99FF00</a></td>
+ <td bgcolor="99FF33"><a href="javascript:insertcode('99FF33');" style="color:#000000;">99FF33</a></td>
+ <td bgcolor="99FF66"><a href="javascript:insertcode('99FF66');" style="color:#000000;">99FF66</a></td>
+ <td bgcolor="99FF99"><a href="javascript:insertcode('99FF99');" style="color:#000000;">99FF99</a></td>
+ <td bgcolor="99FFCC"><a href="javascript:insertcode('99FFCC');" style="color:#000000;">99FFCC</a></td>
+ <td bgcolor="99FFFF"><a href="javascript:insertcode('99FFFF');" style="color:#000000;">99FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC0000"><a href="javascript:insertcode('CC0000');" style="color:#FFFFFF;">CC0000</a></td>
+ <td bgcolor="CC0033"><a href="javascript:insertcode('CC0033');" style="color:#FFFFFF;">CC0033</a></td>
+ <td bgcolor="CC0066"><a href="javascript:insertcode('CC0066');" style="color:#FFFFFF;">CC0066</a></td>
+ <td bgcolor="CC0099"><a href="javascript:insertcode('CC0099');" style="color:#FFFFFF;">CC0099</a></td>
+ <td bgcolor="CC00CC"><a href="javascript:insertcode('CC00CC');" style="color:#FFFFFF;">CC00CC</a></td>
+ <td bgcolor="CC00FF"><a href="javascript:insertcode('CC00FF');" style="color:#FFFFFF;">CC00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC3300"><a href="javascript:insertcode('CC3300');" style="color:#FFFFFF;">CC3300</a></td>
+ <td bgcolor="CC3333"><a href="javascript:insertcode('CC3333');" style="color:#FFFFFF;">CC3333</a></td>
+ <td bgcolor="CC3366"><a href="javascript:insertcode('CC3366');" style="color:#FFFFFF;">CC3366</a></td>
+ <td bgcolor="CC3399"><a href="javascript:insertcode('CC3399');" style="color:#FFFFFF;">CC3399</a></td>
+ <td bgcolor="CC33CC"><a href="javascript:insertcode('CC33CC');" style="color:#FFFFFF;">CC33CC</a></td>
+ <td bgcolor="CC33FF"><a href="javascript:insertcode('CC33FF');" style="color:#FFFFFF;">CC33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC6600"><a href="javascript:insertcode('CC6600');" style="color:#000000;">CC6600</a></td>
+ <td bgcolor="CC6633"><a href="javascript:insertcode('CC6633');" style="color:#000000;">CC6633</a></td>
+ <td bgcolor="CC6666"><a href="javascript:insertcode('CC6666');" style="color:#000000;">CC6666</a></td>
+ <td bgcolor="CC6699"><a href="javascript:insertcode('CC6699');" style="color:#000000;">CC6699</a></td>
+ <td bgcolor="CC66CC"><a href="javascript:insertcode('CC66CC');" style="color:#000000;">CC66CC</a></td>
+ <td bgcolor="CC66FF"><a href="javascript:insertcode('CC66FF');" style="color:#000000;">CC66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC9900"><a href="javascript:insertcode('CC9900');" style="color:#000000;">CC9900</a></td>
+ <td bgcolor="CC9933"><a href="javascript:insertcode('CC9933');" style="color:#000000;">CC9933</a></td>
+ <td bgcolor="CC9966"><a href="javascript:insertcode('CC9966');" style="color:#000000;">CC9966</a></td>
+ <td bgcolor="CC9999"><a href="javascript:insertcode('CC9999');" style="color:#000000;">CC9999</a></td>
+ <td bgcolor="CC99CC"><a href="javascript:insertcode('CC99CC');" style="color:#000000;">CC99CC</a></td>
+ <td bgcolor="CC99FF"><a href="javascript:insertcode('CC99FF');" style="color:#000000;">CC99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCCC00"><a href="javascript:insertcode('CCCC00');" style="color:#000000;">CCCC00</a></td>
+ <td bgcolor="CCCC33"><a href="javascript:insertcode('CCCC33');" style="color:#000000;">CCCC33</a></td>
+ <td bgcolor="CCCC66"><a href="javascript:insertcode('CCCC66');" style="color:#000000;">CCCC66</a></td>
+ <td bgcolor="CCCC99"><a href="javascript:insertcode('CCCC99');" style="color:#000000;">CCCC99</a></td>
+ <td bgcolor="CCCCCC"><a href="javascript:insertcode('CCCCCC');" style="color:#000000;">CCCCCC</a></td>
+ <td bgcolor="CCCCFF"><a href="javascript:insertcode('CCCCFF');" style="color:#000000;">CCCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCFF00"><a href="javascript:insertcode('CCFF00');" style="color:#000000;">CCFF00</a></td>
+ <td bgcolor="CCFF33"><a href="javascript:insertcode('CCFF33');" style="color:#000000;">CCFF33</a></td>
+ <td bgcolor="CCFF66"><a href="javascript:insertcode('CCFF66');" style="color:#000000;">CCFF66</a></td>
+ <td bgcolor="CCFF99"><a href="javascript:insertcode('CCFF99');" style="color:#000000;">CCFF99</a></td>
+ <td bgcolor="CCFFCC"><a href="javascript:insertcode('CCFFCC');" style="color:#000000;">CCFFCC</a></td>
+ <td bgcolor="CCFFFF"><a href="javascript:insertcode('CCFFFF');" style="color:#000000;">CCFFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF0000"><a href="javascript:insertcode('FF0000');" style="color:#FFFFFF;">FF0000</a></td>
+ <td bgcolor="FF0033"><a href="javascript:insertcode('FF0033');" style="color:#FFFFFF;">FF0033</a></td>
+ <td bgcolor="FF0066"><a href="javascript:insertcode('FF0066');" style="color:#FFFFFF;">FF0066</a></td>
+ <td bgcolor="FF0099"><a href="javascript:insertcode('FF0099');" style="color:#FFFFFF;">FF0099</a></td>
+ <td bgcolor="FF00CC"><a href="javascript:insertcode('FF00CC');" style="color:#FFFFFF;">FF00CC</a></td>
+ <td bgcolor="FF00FF"><a href="javascript:insertcode('FF00FF');" style="color:#FFFFFF;">FF00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF3300"><a href="javascript:insertcode('FF3300');" style="color:#FFFFFF;">FF3300</a></td>
+ <td bgcolor="FF3333"><a href="javascript:insertcode('FF3333');" style="color:#FFFFFF;">FF3333</a></td>
+ <td bgcolor="FF3366"><a href="javascript:insertcode('FF3366');" style="color:#FFFFFF;">FF3366</a></td>
+ <td bgcolor="FF3399"><a href="javascript:insertcode('FF3399');" style="color:#FFFFFF;">FF3399</a></td>
+ <td bgcolor="FF33CC"><a href="javascript:insertcode('FF33CC');" style="color:#FFFFFF;">FF33CC</a></td>
+ <td bgcolor="FF33FF"><a href="javascript:insertcode('FF33FF');" style="color:#FFFFFF;">FF33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF6600"><a href="javascript:insertcode('FF6600');" style="color:#000000;">FF6600</a></td>
+ <td bgcolor="FF6633"><a href="javascript:insertcode('FF6633');" style="color:#000000;">FF6633</a></td>
+ <td bgcolor="FF6666"><a href="javascript:insertcode('FF6666');" style="color:#000000;">FF6666</a></td>
+ <td bgcolor="FF6699"><a href="javascript:insertcode('FF6699');" style="color:#000000;">FF6699</a></td>
+ <td bgcolor="FF66CC"><a href="javascript:insertcode('FF66CC');" style="color:#000000;">FF66CC</a></td>
+ <td bgcolor="FF66FF"><a href="javascript:insertcode('FF66FF');" style="color:#000000;">FF66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF9900"><a href="javascript:insertcode('FF9900');" style="color:#000000;">FF9900</a></td>
+ <td bgcolor="FF9933"><a href="javascript:insertcode('FF9933');" style="color:#000000;">FF9933</a></td>
+ <td bgcolor="FF9966"><a href="javascript:insertcode('FF9966');" style="color:#000000;">FF9966</a></td>
+ <td bgcolor="FF9999"><a href="javascript:insertcode('FF9999');" style="color:#000000;">FF9999</a></td>
+ <td bgcolor="FF99CC"><a href="javascript:insertcode('FF99CC');" style="color:#000000;">FF99CC</a></td>
+ <td bgcolor="FF99FF"><a href="javascript:insertcode('FF99FF');" style="color:#000000;">FF99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFCC00"><a href="javascript:insertcode('FFCC00');" style="color:#000000;">FFCC00</a></td>
+ <td bgcolor="FFCC33"><a href="javascript:insertcode('FFCC33');" style="color:#000000;">FFCC33</a></td>
+ <td bgcolor="FFCC66"><a href="javascript:insertcode('FFCC66');" style="color:#000000;">FFCC66</a></td>
+ <td bgcolor="FFCC99"><a href="javascript:insertcode('FFCC99');" style="color:#000000;">FFCC99</a></td>
+ <td bgcolor="FFCCCC"><a href="javascript:insertcode('FFCCCC');" style="color:#000000;">FFCCCC</a></td>
+ <td bgcolor="FFCCFF"><a href="javascript:insertcode('FFCCFF');" style="color:#000000;">FFCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFFF00"><a href="javascript:insertcode('FFFF00');" style="color:#000000;">FFFF00</a></td>
+ <td bgcolor="FFFF33"><a href="javascript:insertcode('FFFF33');" style="color:#000000;">FFFF33</a></td>
+ <td bgcolor="FFFF66"><a href="javascript:insertcode('FFFF66');" style="color:#000000;">FFFF66</a></td>
+ <td bgcolor="FFFF99"><a href="javascript:insertcode('FFFF99');" style="color:#000000;">FFFF99</a></td>
+ <td bgcolor="FFFFCC"><a href="javascript:insertcode('FFFFCC');" style="color:#000000;">FFFFCC</a></td>
+ <td bgcolor="FFFFFF"><a href="javascript:insertcode('FFFFFF');" style="color:#000000;">FFFFFF</a></td>
+ </tr>
+</table> \ No newline at end of file
diff --git a/0.7.6/templates/help.sno b/0.7.6/templates/help.sno
new file mode 100644
index 0000000..e1f6de9
--- /dev/null
+++ b/0.7.6/templates/help.sno
@@ -0,0 +1,79 @@
+<div>
+ Alle Chat-Befehle:
+</div>
+<hr>
+<table border=1>
+<tr><th><div>SU</div></th><th><div>Befehl</div></th><th><div>Beschreibung</div></th></tr>
+<tr><td><div>NC</div></td><td><div>/about</div></td><td><div>Zeigt aktuelle Version und andere Infos der Community an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/away <font color=red>Nachricht</font></div></td><td><div>Abmelden mit einer<font color=red>Abmeldenachricht</font></div></td></tr>
+<tr><td><div>NC</div></td><td><div>/clear</div></td><td><div>Bildschirm wird gelöscht</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/col <font color=red>XXXXXX</font> <font color=ffa500>XXXXXX</font></div></td><td><div>Farbe/n (<font color=red>Namensfarbe</font> / <font color=ffa500>Textfarbe</font>) wechseln. Angabe in Hexadezimal. Wird gar keine Farbe angegeben, dann wird eine zufällige generiert!</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/date</div></td><td><div>Zeigt aktuelles Datum und Urzeit an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/exit</div></td><td><div>Komplett aus dem System ausloggen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/getcol <font color=red>Alias</font></div></td><td><div>Zeigt an welche Farb-Codes <font color=red>Alias</font> zum Chatten verwendet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/hits</div></td><td><div>Zeigt an vor wieviel Stunden der Chat-Server neugestartet wurde und die Hits und Hits per Minute seit dieser Zeit</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ig <font color=red>Alias</font></div></td><td><div>Setzt/entfernt <font color=red>Alias</font> auf/aus die/der Ignorierliste. Wird das Argument weggelassen, so wird die Liste aller ignorierten Personen angezeigt</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/j <font color=red>Raumname</font></div></td><td><div>Raum wechseln/erstellen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ju <font color=red>Alias</font></div></td><td><div>In den Raum wechseln/folgen, wo sich <font color=red>Alias</font> befindet.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/m <font color=red>Aktion</font></div></td><td><div>Handeln mit 2 Farben</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/me <font color=red>Aktion</font></div></td><td><div>Handeln mit einer Farbe</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/memo <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine <font color=ffa500>Memonachricht</font> hinterlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/msg <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine private <font color=ffa500>Nachricht</font> flüstern</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ <font color=ffa500>Nachricht</font></div></td><td><div>Eine private <font color=ffa500>Nachricht</font> demjenigen flüstern, dem zuletzt eine geflüstert wurde</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/online <font color=red>Alias</font></div></td><td><div>Zeigt Onlineminuten von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/q</div></td><td><div>Chat verlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/rmgb</div></td><td><div>Das eigene Gästebuch komplett weglöschen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/s <font color=red>Nachricht</font></div></td><td><div><font color=red>Nachricht</font> schreien</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/seen <font color=red>Alias</font></div></td><td><div>Zeigt an, vor wieviel Stunden sich <font color=red>Nachricht</font> zum letzten Mal in das System eingelogt hat</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/selfkill</div></td><td><div>Sich selbst ganz und gar aus dem System entfernen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/sep <font color=red>Raumname</font></div></td><td><div>In den Raum <font color=red>Raumnamen</font> wechseln und gleichzeitig absperren</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/uptime</div></td><td><div>Siehe Befehl "/hits"</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/w</div></td><td><div>Zeigt an, wer sich im aktuellen Raum befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc <font color=red>Raum</font></div></td><td><div>Zeigt an, wer sich im <font color=red>Raum</font> befindet. Wird kein Raum angegeben, dann wird ledeglich angezeigt, wer sich im System befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc/</div></td><td><div>Zeigt alle offenen Räume und deren Chatter an</div></td></tr>
+<tr><td><div>NC</div></td><td> <div>/wj <font color=red>Alias</font></div></td><td><div>Zeigt an, in welchen Raum sich <font color=red>Alias</font> befindet</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/l</div></td><td><div>Der aktuelle Raum wird ab- bzw. aufgesperrt</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/rsu <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> die Raumbesetzerrechte entnehmen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/su <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Raumbesetzer ernennen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/t <font color=red>Thema</font></div></td><td><div>Dem Raum wird ein <font color=red>Thema</font> gegeben</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban</div></td><td><div>Zeigt alle verbannten Benutzer an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> verbannen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/rban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> "entbannen"</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/banip <font color=red>Alias</font></div></td><td><div>Die IP-Nummer von <font color=red>Alias</font> verbannen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/rbanip ip://<font color=red>x.x.x.x</font></div></td><td><div>Die IP-Nummer <font color=red>x.x.x.x</font> "entbannen"</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ip <font color=red>Alias</font></div></td><td><div>Zeigt die IP-Nummer von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/img</div></td><td><div>Versteckt/reaktiviert das eigene Superuser-Logo im Online-Frame</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/k <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird aus dem Chat katapultiert!</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/o <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird aus dem Chat ausgeloggt!</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/sl <font color=red>Raum</font></div></td><td><div>Einen anderen <font color=ffa500>Raum</font> absperren</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ss <font color=red>Raum</font> <font color=ffa500>Nachricht</font></div></td><td><div>Eine <font color=ffa500>Nachricht</font> in <font color=red>Raum</font> hinüber rufen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/st <font color=red>Raum</font> <font color=ffa500>Thema</font></div></td><td><div>Einem anderen <font color=red>Raum</font> ein <font color=ffa500>Thema</font > geben</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/status <font color=ffa500>Alias</font></div></td><td><div>Zeigt den Superuserstatus von <font color=ffa500>Alias</font> an</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/kill <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird ganz und gar aus dem System entfernt</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/wa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Wächter ernennen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/rwa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom Wächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/sys <font color=red>Nachricht</font></div></td><td><div>Systemnachricht schreiben. (Erscheint in allen existierenden Räumen)</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/twa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum temporären Wächter ernennen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/rtwa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom temporären Wächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=red>AD</font></div></td><td><div>/cool <font color=red>Nachricht</font></div></td><td><div>Gibt für den aktuellen Raum eine Systemmeldung aus</div></td></tr>
+<tr><td><div><font color=red>AD</font></div></td><td><div>/id <font color=red>Alias</font></div></td><td><div>Zeigt TempID von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div><font color=red>AD</font></div></td><td><div>/ow <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Oberwächter ernennen</div></td></tr>
+<tr><td><div><font color=red>AD</font></div></td><td><div>/row <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom Oberwächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=red>AD</font></div></td><td><div>/pw <font color=red>Alias</font></div></td><td><div>Zeigt das Passwort von <font color=red>Alias</font> an</div></td></tr>
+
+</table><hr>
+<div>
+ Zur Erklärung: NC steht für "Normale Chatter", RB für "Raumbesetzer", WÄ für "Wächter" und OW für "Oberwächter".
+ Obrige Befehle können nur von der/den jeweiligen Benutzergruppe/n ausgeführt werden.<br><br>
+ Allerdings gibt es folgendes zu beachten: Oberwächter verfügen über alle Chatbefehle. Normale Wächter über alle Chatbefehle, außer über die der Oberwächter.
+ Raumbesetzer können nur Raumbesetzerbefehle und die Befehle der normalen Chatter durchführen. Normale Chatter haben ledeglich die Standardbefehle zu verwenden.<br><br>
+ Weitere Besonderheiten der Wächter und Oberwächter:<br><br>
+ Wächter und Oberwächter können ....<br>
+ ... abgesperrte Chaträume problemlos betreten.<br>
+ ... nicht gekickt, verbannt oder gekillt werden.<br><br>
+ Nur Oberwächer können Logdateien der Cyberbar lesen!<br><br>
+ Oberwächter ernennt nur der Systemadministrator! Dieser wiederum hat weitere spezielle Befehle die geheim sind und die nur ihm
+ vorbehalten sind und ihm das Administrieren erleichtert.
+</div>
+</body>
+</html>
diff --git a/0.7.6/ychatd.pl b/0.7.6/ychatd.pl
new file mode 100644
index 0000000..75b6983
--- /dev/null
+++ b/0.7.6/ychatd.pl
@@ -0,0 +1,60 @@
+#!/usr/bin/perl
+use CGI;
+$q = new CGI;
+use config;
+use modules::commands;
+use modules::changeroom;
+use modules::divcom;
+use modules::hierachie;
+use modules::htdocs;
+use modules::input;
+use modules::loggedin;
+use modules::online;
+use modules::postmessage;
+use modules::shared;
+use modules::start;
+use modules::statistic;
+use modules::stream;
+use modules::webchat;
+use IO::Socket;
+$SIG{'CHLD'} = 'IGNORE';
+$mainsocket = 'IO::Socket::INET'->new('LocalHost', "$localhost", 'LocalPort', $localport, 'Porto', 'tcp', 'Listen', $limit + 10, 'Reuse', 1);
+die "Kann Server-Socket nicht erzeugen: $!\n" unless $mainsocket;
+print "yChat wurde auf $localhost:$localport gestartet...\n";
+$STARTIME = time;
+while ($client = $mainsocket->accept) {
+ ++$HITS;
+ $pid = fork;
+ if ($pid == 0) {
+ print $client "HTTP/1.1 200 OK\nContent-type:text/html\n\n";
+ while (defined($buffer = <$client>)) {
+ my $requeststring;
+ my(@tmp) = split(/\s+/, $buffer, 0);
+ if ($tmp[0] eq 'GET') {
+ $requeststring = $tmp[1];
+ }
+ @tmp = split(/\?/, $requeststring, 0);
+ @tmp = split(/&/, $tmp[1], 0);
+ my %variables;
+ foreach $_ (@tmp) {
+ my(@tmp) = split(/=/, $_, 0);
+ next if $tmp[0] eq 'admin' or $tmp[0] eq 'mogeladmin';
+ $tmp[0] =~ s[/][];
+ $variables{$tmp[0]} = &url_decode($tmp[1]);
+ }
+ foreach $_ (keys %variables) {
+ eval "\$$_ = '" . $variables{$_} . q['];
+ }
+ *STDOUT = $client;
+ if ($request) {
+ &secure_checkid($alias, $tmpid) if $request != 'start';
+ eval "&$request";
+ }
+ else {
+ &start;
+ }
+ $client->shutdown(2);
+ exit 0;
+ }
+ }
+}
diff --git a/0.8.0/INSTALL.txt b/0.8.0/INSTALL.txt
new file mode 100644
index 0000000..ee0cf3b
--- /dev/null
+++ b/0.8.0/INSTALL.txt
@@ -0,0 +1,63 @@
+So wird der Perl yChat Version 0.8.0 installiert:
+
+1. Die tar.gz Datei in ein beliebiges Verzeichnis entpacken und
+dort hineinwechseln. Am besten einen neuen Benutzer yC anlegen
+und das Archiv dorthinein entpacken.
+
+2. In das entpackte Verzeichnis wechseln. Dort finden Sie die
+Shell-Datei setup.sh. Öffnen Sie diese und editieren sie dort
+den letzten Befehl
+chmod yC * -R
+so, daß yC durch den Usernamen ersetzt wird, unter dem der yChat
+letzendlich gestartet werden soll.
+
+3. Wenn sie auf dem Server Root-Zugriff haben, dann können sie
+den Chat über Ramdisk (schneller) laufen lassen. Wechseln
+Sie deshalb den user nach root und führen Sie dann das Shell
+Skript mit ./setup.sh aus.
+Wenn sie kein Root-Zugriff haben, können sie das Skript
+auch ausführen, wobei keine Ramdisks angelegt werden.
+
+4. Kopieren sie den Unterordner "yC-web-docs" in ein Verzeichnis
+auf das öffentlich via HTTP zugegriffen wird (z.B. htdocs
+von Apache).
+
+5. Nun hat das Skript alle Unterverzeichnisse erstellt. Jetzt
+müssen Sie die Datei config.pm öffnen und dort die Variablen
+$localport, $localhost und $gfxpath editieren. Hierbei setzen
+Sie den Localport auf den Port über den der yChat-Server laufen
+soll und den Localhost auf die IP-Nummer Ihren Servers. Bei
+FX-Path geben sie die URL an, unter der sie auf die Grafiken
+via HTTP zugreifen können.
+
+6. Nun können sie den Chat starten. Dafür geben sie lediglich
+ein:
+perl ychatd.pl &
+Achten sie darauf, daß sie dies nicht als root- sondern als
+einen anderen User tun (z.B. user yC den Sie angelegt haben
+sollten, wenn Sie sich an meinen Vorschlag gehalten haben).
+Wenn Sie den Chat gestartet haben, können sie ihn via einem
+beliebigen Webbrowser unter http://ihrlocalhost:ihrlocalport
+erreichen.
+
+7. Wenn sie sich einen Nick registriert haben, können sie sich
+zum Administrator machen indem Sie die Datei data/hierachie
+anlegen und dort in die erste Zeile folgendes schreiben:
+ihrnick<;9
+
+Die weiteren Befehle finden sie im Chat wenn sie den Befehl
+/menu eingeben und dann auf "Befehle" klicken.
+
+Bei Fragen Mail an snooper@ychat.de,
+MfG,
+Paul.
+
+
+PS: Ich werde nicht mehr sehr viel am Perl yChat programmieren.
+Geplant ist eine evtl. 0.8.1er Release, in der man nicht mehr
+auf die Groß- und Kleinschreibung der Nicks achten muß.
+
+Des Weiteren programmiere ich ein neues Chat-System, welches
+vollständig auf Java basiert. Wenn der Server gerade gehen sollte,
+dann ist eine Beta stets unter www.yChat.org einsehbar. Unter
+www.yChat.de läuft der Perl yChat weiter.
diff --git a/0.8.0/config.pm b/0.8.0/config.pm
new file mode 100755
index 0000000..36af482
--- /dev/null
+++ b/0.8.0/config.pm
@@ -0,0 +1,43 @@
+# yChat - Copyright by Paul C. Bütow
+########################### Dieser Teil bestimmt die Standart-Variabeln.
+##STANDART-CONFIGURATION:## (CSS, Farben, Version etc.)
+###########################
+$limit = 50; # Benutzerlimit
+$datum = "19.06.02"; # Datum der letzten Änderung (ändern erwünscht)
+$version = "0.8.0"; # Bitte Hauptversionsnummer nicht ändern
+$title = "yChat [$version]"; # Erscheint in der Browser-Leiste oben
+$standardroom = "Cyberbar"; # Standardchatraum
+$loginplace = "Lounge"; # Bezeichnung der Startseite nach dem Login
+$localhost = "62.75.136.147";# Host oder IP# des Chat-Servers
+$localport = 2000; # Port über den fer Chat-Server läuft
+$gfxpath = "http://$localhost/yChat"; # URL der Binärdaten (Grafiken etc.)
+$bgcolor = "#3E535B"; # Hintergrundfarbe der HTML-Seiten
+$chatbg = "#000000"; # Hintergrundfarbe des Chat-Frames
+$cryptkey = "kASD73jnS"; # Hiermit wetden die PW's verschlüsselt.
+
+# PS: Um einen Chat-Administrator anzulegen, dann die Datei data/hierachie
+# anlegen, in eine Zeile muß folgendes eingetragen werden: "Nickname<;7"
+# (Natürlich ohne Anführungsstriche) Nickname ist somit Chat-Administrator
+# und kann Oberwächter und Wächter bestimmen!
+
+sub style {
+print <<ENDCSS;
+<style type="text/css">
+ body { background-color: $bgcolor }
+ body.blank { background-color: $chatbg }
+ body.online { background-color: $chatbg }
+ div { font-family: arial, geneva, verdana, helvetiva; font-size: 12px; color: #ffffff }
+ div.b { font-weight: bold; color: #ffa500 }
+ a { color: #ffffef; }
+ a:hover { color: #ffffff; }
+ p { font-family:verdana, arial, geneva, helvetica, sans-serif; color:#FFFFFF; font-size:12px; }
+</style>
+<style type="text/css" media="all">
+ a { text-decoration: none; }
+ a:hover { text-decoration:underline; }
+ input { border:2px solid #000000; font-size:12px; color:#000000; background-color: #ffffff; height:23px; padding:2px;}
+ select { border:2px solid #000000; font-family:arial, verdana, helvetica; font-size:11px; color:#000000; height:21px; padding:2px;}
+</style>
+ENDCSS
+}
+1;
diff --git a/0.8.0/modules/changeroom.pm b/0.8.0/modules/changeroom.pm
new file mode 100755
index 0000000..4a5e787
--- /dev/null
+++ b/0.8.0/modules/changeroom.pm
@@ -0,0 +1,67 @@
+sub change_room {
+ my($method, $newroom, $oldroom, $alias2) = @_;
+ if ($newroom eq $oldroom) {
+ &post_prv($alias, "<font color='ffffff'>Du befindest dich bereits im Raum <font color='ffa500'>$newroom</font>!</font>");
+ &reload_html;
+ }
+ elsif ($newroom eq $loginplace) {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> verl&auml;sst den Chat und geht in die <b>$loginplace</b> ... </font></i>", $alias);
+ &post_strmsg($alias, $room, 'quit');
+ unlink "data/online/rooms/$room/$alias";
+ &rm_rstat($alias, $room);
+ &check_online;
+ &reload_html;
+ }
+ open RSTAT, "<data/online/rstat/$newroom";
+ my(@rstat) = <RSTAT>;
+ close RSTAT;
+ if ($rstat[0] eq "1\n") {
+ if (3 <= &hierachie($alias)) {
+ &post_prv($alias, "<font color='ffffff'>Der Raum <font color='ffa500'>$newroom</font> ist leider abgesperrt!</font>");
+ &reload_html;
+ }
+ }
+ &private_javascript($alias, $room, "parent.input.document.inf.room.value = '$newroom';open('chat?request=online&room=$newroom&alias=$alias&tmpid=$tmpid','online');");
+ open MSGFILE, ">>data/msgs/$newroom";
+ print MSGFILE "$alias<;" . time . "<;!<;!<;<;\n";
+ close MSGFILE;
+ open MSGFILE, ">>data/msgs/$room";
+ if ($method eq 'j') {
+ print MSGFILE "$alias<;" . time . q[<;!<;!<;<i><font color='ffffff'>] . &timestring . " Du wechselst aus dem Raum <b>$oldroom</b> herein nach <b>$newroom</b> ...</font></i><br><;\n";
+ }
+ elsif ($method eq 'ju') {
+ print MSGFILE "$alias<;" . time . q[<;!<;!<;<i><font color='ffffff'>] . &timestring . " Du folgst <font color='".&get_ident($alias2,3)."'>$alias2</font> aus dem Raum <b>$oldroom</b> herein nach <b>$newroom</b> ...</font></i><br><;\n";
+ }
+ elsif ($method eq 'sep') {
+ print MSGFILE "$alias<;" . time . q[<;!<;!<;<i><font color='ffffff'>] . &timestring . " Du wechselst aus dem Raum <b>$oldroom</b> herein nach <b>$newroom</b> und sperrst ab...</font></i><br><;\n";
+ }
+ close MSGFILE;
+ &post_strmsg($alias, $room, 'cr', $newroom);
+ $room = $oldroom;
+ my $tmpstamp = time;
+ if ($method eq 'j') {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> wechselt in den Raum <b>$newroom</b> ...</font></i>", $alias);
+ $room = $newroom;
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> kommt aus dem Raum <b>$oldroom</b> herein nach <b>$newroom</b> ...</font></i>", $alias);
+ }
+ elsif ($method eq 'ju') {
+ my $col2 = &get_ident($alias2,3);
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> folgt <font color='$col2'>$alias2</font> in den Raum <b>$newroom</b> ...</font></i>", $alias);
+ $room = $newroom;
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> kommt aus dem Raum <b>$oldroom</b> und folgt <font color='$col2'>$alias2</font> herein nach <b>$newroom</b> ...</font></i>", $alias);
+ }
+ elsif ($method eq 'sep') {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> wechselt in den Raum <b>$newroom</b> und sperrt ab...</font></i>", $alias);
+ $room = $newroom;
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> kommt aus dem Raum <b>$oldroom</b> herein nach <b>$newroom</b> und sperrt ab...</font></i>", $alias);
+ }
+ elsif ($method eq 'beam') {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias2</font> beamt <b>$alias</b> in den Raum <b>$newroom</b>...</font></i>", $alias2);
+ $room = $newroom;
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias2</font> beamt <b>$alias</b> aus dem Raum <b>$oldroom</b> herein nach <b>$room</b>...</font></i>", $alias2);
+ }
+ unlink "data/online/rooms/$oldroom/$alias";
+ &rm_rstat($alias, $oldroom);
+ &check_online;
+}
+1;
diff --git a/0.8.0/modules/commands.pm b/0.8.0/modules/commands.pm
new file mode 100755
index 0000000..8d6211b
--- /dev/null
+++ b/0.8.0/modules/commands.pm
@@ -0,0 +1,867 @@
+sub command {
+ $_[0] = $_[0] . ' ';
+ $_[0] = substr($_[0], 1, length($_[0]) - 1);
+ my(@cmd) = split(/ /, $_[0], 0);
+ my $cmd = substr($_[0], 0, index($_[0], ' '));
+ my $tmp = $_[1];
+ sub lock {
+ my $method = shift @_;
+ open RSTAT, "data/online/rstat/$room";
+ my(@r_stat) = <RSTAT>;
+ close RSTAT;
+ my $lock = "0\n";
+ if ($room eq $standardroom) {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> sperrt den Raum ohne Erfolg ab ...</font></i>", $alias);
+ }
+ else {
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> sperrt den Raum ab ...</font></i>", $alias) if $method ne 'separee';
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> sperrt den Raum auf ...</font></i>", $alias) if $method ne 'separee';
+ }
+ for ($i = 1; $i <= $#r_stat; ++$i) {
+ $lock = $lock . $r_stat[$i];
+ }
+ open RSTAT, ">data/online/rstat/$room";
+ print RSTAT $lock;
+ close RSTAT;
+ }
+ &reload_html;
+ }
+ if ($cmd eq 'about') {
+ &post_prv($alias, "<font color=ffffff>Aktuelle Version ist $title und wurde am $datum aktuallisiert. Programmiert von Paul C. B\374tow (2000 - 2002).</font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'away') {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $away_msg = $away_msg . ' ' . $cmd[$i];
+ }
+ my $room = &get_room($alias);
+ if ($tmp eq 'autoaway') {
+ $away_msg = "$alias wurde vom System agbemeldet ...";
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='ffa500'><b>Das System</b></font> meldet <font color='".&get_ident($alias,3)."'>$alias</font> wegen Inaktivit&auml;t ab ...</i></font>", $alias);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> meldet sich ab (<font color='$col'>$away_msg</font> ) ...</i></font>", $alias);
+ }
+ open AWAY, ">>data/online/rstat/$room.away";
+ print AWAY "$alias<;$away_msg\n";
+ close AWAY;
+ &private_javascript($alias, $room, q[parent.input.document.inf.tmp.value = 'away'; parent.online.location.reload();]);
+ &reload_html;
+ }
+ elsif ($cmd eq 'clear') {
+ &post_prv($alias, "<script language='JavaScript'>window.open('chat?request=stream&alias=$alias&room=$room&col=$col&secol=$secol&tmp=login&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder','main');</script>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'col') {
+ my $col, $secol;
+ if ($cmd[1] ne undef) {
+ $col = $cmd[1];
+ &prove_color($alias, $col);
+ my $tmpsecol = $cmd[2];
+ my $length = length $tmpsecol;
+ if ($tmpsecol eq '' or $length < 6 or $length > 6) {
+ $secol = $col;
+ }
+ else {
+ $secol = $tmpsecol;
+ }
+ }
+ else {
+ $col = &random_color;
+ $secol = &random_color;
+ }
+ open OPTIONS, "<data/user/options/$alias";
+ my(@options) = <OPTIONS>;
+ close OPTIONS;
+ open OPTIONS, ">data/user/options/$alias";
+ print OPTIONS $options[0] . $col . "\n" . $secol;
+ close OPTIONS;
+ open IDENT, "<data/online/ident/$alias";
+ my(@ident) = <IDENT>;
+ close IDENT;
+ open IDENT, ">data/online/ident/$alias";
+ print IDENT $ident[0] . $ident[1] . $ident[2] . "$col\n$secol";
+ close IDENT;
+ &post($room, '<i><font color=ffffff>' . &timestring . "</font> <font color=$col>$alias</font> <font color=$secol> hat die Farbe gewechselt...</font></i>", $alias);
+ &private_javascript($alias, $room, "parent.input.document.inf.col.value = '$col'; parent.input.document.inf.secol.value = '$secol';");
+ &post_strmsg($alias, $room, 'col', "$col;$secol");
+ &reload_html;
+ }
+ elsif ($cmd eq 'date') {
+ my($secs, $mins, $hours, $days, $months, $years) = &timearray;
+ &post_prv($alias, "<font color=ffffff>Heute ist der $days.$months. Jahr $years. Es ist genau $hours:$mins Uhr und $secs Sekunden.</font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'exit') {
+ my $room = &get_room($alias);
+ if ($tmp eq 'autologout') {
+ &private_javascript($alias, $room, q[open('chat?request=start&tmp=autologout','_top');]);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='ffa500'><b>Das System</b></font> loggt <font color='".&get_ident($alias,3)."'>$alias</font> wegen Inaktivit&auml;t aus ... </font></i>", $alias);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> loggt sich ganz aus ... </font></i>", $alias);
+ &private_javascript($alias, $room, q[open('chat?request=start&tmp=quit','_top');]);
+ }
+ &rm_alias($alias, $room);
+ &rm_away($alias, $room);
+ &reload_html;
+ }
+ elsif ($cmd eq 'getcol') {
+ my $cols2show = $cmd[1];
+ if (-f "data/user/options/$cols2show") {
+ open FILE, "<data/user/options/$cols2show";
+ my(@file) = <FILE>;
+ close FILE;
+ chomp $file[1];
+ chomp $file[2];
+ &post_prv($alias, "<font color='ffa500'>$cols2show <font color='ffffff'> verwendet als 1. Farbe <font color='$file[1]'>$file[1]</font> und als 2. Farbe <font color='$file[2]'>$file[2]</font> !</font></font>");
+ &reload_html;
+ }
+ &post_prv($alias, "<font color='ffa500'>$cols2show <font color='ffffff'> existiert nicht in der Benutzerdatenbank!</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'hits' or $cmd eq 'uptime') {
+ &post_prv($alias, "<font color=ffffff>Uptime: $startime " . &calculate_uptime_hours($STARTIME) . "h; $HITS Hits; " . &calculate_hpm($HITS, $STARTIME) . ' Hits pro Minute</font>');
+ &reload_html;
+ }
+ elsif ($cmd eq 'ig') {
+ my $alias2ignore = $cmd[1];
+ if ($alias2ignore) {
+ if (-f "data/user/options/$alias2ignore") {
+ if (3 <= &hierachie($alias2ignore)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2ignore</font> <font color='ffffff'> kann nicht ignoriert werden!</font>");
+ }
+ else {
+ &post_strmsg($alias, $room, 'ig', $alias2ignore);
+ }
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2ignore</font> <font color='ffffff'>existiert nicht in der Datenbank!</font>");
+ }
+ }
+ else {
+ &post_strmsg($alias, $room, 'igl');
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'j' or $cmd eq 'sep') {
+ if ($cmd[1] =~ /\W/ or $cmd[1] eq '') {
+ &post_prv($alias, "<font color=ffffff>Der Raum <font color=ffa500>$cmd[1]</font> enth\344lt illegale Zeichen!</font>");
+ &reload_html;
+ }
+ else {
+ if ($cmd eq 'j') {
+ &change_room('j', $cmd[1], $room);
+ &reload_html;
+ }
+ else {
+ if ($cmd[1] eq $standardroom) {
+ &post_prv($alias, "<font color=ffffff>Der Raum <font color=ffa500>$cmd[1]</font> ist ein Standardraum und kann nicht als Separee er&ouml;ffnet werden!</font>");
+ }
+ else {
+ &change_room('sep', $cmd[1], $room);
+ &lock('separee');
+ }
+ &reload_html;
+ }
+ }
+ }
+ elsif ($cmd eq 'me' or $cmd eq 'm') {
+ my $me_msg;
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $me_msg = $me_msg . ' ' . $cmd[$i];
+ }
+ $me_msg =~ s[/me/][<i>$alias</i>]g;
+ $me_msg =~ s[/m/][<i><font color=$col>$alias</font></i>]g;
+ if ($cmd eq 'm') {
+ &post($room, "<b><font color=$col><i>$alias</i> <font color=$secol>$me_msg</font></font></b>", $alias);
+ }
+ else {
+ &post($room, "<b><font color=$col><i>$alias</i> $me_msg</font></b>", $alias);
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'memo') {
+ my $alias2memo = $cmd[1];
+ my($secs, $mins, $hours, $days, $months, $years) = &timearray;
+ if (-f "data/user/options/$alias2memo") {
+ my $memo_msg;
+ for ($i = 2; $i <= $#cmd; ++$i) {
+ $memo_msg = $memo_msg . ' ' . $cmd[$i];
+ }
+ &post_prv($alias, "<font color=ffa500>$alias2memo <font color=ffffff>wurde folgende memo erfolgreich hinterlassen: $memo_msg</font></font>");
+ open MEMO, ">>data/user/memos/$alias2memo";
+ print MEMO "<font color=ffffff>($days.$months.$years - $hours:$mins:$secs) <font color=$col>$alias</font> hat Dir eine Memo hinterlassen: <font color=ffa500>$memo_msg</font></font><br>\n";
+ close MEMO;
+ &reload_html;
+ }
+ &post_prv($alias, "<font color=ffa500>$alias2memo <font color=ffffff>existiert in der Datenbank nicht !</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'menu') {
+ &private_javascript($alias, $room, "window.open('chat?request=htdocs&alias=$alias&var=menu_html&room=$standardroom&col=$col&secol=$secol&tmpid=$tmpid','_new','width=500,height=500,screenX=100,screenY=100,scrollbars');");
+ &reload_html;
+ }
+ elsif ($cmd eq 'online') {
+ my $alias2prove = $cmd[1];
+ my $totaltime = &get_online_time($alias2prove);
+ if ($totaltime ne false) {
+ &post_prv("$alias", "<font color=ffa500>$alias2prove <font color=ffffff>war insgesamt schon $totaltime Stunden online!</font></font>");
+ }
+ else {
+ &post_prv("$alias", "<font color=ffa500>$alias2prove <font color=ffffff>existiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'q') {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> verl&auml;sst den Chat ... </font></i>", $alias);
+ &post_strmsg($alias, $room, 'quit');
+ unlink "data/online/rooms/$room/$alias";
+ &rm_rstat($alias, $room);
+ &rm_away($alias, $room);
+ &check_online;
+ &reload_html;
+ }
+ elsif ($cmd eq 'rmgb') {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> l\366scht das eigene G\344stebuch ...</font></i>", $alias);
+ unlink "data/user/gbooks/$alias";
+ &reload_html;
+ }
+ elsif ($cmd eq 's') {
+ my $msg2scream;
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2scream = $msg2scream . ' ' . $cmd[$i];
+ }
+ $msg2scream =~ s/\344/\304/g;
+ $msg2scream =~ s/\366/\326/g;
+ $msg2scream =~ s/\374/\334/g;
+ $msg2scream = "\U$msg2scream\E";
+ &post($room, "<b><font color=$col><i>$alias schreit:</i> <font color=$secol>$msg2scream</font></font></b>", $alias);
+ &reload_html;
+ }
+ elsif ($cmd eq 'seen') {
+ my $alias2prove = $cmd[1];
+ if (-f "data/user/options/$alias2prove") {
+ if (-f "data/user/lastlogin/$alias2prove") {
+ open LASTLOGIN, "<data/user/lastlogin/$alias2prove";
+ my $lastlogin = <LASTLOGIN>;
+ close LASTLOGIN;
+ my $timestamp = sprintf('%.2f', (time - $lastlogin) / 3600);
+ &post_prv("$alias", "<font color='ffa500'>$alias2prove <font color=ffffff> hat sich vor $timestamp Stunden zuletzt in das System eingeloggt!</font></font>");
+ }
+ else {
+ &post_prv("$alias", "<font color='ffa500'>$alias2prove <font color=ffffff> hat sich seit der Einf\374hrung dieses Befehls noch nie eingeloggt!</font></font>");
+ }
+ }
+ else {
+ &post_prv("$alias", "<font color='ffa500'>$alias2prove <font color=ffffff> exsistiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'selfkill') {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> entfernt sich ganz und gar aus dem System und loggt sich aus ... </font></i>", $alias);
+ &private_javascript($alias, $room, q[open('chat?request=start&tmp=selfkill','_top');]);
+ &kill_alias($alias);
+ &reload_html;
+ }
+ elsif ($cmd eq 'w') {
+ my $theme = &get_theme($room);
+ my $door = '[<font color=red>Abgesperrt!</font>]' if $rstat[0] eq "1\n";
+ my($is, $nr) = ('t', 0);
+ my $persons;
+ opendir DIR, "data/online/rooms/$room";
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach $_ (@dir) {
+ if (-f "data/online/rooms/$room/$_") {
+ $persons = $persons . ' ' . "<font color='".&get_ident($_,3)."'>$_</font>";
+ ++$nr;
+ }
+ }
+ &post_prv($alias, "<font color=ffffff>Der aktuelle <b>Raum:</b> $room $theme $door ($nr): $persons</font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'wc' or $cmd eq 'wc/') {
+ my $raum = $cmd[1];
+ my $persons;
+ if ($raum eq '' and $cmd eq 'wc') {
+ opendir USERS, 'data/online/users';
+ my(@users) = readdir USERS;
+ close USERS;
+ foreach $_ (@users) {
+ $persons = $persons . ' ' . "<font color='".&get_ident($_,3)."'>$_</font>" if -f "data/online/users/$_";
+ }
+ my $nr = $#users - 1;
+ my($nrs, $is) = ('', 'ist');
+ if ($nr != 1) {
+ $nrs = 'en';
+ $is = 'sind';
+ }
+ &post_prv("$alias", "<font color=ffffff>$nr Person$nrs $is insgesamt eingeloggt: $persons</font>");
+ }
+ elsif ($raum eq '' and $cmd eq 'wc/') {
+ my $msg2post;
+ opendir DIR, 'data/online/rooms';
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach $_ (@dir) {
+ if (-e "data/online/rooms/$_" and $_ ne '..' and $_ ne '.') {
+ opendir DIR, "data/online/rooms/$_";
+ my(@dir2) = readdir DIR;
+ closedir DIR;
+ open RSTAT, "<data/online/rstat/$_";
+ my(@rstat) = <RSTAT>;
+ close RSTAT;
+ chomp $rstat[1];
+ my $door = '[<font color=red>Abgesperrt!</font>]' if $rstat[0] eq "1\n";
+ my $nr = $#dir2 - 1;
+ $msg2post = $msg2post . "<tr><td><b><font size=2 color='ffffff'>$_ $door ($nr) [" . $rstat[1] . q(]: </font></b></td></tr><tr><td><font size=2 color='ffa500'>);
+ foreach $chatter (@dir2) {
+ $msg2post = $msg2post . "<font color='".&get_ident($chatter,3)."'>$chatter</font> " if -f "data/online/rooms/$_/$chatter";
+ }
+ print '</font></td>';
+ }
+ }
+ &post_prv($alias, "<font color=ffffff>Folgende R&auml;ume sind offen:</font><table>$msg2post</table>");
+ }
+ elsif ($raum ne '') {
+ my $persons;
+ opendir DIR, "data/online/rooms/$raum";
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach $_ (@dir) {
+ $persons = $persons . ' ' . "<font color='".&get_ident($chatter,3)."'>$_</font>" if -f "data/online/rooms/$raum/$_";
+ }
+ my($nr, $is) = ($#dir - 1, 't');
+ if ($nr != 1) {
+ $nrs = 'en';
+ $is = 'n';
+ }
+ &post_prv($alias, "<font color=ffffff> $nr Person$nrs befinde$is sich im Raum <b>$raum</b> $persons</font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'wj' or $cmd eq 'ju') {
+ my $alias2search = $cmd[1];
+ my $roomofalias = &get_room($alias2search);
+ if ($roomofalias) {
+ if ($cmd eq 'wj') {
+ &post_prv($alias, "<font color='ffa500'>$alias2search <font color=ffffff>befindet sich im Raum <b>$roomofalias</b> !</font></font>");
+ }
+ else {
+ &change_room('ju', $roomofalias, $room, $alias2search);
+ }
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2search <font color=ffffff> ist nicht eingeloggt!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif (1 <= &hierachie($alias, $room)) {
+ if ($cmd eq 'l') {
+ &lock;
+ }
+ elsif ($cmd eq 'su') {
+ my $alias2su = $cmd[1];
+ opendir DIR, "data/online/rooms/$room";
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach $_ (@dir) {
+ if ($_ eq $alias2su) {
+ open DATEI, "<data/online/rstat/$room";
+ my(@rstat) = <DATEI>;
+ close DATEI;
+ if (1 <= hierachie($alias2su, $room)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2su</font> <font color='ffffff'> kann nicht zum Raumbesetzer ernannt werden. (Ist bereits RB, W\304 oder OW)</font>");
+ &reload_html;
+ }
+ open RSTAT, ">>data/online/rstat/$room";
+ print RSTAT "$alias2su<;1\n";
+ close RSTAT;
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> verleiht <font color='".&get_ident($alias2su,3)."'>$alias2su</font> Raumbesetzerrechte ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ &reload_html;
+ }
+ }
+ &post_prv($alias, "<font color='ffa500'>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist nicht anwesend)</font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'rsu') {
+ my $alias2rsu = $cmd[1];
+ if (1 == hierachie($alias2rsu, $room)) {
+ &rm_rstat($alias2rsu, $room);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> entzieht <font color='".&get_ident($alias2rsu,3)."'>$alias2rsu</font> die Raumbesetzerrechte ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2rsu <font color='ffffff'>ist gar kein Raumbesetzer!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 't') {
+ open RSTAT, "data/online/rstat/$room";
+ my(@r_stat) = <RSTAT>;
+ close RSTAT;
+ my $theme;
+ if ($cmd[1] ne undef) {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $theme = $theme . ' ' . $cmd[$i];
+ }
+ &post($room, q[<i><font color='ffffff'>] . &timestring . qq[ <font color='$col'>$alias</font> gibt dem Raum das Thema "<font color='$col'>$theme</font>" ...</font></i>], $alias);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> l\366scht das Thema des Raums ...</font></i>", $alias);
+ }
+ $theme = $r_stat[0] . $theme . "\n";
+ for ($i = 2; $i <= $#r_stat; ++$i) {
+ $theme = $theme . $r_stat[$i] . "\n";
+ }
+ open RSTAT, ">data/online/rstat/$room";
+ print RSTAT $theme;
+ close RSTAT;
+ &reload_html;
+ }
+ elsif (3 <= &hierachie($alias, $room)) {
+ if ($cmd eq 'ban' or $cmd eq 'banip') {
+ my $alias2ban = $cmd[1];
+ my $hierachie = &hierachie($alias2ban);
+ open BAN, '<data/ban';
+ my(@ban) = <BAN>;
+ close BAN;
+ if ($cmd[1] eq undef) {
+ my $nr = @ban;
+ my $banned;
+ foreach $_ (@ban) {
+ chomp $_;
+ $banned .= " $_";
+ }
+ &post_prv($alias, "<font color=ffffff>Folgende Benutzer sind verbannt [$nr]: <font color='ff0000'>$banned</font></font>");
+ &reload_html;
+ }
+ elsif (-f "data/user/options/$alias2ban") {
+ if (3 <= $hierachie) {
+ &post_prv($alias, "<font color='ffa500'>$alias2ban <font color='ffffff'>kann nicht verbannt werden!</font></font>");
+ &reload_html;
+ }
+ if ($cmd eq 'ban') {
+ if (&add_entry($alias2ban, 'ban') == 1) {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> verbannt <b>$alias2ban</b> aus dem Chat ...</font></i>", $alias);
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2ban <font color=ffffff>ist bereits verbannt!</font></font>");
+ }
+ }
+ elsif ($cmd eq 'banip') {
+ open DATEI, "<data/online/ident/$alias2ban";
+ my $ipnr = <DATEI>;
+ close DATEI;
+ chomp $ipnr;
+ if (add_entry("ip://$ipnr", 'ban') == 1) {
+ &post_prv($alias, "<font color='ffffff'>IP-Nummer von <font color='ffa500'>$alias2ban</font> (<font color='ff0000'>$ipnr</font>) wurde verbannt!</font></i>");
+ }
+ else {
+ &post_prv($alias, "<font color='ffffff'>Die IP-Nummer <font color='ff0000'>$ipnr</font> von <font color='ffa500'>$alias2ban</font> ist bereits verbannt!</font></font>");
+ }
+ &reload_html;
+ }
+ &reload_html;
+ }
+ &post_prv($alias, "<font color='ffa500'>$alias2ban <font color=ffffff> kann nicht verbannt werden, da Benutzername nicht existiert!</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'rban' or $cmd eq 'rbanip') {
+ my $alias2rban = $cmd[1];
+ open BAN, '<data/ban';
+ @ban = <BAN>;
+ close BAN;
+ foreach $ban (@ban) {
+ if (&rm_entry($alias2rban, 'ban') == 1) {
+ if ($alias2rban =~ /ip:/) {
+ &post_prv($alias, "<font color='ffffff'>Die IP-Nummer <font color='ff0000'>$alias2rban</font> wurde aus der Banliste ausgetragen!</font></font>");
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> entbannt <font color='".&get_ident($alias2rban,3)."'>$alias2rban</font> ...</font></i>", $alias);
+ }
+ &reload_html;
+ }
+ }
+ &post_prv($alias, "<font color='ff0000'>$alias2rban <font color='ffffff'>ist nicht verbannt!</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'img') {
+ my $hierachie = &hierachie($alias, $room);
+ &hierachie_rm($alias);
+ if ($hierachie == 3) {
+ &post_prv($alias, q[<font color='ffffff'>Als tempor&auml;rer W&auml;chter kannst du dein Superuserlogo nicht verstecken!</font>]);
+ }
+ elsif ($hierachie % 2 > 0) {
+ &post_prv($alias, q[<font color='ffffff'>Dein Superuserlogo wurde versteckt!</font>]);
+ &hierachie_add($alias, $hierachie + 1);
+ }
+ else {
+ &post_prv("$alias", q[<font color='ffffff'>Dein Superuserlogo wurde wieder sichtbar gemacht!</font></font>]);
+ &hierachie_add($alias, $hierachie - 1);
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'ip') {
+ my $alias2prove = $cmd[1];
+ opendir DIR, 'data/online/ident';
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach $_ (@dir) {
+ if ($_ eq $alias2prove) {
+ open DATEI, "<data/online/ident/$alias2prove";
+ my $ipnr = <DATEI>;
+ close DATEI;
+ chomp $ipnr;
+ &post_prv($alias, "<font color='ffa500'>$_<font color='ffffff'> hat die IP-Nummer <font color='ff0000'>$ipnr</font> !</font></font>");
+ }
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'k' or $cmd eq 'o') {
+ my $alias2kick = $cmd[1];
+ if (-f "data/online/users/$alias2kick") {
+ opendir DIR, 'data/online/rooms';
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach my $raum (@dir) {
+ opendir DIR, "data/online/rooms/$raum";
+ my(@dir2) = readdir DIR;
+ closedir DIR;
+ foreach my $chatter (@dir2) {
+ if ($chatter eq $alias2kick) {
+ my $hierachie2 = &hierachie($alias2kick);
+ if (&hierachie($alias) <= &hierachie($alias2kick)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2kick <font color='ffffff'> besitzt einen h&ouml;heren oder gleichen Rang und kann nicht gekickt/ausgeloggt werden!</font></font>");
+ }
+ else {
+ if ($cmd eq 'k') {
+ &post_prv($alias2kick, '<script language="JavaScript">window.open("chat?request=start&tmp=kick","_top");</script>');
+ }
+ else {
+ &post_prv($alias2kick, '<script language="JavaScript">window.open("chat?request=start&tmp=logout","_top");</script>');
+ }
+ $_ = undef if $room eq $raum;
+ if ($cmd eq 'k') {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> katapultiert <font color='".&get_ident($alias2kick,3)."'>$alias2kick</font> aus dem Chat ...</font></i>", $alias, $raum);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> loggt <font color='".&get_ident($alias2kick,3)."'>$alias2kick</font> aus dem Chat aus ...</font></i>", $alias, $alias);
+ }
+ &rm_alias($alias2kick, $raum);
+ &check_online;
+ }
+ &reload_html;
+ }
+ }
+ }
+ }
+ &post_prv($alias, "<font color='ffa500'>$alias2kick <font color='ffffff'> ist nicht anwesend und kann nicht aus dem System katapultiert werden werden!</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'sl') {
+ my $sl_room = $cmd[1];
+ if (-e "data/online/rooms/$sl_room") {
+ my $lock = "0\n";
+ open RSTAT, "<data/online/rstat/$sl_room";
+ my(@r_stat) = <RSTAT>;
+ close RSTAT;
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> sperrt den Raum <b>$sl_room</b> von aussen ab ...</font></i>", $alias, $sl_room);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> sperrt den Raum <b>$sl_room</b> von aussen auf ...</font></i>", $alias, $sl_room);
+ }
+ for ($i = 1; $i <= $#r_stat; ++$i) {
+ $lock = $lock . $r_stat[$i];
+ }
+ open RSTAT, ">data/online/rstat/$sl_room";
+ print RSTAT $lock;
+ close RSTAT;
+ }
+ else {
+ &post_prv($alias, "<font color='ffffff'>Der Raum <font color='ffa500'>$sl_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'ss') {
+ my $ss_room = $cmd[1];
+ if (-e "data/online/rooms/$ss_room") {
+ my $ss_msg;
+ for ($i = 2; $i <= $#cmd; ++$i) {
+ $ss_msg = $ss_msg . ' ' . $cmd[$i];
+ }
+ my $msg2scream = "\U$ss_msg\E";
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> ruft in den Raum <b>$ss_room</b> hinein: <b><font color=$col>$msg2scream</font></b> ...</font></i>", $alias, $ss_room);
+ &reload_html;
+ }
+ else {
+ &post_prv($alias, "<font color='ffffff'>Der Raum <font color='ffa500'>$ss_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'st') {
+ my $st_room = $cmd[1];
+ if (-e "data/online/rooms/$st_room") {
+ my $theme;
+ if ($cmd[2] ne undef) {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $theme = $theme . ' ' . $cmd[$i];
+ }
+ &post($room, '<i><font color=ffffff>' . &timestring . qq[ <font color='$col'>$alias</font> gibt dem Raum <b>$st_room</b> das Thema "<font color='$col'>$theme</font>" ...</font></i>], $alias, $st_room);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> l\366scht das Thema des Raums <b>$st_room</b> ...</font></i>", $alias, $st_room);
+ }
+ open RSTAT, "<data/online/rstat/$st_room";
+ my(@r_stat) = <RSTAT>;
+ close RSTAT;
+ $theme = $r_stat[0] . $theme . "\n";
+ for ($i = 2; $i <= $#r_stat; ++$i) {
+ $theme = $theme . $r_stat[$i];
+ }
+ open RSTAT, ">data/online/rstat/$st_room";
+ print RSTAT $theme;
+ close RSTAT;
+ }
+ else {
+ &post_prv($alias, "<font color=ffffff>Der Raum <font color=ffa500>$st_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'status') {
+ my $alias2level = $cmd[1];
+ &post_prv($alias, "<font color='ffa500'>$alias2level <font color='ffffff'>hat den Superuserstatus <font color='ff0000'>".&hierachie($alias2level, &get_room($alias2level))."</font> !</font></font>");
+ &reload_html;
+ }
+ elsif (7 <= &hierachie($alias)) {
+ if ($cmd eq 'kill') {
+ my $alias2kill = $cmd[1];
+ if (-f "data/user/options/$alias2kill") {
+ if (7 <= &hierachie($alias2kill)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2kill</font> <font color='ffffff'>hat einen h&ouml;heren Rang und kann nicht aus dem System entfernt werden !</font>");
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col>$alias</font> killt <b>$alias2kill</b> ganz und gar aus dem System ...</font></i>", $alias);
+ &kill_alias($alias2kill, $alias);
+ }
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2kill <font color='ffffff'> existiert nicht in der Datenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'sys') {
+ my $sys_msg;
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $sys_msg = $sys_msg . ' ' . $cmd[$i];
+ }
+ $sys_msg = q[<i><font color='ffffff'>] . &timestring . " </font></i> <b><font size=2 color='red'>SYSTEMNACHRICHT</font></b><i><font color='ffffff'>: $sys_msg ...</font></i>";
+ opendir ROOMS, 'data/msgs';
+ my(@rooms) = readdir ROOMS;
+ close ROOMS;
+ foreach $_ (@rooms) {
+ &post($_, $sys_msg, $alias) unless /\./;
+ }
+ &log($sys_msg);
+ &reload_html;
+ }
+ elsif ($cmd eq 'twa') {
+ my $alias2wa = $cmd[1];
+ if (-f "data/user/options/$alias2wa") {
+ my $room2 = &get_room($alias2wa);
+ if (3 <= &hierachie($alias2wa, $room2)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2wa <font color='ffffff'>kann nicht zum tempor&auml;ren W&auml;chter ernannt werden!</font></font>");
+ }
+ else {
+ &hierachie_add_rstat($alias2wa, 3, $room2);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> ernennt <font color='".&get_ident($alias2wa,3)."'>$alias2wa</font> zum <font color='ff0000'>tempor&auml;ren</font> W\344chter ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ &reload_html;
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2wa <font color=ffffff>existiert nicht in der Datenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'rtwa') {
+ my $alias2rwa = $cmd[1];
+ my $room2 = &get_room($alias2rwa);
+ if (3 == &hierachie($alias2rwa, $room2)) {
+ &hierachie_rm_rstat($alias2rwa, $room2);
+
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> hat <font color='".&get_ident($alias2rwa,3)."'>$alias2rwa</font> vom <font color='ff0000'>tempor&auml;ren</font> W\344chter zum normalen Chatter degradiert ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2rwa <font color=ffffff>ist kein tempor&auml;rer W\344chter und k\366nnen diese Rechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'wa') {
+ my $alias2wa = $cmd[1];
+ if (-f "data/user/options/$alias2wa") {
+ if (5 <= &hierachie($alias2wa)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2wa <font color='ffffff'>kann nicht zum W&auml;chter ernannt werden!</font></font>");
+ }
+ else {
+ &hierachie_add($alias2wa, 5);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> ernennt <font color='".&get_ident($alias2wa,3)."'>$alias2wa</font> zum W\344chter ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ &reload_html;
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2wa <font color=ffffff>existiert nicht in der Datenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'rwa') {
+ my $alias2rwa = $cmd[1];
+ my $hierachie = &hierachie($alias2rwa);
+ if (5 == $hierachie or 6 == $hierachie) {
+ &hierachie_rm($alias2rwa);
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> hat <font color='".&get_ident($alias2rwa,3)."'>$alias2rwa</font> vom W\344chter zum normalen Chatter degradiert ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2rwa <font color=ffffff>ist kein W\344chter und k\366nnen diese Rechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif (9 <= &hierachie($alias)) {
+ if ($cmd eq 'ow') {
+ my $alias2ow = $cmd[1];
+ if (-f "data/user/options/$alias2ow") {
+ if (7 <= &hierachie($alias2ow)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2ow <font color='ffffff'>kann nicht zum Oberw&auml;chter ernannt werden!</font></font>");
+ }
+ else {
+ &hierachie_add($alias2ow, 7);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> ernennt <font color='".&get_ident($alias2ow,3)."'>$alias2ow</font> zum Oberw&auml;chter ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ &reload_html;
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2wa <font color=ffffff>existiert nicht in der Datenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'row') {
+ my $alias2row = $cmd[1];
+ my $hierachie = &hierachie($alias2row);
+ if (7 == $hierachie or 8 == $hierachie) {
+ &hierachie_rm($alias2row);
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> hat <font color='".&get_ident($alias2row,3)."'>$alias2row</font> vom Oberw\344chter zum normalen Chatter degradiert ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2row <font color=ffffff>ist kein Oberw\344chter und k\366nnen diese Rechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'pw') {
+ my $pw2show = $cmd[1];
+ if (-f "data/user/options/$pw2show") {
+ open PW, "<data/user/options/$pw2show";
+ my(@pw) = <PW>;
+ close PW;
+ chomp $pw[0];
+ &post_prv($alias, "<font color='ffa500'>$pw2show <font color='ffffff'> hat das Passwort <font color='ff0000'>$pw[0]</font> !</font></font>");
+ &reload_html;
+ }
+ &post_prv($alias, "<font color='ffa500'>$pw2show <font color='ffffff'> existiert nicht in der Benutzerdatenbank!</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'id' or $cmd eq 'agent') {
+ my $id2show = $cmd[1];
+ if (-f "data/online/ident/$id2show") {
+ if ($cmd eq 'id') {
+ &post_prv($alias, "<font color='ffa500'>$id2show <font color='ffffff'> hat die Temp-ID <font color='ff0000'>".&get_ident($id2show, 1)."</font> !</font></font>");
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$id2show <font color='ffffff'> verwendet <font color='ff0000'>".&get_ident($id2show, 2)."</font> !</font></font>");
+ }
+ &reload_html;
+ }
+ &post_prv($alias, "<font color='ffa500'>$id2show <font color='ffffff'> ist nicht eingeloggt !</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'cool') {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ &post($room, '<i><font color=ffffff>' . &timestring . " $msg2post</font></i>", $alias);
+ &reload_html;
+ }
+ elsif ($cmd eq 'rev') {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ $msg2post = reverse($msg2post);
+ &post($room, "<b><font color='$col'>$alias: <font color='$secol'>$msg2post</font></font></b>", $alias);
+ &reload_html;
+ }
+ elsif ($cmd eq 'arks') {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ $msg2post =~ s/i/1/gi;
+ $msg2post =~ s/e/3/gi;
+ $msg2post =~ s/a/4/gi;
+ $msg2post =~ s/s/5/gi;
+ $msg2post =~ s/g/6/gi;
+ $msg2post =~ s/t/7/gi;
+ $msg2post =~ s/b/8/gi;
+ $msg2post =~ s/o/0/gi;
+ &post($room, "<b><font color='$col'>$alias: <font color='$secol'>$msg2post</font></font></b>", $alias);
+ &reload_html;
+ }
+ elsif ($cmd eq 'ultra') {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ my @letters = split '', "$alias: $msg2post";
+ $msg2post = undef;
+ foreach (@letters) {
+ $msg2post .= "<font color='".&random_color."'>$_</font>";
+ }
+ &post($room, "<b>$msg2post</b>", $alias);
+ &reload_html;
+ }
+ }
+ }
+ }
+ }
+ my($alias2post, $msg2post, $action);
+ if ($cmd eq 'msg') {
+ $alias2post = $cmd[1];
+ for ($i = 2; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ }
+ elsif ($cmd eq '') {
+ $alias2post = $whisper;
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ }
+ else {
+ $alias2post = $cmd;
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ }
+ $msg2post =~ s[/me/][<i>$alias</i>]g;
+ $msg2post =~ s[/m/][<i><font color=$col>$alias</font></i>]g;
+ if (-f "data/online/users/$alias2post" and not -f "data/online/rooms/$loginplace/$alias2post") {
+ &post_prv($alias, "<b><font color='$col'><i>Zu $alias2post gefl\374stert:</i> <font color='$secol'>$msg2post</font></font></i></b>");
+ &post_prv($alias2post, "<b><font color='$col'><i>$alias fl\374stert:</i> <font color='$secol'>$msg2post</font></font></i></b>");
+ &private_javascript($alias, $room, "parent.input.document.inf.whisper.value = '$alias2post';");
+ &reload_html;
+ }
+ &post_prv($alias, qq[ <font color=ffffff>Benutzer oder Befehl <font color=ffa500>$alias2post</font> ist nicht anwesend/verf\374gbar! Bitte den Befehl "/menu" eingeben, um das Chat-Men&uuml zu &ouml;ffnen.</font></font>]);
+ &reload_html;
+}
+1;
diff --git a/0.8.0/modules/divcom.pm b/0.8.0/modules/divcom.pm
new file mode 100755
index 0000000..8e17cbe
--- /dev/null
+++ b/0.8.0/modules/divcom.pm
@@ -0,0 +1,288 @@
+sub divcom {
+ if ($var eq 'list_alias_html') {
+ &list_alias_html;
+ }
+ elsif ($var eq 'alias_html') {
+ &alias_html;
+ }
+ elsif ($var eq 'edit_profile_html') {
+ &secure_checkid($alias, $tmpid);
+ &edit_html('edit_profile_html');
+ }
+ elsif ($var eq 'edit_options_html') {
+ &secure_checkid($alias, $tmpid);
+ &edit_html('edit_options_html');
+ }
+ elsif ($var eq 'gb_html') {
+ &gb_html;
+ }
+ elsif ($var eq 'post_gb') {
+ &secure_checkid($alias, $tmpid);
+ &post_gb;
+ }
+ elsif ($var eq 'edit_profile') {
+ &secure_checkid($alias, $tmpid);
+ &edit('edit_profile');
+ }
+ elsif ($var eq 'edit_options') {
+ &secure_checkid($alias, $tmpid);
+ &edit('edit_options');
+ }
+ elsif ($var eq 'rm_gb_alias') {
+ &secure_checkid($alias, $tmpid);
+ &rm_gb;
+ }
+ else {
+ &error('Parameter fehlt');
+ }
+}
+sub gb_html {
+ my ($message,$method) = @_;
+ unless ($method eq 'loggedin') {
+ &start_html('Benutzerboard');
+ &menu();
+ }
+ if ($message eq 'post_empty') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Du wolltest soeben einen leeren Eintrag posten. Bitte schreib\n <i>\n zuerst\n </i>\n einen Text und poste\n <u>dann</u>\n !\n </div>\n <hr>\n";
+ }
+ elsif ($message eq 'post_less') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Ein Eintrag muss mindestens aus 30 Zeichen bestehen ...\n </div>\n <hr>\n";
+
+ }
+ elsif ($message eq 'post_ok') {
+ print " <div class=b>\n Meldung:\n </div>\n <div>\n Vielen Dank f\374r Deinen Beitrag. Wenn Du willst, kannst Du jetzt gleich noch einen Eintrag posten ...\n </div>\n <hr>\n";
+ }
+ else {
+ print " <div>\n Falls Du Anregungen oder Verbesserungsvorschl\344ge f\374r die Community hast, dann poste doch einen kleinen Eintrag :-)\n </div>\n <hr>\n";
+ }
+ print qq[ <form action="chat">\n <input type="hidden" name="col" value="$col">\n<input type="hidden" name="secol" value="$secol">\n<input type="hidden" name="maxVerlauf" value="$maxVerlauf">\n<input type="hidden" name="verlaufOrder" value="$verlaufOrder">\n<input type="hidden" name="request" value="divcom">\n <input type="hidden" name="method" value="$method">\n <input type="hidden" name="var" value="post_gb">\n <input type="hidden" name="alias" value="$alias">\n <input type="hidden" name="tmpid" value="$tmpid">\n <input type="hidden" name="tmp" value="guestbook">\n <input type="hidden" name="id" value="y">\n <input size="40" name="msg">\n <font color="ffffff">\n <input type="submit" value="Hinterlassen ...">\n </font>\n </form>\n <hr>\n];
+ if (-e 'data/guestbook') {
+ &error("Konnte dat/guestbook nicht \366ffnen") unless open DATEI, '<data/guestbook';
+ @datei = <DATEI>;
+ close DATEI;
+ print $q->div(@datei);
+ }
+ print $q->end_html;
+}
+sub post_gb {
+ my($secs, $mins, $hours, $days, $months, $years) = &timearray;
+ if ($msg eq '') {
+ if ($id eq 'y') {
+ if ($method eq 'loggedin') {
+ &loggedin('post_empty');
+ } else {
+ &gb_html('post_empty');
+ }
+ }
+ else {
+ &alias_html('post_empty');
+ }
+ $client->shutdown(2);
+ exit 0;
+ }
+ if (length($msg) < 30) {
+ if ($id eq 'y') {
+ if ($method eq 'loggedin') {
+ &loggedin('post_less');
+ } else {
+ &gb_html('post_less');
+ }
+ }
+ else {
+ &alias_html('post_less');
+ }
+ $client->shutdown(2);
+ exit 0;
+ }
+
+ $msg =~ s/</&lt;/g;
+ $msg =~ s/\n/<br>/g;
+ my $tmpath = '';
+ if ($id eq 'y') {
+ $tmpath = 'data/guestbook';
+ }
+ else {
+ $tmpath = "data/user/gbooks/$tmp";
+ }
+ open GB, "$tmpath";
+ my(@gb) = <GB>;
+ close GB;
+ pop @gb if $#gb > 99;
+ my(@newdatei) = "<br><b>$alias schrieb am $days.$months.$years um $hours:$mins:$secs ...</b><br>$msg<br>\n";
+ push @newdatei, @gb;
+ open GB, ">$tmpath";
+ print GB @newdatei;
+ close GB;
+ if ($id eq 'y') {
+ if ($method eq 'loggedin') {
+ &loggedin('post_ok');
+ } else {
+ &gb_html('post_ok');
+ }
+ $client->shutdown(2);
+ exit 0;
+ }
+ &post_prv ($tmp, "<font color=ffffff>$alias hat soeben einen Pin in Dein Profil geh\344ngt ... </font>");
+ &alias_html;
+ $client->shutdown(2);
+ exit 0;
+}
+sub rm_gb {
+ open GB, "<data/user/gbooks/$alias";
+ my(@gbfile) = <GB>;
+ close GB;
+ my(@newgbfile) = ();
+ for ($i = 0; $i <= $#gbfile; ++$i) {
+ push @newgbfile, $gbfile[$i] if $i != $id;
+ }
+ open GB, ">data/user/gbooks/$alias";
+ print GB @newgbfile;
+ close GB;
+ &alias_html('rm_ok');
+}
+sub list_alias_html {
+ &start_html('Alle Benutzer');
+ opendir REGISTERED, 'data/user/options';
+ my(@users) = readdir REGISTERED;
+ closedir REGISTERED;
+ my(@liste) = sort(@users);
+ my $nr = $#users - 1;
+ &menu();
+ print " <div>\n Es sind z.Z. genau $nr Benutzernamen in der Datenbank vorhanden! (Sortiert nach #, A-Z, a-z)\n </div>\n <hr>\n <div>\n";
+ foreach $_ (@liste) {
+ if (-f "data/user/options/$_") {
+ print $q->a({-'href', "chat?request=divcom&var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid"}, "$_"), ' ';
+ }
+ }
+ print " </div>\n</body>\n</html>\n";
+}
+sub alias_html {
+ my $message = $_[0];
+ open COUNTS, "<data/user/counts/$tmp";
+ local $counter = <COUNTS>;
+ close COUNTS;
+ ++$counter;
+ open COUNTS, ">data/user/counts/$tmp";
+ print COUNTS $counter;
+ close COUNTS;
+ &start_html($tmp);
+ &menu();
+ print "";
+ if ($message eq 'rm_ok') {
+ print " <div class=b>\n Meldung:\n </div>\n <div>\n Der von Dir gew\344hlte Eintrag wurde erfolgreich gel\366scht.\n </div>\n <hr>\n";
+ }
+ elsif ($message eq 'post_empty') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Du wolltest soeben einen leeren Eintrag posten. Bitte schreib\n <i>\n zuerst\n </u>\n einen Text und poste\n <u>dann</u>\n !\n <hr>\n";
+ }
+ open PROFILE, "<data/user/profiles/$tmp";
+ @data = <PROFILE>;
+ close PROFILE;
+ print qq[ <div>\n Dieses Profil wurde insgesamt schon $counter mal aufgerufen !\n <br><br>Alias: $tmp\n <br><br>Nachname: $data[0]\n <br><br>Vorname: $data[1]\n <br><br>Alter: $data[2]\n <br><br>Wohnort: $data[3]\n <br><br>E-Mail:\n <a href="mailto:$data[4]">$data[4]</a>\n <br><br>ICQ-Nummer: $data[5]\n <br><br>Homepage: <a href="$data[6]" target="_new">$data[6]</a>\n <br><br>Weiteres:<br>$data[7]\n <hr>\n Hier kannst Du $tmp eine Nachricht hinterlassen!\n <form action="chat">\n <input type="hidden" name="request" value="divcom">\n <input type="hidden" name="var" value="post_gb">\n <input type="hidden" name="alias" value="$alias">\n <input type="hidden" name="tmpid" value="$tmpid">\n <input type="hidden" name="tmp" value="$tmp">\n <input type="text" size="40" name="msg">\n <font color="ffffff">\n <input type="submit" value="Hinterlassen ...">\n </font>\n </form>\n <hr>\n];
+ if (-e "data/user/gbooks/$tmp") {
+ &error("Konnte data/user/gbooks/$tmp nicht \366ffnen") unless open DATEI, "<data/user/gbooks/$tmp";
+ @datei = <DATEI>;
+ close DATEI;
+ my $nr = 1;
+ if ($alias ne $tmp) {
+ foreach $_ (@datei) {
+ print "<br>Eintrag # $nr: $_";
+ ++$nr;
+ }
+ }
+ else {
+ print qq[ <table>\n <form action="chat">\n <input type="hidden" name="request" value="divcom">\n <input type="hidden" name="var" value="rm_gb_alias">\n <input type="hidden" name="alias" value="$alias">\n <input type="hidden" name="tmpid" value="$tmpid">\n <input type="hidden" name="tmp" value="$tmp">\n];
+ for ($i = 0; $i <= $#datei; ++$i) {
+ print qq[ <tr>\n <td>\n <input type="radio" name="id" value="$i">\n </td>\n <td>\n <div class=q>\n <br>\n Eintrag # $nr:\n $datei[$i]\n </div>\n </td>\n </tr>\n];
+ ++$nr;
+ }
+ print qq[ </table>\n <table>\n <tr>\n <td>\n <font color=ffffff>\n <input type="submit" value="Markierten Eintrag l\366schen">\n </font>\n </td>\n <td>\n <font color=ffffff>\n <input type="reset" value="Markierung r\374ckg\344ngig machen">\n </font>\n </td>\n </tr>\n </table>\n </form>\n];
+ }
+ }
+ print $q->end_html;
+}
+sub edit_html {
+ my($method, $message) = @_;
+ &start_html("Benutzerprofil \344ndern");
+ if ($method eq 'edit_options_html') {
+ open DATEI, "<data/user/options/$alias";
+ }
+ elsif ($method eq 'edit_profile_html') {
+ open DATEI, "<data/user/profiles/$alias";
+ }
+ @data = <DATEI>;
+ close DATEI;
+ foreach $_ (@data) {
+ chomp $_;
+ }
+ &menu();
+ if ($method eq 'edit_options_html') {
+ if ($message eq 'edit_options_ok') {
+ print "<div class=b>\n Hinweis:\n</div>\n<div>\n Du hast soeben Deine Chat-Optionen erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren. Um\n weiterzuchatten einfach Fenster schliessen!\n</div>\n<hr>\n";
+ }
+ elsif ($message eq 'edit_pw_wrong') {
+ print "<div class=b>\n ACHTUNG!\n</div>\n<div>\n Du hast soeben versucht, dein Passwort zu \344ndern. Jedoch stimmte die Erste Eingabe nicht mit der Zweiten \374berein.\n Bitte versuch es erneuert ...\n</div>\n<hr>\n";
+ }
+ else {
+ print $q->div('Hier kannst Du Deine Chat-Optionen editieren!'), $q->hr;
+ }
+ print qq[<script lang="javascript" type="text/javascript">\n<!--\n\nfunction radioWert(rObj) {\n for (var i=0; i<rObj.length; i++) if (rObj[i].checked) return rObj[i].value;\n return false;\n}\n\nfunction insertcode( code ) {\n document.optionen.elements[radioWert(document.optionen.eingabe)].value = code;\n}\n\n//-->\n</script>\n\n<form name="optionen" action="chat">\n <input type="hidden" name="var" value="edit_options">\n <table>\n <tr>\n <td>\n <div>\n Dein Passwort\n <font color=ffa500>\n (Gut merken !!)\n </font>\n <br>\n <input type="password" name="id" value="$data[0]">\n </div>\n </td>\n <td width=20>\n </td>\n <td>\n <div>\n Geb hier das Passwort erneuert ein:\n <br>\n <input type="password" name="tmp" value="$data[0]">\n </div>\n </td>\n </tr>\n </table>\n <hr>\n <div>Einstellungen f\374r den Nachrichten-Verlauf</div>\n <table>\n <tr>\n <td>\n <br>\n <div>Anzahl der Nachrichten im Verlauf (Standart = 10)</div>\n <font color=ffffff>\n <select name="maxVerlauf" size="1">\n <option value="$data[3]">$data[3]\n];
+ for ($i = 1; $i <= 50; ++$i) {
+ print qq[<option value="$i">$i];
+ }
+ print qq[ </select>\n </font>\n </td>\n </tr>\n <tr>\n <td>\n <br>\n<div>Wie sollen die Nachrichten im Verlauf angeordnet sein?</div>\n <font color=ffffff>\n <select name="verlaufOrder" size="1">\n <option value="$data[4]">Bisherige Einstellung ($data[4])\n <option value="0">Neue Verlaufnachrichten oben (0)\n <option value="1">Neue Verlaufnachrichten unten (1)\n </select>\n </font>\n </td>\n </tr>\n </table>\n<br>\n <div>PS: Einstellungen des Nachrichten-Verlaufs werden erst nach einem Neueinloggen aktualisiert.</div>\n <hr>\n <table>\n <tr>\n <td>\n <div>\n <input type="radio" name="eingabe" value="col" checked>\n Auswahl von Farbe 1\n <br>\n (Farbe Deines Nicks):\n <br>\n <input name="col" size="6" maxlength="6" value="$data[1]">\n </div>\n </td>\n <td width=20>\n </td>\n <td>\n <div>\n <input type="radio" name="eingabe" value="secol">\n Auswahl von Farbe 2\n <br>\n (Farbe Deiner Nachrichten):\n <br>\n <input name="secol" size="6" maxlength="6" value="$data[2]">\n </div>\n </td>\n </tr>\n </table>\n<br>\n <div>\n Beliebige Auswahl markieren und Farbe w\344hlen. Um Deine Optionen abzuspeichern,\n auf "Daten \344ndern" klicken!\n </div>\n <br>\n];
+ open COLORS, '<templates/colors.sno';
+ @colors = <COLORS>;
+ close COLORS;
+ print @colors;
+ }
+ elsif ($method eq 'edit_profile_html') {
+ if ($message eq 'edit_profile_ok') {
+ print " <div class=b>\n Hinweis:\n </div>\n <div>\n Du hast soeben Dein Profil erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren:\n <hr>\n";
+ }
+ else {
+ print $q->div('Hier kannst Du Dein Profil editieren!'), $q->hr;
+ }
+ print qq[ <form action="chat">\n <input type="hidden" name="var" value="edit_profile">\n <div>\n Dein Nachname:\n <br>\n <input name="nachname" value="$data[0]">\n </div>\n <br>\n <div>\n Dein Vorname:\n <br>\n <input name="vorname" value="$data[1]">\n </div>\n <br>\n <div>\n Dein Alter:\n <br>\n <input name="alter" value="$data[2]">\n </div>\n <br>\n <div>\n Dein Wohnort:\n <br>\n <input name="wohnort" value="$data[3]">\n </div>\n <br>\n <div>\n Deine E-Mail Adresse:\n <br>\n <input name="email" value="$data[4]">\n </div>\n <br>\n <div>\n Deine ICQ-Nummer:\n <br>\n <input name="icq" value="$data[5]">\n </div>\n <br>\n <div>\n Deine Homepage:\n <br>\n <input name="homepage" value="$data[6]">\n </div>\n <br>\n <div>\n Weiteres:\n <br>\n <textarea rows="5" cols="40"name="weiteres" wrap="virtual">$data[7]</textarea>\n </div>\n];
+ }
+ print qq[ <hr>\n <font color=ffffff>\n <input type="hidden" name="request" value="divcom">\n <input type="hidden" name="alias" value="$alias">\n <input type="hidden" name="tmpid" value="$tmpid">\n <input type="hidden" name="room" value="$room">\n <input type="submit" value="Daten \344ndern ...">\n </font>\n </form>\n</body>\n</html>\n];
+}
+sub edit {
+ my $method = $_[0];
+ if ($method eq 'edit_profile') {
+ my $url = $homepage;
+ $url =~ s[^http://*][];
+ $url =~ s[=][];
+ $url =~ s["][];
+ open PROFILE, ">data/user/profiles/$alias";
+ my $profile = "$nachname\n$vorname\n$alter\n$wohnort\n$email\n$icq\nhttp://$url\n$weiteres";
+ $profile =~ s/</&lt;/g;
+ print PROFILE $profile;
+ close PROFILE;
+ &edit_html('edit_profile_html', 'edit_profile_ok');
+ }
+ elsif ($method eq 'edit_options') {
+ if ($id ne $tmp) {
+ &edit_html('edit_options_html', 'edit_pw_wrong');
+ $client->shutdown(2);
+ exit 0;
+ }
+ $id = crypt $id, $cryptkey;
+ open OPTIONS, ">data/user/options/$alias";
+ my $options = "$id\n$col\n$secol\n$maxVerlauf\n$verlaufOrder";
+ $options =~ s/</&lt;/g;
+ print OPTIONS $options;
+ close OPTIONS;
+ open IDENT, "<data/online/ident/$alias";
+ my (@ident) = <IDENT>;
+ close IDENT;
+ open IDENT, ">data/online/ident/$alias";
+ print IDENT $ident[0] . $ident[1] . $ident[2] . "$col\n$secol";
+ close IDENT;
+ my $room = &get_room($alias);
+ &private_javascript($alias, $room, "parent.input.document.inf.col.value = '$col'; parent.input.document.inf.secol.value = '$secol';");
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> <font color='$secol'>hat seine Chat-Einstellungen ge&auml;ndert</font> ...</font></i>", $alias);
+ &post_strmsg($alias, $room, 'col', "$col;$secol");
+ &edit_html('edit_options_html', 'edit_options_ok');
+ }
+}
+1;
diff --git a/0.8.0/modules/hierachie.pm b/0.8.0/modules/hierachie.pm
new file mode 100755
index 0000000..b6f5732
--- /dev/null
+++ b/0.8.0/modules/hierachie.pm
@@ -0,0 +1,77 @@
+sub hierachie {
+ my($alias, $room) = @_;
+ open FILE, "<data/online/rstat/$room";
+ flock FILE, 2;
+ my(@rstat) = <FILE>;
+ close FILE;
+ shift @rstat;
+ shift @rstat;
+ open FILE, '<data/hierachie';
+ flock FILE, 2;
+ my(@hierachie) = <FILE>;
+ close FILE;
+ my(@userlevels) = (@hierachie, @rstat);
+ foreach $_ (@userlevels) {
+ my($name, $level) = split(/<;/, $_, 3);
+ if ($name eq $alias) {
+ chomp $level;
+ return $level;
+ }
+ }
+ return 0;
+}
+sub hierachie_rm {
+ my $alias = shift @_;
+ my @return;
+ open FILE, '<data/hierachie';
+ my(@hierachie) = <FILE>;
+ close FILE;
+ foreach $_ (@hierachie) {
+ push @return, $_ unless /^$alias<;/;
+ }
+ open FILE, '>data/hierachie';
+ print FILE @return;
+ close FILE;
+}
+sub hierachie_rm_rstat {
+ my($alias, $room) = @_;
+ my @return;
+ return unless open FILE, "<data/online/rstat/$room";
+ my(@hierachie) = <FILE>;
+ close FILE;
+ foreach $_ (@hierachie) {
+ push @return, $_ unless /^$alias<;/;
+ }
+ open FILE, ">data/online/rstat/$room";
+ print FILE @return;
+ close FILE;
+}
+sub hierachie_add {
+ my($alias, $level) = @_;
+ &hierachie_rm($alias);
+ open FILE, '>>data/hierachie';
+ print FILE "$alias<;$level\n";
+ close FILE;
+}
+sub hierachie_add_rstat {
+ my($alias, $level, $room) = @_;
+ &hierachie_rm_rstat($alias, $room);
+ return unless open FILE, ">>data/online/rstat/$room";
+ print FILE "$alias<;$level\n";
+ close FILE;
+}
+sub prove_away {
+ my($alias, $room) = @_;
+ return unless open AWAY, "<data/online/rstat/$room.away";
+ @away = <AWAY>;
+ close AWAY;
+ my $name, $away;
+ foreach $_ (@away) {
+ if (/^$alias.*/) {
+ ($name, $away) = split(/<; /, $_, 3);
+ chomp $away;
+ return $away;
+ }
+ }
+}
+1;
diff --git a/0.8.0/modules/htdocs.pm b/0.8.0/modules/htdocs.pm
new file mode 100755
index 0000000..4f1bbeb
--- /dev/null
+++ b/0.8.0/modules/htdocs.pm
@@ -0,0 +1,127 @@
+sub htdocs {
+ if ($var eq 'help_html') {
+ &printfile('templates/help.sno', 'Alle Chatbefehle');
+ }
+ elsif ($var eq 'logo_html') {
+ &start_html('Logo');
+ &logo_html;
+ }
+ elsif ($var eq 'menu_html') {
+ &menu_html;
+ }
+ elsif ($var eq 'logs_html') {
+ &logs_html;
+ }
+ elsif ($var eq 'view_logs_html') {
+ &secure_checkid($alias, $tmpid);
+ &printfile("data/logs/$tmp", 'Logdatei', 'blank') if 7 <= &hierachie($alias);
+ }
+ elsif ($var eq 'superuser_html') {
+ &secure_checkid($alias, $tmpid);
+ &superuser_html;
+ }
+ elsif ($var eq 'chatiquette_html') {
+ &printfile('templates/chatiq.sno', 'Chatiquette');
+ print $q->end_html;
+ }
+ else {
+ print $q->start_html(-'bgcolor', '000000'), $q->end_html;
+ }
+}
+sub menu_html {
+ &start_html("Men\374");
+ print "<div>\n Von hier aus kannst du alle Untermen\374punkte des Systems erreichen:\n</div>\n<hr>\n";
+ &menu();
+ print "</body>\n</html>";
+}
+sub logo_html {
+ print qq[ <layer top=-3 left=0><div style="position:absolute; top:5; left:10">\n <OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"\n codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0"\n WIDTH=48 HEIGHT=48>\n <PARAM NAME=movie VALUE="$gfxpath/ySymbol.swf">\n <PARAM NAME=loop VALUE=false>\n <PARAM NAME=menu VALUE=false>\n <PARAM NAME=quality VALUE=high>\n <PARAM NAME=scale VALUE=noborder>\n <PARAM NAME=wmode VALUE=opaque>\n <PARAM NAME=bgcolor VALUE=$bgcolor>\n <EMBED src="$gfxpath/ySymbol.swf" loop=false menu=false quality=high scale=noborder wmode=opaque bgcolor=$bgcolor WIDTH=48 HEIGHT=48 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED>\n </OBJECT>\n </div></layer>\n];
+ print $q->end_html;
+}
+sub logs_html {
+ &start_html('Logdateien');
+ &menu;
+ print "<div>\n Hier befinden sich alle Logdateien\n</div>\n<hr>\n";
+ if (5 <= &hierachie($alias)) {
+ print $q->div(qq[Folgende Logdateien des Raumes "$standardroom" k\366nnen nur von Oberw\344chtern oder h\366her gelesen werden (Sortiert nach A-Z, a-z):]), $q->br;
+ opendir LOGS, 'data/logs';
+ my(@logs) = readdir LOGS;
+ closedir LOGS;
+ my(@sortedir) = sort(@logs);
+ foreach $_ (@sortedir) {
+ if (-f "data/logs/$_") {
+ print $q->a({-'href', "chat?request=htdocs&alias=$alias&var=view_logs_html&tmp=$_&tmpid=$tmpid", -'target', '_new'}, "$_"), ' ';
+ }
+ }
+ }
+ else {
+ print $q->div("Logdateien k\366nnen nur von Oberw\344chtern (OW) gelesen werden. Du bist jedoch ein W\344chter (W\304) oder ein", qq["Normaler Chatter". Oberw\344chter k\366nnen alles nachlesen, was \366ffentlich im Raum "Cyberbar" gechattet wurde.]), $q->hr;
+ }
+ print $q->end_html;
+}
+sub superuser_html {
+ &start_html ('Superuser');
+ &menu;
+ print "<div>Hallo $alias. Du bist als ";
+ my $hierachie = &hierachie($alias);
+ if (9 <= $hierachie) {
+ print $q->b('Administrator'), ' (AD) eingetragen.</div><br>', $q->br;
+ }
+ elsif (7 <= $hierachie) {
+ print $q->b("Oberw\344chter"), ' (OW) eingetragen.</div><br>', $q->br;
+ }
+ elsif (5 <= $hierachie) {
+ print $q->b("W\344chter"), " (W\304) eingetragen.</div><br>", $q->br;
+ }
+ else {
+ print $q->b('normaler Chatter'), ' (NC) eingetragen.</div><br>', $q->br;
+ }
+ open FILE, 'data/hierachie';
+ my(@hierachie) = <FILE>;
+ close FILE;
+ my @ows, @was, @ads;
+ foreach $_ (@hierachie) {
+ my($name, $level) = split(/<;/, $_, 3);
+ chomp $level;
+ if ($level == 5) {
+ push @was, $name;
+ }
+ elsif ($level == 7) {
+ push @ows, $name;
+ }
+ elsif ($level == 9) {
+ push @ads, $name;
+ }
+ if (3 <= $hierachie) {
+ if ($level == 6) {
+ push @was, "$name!";
+ }
+ elsif ($level == 8) {
+ push @ows, "$name!";
+ }
+ elsif ($level == 10) {
+ push @ads, "$name!";
+ }
+ }
+ }
+ my $nads = $#ads + 1;
+ print '<div>', $q->b('AD'), "s ($nads St\374ck)";
+ foreach $_ (@ads) {
+ print $q->font({-'color', 'ffa500'}, ' ' . $_);
+ }
+ my $nrow = $#ows + 1;
+ print '</div><br><br><div>', $q->b('OW'), "s ($nrow St\374ck)";
+ foreach $_ (@ows) {
+ print $q->font({-'color', 'ffa500'}, ' ' . $_);
+ }
+ my $nrwa = $#was + 1;
+ print '</div><br>', $q->br, '<div>', $q->b("W\304"), "s ($nrwa St\374ck)";
+ foreach $_ (@was) {
+ print $q->font({-'color', 'FFA500'}, ' ' . $_);
+ }
+ print qq[<hr>\n Die jeweiligen F\344higkeiten der Oberw\344chter (OW) und der W\344chter (W\304) sind unter\n "<a href="chat?request=htdocs&var=help_html">Chat-Befehle</a>"\n dokumentiert. Versteckte Superuser k\366nnen nur von anderen Superusern auf\ndieser Liste eingesehen werden!\n</div>\n</body>\n</html>\n];
+}
+sub menu {
+ print "<div>\n <a href='chat?request=divcom&var=edit_profile_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Profil \344ndern</a>\n <a href='chat?request=divcom&var=edit_options_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Optionen</a>\n <a href='chat?request=divcom&var=list_alias_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Benutzer</a>\n <a href='chat?request=htdocs&var=help_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Befehle</a>\n <a href='chat?request=divcom&var=gb_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Board</a>\n <a href='chat?request=htdocs&var=superuser_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Superuser</a>\n <a href='chat?request=htdocs&var=logs_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Logs</a>\n <a href='chat?request=statistic&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Statistik</a>\n <a href='chat?request=htdocs&var=chatiquette_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Chatiquette</a>\n</div>\n<hr>\n";
+}
+1;
diff --git a/0.8.0/modules/input.pm b/0.8.0/modules/input.pm
new file mode 100755
index 0000000..48df243
--- /dev/null
+++ b/0.8.0/modules/input.pm
@@ -0,0 +1,14 @@
+sub input {
+ &rm_away($alias, $room);
+ $maxVerlauf = '10' if $maxVerlauf eq undef;
+ $verlaufOrder = '1' if $verlaufOrder eq undef;
+ if ($tmp eq 'login') {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> hat den Chat im Raum <b>$room</b> betreten ...</font></i>");
+ }
+ print qq[<html>\n<head>\n<script language="JavaScript"><!--\n\n// Einstellungsvariablen\nmaxVerlauf = $maxVerlauf; // Anzahl der Eintr\344ge des Verlaufs\nmaxPreview = 20; // Zeichenl\344nge der Verlaufsvorschau\nverlaufOrder = $verlaufOrder; // Neue Nachrichten von: 0=oben, 1=unten\n//autoAwayTimeout = 5; // Sekunden, nach denen der User 'Away' gesetzt wird\n//autoQuitTimeout = 10; // Sekunden, nach denen der User den Chat verl\344sst\nautoAwayTimeout = 300; // Sekunden, nach denen der User 'Away' gesetzt wird\nautoQuitTimeout = 1200; // Sekunden, nach denen der User den Chat verl\344sst\n\n// Interne Variablen\nuserNotFocused = false; // Wenn User nicht schreibt\nuserAway = false; // Wenn User automatisch auf 'Away' gesetzt ist\nuserAwayTime = 0; // Sekunden, die User 'Away' ist\nfullVerlauf = new Array( maxVerlauf ); // Verlaufspuffer\n\nfunction delout()\n{\n addVerlauf (document.inf.msg.value); // Dem Verlauf eine Nachricht anh\344ngen\n document.inf.msg.focus(); // Fukus in das Eingabeform\n document.inf.msg.select(); // Text im Eigabeform markieren\n document.inf.submit(); // Formular absenden\n return false; // Abbrechen, damit das Frame nicht neu geladen wird\n}\n\nfunction CheckAuswahl()\n{\n id=document.verlaufform.verlauf.selectedIndex; // ID des ausgew\344hlten Feldes\n\n if (fullVerlauf[id-1] != null) // Nur, wenn das Feld nicht leer ist\n {\n document.inf.msg.value = fullVerlauf[id-1]; // Eintrag ins Textfeld\n }\n\n document.verlaufform.verlauf.selectedIndex = 0; // Ersten Eintrag (\334berschrift) ausw\344hlen\n document.inf.msg.focus(); // Eingabefeld fokusieren\n\n return true;\n}\n\nfunction addVerlauf (msg)\n{\n if (msg == "") // Falls msg leer\n return false; // Aufruf ignorieren\n\n if (verlaufOrder) // neue Nachrichten von unten\n {\n for (i=0; i<(maxVerlauf-1); i++) // Alle Eintr\344ge einen aufrutschen\n {\n document.verlaufform.verlauf.options[i+1].text = document.verlaufform.verlauf.options[i+2].text;\n fullVerlauf[i] = fullVerlauf[i+1];\n }\n }\n else // neue Nachrichten von oben\n {\n for (i=(maxVerlauf-2); i>=0; i--) // Alle Eintr\344ge einen aufrutschen\n {\n document.verlaufform.verlauf.options[i+2].text = document.verlaufform.verlauf.options[i+1].text;\n fullVerlauf[i+1] = fullVerlauf[i];\n }\n }\n\n if (msg.length > maxPreview) // Vorschau zuschneiden\n pre = msg.slice(0, maxPreview-3) + "...";\n else\n pre = msg;\n\n if (verlaufOrder) // pos = Position des neuen Eintrags\n pos = maxVerlauf-1;\n else\n pos = 0\n\n document.verlaufform.verlauf.options[pos+1].text = pre; // Neue Vorschau anf\374gen\n fullVerlauf[pos] = msg; // Neuen Eintrag an den Verlauf anf\374gen\n\n// document.verlaufform.verlauf.selectedIndex = maxVerlauf; // Fokus auf den letzten Eintrag\n document.verlaufform.verlauf.selectedIndex = 0; // Fokus auf den ersten Eintrag (\334berschrift)\n}\n\nfunction msgBlur()\n{\n userNotFocused = true;\n userAwayTime = 0;\n userAway = false;\n}\n\nfunction msgFocus()\n{\n userNotFocused = false;\n if (userAway) // Wird ausgef\374hrt, falls User 'Away' war\n {\n ; // nop\n }\n userAwayTime = 0;\n userAway = false;\n}\n\nfunction checkInterval()\n{\n// status = "userNotFocused=" + userNotFocused + "; userAway=" + userAway + "; userAwayTime=" + userAwayTime + ""; // Debug\n if (userNotFocused)\n {\n userAwayTime += 5; // Addiere 5, da nur alle 5Sek ausgef\374hrt\n if (!userAway)\n {\n if (autoAwayTimeout < userAwayTime) // Falls Zeit abgelaufen\n {\n if (document.inf.tmp.value != "away")\n open ("chat?request=postmessage&alias=$alias&tmpid=$tmpid&msg=%2faway&tmp=autoaway","reload"); // 'Away' setzen\n userAway = true;\n }\n }\n else\n {\n if (autoQuitTimeout < userAwayTime) // Falls Zeit abgelaufen\n {\n open ("chat?request=postmessage&alias=$alias&tmpid=$tmpid&msg=%2fexit&tmp=autologout","reload"); // Chat beenden\n }\n }\n }\n\n window.setTimeout("checkInterval()",5000); // In 5 Sekunden wieder aufrufen\n}\n\nfunction initFrame()\n{\n window.setTimeout("checkInterval()",5000); // In 5 Sekunden aufrufen\n document.inf.msg.focus(); // Eingabefeld fokusieren\n}\n//-->\n</script>\n];
+ &style;
+ print qq[</head>\n<body class="blank" onload="initFrame();">\n <div align="left">\n <table border="0" cellpadding="0" cellspacing="0">\n <tr>\n <td>\n <form name="inf" target="reload" action="chat" onsubmit="return delout();">\n <input type="hidden" name="request" value="postmessage">\n <input type="hidden" name="alias" value="$alias">\n <input type="hidden" name="room" value="$room">\n <input type="hidden" name="col" value="$col">\n <input type="hidden" name="secol" value="$secol">\n <input type="hidden" name="tmpid" value="$tmpid">\n <input type="hidden" name="whisper" value="$whisper">\n <input type="hidden" name="tmp" value="$tmp">\n <input size="40" maxlength="300" name="msg" onBlur="msgBlur();" onFocus="msgFocus();">\n </form>\n </td>\n <td><form name="verlaufform">\n <script language="JavaScript"><!--\n document.write("<select size='1' name='verlauf' size='40' onChange='CheckAuswahl();'>");\n document.write("<option>- Nachrichten-Verlauf -</option>");\n for(i=0; i<maxVerlauf; i++) // Leere Verlaufsfelder generieren\n document.write("<option value>(leer)</option>");\n document.write("</select>");\n //-->\n </script>\n </form>\n </td>\n </tr>\n </table>\n </div>\n</body>\n</html>\n];
+ $client->$shutdown(2);
+ exit 0;
+}
+1;
diff --git a/0.8.0/modules/loggedin.pm b/0.8.0/modules/loggedin.pm
new file mode 100755
index 0000000..848505d
--- /dev/null
+++ b/0.8.0/modules/loggedin.pm
@@ -0,0 +1,41 @@
+sub loggedin {
+ &start_html($loginplace, 'blank');
+ print qq[<div>\n <font color='$col'>$alias</font>, sch\366n da\337 Du da bist :-), <a href='chat?request=loggedin&alias=$alias&col=$col&secol=$secol&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder' style="text-decoration: underline; color: red">hier</a> kannst du die Seite aktualisieren.\n</div>\n<hr>\n<div>\n<a href="chat?request=stream&alias=$alias&room=$standardroom&col=$col&secol=$secol&tmp=login&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder" style="text-decoration: underline; color: red; font-size:20px">Hier</a>\nkannst du den Standardraum $standardroom betreten. <br><br>\n];
+ opendir ROOMDIRS, 'data/online/rooms';
+ local(@roomdirs) = readdir ROOMDIRS;
+ close ROOMDIRS;
+ foreach $_ (@roomdirs) {
+ if (-e "data/online/rooms/$_" and $_ ne '..' and $_ ne '.') {
+ my $room = $_;
+
+ open RSTAT, "<data/online/rstat/$room";
+ my(@rstat) = <RSTAT>;
+ close RSTAT;
+
+ my $door = '[<font color=red>Abgesperrt!</font>]' if $rstat[0] eq "1\n";
+
+ opendir ROOMDIR, "data/online/rooms/$room";
+ my(@roomdir) = readdir ROOMDIR;
+ close ROOMDIR;
+
+ my $nr = $#roomdir - 1;
+ if ($door or $_ eq $loginplace) {
+ print $q->b($_), " $door ($nr) ";
+ }
+ else {
+ print $q->b($q->a({-'href', "chat?request=stream&alias=$alias&room=$_&col=$col&secol=$secol&tmp=login&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder"}, "$_")), " ($nr)";
+ }
+ print " Raumthema: $rstat[1]" if $rstat[1] ne "\n";
+ print $q->br;
+ foreach $_ (@roomdir) {
+ if ($_ ne '..' and $_ ne '.') {
+ my $col = &get_ident($_,3);
+ print "<a href='chat?request=divcom&var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid' target='$_' style='color: $col'>$_</a> ";
+ }
+ }
+ print $q->br, $q->br;
+ }
+ }
+ &gb_html($_[0],'loggedin');
+}
+1;
diff --git a/0.8.0/modules/online.pm b/0.8.0/modules/online.pm
new file mode 100755
index 0000000..4c87fb0
--- /dev/null
+++ b/0.8.0/modules/online.pm
@@ -0,0 +1,167 @@
+sub online {
+ &secure_checkid($alias, $tmpid);
+ my(@away) = &prove_away($alias, $room, 'return_list');
+ for (;;) {
+ for ($i = 0; $i <= $#away; $i += 2) {
+ last if ($away[$i] eq $alias || $room eq $loginplace);
+ }
+ open DATEI, "<data/online/users/$alias";
+ my $oldstamp = <DATEI>;
+ close DATEI;
+ if ($oldstamp > time - 100) {
+ open DATEI, "<data/user/counts/$alias.online";
+ my $online = <DATEI>;
+ close DATEI;
+ my $total = time - $oldstamp + $online;
+ open DATEI, ">data/user/counts/$alias.online";
+ print DATEI $total;
+ close DATEI;
+ }
+ last;
+ }
+ unless (-d "data/online/rooms/$room") {
+ mkdir "data/online/rooms/$room", 511;
+ }
+ open DATEI, ">data/online/users/$alias";
+ print DATEI time;
+ close DATEI;
+
+ open DATEI, ">data/online/rooms/$room/$alias";
+ print DATEI time;
+ close DATEI;
+ open DATEI, '<data/online/prove';
+ my $provetime = <DATEI>;
+ close DATEI;
+
+ &check_online if $provetime < time - 40;
+ print <<END;
+ <html>
+ <head>
+ <meta http-equiv="refresh" content="20" URL="chat?request=online&room=$room&alias=$alias&tmpid=$tmpid">
+ <style type="text/css">\n a { font-family: arial; font-size:11px; color: #ffffef; }\n a:hover { color: #ffffff; }\n </style>\n <style type="text/css" media="all">\n a { text-decoration: none; }\n a:hover { text-decoration:underline; }
+ </style>
+ </head>
+ <body bgcolor="$chatbg">
+END
+
+ opendir ROOM, 'data/online/rooms/' . $room;
+ my(@room) = readdir(ROOM);
+ closedir ROOM;
+
+ my $chatter = $#room - 1;
+ print "<font size='1' color='ffffff' face='arial'>$room ($chatter):</font><table>\n";
+
+ open FILE, "<data/online/rstat/$room";
+ my(@rstat) = <FILE>;
+ close FILE;
+ shift @rstat;
+ shift @rstat;
+
+ open FILE, '<data/hierachie';
+ my(@userlevels) = (<FILE>, @rstat);
+ close FILE;
+
+ open FILE, "<data/online/rstat/$room.away";
+ my(@away) = <FILE>;
+ close FILE;
+
+ my $hierachie;
+ foreach (@userlevels) {
+ my($name, $level) = split(/<;/, $_, 3);
+ if ($name eq $alias) {
+ $hierachie = $level;
+ last;
+ }
+ }
+
+ my %alias;
+ foreach (@room) {
+ if (-f "data/online/rooms/$room/$_") {
+ open IDENT, "data/online/ident/$_";
+ my @ident = <IDENT>;
+ close IDENT;
+ chomp $ident[2];
+ chomp $ident[3];
+ $alias{$ident[2]} = [$_, $ident[3]];
+
+ }
+ }
+
+ @room = undef;
+ foreach my $value (reverse (sort { $a <=> $b } keys %alias)) {
+ push @room, ${$alias{$value}}[0]
+ }
+
+ foreach my $nick (@room) {
+ if (-f "data/online/rooms/$room/$nick") {
+ my $inside = 0;
+ my $col = &get_ident($nick,3);
+ foreach $_ (@away) {
+ my($name, $awaymessage) = split(/<;/, $_, 3);
+ if ($name eq $nick) {
+ chomp $awaymessage;
+ $awaymessage =~ s/=//ig;
+ print "<tr><td><img border='0' title='$awaymessage' alt='$awaymessage' src='$gfxpath/away.gif'></td>";
+ $inside = 2;
+ }
+ }
+ if ($inside == 0) {
+ foreach $_ (@userlevels) {
+ my($name, $level) = split(/<;/, $_, 3);
+ if ($nick eq $name) {
+ chomp $level;
+ $inside = 1;
+ if ($level == 1) {
+ print "<tr><td><img title='Raumbesetzer' alt='Raumbesetzer' src='$gfxpath/rb.gif'></td>";
+ last;
+ }
+ elsif ($level == 2) {
+ print "<tr><td><img title='Die Unschuld vom Land' alt='Die Unschuld vom Land' src='$gfxpath/uvl.gif'></td>";
+ last;
+ }
+ elsif ($level == 3) {
+ print "<tr><td><img title='Tempor&auml;rer W&auml;chter' alt='Tempor&auml;rer W&auml;chter' src='$gfxpath/twa.gif'></td>";
+ last;
+ }
+ elsif ($level == 5) {
+ print "<tr><td><img title='W&auml;chter' alt='W&auml;chter' src='$gfxpath/wa.gif'></td>";
+ last;
+ }
+ elsif ($level == 7) {
+ print "<tr><td><img title='oberw&auml;chter' alt='Oberw&auml;chter' src='$gfxpath/ow.gif'></td>";
+ last;
+ }
+ elsif ($level == 9) {
+ print "<tr><td><img title='Administrator' alt='Administrator' src='$gfxpath/adm.gif'></td>";
+ last;
+ }
+
+ if (5 <= $hierachie) {
+ if ($level == 6) {
+ print "<tr><td><img title='W&auml;chter' alt='Unsichtbarer W&auml;chter' src='$gfxpath/wa-i.gif'></td>";
+ last;
+ }
+ elsif ($level == 8) {
+ print "<tr><td><img title='oberw&auml;chter' alt='Unsichtbarer Oberw&auml;chter' src='$gfxpath/ow-i.gif'></td>";
+ last;
+ }
+ elsif ($level == 10) {
+ print "<tr><td><img title='Administrator' alt='Unsichtbarer Administrator' src='$gfxpath/adm-i.gif'></td>";
+ last;
+ }
+
+ }
+ print '<tr><td></td>';
+ last;
+ }
+ }
+ }
+ if ($inside == 0) {
+ print '<tr><td></td>';
+ }
+ print "<td><a href='chat?request=divcom&var=alias_html&alias=$alias&tmp=$nick&tmpid=$tmpid' target='$nick' style='color: $col'>$nick</a></td></tr>\n";
+ }
+ }
+ print '</table></body></html>';
+}
+1;
diff --git a/0.8.0/modules/postmessage.pm b/0.8.0/modules/postmessage.pm
new file mode 100755
index 0000000..f787534
--- /dev/null
+++ b/0.8.0/modules/postmessage.pm
@@ -0,0 +1,90 @@
+sub postmessage {
+ if (not -e "data/online/rooms/$room/$alias" and $tmp ne 'autoaway' and $tmp ne 'autologout') {
+ &post_prv($alias, "<font color=ffffff>Du befindest Dich nicht im Raum <font color=ffa500>$room</font> und kannst dort auch keine Nachrichten posten!</font>");
+ &reload_html;
+ }
+ elsif (length $msg > 300) {
+ &post_prv($alias, "<font color=ffffff>Deine Nachricht enth\344lt zu viele Zeichen. Maximal sind 300 Zeichen erlaubt.</font>");
+ &reload_html;
+ }
+ if ($tmp eq 'away') {
+ &rm_away($alias, $room);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> hat sich zur\374ck gemeldet ... </font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ &private_javascript($alias, $room, q[parent.input.document.inf.tmp.value = 'notaway';]);
+ }
+ $msg =~ s/</&lt;/g;
+ if (substr($msg, 0, 1) ne '/') {
+ unless ($tmp eq 'autoaway') {
+ foreach $_ ($col, $secol) {
+ &prove_color($alias, $_);
+ }
+ }
+ open MSGFILE, ">>data/msgs/$room";
+ if (not $msg =~ s[/me/][<i>$alias</i>]g || $msg =~ s[/m/][<i><font color=$col>$alias</font></i>]g) {
+ print MSGFILE '!<;' . time . "<;!<;!<;<b><font color='$col'>$alias: <font color='$secol'>$msg<br></font></font></b><;$alias<;\n";
+ }
+ else {
+ $msg =~ s[/me/][<i>$alias</i>]g;
+ $msg =~ s[/m/][<i><font color=$col>$alias</font></i>]g;
+ print MSGFILE '!<;' . time . "<;!<;!<;<b><font color=$secol>$msg</font></font></b><br><;$alias<;\n";
+ }
+ close MSGFILE;
+ opendir PID, "data/online/pids/$room";
+ my(@pids) = readdir PID;
+ closedir PID;
+ foreach $_ (@pids) {
+ kill 'USR1', $_ if -f "data/online/pids/$room/$_";
+ }
+ &log("<b><font color=$col>$alias: <font color=$secol>$msg</font></font></b>") if $room eq $standardroom;
+ &reload_html;
+ }
+ else {
+ &command($msg, $tmp);
+ }
+}
+sub post {
+ my($room, $msg2post, $alias, $secroom) = @_;
+ my(@rooms) = $room;
+ push @rooms, $secroom if $room ne $secroom;
+ foreach my $theroom (@rooms) {
+ open MSGFILE, ">>data/msgs/$theroom";
+ print MSGFILE '!<;' . time . "<;!<;!<;$msg2post<br><;$alias<;\n";
+ close MSGFILE;
+ opendir PID, "data/online/pids/$theroom";
+ my(@pids) = readdir PID;
+ closedir PID;
+ foreach $_ (@pids) {
+ kill 'USR1', $_ if -f "data/online/pids/$theroom/$_";
+ }
+ }
+ &log($msg2post) if $room eq $standardroom;
+}
+sub post_prv {
+ my($alias2post, $msg2post) = @_;
+ my $roomofalias = &get_room($alias2post);
+ return 'false' if not $roomofalias;
+ open MSGFILE, ">>data/msgs/$roomofalias";
+ print MSGFILE "$alias2post<;" . time . "<;!<;!<;$msg2post<br><;$alias<;\n";
+ close MSGFILE;
+ opendir PID, "data/online/pids/$roomofalias";
+ my(@pids) = readdir PID;
+ closedir PID;
+ foreach $_ (@pids) {
+ kill 'USR1', $_ if -f "data/online/pids/$roomofalias/$_";
+ }
+ return 'true';
+}
+sub post_strmsg {
+ my($alias, $room, $command, $action) = @_;
+ open MSGFILE, ">>data/msgs/$room";
+ print MSGFILE "$alias<;" . time . "<;$command<;$action<;!<;!<;\n";
+ close MSGFILE;
+ opendir PID, "data/online/pids/$room";
+ my(@pids) = readdir PID;
+ closedir PID;
+ foreach $_ (@pids) {
+ kill 'USR1', $_ if -f "data/online/pids/$room/$_";
+ }
+}
+
+1;
diff --git a/0.8.0/modules/shared.pm b/0.8.0/modules/shared.pm
new file mode 100755
index 0000000..e458953
--- /dev/null
+++ b/0.8.0/modules/shared.pm
@@ -0,0 +1,353 @@
+sub reload_html {
+ print "<html><body bgcolor='$chatbg'></body></html>";
+ &del_awake();
+ $client->shutdown(2);
+ exit 0;
+}
+sub printfile {
+ my($file2print, $pagetitle, $bodyclass) = @_;
+ &start_html($pagetitle, $bodyclass) if $pagetitle ne '';
+ &menu unless $bodyclass eq 'blank';
+ open FILE2PRINT, "<$file2print";
+ print "$_\n" while defined($_ = <FILE2PRINT>);
+ close FILE2PRINT;
+}
+sub start_html {
+ print "<html><head><title>$title - $_[0]</title>$_[2]";
+ &style;
+ print '</head>';
+ if ($_[1] eq 'start') {
+ print '<body onload="document.login.alias.focus();">';
+ }
+ elsif ($_[1] ne '') {
+ print "<body class=$_[1]>";
+ }
+ else {
+ print '<body>';
+ }
+}
+sub log {
+ my $msg2log = $_[0];
+ my($secs, $mins, $hours, $days, $months, $years) = &timearray;
+ my $js;
+ $hours--;
+ ($msg2log, $js) = split(/<script/, $msg2log, 3);
+ open LOG, ">>data/logs/$days.$months.$years";
+ print LOG "<br><font color=ffffef><i>($hours:$mins:$secs)</i></font> $msg2log\n";
+ close LOG;
+}
+sub timestring {
+ my($mins, $hours) = (localtime)[1, 2];
+ $hours = '0' . $hours if $hours < 10;
+ $mins = '0' . $mins if $mins < 10;
+ return "$hours:$mins";
+}
+sub timearray {
+ my($secs, $mins, $hours, $days, $months, $years) = (localtime)[(0, 1, 2, 3, 4, 5)];
+ $months += 1;
+ $hours = '0' . $hours if $hours < 10;
+ $mins = '0' . $mins if $mins < 10;
+ $secs = '0' . $secs if $secs < 10;
+ $days = '0' . $days if $days < 10;
+ $months = '0' . $months if $months < 10;
+ $years = $years - 100;
+ if ($years < 10) {
+ $years = '200' . $years;
+ }
+ else {
+ $years = '20' . $years;
+ }
+ return $secs, $mins, $hours, $days, $months, $years;
+}
+sub error {
+ my $error_msg = $_[0];
+ &start_html("Error: ($error_msg)");
+ print $q->div("Error: ($error_msg)"), $q->end_html;
+ open ERROR, '>>data/error';
+ print ERROR "Alias: $alias TempID: $tmpid File. $0 PID: $$ Time: " . time . " Message: $error_msg \n";
+ close ERROR;
+ $client->shutdown(2) if $client;
+ exit 0;
+}
+sub check_online {
+ open PROVE, '>data/online/prove';
+ print PROVE time;
+ close PROVE;
+ opendir DIR, 'data/online/rooms';
+ my(@roomdir) = readdir DIR;
+ closedir DIR;
+ foreach my $theroom (@roomdir) {
+ opendir DIR, "data/online/rooms/$theroom";
+ my(@roomusers) = readdir DIR;
+ closedir DIR;
+ my $empty = 1;
+ foreach $user (@roomusers) {
+ if (-f "data/online/rooms/$theroom/$user") {
+ $empty = 0;
+ open USER, "<data/online/rooms/$theroom/$user";
+ my $userstamp = <USER>;
+ close USER;
+ if ($userstamp < time - 40) {
+ unlink "data/online/$theroom/$user";
+ open USER, "<data/online/users/$user";
+ my $userstamp = <USER>;
+ close USER;
+ if ($userstamp < time - 40) {
+ &post($theroom, '<i><font color=ffffff>' . &timestring . " <font color='".&get_ident($user,3)."'>$user</font> hat den Chat verlassen ... </font></i>");
+ if ($user ne $alias) {
+ &rm_alias($user, $theroom);
+ }
+ else {
+ unlink "data/online/rooms/$theroom/$user";
+ }
+ }
+ }
+ }
+ }
+ opendir PIDS, "data/online/pids/$theroom";
+ my(@pids) = readdir PIDS;
+ closedir PIDS;
+ if ($empty == 1) {
+ rmdir "data/online/rooms/$theroom";
+ unlink "data/online/rstat/$theroom";
+ unlink "data/online/rstat/$theroom.away";
+ unlink "data/msgs/$theroom";
+ foreach $_ (@pids) {
+ unlink "data/online/pids/$theroom/$_" if -f "data/online/pids/$theroom/$_";
+ }
+ rmdir "data/online/pids/$theroom";
+ }
+ }
+}
+sub rm_if_loggedin {
+ my $alias = shift;
+ my $room = &get_room($alias);
+ while ($room ne undef) {
+ &rm_alias($alias, $room);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$user</font> hat den Chat verlassen ... </font></i>");
+ $room = &get_room($alias);
+ }
+}
+sub secure_checkid {
+ my($alias2check, $tmpid) = @_;
+ &error("Falsche TempID! $tmpid") unless -f "data/online/tmpid/$alias.$tmpid";
+}
+sub rm_alias {
+ my($alias, $room) = @_;
+ unlink "data/online/rooms/$room/$alias";
+ unlink "data/online/users/$alias";
+ opendir TMPID, 'data/online/tmpid';
+ my(@tmpid) = readdir TMPID;
+ close TMPID;
+ foreach $_ (@tmpid) {
+ unlink "data/online/tmpid/$_" if /^$alias\..+$/;
+ }
+ unlink "data/online/ident/$alias";
+ &rm_rstat($alias, $room);
+}
+sub rm_rstat {
+ my($alias, $room) = @_;
+ open RSTAT, "<data/online/rstat/$room";
+ my(@rstat) = <RSTAT>;
+ close RSTAT;
+ my(@rstat2) = ($rstat[0], $rstat[1]);
+ for ($i = 2; $i <= $#rstat; ++$i) {
+ chomp $rstat[$i];
+ push @rstat2, $rstat[$i] . "\n" unless $rstat[$i] =~ /^$alias<;/;
+ }
+ open RSTAT, ">data/online/rstat/$room";
+ print RSTAT @rstat2;
+ close RSTAT;
+}
+sub rm_away {
+ my($alias, $room) = @_;
+ open AWAY, "<data/online/rstat/$room.away";
+ my(@away) = <AWAY>;
+ close AWAY;
+ my @away2;
+ foreach $_ (@away) {
+ my(@split) = split(/<;/, $_, 0);
+ push @away2, $_ if $alias ne $split[0];
+ }
+ open AWAY, ">data/online/rstat/$room.away";
+ print AWAY @away2;
+ close AWAY;
+}
+sub rm_entry {
+ my($entry, $file) = @_;
+ open ENTRY, "<data/$file";
+ my(@entry) = <ENTRY>;
+ close ENTRY;
+ my @new;
+ foreach $_ (@entry) {
+ push @new, $_ if $entry . "\n" ne $_;
+ }
+ if (@entry != @new) {
+ open ENTRY, ">data/$file";
+ print ENTRY @new;
+ close ENTRY;
+ return 1;
+ }
+ else {
+ return;
+ }
+}
+sub add_entry {
+ my($entry, $file) = @_;
+ open ENTRY, "<data/$file";
+ my(@entry) = <ENTRY>;
+ close ENTRY;
+ foreach $_ (@entry) {
+ chomp $_;
+ return if $entry eq $_;
+ }
+ open ENTRY, ">>data/$file";
+ print ENTRY $entry . "\n";
+ close ENTRY;
+ return 1;
+}
+sub prove_color {
+ my($alias, $color) = @_;
+ my $length = length $color;
+ if ($length > 6 or $length < 6) {
+ &post_prv($alias, "<font color=ffffff>Ung\374ltige Hexadezimalfarbe.</font>");
+ &reload_html;
+ }
+}
+sub kill_alias {
+ my($alias2kill, $alias) = @_;
+ my($secs, $mins, $hours, $days, $months, $years) = &timearray;
+ unlink "data/user/options/$alias2kill";
+ unlink "data/user/profiles/$alias2kill";
+ unlink "data/user/gbooks/$alias2kill";
+ unlink "data/user/counts/$alias2kill";
+ unlink "data/user/counts/$alias2kill.online";
+ unlink "data/user/lastlogin/$alias2kill";
+ unlink "data/user/memos/$alias2kill";
+ &rm_entry($alias2kill, 'ban');
+ open DEL, '>>data/kill';
+ print DEL "($days.$months.$years $hours:$mins:$secs) $alias2kill wurde von $alias gekillt\n";
+ close DEL;
+}
+sub random_color {
+ my(@digit) = ('F', 'C', 'A', 'B', (5, 6, 7, 8, 9));
+ my $dig1 = rand @digit;
+ my $dig2 = rand @digit;
+ my $dig3 = rand @digit;
+ my $dig4 = rand @digit;
+ my $dig5 = rand @digit;
+ my $dig6 = rand @digit;
+ return $digit[$dig1] . $digit[$dig2] . $digit[$dig3] . $digit[$dig4] . $digit[$dig5] . $digit[$dig6];
+}
+sub url_decode {
+ my $t = shift @_;
+ $t =~ s[/][];
+ $t =~ tr/+/ /;
+ while ($t =~ s/%([a-f0-9][a-f0-9])/chr hex $1;/ie) {
+ ();
+ }
+ return $t;
+}
+sub url_encode {
+ my $t = shift @_;
+ while ($t =~ s/([^\w()'*~!.-])/sprintf '%%%02x', $1;/eg) {
+ ();
+ }
+ return $t;
+}
+sub calculate_hpm {
+ my($hits, $starttime) = @_;
+ return sprintf('%.2f', $hits / ((time - $starttime) / 60));
+}
+sub calculate_uptime_hours {
+ my $starttime = shift @_;
+ return sprintf('%.2f', (time - $starttime) / 3600);
+}
+sub private_javascript {
+ my($alias, $room, $javascript) = @_;
+ open MSGFILE, ">>data/msgs/$room";
+ print MSGFILE "$alias<;" . time . qq[<;!<;!<;<script language="JavaScript">$javascript</script><;\n];
+ close MSGFILE;
+ opendir PID, "data/online/pids/$room";
+ my(@pids) = readdir PID;
+ closedir PID;
+ foreach $_ (@pids) {
+ kill 'USR1', $_ if -f "data/online/pids/$room/$_";
+ }
+}
+sub get_theme {
+ my $room = shift @_;
+ open RSTAT, "data/online/rstat/$room";
+ my(@rstat) = <RSTAT>;
+ close RSTAT;
+ chomp $rstat[1];
+ return '<b>Raumthema:</b>' . $rstat[1] if $rstat[1] ne undef;
+}
+sub get_room {
+ my $alias = shift @_;
+ opendir DIR, 'data/online/rooms';
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach my $room (@dir) {
+ opendir DIR, "data/online/rooms/$room";
+ my(@chatter) = readdir DIR;
+ closedir DIR;
+ foreach my $chatter (@chatter) {
+ return $room if $chatter eq $alias;
+ }
+ }
+ return undef;
+}
+sub get_ident {
+ my ($alias,$line) = @_;
+ open IDENT, "data/online/ident/$alias";
+ my (@ident) = <IDENT>;
+ close IDENT;
+ chomp $ident[$line];
+ return $ident[$line];
+}
+sub get_online_users {
+ my @dir = &diropen('data/online/rooms');
+ my @users;
+
+ foreach my $room (@dir) {
+ next if $room =~ /\./;
+ my @room = &diropen("data/online/rooms/$room");
+
+ foreach (@room) {
+ push @users, $_ unless /\./;
+ }
+ }
+ return @users;
+}
+sub get_online_time {
+ my $alias = shift;
+ if (-f "data/user/options/$alias") {
+ open ONLINE, "<data/user/counts/$alias.online";
+ my $online = <ONLINE>;
+ close ONLINE;
+ return sprintf('%.2f', $online / 3600);
+ }
+ return false;
+}
+sub diropen {
+ my $dir = shift;
+
+ opendir DIR, $dir;
+ my @dir = readdir(DIR);
+ closedir(DIR);
+
+ return @dir;
+}
+sub del_awake {
+ unlink "data/online/awake/$$";
+}
+sub debug {
+ open DEBUG, '>>debug';
+ while (@_) {
+ chomp $_;
+ print DEBUG "$_\n";
+ }
+ close DEBUG;
+}
+1;
diff --git a/0.8.0/modules/start.pm b/0.8.0/modules/start.pm
new file mode 100755
index 0000000..4fe416b
--- /dev/null
+++ b/0.8.0/modules/start.pm
@@ -0,0 +1,264 @@
+sub start {
+ if ($var eq 'create_alias_html') {
+ &create_alias_html;
+ }
+ elsif ($var eq 'create_alias') {
+ &create_alias;
+ }
+ elsif ($var eq 'login_html') {
+ &login_html;
+ }
+ elsif ($var eq 'chatiquette_html') {
+ &chatiquette_html;
+ }
+ elsif ($alias eq '') {
+ &login_html;
+ }
+ else {
+ &checklogin;
+ }
+}
+sub login_html {
+ &check_online;
+ my $counter = undef;
+ open COUNT, '<data/count';
+ $counter = <COUNT>;
+ close COUNT;
+ ++$counter;
+ open COUNT, '>data/count';
+ flock COUNT, 2;
+ print COUNT $counter;
+ close COUNT;
+
+ my(@users) = &get_online_users;
+
+ opendir REGISTRED, 'data/user/options';
+ my(@registred) = readdir REGISTRED;
+ closedir REGISTRED;
+
+ my($logtin, $users) = ($#users + 1, $#registred - 1);
+ &start_html("Created & Copyright by Paul C. B\374tow", 'start');
+ print qq[ <center>\n <table width=500>\n <tr>\n <td>\n <center>\n <table>\n <tr>\n <td>\n <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0" WIDTH=240 HEIGHT=240>\n <param name=movie value="$gfxpath/yIntro.swf">\n <param name=loop value=false>\n <param name=menu value=false>\n <param name=quality value=high>\n <param name=scale value=noborder>\n <param name=wmode value=opaque>\n <param name=bgcolor value=$bgcolor>\n <embed src="$gfxpath/yIntro.swf" loop=false menu=false quality=high scale=noborder wmode=opaque bgcolor=$bgcolor WIDTH=240 HEIGHT=240 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED>\n </object>\n </td>\n <td>\n <div>\n yChat: Version $version\n <br><br>\n Letztes Update: $datum\n <br><br>\n Seitenaufrufe: $counter\n <br><br>\n Benutzer registriert: $users\n <br><br>\n Benutzer online: $logtin\n <br><br>\n Benutzerlimit: $limit\n <br><br>\n Beta-yChat: <a href="http://www.java.yChat.de">www.java.yChat.de</a>\n <br><br><a href="http://www.webchat.de" target="_new"> <img src="http://www.webchat.de/webchat.gif" alt="[webchat]" title="[webchat]" border="0"></a><br>\n<img src="http://stats.topwebmaster.net/extern/de/snooper"></div></td>\n </tr>\n </table>\n </center>\n </div>\n <br>\n <br>\n];
+ if ($tmp eq 'true') {
+ print qq[ <div class=b>\n ACHTUNG!\n </div>\n <div>\n Wahrscheinlich existiert Dein Alias "$alias" nicht,\n <br>\n Du hast Dich verschrieben oder das Passwort ist falsch.\n <br>\n Versuch es erneuert !\n </div>\n];
+ }
+ elsif ($tmp eq 'quit') {
+ print qq[ <div>\n Du hast soeben den Chat verlassen.\n <br>\n Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)\n </div>\n];
+ }
+ elsif ($tmp eq 'autologout') {
+ print qq[ <div>\n Du wurdest automatisch aus dem Chat ausgeloggt. Grund: Du warst 20 Minuten inaktiv.\n <br>\n Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)\n </div>\n];
+ }
+ elsif ($tmp eq 'autokick') {
+ print qq[ <div>\n Du wurdest automatisch aus dem Chat katapultiert. Grund: Du hast den Chat geflutet!\n <br>\n Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)\n </div>\n];
+ }
+ elsif ($tmp eq 'banned') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Du wurdest aus dem Chat verbannt!!!\n <br>\n Z.z. kannst Du Dich leider nicht in den Chat einloggen.\n <br>\n Sorry!\n </div>\n";
+ }
+ elsif ($tmp eq 'kick') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Du wurdest soeben aus dem Chat katapultiert!\n <br>\n Schlechtes Verhalten mag die Ursache hierf\374r sein.\n <br>\n Sorry!\n </div>\n";
+ }
+ elsif ($tmp eq 'selfkill') {
+ print qq[ <div>\n Du hast dich soeben ganz und gar aus dem System gel\366scht!\n <br>\n Wenn du dir einen neuen Nick angelen willst, dann einfach auf "Registrieren" klicken! :-)\n </div>\n];
+ }
+ elsif ($tmp eq 'selfkill') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Du wurdest soeben aus dem Chat ausgeloggt!\n <br>\n Ursache hierf\374r mag sein, da\337 der Chat voll war und Du Dich nicht am\n Geschehen beteiligt- und unn\366tige Chatkapazit\344ten in Anspruch\n genommen hast.\n <br>\n Sorry!\n </div>\n";
+ }
+ elsif ($tmp eq 'full') {
+ print "<div class=b>ACHTUNG!</div><div>Der Chat ist leider voll! Bitte versuch Dich sp\344ter noch mal einzuloggen!</div>";
+ }
+ elsif ($var eq 'create_alias') {
+ print q[<div>Du hast sich soeben in die Datenbank eingetragen. Einfach auf "Los Geht's" klicken :-)</div>];
+ }
+ else {
+ print qq[ <div>\n Herzlich willkommen!\n <br>\n Einfach Daten eingeben und auf "Los Geht's" klicken :-)\n </div>\n];
+ }
+ print qq[ <hr>\n <form name="login" method="GET">\n <input type="hidden" name="request" value="start">\n <input type="hidden" name="tmp" value="true">\n <table>\n <tr>\n <td>\n <div>\n Dein Alias:\n <br>\n <input name="alias" value="$alias">\n </div>\n </td>\n <td>\n <div>\n Dein Passwort:\n <br>\n <input type="password" name="pw" value="$pw">\n </div>\n </td>\n </tr>\n </table>\n <br>\n <br>\n <div>\n Solltest Du noch keinen Nick besitzen, dann auf "Registrieren" klicken!\n </div>\n <br>\n <table>\n <tr>\n <td>\n <font color="ffffff">\n <input type="submit" value="Los geht's!">\n </font>\n </form>\n </td>\n <td>\n <form action="chat">\n <input type="hidden" name="request" value="start">\n <input type="hidden" name="var" value="create_alias_html">\n <font color="ffffff">\n <input type="submit" value="Registrieren">\n </font>\n </form>\n </td>\n </tr>\n </table>\n <hr>\n];
+ if ($logtin > 0) {
+ print q[<div>Folgende Personen sind eingeloggt:<br><font size='1'>];
+ foreach $_ (@users) {
+ print "$_ " if -f "data/online/users/$_";
+ }
+ print '</font></div>';
+ }
+ print " </td>\n </tr>\n </table>\n </center>\n</body>\n</html>\n";
+ unless (-d 'data/online/rooms') {
+ mkdir 'data/online/rooms', 511;
+ }
+}
+sub create_alias_html {
+ open BAN, '<data/ban';
+ my(@ban) = <BAN>;
+ close BAN;
+ foreach $_ (@ban) {
+ chomp $_;
+ if ($_ eq 'ip://' . $client->peerhost) {
+ $tmp = 'banned';
+ &login_html;
+ &del_away();
+ $client->shutdown(2);
+ exit 0;
+ }
+ }
+ my $reload = $_[0];
+ &start_html('Registration');
+ print " <center>\n <table width=500>\n <tr>\n <td>\n";
+ if ($reload eq 'alias_exists') {
+ print qq[ <div class=b>\n ACHTUNG!\n </div>\n <div>\n Der von Dir gew\344hlte Benutzername "$alias" existiert in unserer Datenbank bereits. Bitte versuch es erneuert mit\n einem anderen Benutzernamen !\n </div>\n <hr>\n];
+ }
+ elsif ($reload eq 'pw_wrong') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Deine beiden Passworteingaben stimmen nicht \374berein. Bitte geb das Passwort erneuert an um sicherzugehen, da\337\n kein falsches Passwort abgespeichert wird !\n </div>\n <hr>\n";
+ }
+ elsif ($reload eq 'alias_prohibited') {
+ print qq[ <div class=b>\n ACHTUNG!\n </div>\n <div>\n Dein gew\344hlter Benutername "$alias" enth\344lt illegale Zeichen. Bitte versuch einen anderen Benutzernamen!\n </div>\n <hr>\n];
+ }
+ elsif ($reload eq 'alias_length') {
+ print qq[ <div class=b>\n ACHTUNG!\n </div>\n <div>\n Dein gew\344hlter Benutername "$alias" enth\344lt zu viele Zeichen. Es sind maximal 15 Zeichen erlaubt!!\n </div>\n <hr>\n];
+ }
+ else {
+ print " <div>\n Hier kannst Du Dich registrieren. Bitte beachte, da\337 die Passworteingabefelder \374bereinstimmen!\n </div>\n <hr>\n";
+ }
+ print qq[ <form action="chat">\n <input type="hidden" name="request" value="start">\n <input type="hidden" name="var" value="create_alias">\n <div>\n Dein Alias:\n <font color="ffa500">\n (Mu\337 angegeben werden)\n </font>\n <br>\n <input name="alias" VALUE="$alias">\n </div>\n <br>\n <div>\n Dein gew\374nschtes Passwort:\n <br>\n <input type="password" name="pw" value="$pw">\n </div>\n <br>\n <div>\n Geb hier Dein Passwort erneuert ein:\n <br>\n <input type="password" name="tmp">\n </div>\n <br>\n <font color=ffffff>\n <input type="submit" value="Registrieren">\n </font>\n <br>\n </form>\n <hr>\n <div>\n Um den Chat zu betreten m\374ssen die Daten nach der Registration auf der Startseite erneuert best\344tigt werden !\n </div>\n </td>\n </tr>\n </table>\n</center>\n</body>\n</html>\n];
+}
+sub checklogin {
+ opendir USERS, 'data/online/users';
+ my(@users) = readdir USERS;
+ closedir USERS;
+ my $users = $#users;
+ if ($users > $limit && 3 > &hierachie($alias)) {
+ $tmp = 'full';
+ &login_html;
+ &del_away();
+ $client->shutdown(2);
+ exit 0;
+ }
+ my $lognotexists = 'true';
+ opendir USERDIR, 'data/user/options';
+ my(@userdir) = readdir USERDIR;
+ closedir USERDIR;
+ foreach $user (@userdir) {
+ if ($user eq $alias) {
+ open OPTIONS, "<data/user/options/$alias";
+ my(@options) = <OPTIONS>;
+ close OPTIONS;
+ foreach $_ (@options) {
+ chomp $_;
+ }
+ if ((crypt $pw, $cryptkey) eq $options[0] || $options[0] eq $pw) {
+ open BAN, '<data/ban';
+ my(@ban) = <BAN>;
+ close BAN;
+ foreach $_ (@ban) {
+ chomp $_;
+ if ($_ eq $alias or $_ eq 'ip://' . $client->peerhost) {
+ if (-f "data/online/users/$admin") {
+ &post_prv($admin, "<font color=ffffff><font color=ffa500>$_</font> kann sich nicht einloggen (Ist verbannt)!!</font>");
+ }
+ $tmp = 'banned';
+ &login_html;
+ &del_away();
+ $client->shutdown(2);
+ exit 0;
+ }
+ }
+ if ($options[1] eq undef) {
+ $col = &random_color;
+ }
+ else {
+ $col = $options[1];
+ }
+ if ($options[2] eq undef) {
+ $secol = &random_color;
+ }
+ else {
+ $secol = $options[2];
+ }
+ if ($options[3] eq undef) {
+ $maxVerlauf = '10';
+ }
+ else {
+ $maxVerlauf = $options[3];
+ }
+ if ($options[4] eq undef) {
+ $verlaufOrder = '1';
+ }
+ else {
+ $verlaufOrder = $options[4];
+ }
+ &rm_if_loggedin($alias);
+ # Sorry weil so ausführlich, der Code-Optimizer formulierte dies um!
+ my(@digit) = (('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'), (0, 1, 2, 3, 4, 5, 6, 7, 8, 9), '.');
+ my $num1 = rand @digit;
+ my $num2 = rand @digit;
+ my $num3 = rand @digit;
+ my $num4 = rand @digit;
+ my $num5 = rand @digit;
+ my $num6 = rand @digit;
+ my $num7 = rand @digit;
+ my $num8 = rand @digit;
+ my $num9 = rand @digit;
+ my $num10 = rand @digit;
+ my $num11 = rand @digit;
+ my $num12 = rand @digit;
+ $tmpid = $digit[$num1] . $digit[$num2] . $digit[$num3] . $digit[$num4] . $digit[$num5] . $digit[$num6] . $digit[$num7] . $digit[$num8] . $digit[$num9] . $digit[$num10] . $digit[$num11] . $digit[$num12];
+ open TMPID, ">data/online/tmpid/$alias.$tmpid";
+ print TMPID $alias;
+ close TMPID;
+ open IDENT, ">data/online/ident/$alias";
+ print IDENT $client->peerhost . "\n$tmpid\n" . &get_online_time($alias) . "\n$col\n$secol\n";
+ close IDENT;
+ open LASTLOGIN, ">data/user/lastlogin/$alias";
+ print LASTLOGIN time;
+ close LASTLOGIN;
+ &frameset_html;
+ &del_away();
+ $client->shutdown(2);
+ exit 0;
+ }
+ else {
+ $lognotexists = 'false';
+ }
+ }
+ }
+ &login_html;
+}
+sub create_alias {
+ if ($alias =~ /\W/ or $alias eq '') {
+ goto CREATE if $alias =~ /[-]/ and not $alias =~ /\W/;
+ &create_alias_html('alias_prohibited');
+ &del_away();
+ $client->shutdown(2);
+ exit 0;
+ }
+ elsif ($pw ne $tmp) {
+ &create_alias_html('pw_wrong');
+ &del_away();
+ $client->shutdown(2);
+ exit 0;
+ }
+ elsif (length $alias >= 15) {
+ &create_alias_html('alias_length');
+ &del_away();
+ $client->shutdown(2);
+ exit 0;
+ }
+ CREATE: opendir USERDIR, 'data/user/options';
+ my(@user) = readdir USERDIR;
+ close USERDIR;
+ foreach $user (@user) {
+ if ($user eq $alias) {
+ &create_alias_html('alias_exists');
+ &del_away();
+ $client->shutdown(2);
+ exit 0;
+ }
+ }
+ $pw = crypt $pw, $cryptkey;
+ open OPTIONS, ">data/user/options/$alias";
+ print OPTIONS $pw . "\n";
+ close OPTIONS;
+ &login_html;
+}
+sub frameset_html {
+ print qq[<html>\n <head>\n <title>\n $title\n </title>\n </head>\n<frameset border=0 frameborder=0 framespacing=0 cols="130,*">\n <frameset border=0 frameborder=0 framespacing=0 rows="*,55">\n <frame name="online" src="chat?request=online&room=$loginplace&alias=$alias&tmpid=$tmpid">\n <frameset border=0 frameborder=0 framespacing=0 cols="70,*">\n <frame name="logo" src="chat?request=htdocs&var=logo_html" scrolling="no">\n <frame name="reload" src="chat?request=htdocs" scrolling="no">\n </frameset>\n </frameset>\n <frameset border=0 frameborder=0 framespacing=0 rows="*,55">\n <frame name='main' src='chat?request=loggedin&alias=$alias&col=$col&secol=$secol&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder'>\n <frame name="input" src="chat?request=htdocs" scrolling="no">\n </frameset>\n</frameset>\n</html>\n];
+}
+1;
diff --git a/0.8.0/modules/statistic.pm b/0.8.0/modules/statistic.pm
new file mode 100755
index 0000000..a0aad73
--- /dev/null
+++ b/0.8.0/modules/statistic.pm
@@ -0,0 +1,148 @@
+sub statistic {
+ &start_html('Statistiken');
+ &menu;
+ print $q->div('yChat Statistiken'), $q->hr, $q->div($q->a({-'href', "chat?request=statistic&var=ranking&alias=$alias&tmpid=$tmpid"}, 'Rankings'), ' | ', $q->a({-'href', "chat?request=statistic&var=del&alias=$alias&tmpid=$tmpid"}, 'Loginstatistiken'), ' | ', $q->a({-'href', "chat?request=statistic&var=statistic&alias=$alias&tmpid=$tmpid"}, 'DB-Statistik'), ' | ', $q->a({-'href', "chat?request=statistic&var=var&alias=$alias&tmpid=$tmpid"}, 'Umgebungsvariablen')), $q->hr;
+ if ($var eq 'ranking') {
+ opendir COUNTS, 'data/user/counts';
+ my(@counts) = readdir COUNTS;
+ closedir COUNTS;
+ print '<div>';
+ my $nr_start = $start;
+ my $nr_end = $end;
+ my %online;
+ my $rank;
+ my $nr;
+ foreach $_ (@counts) {
+ if (-f "data/user/counts/$_") {
+ if (s/.online//g) {
+ open TOTAL, "<data/user/counts/$_.online";
+ my $total = <TOTAL>;
+ close TOTAL;
+ $online{sprintf '%.2f', $total / 3600} = $_;
+ }
+ }
+ }
+ print '<div>', $q->b('Rankings:'), $q->br, '<table><tr><td><div><b>#:</b></div></td><td><b><div>St.:</div></b></td><td><b><div>Name:</div></b></td></tr>';
+ if (not $nr_start) {
+ $nr_start = 1;
+ }
+ if (not $nr_end) {
+ $nr_end = 20;
+ }
+ foreach $wert (reverse (sort { $a <=> $b } keys %online)) {
+ ++$nr;
+ if ($online{$wert} eq $alias) {
+ $rank = $nr;
+ last if $nr > $nr_end;
+ }
+ next if ($nr < $nr_start or $nr > $nr_end);
+ print q[<tr><td><font color='ffffff' size='1' face='arial'>] . $nr . q[</font></td><td><font color='ffffff' size='1' face='arial'> ] . $wert . "h </font></td><td> <a href='chat?request=divcom&var=alias_html&alias=$alias&tmp=$online{$wert}&tmpid=$tmpid'><font size='1' face='arial'>$online{$wert}</font></a></td></tr>\n";
+ }
+ print '</table>', $q->hr;
+ $nr_start -= 20;
+ $nr_end -= 20;
+ print "Rankings von <a href='chat?request=statistic&var=ranking&start=$nr_start&end=$nr_end&alias=$alias&tmpid=$tmpid'>$nr_start bis $nr_end</a> anzeigen ...<br>" if $nr_start > 0;
+ $nr_start += 40;
+ $nr_end += 40;
+ print "Rankings von <a href='chat?request=statistic&var=ranking&start=$nr_start&end=$nr_end&alias=$alias&tmpid=$tmpid'>$nr_start bis $nr_end</a> anzeigen ...", $q->br, $q->br, $q->b("$alias, Du befindest Dich auf Rank $rank</div>");
+ }
+ elsif ($var eq 'del') {
+ print '<div>', $q->b('Alte Benutzer l&ouml;schen:'), $q->br, "Benutzer, die sich 1440 Stunden (60 Tage) nicht mehr in das System eingeloggt haben, werden gel\366scht.", $q->br, $q->br;
+ opendir USER, 'data/user/options';
+ my(@user) = readdir USER;
+ closedir USER;
+ @user = sort(@user);
+ my $i = 0;
+ my $j;
+ my $k = 0;
+ my $l = 0;
+ my $full = $tmp;
+ foreach $_ (@user) {
+ if (-f "data/user/lastlogin/$_") {
+ open LOGIN, "<data/user/lastlogin/$_";
+ my $login = <LOGIN>;
+ close LOGIN;
+ $login = sprintf('%.2f', (time - $login) / 3600);
+ ++$j;
+ if (999 < $login and $login < 1440) {
+ ++$k;
+ print $q->font({-'color', 'ffa500'}, $q->b("$j($k) $_ Letztes Login vor: " . $login . 'h')), $q->br, "\n" if $full ne undef;
+ }
+ elsif ($login < 48) {
+ ++$l;
+ print $q->font({-'color', 'ffffef'}, $q->b("$j($l) $_ Letztes Login vor: " . $login . 'h')), $q->br, "\n" if $full ne undef;
+ }
+ elsif ($login < 1440) {
+ print "$j $_ Letztes Login vor: " . $login . 'h', $q->br, "\n" if $full ne undef;
+ }
+ else {
+ ++$k;
+ &kill_it($_, $i++, $login);
+ }
+ }
+ elsif (-f "data/user/options/$_") {
+ &kill_it($_, $i++);
+ }
+ }
+ print $q->hr if $full ne undef;
+ print '</div>', $q->div($q->b("$j Benutzer befinden sich in der Datenbank!", $q->br, $q->font({-'color', 'ffffef'}, "$l Benutzer haben sich innerhalb der letzten 48 Stunden eingeloggt!"), $q->br, $q->font({-'color', 'ffa500'}, "$k Benutzer haben sich &uuml;ber 1000 Stunden nicht mehr eingeloggt!"), $q->br, $q->font({-'color', 'ff0000'}, "$i Benutzer wurden gerade eben gel\366scht!")), $q->br, $q->br, 'PS: Jeder registrierte Benutzername wird nur einmal gez&auml;hlt!');
+ print $q->br, $q->div('(', $q->a({-'href', "chat?request=statistic&var=del&tmp=true&alias=$alias&tmpid=$tmpid"}, 'Vollst&auml;ndige Ansicht'), ')') if $full eq undef;
+ }
+ elsif ($var eq 'var') {
+ print '<div>', $q->b('Server Umgebungsvariablen:'), $q->br, $q->br, 'Die Serverumgebungsvariablen k&ouml;nnen nur von Oberw&auml;chtern oder h&ouml;her eingesehen werden!', $q->br, $q->br;
+ if (7 <= &hierachie($alias)) {
+ while (($key, $value) = each %ENV) {
+ print "$key = $value\n", $q->br;
+ }
+ }
+ print '</div>';
+ }
+ elsif ($var eq 'statistic') {
+ print $q->div($q->b('yChat-DB Statistik:')), $q->br;
+ $files = 0;
+ $size = 0;
+ $directorys = 1;
+ &zaehle('data');
+ $size = sprintf('%.2f', $size / 1048576);
+ print $q->div("Dateien insgesamt: $files", $q->br, "MB insgesamt: $size", $q->br, "Verzeichnisse insgesamt: $directorys");
+ }
+ print $q->end_html;
+}
+sub zaehle {
+ local($dir, $data) = @_;
+ $dir = "$dir/$data" if $data ne undef;
+ opendir DATA, $dir;
+ local(@data) = readdir DATA;
+ closedir DATA;
+ $files2 = 0;
+ foreach $_ (@data) {
+ if (-f "$dir/$_") {
+ ++$files;
+ ++$files2;
+ $size += -s "$dir/$_";
+ }
+ elsif (-d "$dir/$_" and $_ ne '.' and $_ ne '..') {
+ ++$directorys;
+ &zaehle($dir, $_);
+ }
+ }
+}
+sub kill_it {
+ my($rm, $nr, $login) = @_;
+ $login = 'XXXXXX' if $login eq undef;
+ print $q->font({-'color', 'ff0000'}, $q->b("$j($nr) $rm Letztes Login vor: " . $login . 'h (wurde gel&ouml;scht)')), $q->br, "\n";
+ print q[<font size='1'>];
+ print 'options ' if unlink "data/user/options/$rm";
+ print 'profiles ' if unlink "data/user/profiles/$rm";
+ print 'gbooks ' if unlink "data/user/gbooks/$rm";
+ print 'counts ' if unlink "data/user/counts/$rm";
+ print 'counts.online ' if unlink 'data/user/counts/' . $rm . '.online';
+ print 'lastlogin ' if unlink "data/user/lastlogin/$rm";
+ print 'memos' if unlink "data/user/memos/$rm";
+ print '</font>', $q->hr, "\n";
+ &zeit;
+ open DEL, '>>data/kill';
+ print DEL "($day.$month.$year $hours:$min:$sec) $rm wurde automatisch gekillt [$alias]\n";
+ close DEL;
+}
+1;
diff --git a/0.8.0/modules/stream.pm b/0.8.0/modules/stream.pm
new file mode 100755
index 0000000..2885d8b
--- /dev/null
+++ b/0.8.0/modules/stream.pm
@@ -0,0 +1,170 @@
+sub stream {
+ unlink "data/online/rooms/$loginplace/$alias";
+ &secure_checkid($alias, $tmpid);
+ my $pid = $$;
+ $SIG{'CHLD'} = 'IGNORE';
+ ++$|;
+ print qq[<html>\n <head>\n<script language="JavaScript">\n<!--\n open('chat?request=online&room=$room&alias=$alias&tmpid=$tmpid','online');\n open('chat?request=input&alias=$alias&room=$room&col=$col&secol=$secol&tmp=login&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder','input');\n\n// open('chat?request=input&alias=$alias&room=$room&col=$col&secol=$secol&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder','input');\n\n// Scroll-Routine von Anklepper (http://www.anklepper.de)\n// speziell f\374r yChat (http://www.yChat.de), Copyright 2000\nscrolling = true;\nmoves_steps = 4;\nmoves_interval = 4;\nfunction moves()\n{\n if( scrolling != false )\n window.scrollBy( 0, moves_steps );\n window.setTimeout( "moves()", moves_interval );\n}\nmoves();\n//-->\n</script>\n</head>\n<body bgcolor="$chatbg">\n];
+ &check_online;
+ print "<font size=1 color=ffffff face=arial>$title - Letzte &Auml;nderung $datum\n; Der Chat wird geladen...\n<br>";
+ sleep 1;
+ print "<b>Hallo <font color=$col>$alias</font></b>, mit dem Befehl /menu kannst du das Chat-Men&uuml; aufrufen!<br>";
+ sleep 1;
+ print "Du befindest dich im Raum <b>$room</b>: " . get_theme($room) . "<br>\n";
+ print "</font>\n";
+
+ if (-f "data/user/memos/$alias") {
+ open MEMOS, "<data/user/memos/$alias";
+ my(@memos) = <MEMOS>;
+ close MEMOS;
+ my $memos;
+ foreach $_ (@memos) {
+ $memos .= $_;
+ }
+ print $memos;
+ unlink "data/user/memos/$alias";
+ }
+
+ my ($change_room,
+ $startime,
+ $flooding,
+ @ignore,
+ @flood);
+
+ OPENMSGFILE:
+ $change_room = 0;
+ $startime = time;
+ $flooding = 0;
+ unless (-f "data/online/rstat/$room") {
+ open DATEI, ">data/online/rstat/$room";
+ print DATEI "0\n\n$alias<;1\n";
+ close DATEI;
+ }
+ open DATEI, ">data/online/users/$alias";
+ print DATEI time;
+ close DATEI;
+ open DATEI, ">data/online/rooms/$room/$alias";
+ print DATEI time;
+ close DATEI;
+ if (-e "data/msgs/$room") {
+ open MSGFILE, "<data/msgs/$room";
+ mkdir 'data/online/pids', 511 unless -d 'data/online/pids';
+ mkdir "data/online/pids/$room", 511 unless -d "data/online/pids/$room";
+ open PID, ">data/online/pids/$room/$pid";
+ print PID time;
+ close PID;
+ }
+ else {
+ sleep 1;
+ goto OPENMSGFILE;
+ }
+ &sendmsgs;
+ while (-f "data/online/users/$alias") {
+ local $SIG{'USR1'} = \&sendmsgs;
+ goto OPENMSGFILE if $change_room == 1;
+ unlink "data/online/rooms/$loginplace/$alias"
+ if (-f "data/online/rooms/$loginplace/$alias");
+ sleep 15;
+ print "\n";
+ }
+ sub sendmsgs {
+ for ($curpos = tell MSGFILE; defined($_ = <MSGFILE>); $curpos = tell MSGFILE) {
+ my($address, $stamp, $command, $action, $message, $from) = split(/<;/, $_, 7);
+ if ($address =~ /$\!/ or $address eq $alias) {
+ if ($stamp > $startime) {
+ if ($command eq 'col') {
+ ($col, $secol) = split(/;/, $action, 3);
+ }
+ elsif ($command eq 'cr') {
+ unlink "data/online/pids/$room/$pid";
+ $room = $action;
+ close MSGFILE;
+ $change_room = 1;
+ }
+ elsif ($command eq 'ig') {
+ my @temp;
+ my $add2list = 1;
+ foreach $_ (@ignore) {
+ if ($action ne $_) {
+ push @temp, $_;
+ }
+ else {
+ $add2list = 0;
+ }
+ }
+ if ($add2list == 1) {
+ push @ignore, $action;
+ print "<font color='#ffffff'><font color='#ffa500'>$action</font> wird nun ignoriert!</font><br>\n";
+ &post_prv_extra($action, "<font color='#ff0000'>Du wirst nun von $alias ignoriert!</font>");
+ }
+ else {
+ @ignore = @temp;
+ print "<font color='#ffffff'><font color='#ffa500'>$action</font> wird nun nicht mehr ignoriert!</font><br>\n";
+ &post_prv_extra($action, "<font color='#ff0000'>Du wirst nun von $alias nicht mehr ignoriert!</font>");
+ }
+ }
+ elsif ($command eq 'igl') {
+ my $ignored;
+ foreach $_ (@ignore) {
+ $ignored .= "$_ ";
+ }
+ if ($#ignore == -1) {
+ print "<font color='#ffffff'>Momentan wird keine Person von dir ignoriert!</font><br>\n";
+ }
+ else {
+ print "<font color='#ffffff'>Folgende Personen werden von dir ignoriert: <font color='#ffa500'>$ignored</font>!</font><br>\n";
+ }
+ }
+ elsif ($command eq 'quit') {
+ print "<script language='JavaScript'>\n";
+ print "open('chat?request=online&room=$loginplace&alias=$alias&tmpid=$tmpid','online');\n";
+ print "open('chat?request=htdocs','input');\n";
+ print "open('chat?request=loggedin&alias=$alias&col=$col&secol=$secol&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder','main');\n";
+ print "</script>\n";
+ last;
+ }
+ elsif ($change_room != 1) {
+ my $ignored = 0;
+ foreach $_ (@ignore) {
+ if ($_ eq $from) {
+ $ignored = 1;
+ last;
+ }
+ }
+ if ($ignored != 1) {
+ print "$message\n";
+ }
+ else {
+ $address =~ s/!//;
+ &post_prv_extra($from, "<font color='#ff0000'>Du wirst von $alias ignoriert!</font>") if $address eq $alias;
+ }
+ }
+ push @flood, $address . $command . $action . $message . $from;
+ if ($flood[0] eq $flood[1] and $flood[0] eq $flood[2] and $flood[0] eq $flood[3]) {
+ print "<i><font color=red>$from flutet den Chat !</font></i><br>\n";
+ if ($from eq $alias and $flooding++ and $flooding >= 4) {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='ffa500'><b>Das System</b></font> katapultiert <font color='".&get_ident($alias,3)."'>$alias</font>> wegen Fluten des Chats nach draussen ... </font></i>", $alias);
+ print "<script language='JavaScript'>open('chat?request=start&tmp=autokick','_top');</script>\n";
+ &rm_alias($alias, $room);
+ }
+ }
+ else {
+ $flooding = 0;
+ }
+ shift @flood if $#flood > 2;
+ }
+ }
+ }
+ seek MSGFILE, $curpos, 0;
+ }
+ unlink "data/online/pids/$room/$pid";
+}
+sub post_prv_extra {
+ my($alias, $message) = @_;
+ my $helpid = fork;
+ if ($helpid == 0) {
+ &post_prv($alias, $message);
+ exit 0;
+ }
+}
+1;
diff --git a/0.8.0/modules/webchat.pm b/0.8.0/modules/webchat.pm
new file mode 100755
index 0000000..90f8731
--- /dev/null
+++ b/0.8.0/modules/webchat.pm
@@ -0,0 +1,22 @@
+sub webchat {
+ my @rooms = &diropen('data/online/rooms');
+ my $output;
+
+ foreach my $room (@rooms) {
+ next if ($room =~ /\./);
+ my @users = &diropen("data/online/rooms/$room") or print "$!\n";
+
+ foreach my $user (@users) {
+ next if ($user =~ /\./);
+ open FILE, "data/online/rooms/$room/$user";
+ my $timestamp = <FILE>;
+ close FILE;
+ chomp $timestamp;
+
+ $output = $output . "($user)($timestamp)($room)\n";
+ }
+ }
+
+ print $output;
+}
+1;
diff --git a/0.8.0/setup.sh b/0.8.0/setup.sh
new file mode 100755
index 0000000..460655c
--- /dev/null
+++ b/0.8.0/setup.sh
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+mke2fs /dev/ram0
+mke2fs /dev/ram1
+
+mkdir data
+cd data
+mkdir {logs,msgs,user,online}
+mount /dev/ram0 msgs
+mount /dev/ram1 online
+cd user
+mkdir {counts,memos,options,profiles,gbooks,lastlogin}
+cd ../online
+mkdir {rstat,rooms,pids,users,ident,tmpid,awake}
+cd ..
+
+chmod 700 * -R
+chown yC * -R
diff --git a/0.8.0/templates/chatiq.sno b/0.8.0/templates/chatiq.sno
new file mode 100755
index 0000000..2a024f5
--- /dev/null
+++ b/0.8.0/templates/chatiq.sno
@@ -0,0 +1 @@
+<div><h2>Chatiquette</h2></div><hr><div>Hier einige Grundlagen ...</div><style type="text/css"> li { color: #ffffff }</style><ul><li><div>Vergiss nie, dass am anderen Ende auch nur Menschen sitzen. Diese m&ouml;gen es gar nicht, angep&ouml;belt, beleidigt oder in sonstiger Weise angegriffen zu werden.</div></li><li><div>St&ouml;rend ist auch immer, wenn ein privater Streit im Chat ausgetragen wird. Tragt eure privaten Sachen ausserhalb des Chats aus.<br>Selbst wenn es nur Spass ist - weiss der Rest im Chat das?</div></li><li><div>Dauergeschrei f&auml;llt auch immer wieder st&ouml;rend auf. Was in Grossbuchstaben geschrieben wird, wird als Schreien bezeichnet.</div></li><li><div>Unsere ganz besonderen Spezialisten wollen auch immer wieder rausfliegen. Um das zu erreichen, senden sie die ganze Zeit Unsinn.</div></li><li><div>Diskussionen sind dagegen kein Problem. Daf&uuml;r ist ein Chat ja da. Sobald allerdings das Thema der Diskussion zu sehr entgleist, sollte die Diskussion in einen etwas weniger &ouml;ffentlichen Raum verlegt werden.</div></li></ul><div>Daraus ergeben sich folgende Regeln:</div><ul><li><div>keinen beleidigenden Wortschatz verwenden</div></li><li><div>obz&ouml;ner und verfassungsfeindlicher Wortschatz f&auml;llt auch weg</div></li><li><div>streitet euch woanders oder in einem privaten Raum</div></li><li><div>schreit nich so viel</div></li><li><div>schreibt keinen Unsinn, der so aussieht, als ob eure Katze über die Tastatur gelaufen ist</div></li><li><div>schreibt nicht zu schnell hintereinander, besonders nicht dasselbe</div></li><li><div>verlagert die Diskussion, wenn sich jemand gest&ouml;rt f&uuml;hlt</div></li><li><div>Diese Liste ist nicht vollst&auml;ndig. Mit dem gesunden Menschenverstand sollte es eigentlich m&ouml;glich sein, sich die nicht aufgef&uuml;hrten Punkte zu denken.</div></li></ul><div>So - nach den ganzen "lass-es-bessers" noch ein paar &Uuml;berlebenstips:</div><ul><li><div>beachte die oben stehenden Punkte ;-)</div></li><li><div>es macht sich immer gut, beim Reinkommen mal zu gr&uuml;ssen</div></li><li><div>warte nicht, bis man/frau dich anspricht - werde selbst aktiv und gib deinen Senf dazu</div></li><li><div>es gibt meist kein allgemein anerkanntes Gespr&auml;chsthema - lies dich einfach rein</div></li><li><div>die frage &quot;wer will chatten&quot; ist eigentlich &uuml;berfl&uuml;ssig in einem Chat (wir warten doch alle nur aufs Ufo ;-)</div></li><li><div>fang nich sofort mit den W-Fragen (woher, wie alt, weiblich oder männlich?) an - es st&ouml;rt einige Leute</div></li></ul><div>Problematisch f&uuml;r die W&auml;chter und Oberw&auml;chter ist:</div><ul><li><div>&quot;der nervt mich - schmeiss den mal raus&quot; ist oft nicht nachvollziehbar, weil der W&Auml; oder OW die Vorgeschichte - die vielleicht ausserhalb des yChat stattgefunden hat - nicht kennt oder keinen Beweis daf&uuml;r hat.</div></li></ul><hr><div><h2>Richtlinien f&uuml;r den gestressten W&Auml; und OW:</h2></div><ul><li><div>Du hast die Macht - aber mi&szlig;brauche sie nicht!</div></li><li><div>Leute, die ganz offensichtlich st&ouml;ren wollen und dabei den Chatbetrieb massiv behindern, sofort rausschmeissen! Kriterien dazu:</div><ul><li><div>Fluten des Chats</div></li><li><div>Wiederholung von Parolen</div></li><li><div>Exzessive Nutzung von zuf&auml;lligen Buchstaben-/Zeichenfolgen</div></li><li><div>usw...</div></li></ul></li><li><div>Bei den anderen vorher noch eine Warnung aussprechen...</div></li><li><div>Nicht vergessen: auch f&uuml;r euch gelten die oben aufgef&uuml;hrten Regeln!</div></li><li><div>Vergabe von Raumbesetzer- und W&auml;chterrechten:<br>(dies gilt f&uuml;r RB-Vergabe in der Cyberbar, W&Auml; allgemein)</div><ul><li><div>Um RB oder W&Auml; betteln wird schon mal gar nicht beachtet.</div></li><li><div>Wer W&Auml; wird, soll sichs verdienen - z.B. durch h&auml;ufiges Helfen bei Neulingen.</div></li><li><div>Ein W&Auml; sollte schon &ouml;fter im Chat sein.</div></li><li><div>Oberw&auml;chter zu werden ist sehr schwierig. Frag gar nicht erst danach ;-)</div></li></ul></ul><div>Wer meint, von einem W&auml;chter oder Oberw&auml;chter ungerecht behandelt worden zu sein (z.B. weil dieser wegen persönlichen Streitigkeiten rausschmeisst), richte seine Klage an einen Oberw&auml;chter oder direkt an den obersten Boss: Snooper (<a href="mailto:admin@ychat.de">admin@ychat.de</a>).</div> \ No newline at end of file
diff --git a/0.8.0/templates/colors.sno b/0.8.0/templates/colors.sno
new file mode 100755
index 0000000..3640b9e
--- /dev/null
+++ b/0.8.0/templates/colors.sno
@@ -0,0 +1,290 @@
+ <table cellspacing=0 cellpadding=5 border=0>
+ <tr>
+ <td bgcolor="000000"><span style="color:#FFFFFF; text-decoration:line-through;">000000</span></td>
+ <td bgcolor="000033"><span style="color:#FFFFFF; text-decoration:line-through;">000033</span></td>
+ <td bgcolor="000066"><span style="color:#FFFFFF; text-decoration:line-through;">000066</span></td>
+ <td bgcolor="000099"><span style="color:#FFFFFF; text-decoration:line-through;">000099</span></td>
+ <td bgcolor="0000CC"><span style="color:#FFFFFF; text-decoration:line-through;">0000CC</span></td>
+ <td bgcolor="0000FF"><a href="javascript:insertcode('0000FF');" style="color:#FFFFFF;">0000FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="003300"><span style="color:#FFFFFF; text-decoration:line-through;">003300</span></td>
+ <td bgcolor="003333"><span style="color:#FFFFFF; text-decoration:line-through;">003333</span></td>
+ <td bgcolor="003366"><span style="color:#FFFFFF; text-decoration:line-through;">003366</span></td>
+ <td bgcolor="003399"><a href="javascript:insertcode('003399');" style="color:#FFFFFF;">003399</a></td>
+ <td bgcolor="0033CC"><a href="javascript:insertcode('0033CC');" style="color:#FFFFFF;">0033CC</a></td>
+ <td bgcolor="0033FF"><a href="javascript:insertcode('0033FF');" style="color:#FFFFFF;">0033FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="006600"><span style="color:#FFFFFF; text-decoration:line-through;">006600</span></td>
+ <td bgcolor="006633"><span style="color:#FFFFFF; text-decoration:line-through;">006633</span></td>
+ <td bgcolor="006666"><a href="javascript:insertcode('006666');" style="color:#FFFFFF;">006666</a></td>
+ <td bgcolor="006699"><a href="javascript:insertcode('006699');" style="color:#FFFFFF;">006699</a></td>
+ <td bgcolor="0066CC"><a href="javascript:insertcode('0066CC');" style="color:#FFFFFF;">0066CC</a></td>
+ <td bgcolor="0066FF"><a href="javascript:insertcode('0066FF');" style="color:#FFFFFF;">0066FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="009900"><a href="javascript:insertcode('009900');" style="color:#FFFFFF;">009900</a></td>
+ <td bgcolor="009933"><a href="javascript:insertcode('009933');" style="color:#FFFFFF;">009933</a></td>
+ <td bgcolor="009966"><a href="javascript:insertcode('009966');" style="color:#FFFFFF;">009966</a></td>
+ <td bgcolor="009999"><a href="javascript:insertcode('009999');" style="color:#FFFFFF;">009999</a></td>
+ <td bgcolor="0099CC"><a href="javascript:insertcode('0099CC');" style="color:#FFFFFF;">0099CC</a></td>
+ <td bgcolor="0099FF"><a href="javascript:insertcode('0099FF');" style="color:#FFFFFF;">0099FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00CC00"><a href="javascript:insertcode('00CC00');" style="color:#000000;">00CC00</a></td>
+ <td bgcolor="00CC33"><a href="javascript:insertcode('00CC33');" style="color:#000000;">00CC33</a></td>
+ <td bgcolor="00CC66"><a href="javascript:insertcode('00CC66');" style="color:#000000;">00CC66</a></td>
+ <td bgcolor="00CC99"><a href="javascript:insertcode('00CC99');" style="color:#000000;">00CC99</a></td>
+ <td bgcolor="00CCCC"><a href="javascript:insertcode('00CCCC');" style="color:#000000;">00CCCC</a></td>
+ <td bgcolor="00CCFF"><a href="javascript:insertcode('00CCFF');" style="color:#000000;">00CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00FF00"><a href="javascript:insertcode('00FF00');" style="color:#000000;">00FF00</a></td>
+ <td bgcolor="00FF33"><a href="javascript:insertcode('00FF33');" style="color:#000000;">00FF33</a></td>
+ <td bgcolor="00FF66"><a href="javascript:insertcode('00FF66');" style="color:#000000;">00FF66</a></td>
+ <td bgcolor="00FF99"><a href="javascript:insertcode('00FF99');" style="color:#000000;">00FF99</a></td>
+ <td bgcolor="00FFCC"><a href="javascript:insertcode('00FFCC');" style="color:#000000;">00FFCC</a></td>
+ <td bgcolor="00FFFF"><a href="javascript:insertcode('00FFFF');" style="color:#000000;">00FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="330000"><span style="color:#FFFFFF; text-decoration:line-through;">330000</span></td>
+ <td bgcolor="330033"><span style="color:#FFFFFF; text-decoration:line-through;">330033</span></td>
+ <td bgcolor="330066"><span style="color:#FFFFFF; text-decoration:line-through;">330066</span></td>
+ <td bgcolor="330099"><a href="javascript:insertcode('330099');" style="color:#FFFFFF;">330099</a></td>
+ <td bgcolor="3300CC"><a href="javascript:insertcode('3300CC');" style="color:#FFFFFF;">3300CC</a></td>
+ <td bgcolor="3300FF"><a href="javascript:insertcode('3300FF');" style="color:#FFFFFF;">3300FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="333300"><span style="color:#FFFFFF; text-decoration:line-through;">333300</span></td>
+ <td bgcolor="333333"><span style="color:#FFFFFF; text-decoration:line-through;">333333</span></td>
+ <td bgcolor="333366"><a href="javascript:insertcode('333366');" style="color:#FFFFFF;">333366</a></td>
+ <td bgcolor="333399"><a href="javascript:insertcode('333399');" style="color:#FFFFFF;">333399</a></td>
+ <td bgcolor="3333CC"><a href="javascript:insertcode('3333CC');" style="color:#FFFFFF;">3333CC</a></td>
+ <td bgcolor="3333FF"><a href="javascript:insertcode('3333FF');" style="color:#FFFFFF;">3333FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="336600"><a href="javascript:insertcode('336600');" style="color:#FFFFFF;">336600</a></td>
+ <td bgcolor="336633"><a href="javascript:insertcode('336633');" style="color:#FFFFFF;">336633</a></td>
+ <td bgcolor="336666"><a href="javascript:insertcode('336666');" style="color:#FFFFFF;">336666</a></td>
+ <td bgcolor="336699"><a href="javascript:insertcode('336699');" style="color:#FFFFFF;">336699</a></td>
+ <td bgcolor="3366CC"><a href="javascript:insertcode('3366CC');" style="color:#FFFFFF;">3366CC</a></td>
+ <td bgcolor="3366FF"><a href="javascript:insertcode('3366FF');" style="color:#FFFFFF;">3366FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="339900"><a href="javascript:insertcode('339900');" style="color:#FFFFFF;">339900</a></td>
+ <td bgcolor="339933"><a href="javascript:insertcode('339933');" style="color:#FFFFFF;">339933</a></td>
+ <td bgcolor="339966"><a href="javascript:insertcode('339966');" style="color:#FFFFFF;">339966</a></td>
+ <td bgcolor="339999"><a href="javascript:insertcode('339999');" style="color:#FFFFFF;">339999</a></td>
+ <td bgcolor="3399CC"><a href="javascript:insertcode('3399CC');" style="color:#FFFFFF;">3399CC</a></td>
+ <td bgcolor="3399FF"><a href="javascript:insertcode('3399FF');" style="color:#FFFFFF;">3399FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33CC00"><a href="javascript:insertcode('33CC00');" style="color:#000000;">33CC00</a></td>
+ <td bgcolor="33CC33"><a href="javascript:insertcode('33CC33');" style="color:#000000;">33CC33</a></td>
+ <td bgcolor="33CC66"><a href="javascript:insertcode('33CC66');" style="color:#000000;">33CC66</a></td>
+ <td bgcolor="33CC99"><a href="javascript:insertcode('33CC99');" style="color:#000000;">33CC99</a></td>
+ <td bgcolor="33CCCC"><a href="javascript:insertcode('33CCCC');" style="color:#000000;">33CCCC</a></td>
+ <td bgcolor="33CCFF"><a href="javascript:insertcode('33CCFF');" style="color:#000000;">33CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33FF00"><a href="javascript:insertcode('33FF00');" style="color:#000000;">33FF00</a></td>
+ <td bgcolor="33FF33"><a href="javascript:insertcode('33FF33');" style="color:#000000;">33FF33</a></td>
+ <td bgcolor="33FF66"><a href="javascript:insertcode('33FF66');" style="color:#000000;">33FF66</a></td>
+ <td bgcolor="33FF99"><a href="javascript:insertcode('33FF99');" style="color:#000000;">33FF99</a></td>
+ <td bgcolor="33FFCC"><a href="javascript:insertcode('33FFCC');" style="color:#000000;">33FFCC</a></td>
+ <td bgcolor="33FFFF"><a href="javascript:insertcode('33FFFF');" style="color:#000000;">33FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="660000"><span style="color:#FFFFFF; text-decoration:line-through;">660000</span></td>
+ <td bgcolor="660033"><span style="color:#FFFFFF; text-decoration:line-through;">660033</span></td>
+ <td bgcolor="660066"><a href="javascript:insertcode('660066');" style="color:#FFFFFF;">660066</a></td>
+ <td bgcolor="660099"><a href="javascript:insertcode('660099');" style="color:#FFFFFF;">660099</a></td>
+ <td bgcolor="6600CC"><a href="javascript:insertcode('6600CC');" style="color:#FFFFFF;">6600CC</a></td>
+ <td bgcolor="6600FF"><a href="javascript:insertcode('6600FF');" style="color:#FFFFFF;">6600FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="663300"><a href="javascript:insertcode('663300');" style="color:#FFFFFF;">663300</a></td>
+ <td bgcolor="663333"><a href="javascript:insertcode('663333');" style="color:#FFFFFF;">663333</a></td>
+ <td bgcolor="663366"><a href="javascript:insertcode('663366');" style="color:#FFFFFF;">663366</a></td>
+ <td bgcolor="663399"><a href="javascript:insertcode('663399');" style="color:#FFFFFF;">663399</a></td>
+ <td bgcolor="6633CC"><a href="javascript:insertcode('6633CC');" style="color:#FFFFFF;">6633CC</a></td>
+ <td bgcolor="6633FF"><a href="javascript:insertcode('6633FF');" style="color:#FFFFFF;">6633FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="666600"><a href="javascript:insertcode('666600');" style="color:#FFFFFF;">666600</a></td>
+ <td bgcolor="666633"><a href="javascript:insertcode('666633');" style="color:#FFFFFF;">666633</a></td>
+ <td bgcolor="666666"><a href="javascript:insertcode('666666');" style="color:#FFFFFF;">666666</a></td>
+ <td bgcolor="666699"><a href="javascript:insertcode('666699');" style="color:#FFFFFF;">666699</a></td>
+ <td bgcolor="6666CC"><a href="javascript:insertcode('6666CC');" style="color:#FFFFFF;">6666CC</a></td>
+ <td bgcolor="6666FF"><a href="javascript:insertcode('6666FF');" style="color:#FFFFFF;">6666FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="669900"><a href="javascript:insertcode('669900');" style="color:#000000;">669900</a></td>
+ <td bgcolor="669933"><a href="javascript:insertcode('669933');" style="color:#000000;">669933</a></td>
+ <td bgcolor="669966"><a href="javascript:insertcode('669966');" style="color:#000000;">669966</a></td>
+ <td bgcolor="669999"><a href="javascript:insertcode('669999');" style="color:#000000;">669999</a></td>
+ <td bgcolor="6699CC"><a href="javascript:insertcode('6699CC');" style="color:#000000;">6699CC</a></td>
+ <td bgcolor="6699FF"><a href="javascript:insertcode('6699FF');" style="color:#000000;">6699FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66CC00"><a href="javascript:insertcode('66CC00');" style="color:#000000;">66CC00</a></td>
+ <td bgcolor="66CC33"><a href="javascript:insertcode('66CC33');" style="color:#000000;">66CC33</a></td>
+ <td bgcolor="66CC66"><a href="javascript:insertcode('66CC66');" style="color:#000000;">66CC66</a></td>
+ <td bgcolor="66CC99"><a href="javascript:insertcode('66CC99');" style="color:#000000;">66CC99</a></td>
+ <td bgcolor="66CCCC"><a href="javascript:insertcode('66CCCC');" style="color:#000000;">66CCCC</a></td>
+ <td bgcolor="66CCFF"><a href="javascript:insertcode('66CCFF');" style="color:#000000;">66CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66FF00"><a href="javascript:insertcode('66FF00');" style="color:#000000;">66FF00</a></td>
+ <td bgcolor="66FF33"><a href="javascript:insertcode('66FF33');" style="color:#000000;">66FF33</a></td>
+ <td bgcolor="66FF66"><a href="javascript:insertcode('66FF66');" style="color:#000000;">66FF66</a></td>
+ <td bgcolor="66FF99"><a href="javascript:insertcode('66FF99');" style="color:#000000;">66FF99</a></td>
+ <td bgcolor="66FFCC"><a href="javascript:insertcode('66FFCC');" style="color:#000000;">66FFCC</a></td>
+ <td bgcolor="66FFFF"><a href="javascript:insertcode('66FFFF');" style="color:#000000;">66FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="990000"><a href="javascript:insertcode('990000');" style="color:#FFFFFF;">990000</a></td>
+ <td bgcolor="990033"><a href="javascript:insertcode('990033');" style="color:#FFFFFF;">990033</a></td>
+ <td bgcolor="990066"><a href="javascript:insertcode('990066');" style="color:#FFFFFF;">990066</a></td>
+ <td bgcolor="990099"><a href="javascript:insertcode('990099');" style="color:#FFFFFF;">990099</a></td>
+ <td bgcolor="9900CC"><a href="javascript:insertcode('9900CC');" style="color:#FFFFFF;">9900CC</a></td>
+ <td bgcolor="9900FF"><a href="javascript:insertcode('9900FF');" style="color:#FFFFFF;">9900FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="993300"><a href="javascript:insertcode('993300');" style="color:#FFFFFF;">993300</a></td>
+ <td bgcolor="993333"><a href="javascript:insertcode('993333');" style="color:#FFFFFF;">993333</a></td>
+ <td bgcolor="993366"><a href="javascript:insertcode('993366');" style="color:#FFFFFF;">993366</a></td>
+ <td bgcolor="993399"><a href="javascript:insertcode('993399');" style="color:#FFFFFF;">993399</a></td>
+ <td bgcolor="9933CC"><a href="javascript:insertcode('9933CC');" style="color:#FFFFFF;">9933CC</a></td>
+ <td bgcolor="9933FF"><a href="javascript:insertcode('9933FF');" style="color:#FFFFFF;">9933FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="996600"><a href="javascript:insertcode('996600');" style="color:#FFFFFF;">996600</a></td>
+ <td bgcolor="996633"><a href="javascript:insertcode('996633');" style="color:#FFFFFF;">996633</a></td>
+ <td bgcolor="996666"><a href="javascript:insertcode('996666');" style="color:#FFFFFF;">996666</a></td>
+ <td bgcolor="996699"><a href="javascript:insertcode('996699');" style="color:#FFFFFF;">996699</a></td>
+ <td bgcolor="9966CC"><a href="javascript:insertcode('9966CC');" style="color:#FFFFFF;">9966CC</a></td>
+ <td bgcolor="9966FF"><a href="javascript:insertcode('9966FF');" style="color:#FFFFFF;">9966FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="999900"><a href="javascript:insertcode('999900');" style="color:#000000;">999900</a></td>
+ <td bgcolor="999933"><a href="javascript:insertcode('999933');" style="color:#000000;">999933</a></td>
+ <td bgcolor="999966"><a href="javascript:insertcode('999966');" style="color:#000000;">999966</a></td>
+ <td bgcolor="999999"><a href="javascript:insertcode('999999');" style="color:#000000;">999999</a></td>
+ <td bgcolor="9999CC"><a href="javascript:insertcode('9999CC');" style="color:#000000;">9999CC</a></td>
+ <td bgcolor="9999FF"><a href="javascript:insertcode('9999FF');" style="color:#000000;">9999FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99CC00"><a href="javascript:insertcode('99CC00');" style="color:#000000;">99CC00</a></td>
+ <td bgcolor="99CC33"><a href="javascript:insertcode('99CC33');" style="color:#000000;">99CC33</a></td>
+ <td bgcolor="99CC66"><a href="javascript:insertcode('99CC66');" style="color:#000000;">99CC66</a></td>
+ <td bgcolor="99CC99"><a href="javascript:insertcode('99CC99');" style="color:#000000;">99CC99</a></td>
+ <td bgcolor="99CCCC"><a href="javascript:insertcode('99CCCC');" style="color:#000000;">99CCCC</a></td>
+ <td bgcolor="99CCFF"><a href="javascript:insertcode('99CCFF');" style="color:#000000;">99CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99FF00"><a href="javascript:insertcode('99FF00');" style="color:#000000;">99FF00</a></td>
+ <td bgcolor="99FF33"><a href="javascript:insertcode('99FF33');" style="color:#000000;">99FF33</a></td>
+ <td bgcolor="99FF66"><a href="javascript:insertcode('99FF66');" style="color:#000000;">99FF66</a></td>
+ <td bgcolor="99FF99"><a href="javascript:insertcode('99FF99');" style="color:#000000;">99FF99</a></td>
+ <td bgcolor="99FFCC"><a href="javascript:insertcode('99FFCC');" style="color:#000000;">99FFCC</a></td>
+ <td bgcolor="99FFFF"><a href="javascript:insertcode('99FFFF');" style="color:#000000;">99FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC0000"><a href="javascript:insertcode('CC0000');" style="color:#FFFFFF;">CC0000</a></td>
+ <td bgcolor="CC0033"><a href="javascript:insertcode('CC0033');" style="color:#FFFFFF;">CC0033</a></td>
+ <td bgcolor="CC0066"><a href="javascript:insertcode('CC0066');" style="color:#FFFFFF;">CC0066</a></td>
+ <td bgcolor="CC0099"><a href="javascript:insertcode('CC0099');" style="color:#FFFFFF;">CC0099</a></td>
+ <td bgcolor="CC00CC"><a href="javascript:insertcode('CC00CC');" style="color:#FFFFFF;">CC00CC</a></td>
+ <td bgcolor="CC00FF"><a href="javascript:insertcode('CC00FF');" style="color:#FFFFFF;">CC00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC3300"><a href="javascript:insertcode('CC3300');" style="color:#FFFFFF;">CC3300</a></td>
+ <td bgcolor="CC3333"><a href="javascript:insertcode('CC3333');" style="color:#FFFFFF;">CC3333</a></td>
+ <td bgcolor="CC3366"><a href="javascript:insertcode('CC3366');" style="color:#FFFFFF;">CC3366</a></td>
+ <td bgcolor="CC3399"><a href="javascript:insertcode('CC3399');" style="color:#FFFFFF;">CC3399</a></td>
+ <td bgcolor="CC33CC"><a href="javascript:insertcode('CC33CC');" style="color:#FFFFFF;">CC33CC</a></td>
+ <td bgcolor="CC33FF"><a href="javascript:insertcode('CC33FF');" style="color:#FFFFFF;">CC33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC6600"><a href="javascript:insertcode('CC6600');" style="color:#000000;">CC6600</a></td>
+ <td bgcolor="CC6633"><a href="javascript:insertcode('CC6633');" style="color:#000000;">CC6633</a></td>
+ <td bgcolor="CC6666"><a href="javascript:insertcode('CC6666');" style="color:#000000;">CC6666</a></td>
+ <td bgcolor="CC6699"><a href="javascript:insertcode('CC6699');" style="color:#000000;">CC6699</a></td>
+ <td bgcolor="CC66CC"><a href="javascript:insertcode('CC66CC');" style="color:#000000;">CC66CC</a></td>
+ <td bgcolor="CC66FF"><a href="javascript:insertcode('CC66FF');" style="color:#000000;">CC66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC9900"><a href="javascript:insertcode('CC9900');" style="color:#000000;">CC9900</a></td>
+ <td bgcolor="CC9933"><a href="javascript:insertcode('CC9933');" style="color:#000000;">CC9933</a></td>
+ <td bgcolor="CC9966"><a href="javascript:insertcode('CC9966');" style="color:#000000;">CC9966</a></td>
+ <td bgcolor="CC9999"><a href="javascript:insertcode('CC9999');" style="color:#000000;">CC9999</a></td>
+ <td bgcolor="CC99CC"><a href="javascript:insertcode('CC99CC');" style="color:#000000;">CC99CC</a></td>
+ <td bgcolor="CC99FF"><a href="javascript:insertcode('CC99FF');" style="color:#000000;">CC99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCCC00"><a href="javascript:insertcode('CCCC00');" style="color:#000000;">CCCC00</a></td>
+ <td bgcolor="CCCC33"><a href="javascript:insertcode('CCCC33');" style="color:#000000;">CCCC33</a></td>
+ <td bgcolor="CCCC66"><a href="javascript:insertcode('CCCC66');" style="color:#000000;">CCCC66</a></td>
+ <td bgcolor="CCCC99"><a href="javascript:insertcode('CCCC99');" style="color:#000000;">CCCC99</a></td>
+ <td bgcolor="CCCCCC"><a href="javascript:insertcode('CCCCCC');" style="color:#000000;">CCCCCC</a></td>
+ <td bgcolor="CCCCFF"><a href="javascript:insertcode('CCCCFF');" style="color:#000000;">CCCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCFF00"><a href="javascript:insertcode('CCFF00');" style="color:#000000;">CCFF00</a></td>
+ <td bgcolor="CCFF33"><a href="javascript:insertcode('CCFF33');" style="color:#000000;">CCFF33</a></td>
+ <td bgcolor="CCFF66"><a href="javascript:insertcode('CCFF66');" style="color:#000000;">CCFF66</a></td>
+ <td bgcolor="CCFF99"><a href="javascript:insertcode('CCFF99');" style="color:#000000;">CCFF99</a></td>
+ <td bgcolor="CCFFCC"><a href="javascript:insertcode('CCFFCC');" style="color:#000000;">CCFFCC</a></td>
+ <td bgcolor="CCFFFF"><a href="javascript:insertcode('CCFFFF');" style="color:#000000;">CCFFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF0000"><a href="javascript:insertcode('FF0000');" style="color:#FFFFFF;">FF0000</a></td>
+ <td bgcolor="FF0033"><a href="javascript:insertcode('FF0033');" style="color:#FFFFFF;">FF0033</a></td>
+ <td bgcolor="FF0066"><a href="javascript:insertcode('FF0066');" style="color:#FFFFFF;">FF0066</a></td>
+ <td bgcolor="FF0099"><a href="javascript:insertcode('FF0099');" style="color:#FFFFFF;">FF0099</a></td>
+ <td bgcolor="FF00CC"><a href="javascript:insertcode('FF00CC');" style="color:#FFFFFF;">FF00CC</a></td>
+ <td bgcolor="FF00FF"><a href="javascript:insertcode('FF00FF');" style="color:#FFFFFF;">FF00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF3300"><a href="javascript:insertcode('FF3300');" style="color:#FFFFFF;">FF3300</a></td>
+ <td bgcolor="FF3333"><a href="javascript:insertcode('FF3333');" style="color:#FFFFFF;">FF3333</a></td>
+ <td bgcolor="FF3366"><a href="javascript:insertcode('FF3366');" style="color:#FFFFFF;">FF3366</a></td>
+ <td bgcolor="FF3399"><a href="javascript:insertcode('FF3399');" style="color:#FFFFFF;">FF3399</a></td>
+ <td bgcolor="FF33CC"><a href="javascript:insertcode('FF33CC');" style="color:#FFFFFF;">FF33CC</a></td>
+ <td bgcolor="FF33FF"><a href="javascript:insertcode('FF33FF');" style="color:#FFFFFF;">FF33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF6600"><a href="javascript:insertcode('FF6600');" style="color:#000000;">FF6600</a></td>
+ <td bgcolor="FF6633"><a href="javascript:insertcode('FF6633');" style="color:#000000;">FF6633</a></td>
+ <td bgcolor="FF6666"><a href="javascript:insertcode('FF6666');" style="color:#000000;">FF6666</a></td>
+ <td bgcolor="FF6699"><a href="javascript:insertcode('FF6699');" style="color:#000000;">FF6699</a></td>
+ <td bgcolor="FF66CC"><a href="javascript:insertcode('FF66CC');" style="color:#000000;">FF66CC</a></td>
+ <td bgcolor="FF66FF"><a href="javascript:insertcode('FF66FF');" style="color:#000000;">FF66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF9900"><a href="javascript:insertcode('FF9900');" style="color:#000000;">FF9900</a></td>
+ <td bgcolor="FF9933"><a href="javascript:insertcode('FF9933');" style="color:#000000;">FF9933</a></td>
+ <td bgcolor="FF9966"><a href="javascript:insertcode('FF9966');" style="color:#000000;">FF9966</a></td>
+ <td bgcolor="FF9999"><a href="javascript:insertcode('FF9999');" style="color:#000000;">FF9999</a></td>
+ <td bgcolor="FF99CC"><a href="javascript:insertcode('FF99CC');" style="color:#000000;">FF99CC</a></td>
+ <td bgcolor="FF99FF"><a href="javascript:insertcode('FF99FF');" style="color:#000000;">FF99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFCC00"><a href="javascript:insertcode('FFCC00');" style="color:#000000;">FFCC00</a></td>
+ <td bgcolor="FFCC33"><a href="javascript:insertcode('FFCC33');" style="color:#000000;">FFCC33</a></td>
+ <td bgcolor="FFCC66"><a href="javascript:insertcode('FFCC66');" style="color:#000000;">FFCC66</a></td>
+ <td bgcolor="FFCC99"><a href="javascript:insertcode('FFCC99');" style="color:#000000;">FFCC99</a></td>
+ <td bgcolor="FFCCCC"><a href="javascript:insertcode('FFCCCC');" style="color:#000000;">FFCCCC</a></td>
+ <td bgcolor="FFCCFF"><a href="javascript:insertcode('FFCCFF');" style="color:#000000;">FFCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFFF00"><a href="javascript:insertcode('FFFF00');" style="color:#000000;">FFFF00</a></td>
+ <td bgcolor="FFFF33"><a href="javascript:insertcode('FFFF33');" style="color:#000000;">FFFF33</a></td>
+ <td bgcolor="FFFF66"><a href="javascript:insertcode('FFFF66');" style="color:#000000;">FFFF66</a></td>
+ <td bgcolor="FFFF99"><a href="javascript:insertcode('FFFF99');" style="color:#000000;">FFFF99</a></td>
+ <td bgcolor="FFFFCC"><a href="javascript:insertcode('FFFFCC');" style="color:#000000;">FFFFCC</a></td>
+ <td bgcolor="FFFFFF"><a href="javascript:insertcode('FFFFFF');" style="color:#000000;">FFFFFF</a></td>
+ </tr>
+</table> \ No newline at end of file
diff --git a/0.8.0/templates/help.sno b/0.8.0/templates/help.sno
new file mode 100755
index 0000000..e1f6de9
--- /dev/null
+++ b/0.8.0/templates/help.sno
@@ -0,0 +1,79 @@
+<div>
+ Alle Chat-Befehle:
+</div>
+<hr>
+<table border=1>
+<tr><th><div>SU</div></th><th><div>Befehl</div></th><th><div>Beschreibung</div></th></tr>
+<tr><td><div>NC</div></td><td><div>/about</div></td><td><div>Zeigt aktuelle Version und andere Infos der Community an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/away <font color=red>Nachricht</font></div></td><td><div>Abmelden mit einer<font color=red>Abmeldenachricht</font></div></td></tr>
+<tr><td><div>NC</div></td><td><div>/clear</div></td><td><div>Bildschirm wird gelöscht</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/col <font color=red>XXXXXX</font> <font color=ffa500>XXXXXX</font></div></td><td><div>Farbe/n (<font color=red>Namensfarbe</font> / <font color=ffa500>Textfarbe</font>) wechseln. Angabe in Hexadezimal. Wird gar keine Farbe angegeben, dann wird eine zufällige generiert!</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/date</div></td><td><div>Zeigt aktuelles Datum und Urzeit an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/exit</div></td><td><div>Komplett aus dem System ausloggen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/getcol <font color=red>Alias</font></div></td><td><div>Zeigt an welche Farb-Codes <font color=red>Alias</font> zum Chatten verwendet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/hits</div></td><td><div>Zeigt an vor wieviel Stunden der Chat-Server neugestartet wurde und die Hits und Hits per Minute seit dieser Zeit</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ig <font color=red>Alias</font></div></td><td><div>Setzt/entfernt <font color=red>Alias</font> auf/aus die/der Ignorierliste. Wird das Argument weggelassen, so wird die Liste aller ignorierten Personen angezeigt</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/j <font color=red>Raumname</font></div></td><td><div>Raum wechseln/erstellen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ju <font color=red>Alias</font></div></td><td><div>In den Raum wechseln/folgen, wo sich <font color=red>Alias</font> befindet.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/m <font color=red>Aktion</font></div></td><td><div>Handeln mit 2 Farben</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/me <font color=red>Aktion</font></div></td><td><div>Handeln mit einer Farbe</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/memo <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine <font color=ffa500>Memonachricht</font> hinterlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/msg <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine private <font color=ffa500>Nachricht</font> flüstern</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ <font color=ffa500>Nachricht</font></div></td><td><div>Eine private <font color=ffa500>Nachricht</font> demjenigen flüstern, dem zuletzt eine geflüstert wurde</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/online <font color=red>Alias</font></div></td><td><div>Zeigt Onlineminuten von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/q</div></td><td><div>Chat verlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/rmgb</div></td><td><div>Das eigene Gästebuch komplett weglöschen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/s <font color=red>Nachricht</font></div></td><td><div><font color=red>Nachricht</font> schreien</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/seen <font color=red>Alias</font></div></td><td><div>Zeigt an, vor wieviel Stunden sich <font color=red>Nachricht</font> zum letzten Mal in das System eingelogt hat</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/selfkill</div></td><td><div>Sich selbst ganz und gar aus dem System entfernen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/sep <font color=red>Raumname</font></div></td><td><div>In den Raum <font color=red>Raumnamen</font> wechseln und gleichzeitig absperren</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/uptime</div></td><td><div>Siehe Befehl "/hits"</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/w</div></td><td><div>Zeigt an, wer sich im aktuellen Raum befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc <font color=red>Raum</font></div></td><td><div>Zeigt an, wer sich im <font color=red>Raum</font> befindet. Wird kein Raum angegeben, dann wird ledeglich angezeigt, wer sich im System befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc/</div></td><td><div>Zeigt alle offenen Räume und deren Chatter an</div></td></tr>
+<tr><td><div>NC</div></td><td> <div>/wj <font color=red>Alias</font></div></td><td><div>Zeigt an, in welchen Raum sich <font color=red>Alias</font> befindet</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/l</div></td><td><div>Der aktuelle Raum wird ab- bzw. aufgesperrt</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/rsu <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> die Raumbesetzerrechte entnehmen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/su <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Raumbesetzer ernennen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/t <font color=red>Thema</font></div></td><td><div>Dem Raum wird ein <font color=red>Thema</font> gegeben</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban</div></td><td><div>Zeigt alle verbannten Benutzer an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> verbannen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/rban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> "entbannen"</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/banip <font color=red>Alias</font></div></td><td><div>Die IP-Nummer von <font color=red>Alias</font> verbannen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/rbanip ip://<font color=red>x.x.x.x</font></div></td><td><div>Die IP-Nummer <font color=red>x.x.x.x</font> "entbannen"</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ip <font color=red>Alias</font></div></td><td><div>Zeigt die IP-Nummer von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/img</div></td><td><div>Versteckt/reaktiviert das eigene Superuser-Logo im Online-Frame</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/k <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird aus dem Chat katapultiert!</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/o <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird aus dem Chat ausgeloggt!</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/sl <font color=red>Raum</font></div></td><td><div>Einen anderen <font color=ffa500>Raum</font> absperren</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ss <font color=red>Raum</font> <font color=ffa500>Nachricht</font></div></td><td><div>Eine <font color=ffa500>Nachricht</font> in <font color=red>Raum</font> hinüber rufen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/st <font color=red>Raum</font> <font color=ffa500>Thema</font></div></td><td><div>Einem anderen <font color=red>Raum</font> ein <font color=ffa500>Thema</font > geben</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/status <font color=ffa500>Alias</font></div></td><td><div>Zeigt den Superuserstatus von <font color=ffa500>Alias</font> an</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/kill <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird ganz und gar aus dem System entfernt</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/wa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Wächter ernennen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/rwa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom Wächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/sys <font color=red>Nachricht</font></div></td><td><div>Systemnachricht schreiben. (Erscheint in allen existierenden Räumen)</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/twa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum temporären Wächter ernennen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/rtwa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom temporären Wächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=red>AD</font></div></td><td><div>/cool <font color=red>Nachricht</font></div></td><td><div>Gibt für den aktuellen Raum eine Systemmeldung aus</div></td></tr>
+<tr><td><div><font color=red>AD</font></div></td><td><div>/id <font color=red>Alias</font></div></td><td><div>Zeigt TempID von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div><font color=red>AD</font></div></td><td><div>/ow <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Oberwächter ernennen</div></td></tr>
+<tr><td><div><font color=red>AD</font></div></td><td><div>/row <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom Oberwächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=red>AD</font></div></td><td><div>/pw <font color=red>Alias</font></div></td><td><div>Zeigt das Passwort von <font color=red>Alias</font> an</div></td></tr>
+
+</table><hr>
+<div>
+ Zur Erklärung: NC steht für "Normale Chatter", RB für "Raumbesetzer", WÄ für "Wächter" und OW für "Oberwächter".
+ Obrige Befehle können nur von der/den jeweiligen Benutzergruppe/n ausgeführt werden.<br><br>
+ Allerdings gibt es folgendes zu beachten: Oberwächter verfügen über alle Chatbefehle. Normale Wächter über alle Chatbefehle, außer über die der Oberwächter.
+ Raumbesetzer können nur Raumbesetzerbefehle und die Befehle der normalen Chatter durchführen. Normale Chatter haben ledeglich die Standardbefehle zu verwenden.<br><br>
+ Weitere Besonderheiten der Wächter und Oberwächter:<br><br>
+ Wächter und Oberwächter können ....<br>
+ ... abgesperrte Chaträume problemlos betreten.<br>
+ ... nicht gekickt, verbannt oder gekillt werden.<br><br>
+ Nur Oberwächer können Logdateien der Cyberbar lesen!<br><br>
+ Oberwächter ernennt nur der Systemadministrator! Dieser wiederum hat weitere spezielle Befehle die geheim sind und die nur ihm
+ vorbehalten sind und ihm das Administrieren erleichtert.
+</div>
+</body>
+</html>
diff --git a/0.8.0/yC-web-docs/adm-i.gif b/0.8.0/yC-web-docs/adm-i.gif
new file mode 100755
index 0000000..3f45598
--- /dev/null
+++ b/0.8.0/yC-web-docs/adm-i.gif
Binary files differ
diff --git a/0.8.0/yC-web-docs/adm.gif b/0.8.0/yC-web-docs/adm.gif
new file mode 100755
index 0000000..d7b68d9
--- /dev/null
+++ b/0.8.0/yC-web-docs/adm.gif
Binary files differ
diff --git a/0.8.0/yC-web-docs/away.gif b/0.8.0/yC-web-docs/away.gif
new file mode 100755
index 0000000..c001883
--- /dev/null
+++ b/0.8.0/yC-web-docs/away.gif
Binary files differ
diff --git a/0.8.0/yC-web-docs/blank.gif b/0.8.0/yC-web-docs/blank.gif
new file mode 100755
index 0000000..dc1f36f
--- /dev/null
+++ b/0.8.0/yC-web-docs/blank.gif
Binary files differ
diff --git a/0.8.0/yC-web-docs/ow-i.gif b/0.8.0/yC-web-docs/ow-i.gif
new file mode 100755
index 0000000..71584dd
--- /dev/null
+++ b/0.8.0/yC-web-docs/ow-i.gif
Binary files differ
diff --git a/0.8.0/yC-web-docs/ow.gif b/0.8.0/yC-web-docs/ow.gif
new file mode 100755
index 0000000..b30e8f9
--- /dev/null
+++ b/0.8.0/yC-web-docs/ow.gif
Binary files differ
diff --git a/0.8.0/yC-web-docs/rb.gif b/0.8.0/yC-web-docs/rb.gif
new file mode 100755
index 0000000..321341c
--- /dev/null
+++ b/0.8.0/yC-web-docs/rb.gif
Binary files differ
diff --git a/0.8.0/yC-web-docs/twa.gif b/0.8.0/yC-web-docs/twa.gif
new file mode 100755
index 0000000..b80cea4
--- /dev/null
+++ b/0.8.0/yC-web-docs/twa.gif
Binary files differ
diff --git a/0.8.0/yC-web-docs/uvl.gif b/0.8.0/yC-web-docs/uvl.gif
new file mode 100755
index 0000000..b9208d6
--- /dev/null
+++ b/0.8.0/yC-web-docs/uvl.gif
Binary files differ
diff --git a/0.8.0/yC-web-docs/wa-i.gif b/0.8.0/yC-web-docs/wa-i.gif
new file mode 100755
index 0000000..9e9a113
--- /dev/null
+++ b/0.8.0/yC-web-docs/wa-i.gif
Binary files differ
diff --git a/0.8.0/yC-web-docs/wa.gif b/0.8.0/yC-web-docs/wa.gif
new file mode 100755
index 0000000..553984c
--- /dev/null
+++ b/0.8.0/yC-web-docs/wa.gif
Binary files differ
diff --git a/0.8.0/yC-web-docs/yIntro.swf b/0.8.0/yC-web-docs/yIntro.swf
new file mode 100755
index 0000000..81d9015
--- /dev/null
+++ b/0.8.0/yC-web-docs/yIntro.swf
Binary files differ
diff --git a/0.8.0/yC-web-docs/ySymbol.swf b/0.8.0/yC-web-docs/ySymbol.swf
new file mode 100755
index 0000000..2b899bb
--- /dev/null
+++ b/0.8.0/yC-web-docs/ySymbol.swf
Binary files differ
diff --git a/0.8.0/ychatd.pl b/0.8.0/ychatd.pl
new file mode 100755
index 0000000..f804436
--- /dev/null
+++ b/0.8.0/ychatd.pl
@@ -0,0 +1,94 @@
+#!/usr/bin/perl
+use CGI;
+$q = new CGI;
+
+use config;
+use modules::commands;
+use modules::changeroom;
+use modules::divcom;
+use modules::hierachie;
+use modules::htdocs;
+use modules::input;
+use modules::loggedin;
+use modules::online;
+use modules::postmessage;
+use modules::shared;
+use modules::start;
+use modules::statistic;
+use modules::stream;
+use modules::webchat;
+use IO::Socket;
+use Socket;
+use POSIX;
+
+$SIG{'CHLD'} = 'IGNORE';
+
+$mainsocket = 'IO::Socket::INET'->new('LocalHost', "$localhost", 'LocalPort', $localport, 'Porto', 'tcp', 'Listen', $limit + 10, 'Reuse', 1);
+die "Kann Server-Socket nicht erzeugen: $!\n" unless $mainsocket;
+
+print "yChat wurde auf $localhost:$localport gestartet...\n";
+
+$STARTIME = time;
+
+#Debugging only
+#open AWAKE, ">data/online/awake/-$$-";
+#print AWAKE "$STARTIME - Daemon";
+#close AWAKE;
+
+while ($client = $mainsocket->accept) {
+ print $client "HTTP/1.1 200 OK\nContent-type:text/html\n\n";
+
+ ++$HITS;
+ $pid = fork;
+ if ($pid == 0) {
+ my @reqheader;
+
+ $rv = $client->recv($reqheader[0], POSIX::BUFSIZ, 0);
+ @reqheader = split "\n", $reqheader[0];
+
+ my $requeststring;
+ my(@tmp) = split(/\s+/, $reqheader[0], 0);
+
+ if ($tmp[0] eq 'GET') {
+ $requeststring = $tmp[1];
+
+ } else {
+ $requeststring = 'chat?'.$reqheader[-1];
+ }
+
+ #Debug only
+ #open AWAKE, ">data/online/awake/$$";
+ #print AWAKE $requeststring;
+ #close AWAKE;
+
+ @tmp = split(/\?/, $requeststring, 0);
+ @tmp = split(/&/, $tmp[1], 0);
+ my %variables;
+
+ foreach $_ (@tmp) {
+ my(@tmp) = split(/=/, $_, 0);
+ next if $tmp[0] eq 'admin' or $tmp[0] eq 'mogeladmin';
+ $tmp[0] =~ s[/][];
+ $variables{$tmp[0]} = &url_decode($tmp[1]);
+ }
+
+ foreach $_ (keys %variables) {
+ $variables{$_} =~ s/'/\\'/g;
+ my $eval = "\$$_ = '" . $variables{$_} . "';";
+ # print "$eval\n";
+ eval $eval;
+ }
+ *STD = *STDOUT;
+ *STDOUT = $client;
+ if ($request) {
+ &secure_checkid($alias, $tmpid) if $request != 'start';
+ eval "&$request";
+ }
+ else {
+ &start;
+ }
+ &del_awake();
+ $client->shutdown(2);
+ exit 0;
+ }
+}
diff --git a/0.8.1/config.pm b/0.8.1/config.pm
new file mode 100755
index 0000000..3b3007f
--- /dev/null
+++ b/0.8.1/config.pm
@@ -0,0 +1,43 @@
+# yChat - Copyright by Paul C. Bütow
+########################### Dieser Teil bestimmt die Standart-Variabeln.
+##STANDART-CONFIGURATION:## (CSS, Farben, Version etc.)
+###########################
+$limit = 50; # Benutzerlimit
+$datum = "19.02.03"; # Datum der letzten Änderung (ändern erwünscht)
+$version = "0.8.1"; # Bitte Hauptversionsnummer nicht ändern
+$title = "yChat [$version]"; # Erscheint in der Browser-Leiste oben
+$standardroom = "Cyberbar"; # Standardchatraum
+$loginplace = "Lounge"; # Bezeichnung der Startseite nach dem Login
+$localhost = "62.75.136.147";# Host oder IP# des Chat-Servers
+$localport = 2000; # Port über den fer Chat-Server läuft
+$gfxpath = "http://$localhost/yChat"; # URL der Binärdaten (Grafiken etc.)
+$bgcolor = "#3E535B"; # Hintergrundfarbe der HTML-Seiten
+$chatbg = "#000000"; # Hintergrundfarbe des Chat-Frames
+$cryptkey = "ka:jASD73jnS"; # Hiermit wetden die PW's verschlüsselt.
+
+# PS: Um einen Chat-Administrator anzulegen, dann die Datei data/hierachie
+# anlegen, in eine Zeile muß folgendes eingetragen werden: "Nickname<;7"
+# (Natürlich ohne Anführungsstriche) Nickname ist somit Chat-Administrator
+# und kann Oberwächter und Wächter bestimmen!
+
+sub style {
+print <<ENDCSS;
+<style type="text/css">
+ body { background-color: $bgcolor }
+ body.blank { background-color: $chatbg }
+ body.online { background-color: $chatbg }
+ div { font-family: arial, geneva, verdana, helvetiva; font-size: 12px; color: #ffffff }
+ div.b { font-weight: bold; color: #ffa500 }
+ a { color: #ffffef; }
+ a:hover { color: #ffffff; }
+ p { font-family:verdana, arial, geneva, helvetica, sans-serif; color:#FFFFFF; font-size:12px; }
+</style>
+<style type="text/css" media="all">
+ a { text-decoration: none; }
+ a:hover { text-decoration:underline; }
+ input { border:2px solid #000000; font-size:12px; color:#000000; background-color: #ffffff; height:23px; padding:2px;}
+ select { border:2px solid #000000; font-family:arial, verdana, helvetica; font-size:11px; color:#000000; height:21px; padding:2px;}
+</style>
+ENDCSS
+}
+1;
diff --git a/0.8.1/data/hierachie b/0.8.1/data/hierachie
new file mode 100755
index 0000000..8f5f747
--- /dev/null
+++ b/0.8.1/data/hierachie
@@ -0,0 +1,12 @@
+red_pepper<;2
+Snoop<;3
+Lantara<;8
+SMX<;5
+bilke<;6
+Stoffel<;6
+Romeo3008<;5
+Chatter<;5
+Cozmo<;7
+Snooper<;9
+Tekkie<;7
+Peacemaker<;7
diff --git a/0.8.1/modules/changeroom.pm b/0.8.1/modules/changeroom.pm
new file mode 100755
index 0000000..4a5e787
--- /dev/null
+++ b/0.8.1/modules/changeroom.pm
@@ -0,0 +1,67 @@
+sub change_room {
+ my($method, $newroom, $oldroom, $alias2) = @_;
+ if ($newroom eq $oldroom) {
+ &post_prv($alias, "<font color='ffffff'>Du befindest dich bereits im Raum <font color='ffa500'>$newroom</font>!</font>");
+ &reload_html;
+ }
+ elsif ($newroom eq $loginplace) {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> verl&auml;sst den Chat und geht in die <b>$loginplace</b> ... </font></i>", $alias);
+ &post_strmsg($alias, $room, 'quit');
+ unlink "data/online/rooms/$room/$alias";
+ &rm_rstat($alias, $room);
+ &check_online;
+ &reload_html;
+ }
+ open RSTAT, "<data/online/rstat/$newroom";
+ my(@rstat) = <RSTAT>;
+ close RSTAT;
+ if ($rstat[0] eq "1\n") {
+ if (3 <= &hierachie($alias)) {
+ &post_prv($alias, "<font color='ffffff'>Der Raum <font color='ffa500'>$newroom</font> ist leider abgesperrt!</font>");
+ &reload_html;
+ }
+ }
+ &private_javascript($alias, $room, "parent.input.document.inf.room.value = '$newroom';open('chat?request=online&room=$newroom&alias=$alias&tmpid=$tmpid','online');");
+ open MSGFILE, ">>data/msgs/$newroom";
+ print MSGFILE "$alias<;" . time . "<;!<;!<;<;\n";
+ close MSGFILE;
+ open MSGFILE, ">>data/msgs/$room";
+ if ($method eq 'j') {
+ print MSGFILE "$alias<;" . time . q[<;!<;!<;<i><font color='ffffff'>] . &timestring . " Du wechselst aus dem Raum <b>$oldroom</b> herein nach <b>$newroom</b> ...</font></i><br><;\n";
+ }
+ elsif ($method eq 'ju') {
+ print MSGFILE "$alias<;" . time . q[<;!<;!<;<i><font color='ffffff'>] . &timestring . " Du folgst <font color='".&get_ident($alias2,3)."'>$alias2</font> aus dem Raum <b>$oldroom</b> herein nach <b>$newroom</b> ...</font></i><br><;\n";
+ }
+ elsif ($method eq 'sep') {
+ print MSGFILE "$alias<;" . time . q[<;!<;!<;<i><font color='ffffff'>] . &timestring . " Du wechselst aus dem Raum <b>$oldroom</b> herein nach <b>$newroom</b> und sperrst ab...</font></i><br><;\n";
+ }
+ close MSGFILE;
+ &post_strmsg($alias, $room, 'cr', $newroom);
+ $room = $oldroom;
+ my $tmpstamp = time;
+ if ($method eq 'j') {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> wechselt in den Raum <b>$newroom</b> ...</font></i>", $alias);
+ $room = $newroom;
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> kommt aus dem Raum <b>$oldroom</b> herein nach <b>$newroom</b> ...</font></i>", $alias);
+ }
+ elsif ($method eq 'ju') {
+ my $col2 = &get_ident($alias2,3);
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> folgt <font color='$col2'>$alias2</font> in den Raum <b>$newroom</b> ...</font></i>", $alias);
+ $room = $newroom;
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> kommt aus dem Raum <b>$oldroom</b> und folgt <font color='$col2'>$alias2</font> herein nach <b>$newroom</b> ...</font></i>", $alias);
+ }
+ elsif ($method eq 'sep') {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> wechselt in den Raum <b>$newroom</b> und sperrt ab...</font></i>", $alias);
+ $room = $newroom;
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> kommt aus dem Raum <b>$oldroom</b> herein nach <b>$newroom</b> und sperrt ab...</font></i>", $alias);
+ }
+ elsif ($method eq 'beam') {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias2</font> beamt <b>$alias</b> in den Raum <b>$newroom</b>...</font></i>", $alias2);
+ $room = $newroom;
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias2</font> beamt <b>$alias</b> aus dem Raum <b>$oldroom</b> herein nach <b>$room</b>...</font></i>", $alias2);
+ }
+ unlink "data/online/rooms/$oldroom/$alias";
+ &rm_rstat($alias, $oldroom);
+ &check_online;
+}
+1;
diff --git a/0.8.1/modules/commands.pm b/0.8.1/modules/commands.pm
new file mode 100755
index 0000000..8d6211b
--- /dev/null
+++ b/0.8.1/modules/commands.pm
@@ -0,0 +1,867 @@
+sub command {
+ $_[0] = $_[0] . ' ';
+ $_[0] = substr($_[0], 1, length($_[0]) - 1);
+ my(@cmd) = split(/ /, $_[0], 0);
+ my $cmd = substr($_[0], 0, index($_[0], ' '));
+ my $tmp = $_[1];
+ sub lock {
+ my $method = shift @_;
+ open RSTAT, "data/online/rstat/$room";
+ my(@r_stat) = <RSTAT>;
+ close RSTAT;
+ my $lock = "0\n";
+ if ($room eq $standardroom) {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> sperrt den Raum ohne Erfolg ab ...</font></i>", $alias);
+ }
+ else {
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> sperrt den Raum ab ...</font></i>", $alias) if $method ne 'separee';
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> sperrt den Raum auf ...</font></i>", $alias) if $method ne 'separee';
+ }
+ for ($i = 1; $i <= $#r_stat; ++$i) {
+ $lock = $lock . $r_stat[$i];
+ }
+ open RSTAT, ">data/online/rstat/$room";
+ print RSTAT $lock;
+ close RSTAT;
+ }
+ &reload_html;
+ }
+ if ($cmd eq 'about') {
+ &post_prv($alias, "<font color=ffffff>Aktuelle Version ist $title und wurde am $datum aktuallisiert. Programmiert von Paul C. B\374tow (2000 - 2002).</font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'away') {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $away_msg = $away_msg . ' ' . $cmd[$i];
+ }
+ my $room = &get_room($alias);
+ if ($tmp eq 'autoaway') {
+ $away_msg = "$alias wurde vom System agbemeldet ...";
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='ffa500'><b>Das System</b></font> meldet <font color='".&get_ident($alias,3)."'>$alias</font> wegen Inaktivit&auml;t ab ...</i></font>", $alias);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> meldet sich ab (<font color='$col'>$away_msg</font> ) ...</i></font>", $alias);
+ }
+ open AWAY, ">>data/online/rstat/$room.away";
+ print AWAY "$alias<;$away_msg\n";
+ close AWAY;
+ &private_javascript($alias, $room, q[parent.input.document.inf.tmp.value = 'away'; parent.online.location.reload();]);
+ &reload_html;
+ }
+ elsif ($cmd eq 'clear') {
+ &post_prv($alias, "<script language='JavaScript'>window.open('chat?request=stream&alias=$alias&room=$room&col=$col&secol=$secol&tmp=login&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder','main');</script>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'col') {
+ my $col, $secol;
+ if ($cmd[1] ne undef) {
+ $col = $cmd[1];
+ &prove_color($alias, $col);
+ my $tmpsecol = $cmd[2];
+ my $length = length $tmpsecol;
+ if ($tmpsecol eq '' or $length < 6 or $length > 6) {
+ $secol = $col;
+ }
+ else {
+ $secol = $tmpsecol;
+ }
+ }
+ else {
+ $col = &random_color;
+ $secol = &random_color;
+ }
+ open OPTIONS, "<data/user/options/$alias";
+ my(@options) = <OPTIONS>;
+ close OPTIONS;
+ open OPTIONS, ">data/user/options/$alias";
+ print OPTIONS $options[0] . $col . "\n" . $secol;
+ close OPTIONS;
+ open IDENT, "<data/online/ident/$alias";
+ my(@ident) = <IDENT>;
+ close IDENT;
+ open IDENT, ">data/online/ident/$alias";
+ print IDENT $ident[0] . $ident[1] . $ident[2] . "$col\n$secol";
+ close IDENT;
+ &post($room, '<i><font color=ffffff>' . &timestring . "</font> <font color=$col>$alias</font> <font color=$secol> hat die Farbe gewechselt...</font></i>", $alias);
+ &private_javascript($alias, $room, "parent.input.document.inf.col.value = '$col'; parent.input.document.inf.secol.value = '$secol';");
+ &post_strmsg($alias, $room, 'col', "$col;$secol");
+ &reload_html;
+ }
+ elsif ($cmd eq 'date') {
+ my($secs, $mins, $hours, $days, $months, $years) = &timearray;
+ &post_prv($alias, "<font color=ffffff>Heute ist der $days.$months. Jahr $years. Es ist genau $hours:$mins Uhr und $secs Sekunden.</font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'exit') {
+ my $room = &get_room($alias);
+ if ($tmp eq 'autologout') {
+ &private_javascript($alias, $room, q[open('chat?request=start&tmp=autologout','_top');]);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='ffa500'><b>Das System</b></font> loggt <font color='".&get_ident($alias,3)."'>$alias</font> wegen Inaktivit&auml;t aus ... </font></i>", $alias);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> loggt sich ganz aus ... </font></i>", $alias);
+ &private_javascript($alias, $room, q[open('chat?request=start&tmp=quit','_top');]);
+ }
+ &rm_alias($alias, $room);
+ &rm_away($alias, $room);
+ &reload_html;
+ }
+ elsif ($cmd eq 'getcol') {
+ my $cols2show = $cmd[1];
+ if (-f "data/user/options/$cols2show") {
+ open FILE, "<data/user/options/$cols2show";
+ my(@file) = <FILE>;
+ close FILE;
+ chomp $file[1];
+ chomp $file[2];
+ &post_prv($alias, "<font color='ffa500'>$cols2show <font color='ffffff'> verwendet als 1. Farbe <font color='$file[1]'>$file[1]</font> und als 2. Farbe <font color='$file[2]'>$file[2]</font> !</font></font>");
+ &reload_html;
+ }
+ &post_prv($alias, "<font color='ffa500'>$cols2show <font color='ffffff'> existiert nicht in der Benutzerdatenbank!</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'hits' or $cmd eq 'uptime') {
+ &post_prv($alias, "<font color=ffffff>Uptime: $startime " . &calculate_uptime_hours($STARTIME) . "h; $HITS Hits; " . &calculate_hpm($HITS, $STARTIME) . ' Hits pro Minute</font>');
+ &reload_html;
+ }
+ elsif ($cmd eq 'ig') {
+ my $alias2ignore = $cmd[1];
+ if ($alias2ignore) {
+ if (-f "data/user/options/$alias2ignore") {
+ if (3 <= &hierachie($alias2ignore)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2ignore</font> <font color='ffffff'> kann nicht ignoriert werden!</font>");
+ }
+ else {
+ &post_strmsg($alias, $room, 'ig', $alias2ignore);
+ }
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2ignore</font> <font color='ffffff'>existiert nicht in der Datenbank!</font>");
+ }
+ }
+ else {
+ &post_strmsg($alias, $room, 'igl');
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'j' or $cmd eq 'sep') {
+ if ($cmd[1] =~ /\W/ or $cmd[1] eq '') {
+ &post_prv($alias, "<font color=ffffff>Der Raum <font color=ffa500>$cmd[1]</font> enth\344lt illegale Zeichen!</font>");
+ &reload_html;
+ }
+ else {
+ if ($cmd eq 'j') {
+ &change_room('j', $cmd[1], $room);
+ &reload_html;
+ }
+ else {
+ if ($cmd[1] eq $standardroom) {
+ &post_prv($alias, "<font color=ffffff>Der Raum <font color=ffa500>$cmd[1]</font> ist ein Standardraum und kann nicht als Separee er&ouml;ffnet werden!</font>");
+ }
+ else {
+ &change_room('sep', $cmd[1], $room);
+ &lock('separee');
+ }
+ &reload_html;
+ }
+ }
+ }
+ elsif ($cmd eq 'me' or $cmd eq 'm') {
+ my $me_msg;
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $me_msg = $me_msg . ' ' . $cmd[$i];
+ }
+ $me_msg =~ s[/me/][<i>$alias</i>]g;
+ $me_msg =~ s[/m/][<i><font color=$col>$alias</font></i>]g;
+ if ($cmd eq 'm') {
+ &post($room, "<b><font color=$col><i>$alias</i> <font color=$secol>$me_msg</font></font></b>", $alias);
+ }
+ else {
+ &post($room, "<b><font color=$col><i>$alias</i> $me_msg</font></b>", $alias);
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'memo') {
+ my $alias2memo = $cmd[1];
+ my($secs, $mins, $hours, $days, $months, $years) = &timearray;
+ if (-f "data/user/options/$alias2memo") {
+ my $memo_msg;
+ for ($i = 2; $i <= $#cmd; ++$i) {
+ $memo_msg = $memo_msg . ' ' . $cmd[$i];
+ }
+ &post_prv($alias, "<font color=ffa500>$alias2memo <font color=ffffff>wurde folgende memo erfolgreich hinterlassen: $memo_msg</font></font>");
+ open MEMO, ">>data/user/memos/$alias2memo";
+ print MEMO "<font color=ffffff>($days.$months.$years - $hours:$mins:$secs) <font color=$col>$alias</font> hat Dir eine Memo hinterlassen: <font color=ffa500>$memo_msg</font></font><br>\n";
+ close MEMO;
+ &reload_html;
+ }
+ &post_prv($alias, "<font color=ffa500>$alias2memo <font color=ffffff>existiert in der Datenbank nicht !</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'menu') {
+ &private_javascript($alias, $room, "window.open('chat?request=htdocs&alias=$alias&var=menu_html&room=$standardroom&col=$col&secol=$secol&tmpid=$tmpid','_new','width=500,height=500,screenX=100,screenY=100,scrollbars');");
+ &reload_html;
+ }
+ elsif ($cmd eq 'online') {
+ my $alias2prove = $cmd[1];
+ my $totaltime = &get_online_time($alias2prove);
+ if ($totaltime ne false) {
+ &post_prv("$alias", "<font color=ffa500>$alias2prove <font color=ffffff>war insgesamt schon $totaltime Stunden online!</font></font>");
+ }
+ else {
+ &post_prv("$alias", "<font color=ffa500>$alias2prove <font color=ffffff>existiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'q') {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> verl&auml;sst den Chat ... </font></i>", $alias);
+ &post_strmsg($alias, $room, 'quit');
+ unlink "data/online/rooms/$room/$alias";
+ &rm_rstat($alias, $room);
+ &rm_away($alias, $room);
+ &check_online;
+ &reload_html;
+ }
+ elsif ($cmd eq 'rmgb') {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> l\366scht das eigene G\344stebuch ...</font></i>", $alias);
+ unlink "data/user/gbooks/$alias";
+ &reload_html;
+ }
+ elsif ($cmd eq 's') {
+ my $msg2scream;
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2scream = $msg2scream . ' ' . $cmd[$i];
+ }
+ $msg2scream =~ s/\344/\304/g;
+ $msg2scream =~ s/\366/\326/g;
+ $msg2scream =~ s/\374/\334/g;
+ $msg2scream = "\U$msg2scream\E";
+ &post($room, "<b><font color=$col><i>$alias schreit:</i> <font color=$secol>$msg2scream</font></font></b>", $alias);
+ &reload_html;
+ }
+ elsif ($cmd eq 'seen') {
+ my $alias2prove = $cmd[1];
+ if (-f "data/user/options/$alias2prove") {
+ if (-f "data/user/lastlogin/$alias2prove") {
+ open LASTLOGIN, "<data/user/lastlogin/$alias2prove";
+ my $lastlogin = <LASTLOGIN>;
+ close LASTLOGIN;
+ my $timestamp = sprintf('%.2f', (time - $lastlogin) / 3600);
+ &post_prv("$alias", "<font color='ffa500'>$alias2prove <font color=ffffff> hat sich vor $timestamp Stunden zuletzt in das System eingeloggt!</font></font>");
+ }
+ else {
+ &post_prv("$alias", "<font color='ffa500'>$alias2prove <font color=ffffff> hat sich seit der Einf\374hrung dieses Befehls noch nie eingeloggt!</font></font>");
+ }
+ }
+ else {
+ &post_prv("$alias", "<font color='ffa500'>$alias2prove <font color=ffffff> exsistiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'selfkill') {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> entfernt sich ganz und gar aus dem System und loggt sich aus ... </font></i>", $alias);
+ &private_javascript($alias, $room, q[open('chat?request=start&tmp=selfkill','_top');]);
+ &kill_alias($alias);
+ &reload_html;
+ }
+ elsif ($cmd eq 'w') {
+ my $theme = &get_theme($room);
+ my $door = '[<font color=red>Abgesperrt!</font>]' if $rstat[0] eq "1\n";
+ my($is, $nr) = ('t', 0);
+ my $persons;
+ opendir DIR, "data/online/rooms/$room";
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach $_ (@dir) {
+ if (-f "data/online/rooms/$room/$_") {
+ $persons = $persons . ' ' . "<font color='".&get_ident($_,3)."'>$_</font>";
+ ++$nr;
+ }
+ }
+ &post_prv($alias, "<font color=ffffff>Der aktuelle <b>Raum:</b> $room $theme $door ($nr): $persons</font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'wc' or $cmd eq 'wc/') {
+ my $raum = $cmd[1];
+ my $persons;
+ if ($raum eq '' and $cmd eq 'wc') {
+ opendir USERS, 'data/online/users';
+ my(@users) = readdir USERS;
+ close USERS;
+ foreach $_ (@users) {
+ $persons = $persons . ' ' . "<font color='".&get_ident($_,3)."'>$_</font>" if -f "data/online/users/$_";
+ }
+ my $nr = $#users - 1;
+ my($nrs, $is) = ('', 'ist');
+ if ($nr != 1) {
+ $nrs = 'en';
+ $is = 'sind';
+ }
+ &post_prv("$alias", "<font color=ffffff>$nr Person$nrs $is insgesamt eingeloggt: $persons</font>");
+ }
+ elsif ($raum eq '' and $cmd eq 'wc/') {
+ my $msg2post;
+ opendir DIR, 'data/online/rooms';
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach $_ (@dir) {
+ if (-e "data/online/rooms/$_" and $_ ne '..' and $_ ne '.') {
+ opendir DIR, "data/online/rooms/$_";
+ my(@dir2) = readdir DIR;
+ closedir DIR;
+ open RSTAT, "<data/online/rstat/$_";
+ my(@rstat) = <RSTAT>;
+ close RSTAT;
+ chomp $rstat[1];
+ my $door = '[<font color=red>Abgesperrt!</font>]' if $rstat[0] eq "1\n";
+ my $nr = $#dir2 - 1;
+ $msg2post = $msg2post . "<tr><td><b><font size=2 color='ffffff'>$_ $door ($nr) [" . $rstat[1] . q(]: </font></b></td></tr><tr><td><font size=2 color='ffa500'>);
+ foreach $chatter (@dir2) {
+ $msg2post = $msg2post . "<font color='".&get_ident($chatter,3)."'>$chatter</font> " if -f "data/online/rooms/$_/$chatter";
+ }
+ print '</font></td>';
+ }
+ }
+ &post_prv($alias, "<font color=ffffff>Folgende R&auml;ume sind offen:</font><table>$msg2post</table>");
+ }
+ elsif ($raum ne '') {
+ my $persons;
+ opendir DIR, "data/online/rooms/$raum";
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach $_ (@dir) {
+ $persons = $persons . ' ' . "<font color='".&get_ident($chatter,3)."'>$_</font>" if -f "data/online/rooms/$raum/$_";
+ }
+ my($nr, $is) = ($#dir - 1, 't');
+ if ($nr != 1) {
+ $nrs = 'en';
+ $is = 'n';
+ }
+ &post_prv($alias, "<font color=ffffff> $nr Person$nrs befinde$is sich im Raum <b>$raum</b> $persons</font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'wj' or $cmd eq 'ju') {
+ my $alias2search = $cmd[1];
+ my $roomofalias = &get_room($alias2search);
+ if ($roomofalias) {
+ if ($cmd eq 'wj') {
+ &post_prv($alias, "<font color='ffa500'>$alias2search <font color=ffffff>befindet sich im Raum <b>$roomofalias</b> !</font></font>");
+ }
+ else {
+ &change_room('ju', $roomofalias, $room, $alias2search);
+ }
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2search <font color=ffffff> ist nicht eingeloggt!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif (1 <= &hierachie($alias, $room)) {
+ if ($cmd eq 'l') {
+ &lock;
+ }
+ elsif ($cmd eq 'su') {
+ my $alias2su = $cmd[1];
+ opendir DIR, "data/online/rooms/$room";
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach $_ (@dir) {
+ if ($_ eq $alias2su) {
+ open DATEI, "<data/online/rstat/$room";
+ my(@rstat) = <DATEI>;
+ close DATEI;
+ if (1 <= hierachie($alias2su, $room)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2su</font> <font color='ffffff'> kann nicht zum Raumbesetzer ernannt werden. (Ist bereits RB, W\304 oder OW)</font>");
+ &reload_html;
+ }
+ open RSTAT, ">>data/online/rstat/$room";
+ print RSTAT "$alias2su<;1\n";
+ close RSTAT;
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> verleiht <font color='".&get_ident($alias2su,3)."'>$alias2su</font> Raumbesetzerrechte ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ &reload_html;
+ }
+ }
+ &post_prv($alias, "<font color='ffa500'>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist nicht anwesend)</font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'rsu') {
+ my $alias2rsu = $cmd[1];
+ if (1 == hierachie($alias2rsu, $room)) {
+ &rm_rstat($alias2rsu, $room);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> entzieht <font color='".&get_ident($alias2rsu,3)."'>$alias2rsu</font> die Raumbesetzerrechte ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2rsu <font color='ffffff'>ist gar kein Raumbesetzer!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 't') {
+ open RSTAT, "data/online/rstat/$room";
+ my(@r_stat) = <RSTAT>;
+ close RSTAT;
+ my $theme;
+ if ($cmd[1] ne undef) {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $theme = $theme . ' ' . $cmd[$i];
+ }
+ &post($room, q[<i><font color='ffffff'>] . &timestring . qq[ <font color='$col'>$alias</font> gibt dem Raum das Thema "<font color='$col'>$theme</font>" ...</font></i>], $alias);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> l\366scht das Thema des Raums ...</font></i>", $alias);
+ }
+ $theme = $r_stat[0] . $theme . "\n";
+ for ($i = 2; $i <= $#r_stat; ++$i) {
+ $theme = $theme . $r_stat[$i] . "\n";
+ }
+ open RSTAT, ">data/online/rstat/$room";
+ print RSTAT $theme;
+ close RSTAT;
+ &reload_html;
+ }
+ elsif (3 <= &hierachie($alias, $room)) {
+ if ($cmd eq 'ban' or $cmd eq 'banip') {
+ my $alias2ban = $cmd[1];
+ my $hierachie = &hierachie($alias2ban);
+ open BAN, '<data/ban';
+ my(@ban) = <BAN>;
+ close BAN;
+ if ($cmd[1] eq undef) {
+ my $nr = @ban;
+ my $banned;
+ foreach $_ (@ban) {
+ chomp $_;
+ $banned .= " $_";
+ }
+ &post_prv($alias, "<font color=ffffff>Folgende Benutzer sind verbannt [$nr]: <font color='ff0000'>$banned</font></font>");
+ &reload_html;
+ }
+ elsif (-f "data/user/options/$alias2ban") {
+ if (3 <= $hierachie) {
+ &post_prv($alias, "<font color='ffa500'>$alias2ban <font color='ffffff'>kann nicht verbannt werden!</font></font>");
+ &reload_html;
+ }
+ if ($cmd eq 'ban') {
+ if (&add_entry($alias2ban, 'ban') == 1) {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> verbannt <b>$alias2ban</b> aus dem Chat ...</font></i>", $alias);
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2ban <font color=ffffff>ist bereits verbannt!</font></font>");
+ }
+ }
+ elsif ($cmd eq 'banip') {
+ open DATEI, "<data/online/ident/$alias2ban";
+ my $ipnr = <DATEI>;
+ close DATEI;
+ chomp $ipnr;
+ if (add_entry("ip://$ipnr", 'ban') == 1) {
+ &post_prv($alias, "<font color='ffffff'>IP-Nummer von <font color='ffa500'>$alias2ban</font> (<font color='ff0000'>$ipnr</font>) wurde verbannt!</font></i>");
+ }
+ else {
+ &post_prv($alias, "<font color='ffffff'>Die IP-Nummer <font color='ff0000'>$ipnr</font> von <font color='ffa500'>$alias2ban</font> ist bereits verbannt!</font></font>");
+ }
+ &reload_html;
+ }
+ &reload_html;
+ }
+ &post_prv($alias, "<font color='ffa500'>$alias2ban <font color=ffffff> kann nicht verbannt werden, da Benutzername nicht existiert!</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'rban' or $cmd eq 'rbanip') {
+ my $alias2rban = $cmd[1];
+ open BAN, '<data/ban';
+ @ban = <BAN>;
+ close BAN;
+ foreach $ban (@ban) {
+ if (&rm_entry($alias2rban, 'ban') == 1) {
+ if ($alias2rban =~ /ip:/) {
+ &post_prv($alias, "<font color='ffffff'>Die IP-Nummer <font color='ff0000'>$alias2rban</font> wurde aus der Banliste ausgetragen!</font></font>");
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> entbannt <font color='".&get_ident($alias2rban,3)."'>$alias2rban</font> ...</font></i>", $alias);
+ }
+ &reload_html;
+ }
+ }
+ &post_prv($alias, "<font color='ff0000'>$alias2rban <font color='ffffff'>ist nicht verbannt!</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'img') {
+ my $hierachie = &hierachie($alias, $room);
+ &hierachie_rm($alias);
+ if ($hierachie == 3) {
+ &post_prv($alias, q[<font color='ffffff'>Als tempor&auml;rer W&auml;chter kannst du dein Superuserlogo nicht verstecken!</font>]);
+ }
+ elsif ($hierachie % 2 > 0) {
+ &post_prv($alias, q[<font color='ffffff'>Dein Superuserlogo wurde versteckt!</font>]);
+ &hierachie_add($alias, $hierachie + 1);
+ }
+ else {
+ &post_prv("$alias", q[<font color='ffffff'>Dein Superuserlogo wurde wieder sichtbar gemacht!</font></font>]);
+ &hierachie_add($alias, $hierachie - 1);
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'ip') {
+ my $alias2prove = $cmd[1];
+ opendir DIR, 'data/online/ident';
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach $_ (@dir) {
+ if ($_ eq $alias2prove) {
+ open DATEI, "<data/online/ident/$alias2prove";
+ my $ipnr = <DATEI>;
+ close DATEI;
+ chomp $ipnr;
+ &post_prv($alias, "<font color='ffa500'>$_<font color='ffffff'> hat die IP-Nummer <font color='ff0000'>$ipnr</font> !</font></font>");
+ }
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'k' or $cmd eq 'o') {
+ my $alias2kick = $cmd[1];
+ if (-f "data/online/users/$alias2kick") {
+ opendir DIR, 'data/online/rooms';
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach my $raum (@dir) {
+ opendir DIR, "data/online/rooms/$raum";
+ my(@dir2) = readdir DIR;
+ closedir DIR;
+ foreach my $chatter (@dir2) {
+ if ($chatter eq $alias2kick) {
+ my $hierachie2 = &hierachie($alias2kick);
+ if (&hierachie($alias) <= &hierachie($alias2kick)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2kick <font color='ffffff'> besitzt einen h&ouml;heren oder gleichen Rang und kann nicht gekickt/ausgeloggt werden!</font></font>");
+ }
+ else {
+ if ($cmd eq 'k') {
+ &post_prv($alias2kick, '<script language="JavaScript">window.open("chat?request=start&tmp=kick","_top");</script>');
+ }
+ else {
+ &post_prv($alias2kick, '<script language="JavaScript">window.open("chat?request=start&tmp=logout","_top");</script>');
+ }
+ $_ = undef if $room eq $raum;
+ if ($cmd eq 'k') {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> katapultiert <font color='".&get_ident($alias2kick,3)."'>$alias2kick</font> aus dem Chat ...</font></i>", $alias, $raum);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> loggt <font color='".&get_ident($alias2kick,3)."'>$alias2kick</font> aus dem Chat aus ...</font></i>", $alias, $alias);
+ }
+ &rm_alias($alias2kick, $raum);
+ &check_online;
+ }
+ &reload_html;
+ }
+ }
+ }
+ }
+ &post_prv($alias, "<font color='ffa500'>$alias2kick <font color='ffffff'> ist nicht anwesend und kann nicht aus dem System katapultiert werden werden!</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'sl') {
+ my $sl_room = $cmd[1];
+ if (-e "data/online/rooms/$sl_room") {
+ my $lock = "0\n";
+ open RSTAT, "<data/online/rstat/$sl_room";
+ my(@r_stat) = <RSTAT>;
+ close RSTAT;
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> sperrt den Raum <b>$sl_room</b> von aussen ab ...</font></i>", $alias, $sl_room);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> sperrt den Raum <b>$sl_room</b> von aussen auf ...</font></i>", $alias, $sl_room);
+ }
+ for ($i = 1; $i <= $#r_stat; ++$i) {
+ $lock = $lock . $r_stat[$i];
+ }
+ open RSTAT, ">data/online/rstat/$sl_room";
+ print RSTAT $lock;
+ close RSTAT;
+ }
+ else {
+ &post_prv($alias, "<font color='ffffff'>Der Raum <font color='ffa500'>$sl_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'ss') {
+ my $ss_room = $cmd[1];
+ if (-e "data/online/rooms/$ss_room") {
+ my $ss_msg;
+ for ($i = 2; $i <= $#cmd; ++$i) {
+ $ss_msg = $ss_msg . ' ' . $cmd[$i];
+ }
+ my $msg2scream = "\U$ss_msg\E";
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> ruft in den Raum <b>$ss_room</b> hinein: <b><font color=$col>$msg2scream</font></b> ...</font></i>", $alias, $ss_room);
+ &reload_html;
+ }
+ else {
+ &post_prv($alias, "<font color='ffffff'>Der Raum <font color='ffa500'>$ss_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'st') {
+ my $st_room = $cmd[1];
+ if (-e "data/online/rooms/$st_room") {
+ my $theme;
+ if ($cmd[2] ne undef) {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $theme = $theme . ' ' . $cmd[$i];
+ }
+ &post($room, '<i><font color=ffffff>' . &timestring . qq[ <font color='$col'>$alias</font> gibt dem Raum <b>$st_room</b> das Thema "<font color='$col'>$theme</font>" ...</font></i>], $alias, $st_room);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> l\366scht das Thema des Raums <b>$st_room</b> ...</font></i>", $alias, $st_room);
+ }
+ open RSTAT, "<data/online/rstat/$st_room";
+ my(@r_stat) = <RSTAT>;
+ close RSTAT;
+ $theme = $r_stat[0] . $theme . "\n";
+ for ($i = 2; $i <= $#r_stat; ++$i) {
+ $theme = $theme . $r_stat[$i];
+ }
+ open RSTAT, ">data/online/rstat/$st_room";
+ print RSTAT $theme;
+ close RSTAT;
+ }
+ else {
+ &post_prv($alias, "<font color=ffffff>Der Raum <font color=ffa500>$st_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'status') {
+ my $alias2level = $cmd[1];
+ &post_prv($alias, "<font color='ffa500'>$alias2level <font color='ffffff'>hat den Superuserstatus <font color='ff0000'>".&hierachie($alias2level, &get_room($alias2level))."</font> !</font></font>");
+ &reload_html;
+ }
+ elsif (7 <= &hierachie($alias)) {
+ if ($cmd eq 'kill') {
+ my $alias2kill = $cmd[1];
+ if (-f "data/user/options/$alias2kill") {
+ if (7 <= &hierachie($alias2kill)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2kill</font> <font color='ffffff'>hat einen h&ouml;heren Rang und kann nicht aus dem System entfernt werden !</font>");
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col>$alias</font> killt <b>$alias2kill</b> ganz und gar aus dem System ...</font></i>", $alias);
+ &kill_alias($alias2kill, $alias);
+ }
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2kill <font color='ffffff'> existiert nicht in der Datenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'sys') {
+ my $sys_msg;
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $sys_msg = $sys_msg . ' ' . $cmd[$i];
+ }
+ $sys_msg = q[<i><font color='ffffff'>] . &timestring . " </font></i> <b><font size=2 color='red'>SYSTEMNACHRICHT</font></b><i><font color='ffffff'>: $sys_msg ...</font></i>";
+ opendir ROOMS, 'data/msgs';
+ my(@rooms) = readdir ROOMS;
+ close ROOMS;
+ foreach $_ (@rooms) {
+ &post($_, $sys_msg, $alias) unless /\./;
+ }
+ &log($sys_msg);
+ &reload_html;
+ }
+ elsif ($cmd eq 'twa') {
+ my $alias2wa = $cmd[1];
+ if (-f "data/user/options/$alias2wa") {
+ my $room2 = &get_room($alias2wa);
+ if (3 <= &hierachie($alias2wa, $room2)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2wa <font color='ffffff'>kann nicht zum tempor&auml;ren W&auml;chter ernannt werden!</font></font>");
+ }
+ else {
+ &hierachie_add_rstat($alias2wa, 3, $room2);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> ernennt <font color='".&get_ident($alias2wa,3)."'>$alias2wa</font> zum <font color='ff0000'>tempor&auml;ren</font> W\344chter ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ &reload_html;
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2wa <font color=ffffff>existiert nicht in der Datenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'rtwa') {
+ my $alias2rwa = $cmd[1];
+ my $room2 = &get_room($alias2rwa);
+ if (3 == &hierachie($alias2rwa, $room2)) {
+ &hierachie_rm_rstat($alias2rwa, $room2);
+
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> hat <font color='".&get_ident($alias2rwa,3)."'>$alias2rwa</font> vom <font color='ff0000'>tempor&auml;ren</font> W\344chter zum normalen Chatter degradiert ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2rwa <font color=ffffff>ist kein tempor&auml;rer W\344chter und k\366nnen diese Rechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'wa') {
+ my $alias2wa = $cmd[1];
+ if (-f "data/user/options/$alias2wa") {
+ if (5 <= &hierachie($alias2wa)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2wa <font color='ffffff'>kann nicht zum W&auml;chter ernannt werden!</font></font>");
+ }
+ else {
+ &hierachie_add($alias2wa, 5);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> ernennt <font color='".&get_ident($alias2wa,3)."'>$alias2wa</font> zum W\344chter ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ &reload_html;
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2wa <font color=ffffff>existiert nicht in der Datenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'rwa') {
+ my $alias2rwa = $cmd[1];
+ my $hierachie = &hierachie($alias2rwa);
+ if (5 == $hierachie or 6 == $hierachie) {
+ &hierachie_rm($alias2rwa);
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> hat <font color='".&get_ident($alias2rwa,3)."'>$alias2rwa</font> vom W\344chter zum normalen Chatter degradiert ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2rwa <font color=ffffff>ist kein W\344chter und k\366nnen diese Rechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif (9 <= &hierachie($alias)) {
+ if ($cmd eq 'ow') {
+ my $alias2ow = $cmd[1];
+ if (-f "data/user/options/$alias2ow") {
+ if (7 <= &hierachie($alias2ow)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2ow <font color='ffffff'>kann nicht zum Oberw&auml;chter ernannt werden!</font></font>");
+ }
+ else {
+ &hierachie_add($alias2ow, 7);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> ernennt <font color='".&get_ident($alias2ow,3)."'>$alias2ow</font> zum Oberw&auml;chter ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ &reload_html;
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2wa <font color=ffffff>existiert nicht in der Datenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'row') {
+ my $alias2row = $cmd[1];
+ my $hierachie = &hierachie($alias2row);
+ if (7 == $hierachie or 8 == $hierachie) {
+ &hierachie_rm($alias2row);
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> hat <font color='".&get_ident($alias2row,3)."'>$alias2row</font> vom Oberw\344chter zum normalen Chatter degradiert ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2row <font color=ffffff>ist kein Oberw\344chter und k\366nnen diese Rechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'pw') {
+ my $pw2show = $cmd[1];
+ if (-f "data/user/options/$pw2show") {
+ open PW, "<data/user/options/$pw2show";
+ my(@pw) = <PW>;
+ close PW;
+ chomp $pw[0];
+ &post_prv($alias, "<font color='ffa500'>$pw2show <font color='ffffff'> hat das Passwort <font color='ff0000'>$pw[0]</font> !</font></font>");
+ &reload_html;
+ }
+ &post_prv($alias, "<font color='ffa500'>$pw2show <font color='ffffff'> existiert nicht in der Benutzerdatenbank!</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'id' or $cmd eq 'agent') {
+ my $id2show = $cmd[1];
+ if (-f "data/online/ident/$id2show") {
+ if ($cmd eq 'id') {
+ &post_prv($alias, "<font color='ffa500'>$id2show <font color='ffffff'> hat die Temp-ID <font color='ff0000'>".&get_ident($id2show, 1)."</font> !</font></font>");
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$id2show <font color='ffffff'> verwendet <font color='ff0000'>".&get_ident($id2show, 2)."</font> !</font></font>");
+ }
+ &reload_html;
+ }
+ &post_prv($alias, "<font color='ffa500'>$id2show <font color='ffffff'> ist nicht eingeloggt !</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'cool') {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ &post($room, '<i><font color=ffffff>' . &timestring . " $msg2post</font></i>", $alias);
+ &reload_html;
+ }
+ elsif ($cmd eq 'rev') {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ $msg2post = reverse($msg2post);
+ &post($room, "<b><font color='$col'>$alias: <font color='$secol'>$msg2post</font></font></b>", $alias);
+ &reload_html;
+ }
+ elsif ($cmd eq 'arks') {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ $msg2post =~ s/i/1/gi;
+ $msg2post =~ s/e/3/gi;
+ $msg2post =~ s/a/4/gi;
+ $msg2post =~ s/s/5/gi;
+ $msg2post =~ s/g/6/gi;
+ $msg2post =~ s/t/7/gi;
+ $msg2post =~ s/b/8/gi;
+ $msg2post =~ s/o/0/gi;
+ &post($room, "<b><font color='$col'>$alias: <font color='$secol'>$msg2post</font></font></b>", $alias);
+ &reload_html;
+ }
+ elsif ($cmd eq 'ultra') {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ my @letters = split '', "$alias: $msg2post";
+ $msg2post = undef;
+ foreach (@letters) {
+ $msg2post .= "<font color='".&random_color."'>$_</font>";
+ }
+ &post($room, "<b>$msg2post</b>", $alias);
+ &reload_html;
+ }
+ }
+ }
+ }
+ }
+ my($alias2post, $msg2post, $action);
+ if ($cmd eq 'msg') {
+ $alias2post = $cmd[1];
+ for ($i = 2; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ }
+ elsif ($cmd eq '') {
+ $alias2post = $whisper;
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ }
+ else {
+ $alias2post = $cmd;
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ }
+ $msg2post =~ s[/me/][<i>$alias</i>]g;
+ $msg2post =~ s[/m/][<i><font color=$col>$alias</font></i>]g;
+ if (-f "data/online/users/$alias2post" and not -f "data/online/rooms/$loginplace/$alias2post") {
+ &post_prv($alias, "<b><font color='$col'><i>Zu $alias2post gefl\374stert:</i> <font color='$secol'>$msg2post</font></font></i></b>");
+ &post_prv($alias2post, "<b><font color='$col'><i>$alias fl\374stert:</i> <font color='$secol'>$msg2post</font></font></i></b>");
+ &private_javascript($alias, $room, "parent.input.document.inf.whisper.value = '$alias2post';");
+ &reload_html;
+ }
+ &post_prv($alias, qq[ <font color=ffffff>Benutzer oder Befehl <font color=ffa500>$alias2post</font> ist nicht anwesend/verf\374gbar! Bitte den Befehl "/menu" eingeben, um das Chat-Men&uuml zu &ouml;ffnen.</font></font>]);
+ &reload_html;
+}
+1;
diff --git a/0.8.1/modules/divcom.pm b/0.8.1/modules/divcom.pm
new file mode 100755
index 0000000..8e17cbe
--- /dev/null
+++ b/0.8.1/modules/divcom.pm
@@ -0,0 +1,288 @@
+sub divcom {
+ if ($var eq 'list_alias_html') {
+ &list_alias_html;
+ }
+ elsif ($var eq 'alias_html') {
+ &alias_html;
+ }
+ elsif ($var eq 'edit_profile_html') {
+ &secure_checkid($alias, $tmpid);
+ &edit_html('edit_profile_html');
+ }
+ elsif ($var eq 'edit_options_html') {
+ &secure_checkid($alias, $tmpid);
+ &edit_html('edit_options_html');
+ }
+ elsif ($var eq 'gb_html') {
+ &gb_html;
+ }
+ elsif ($var eq 'post_gb') {
+ &secure_checkid($alias, $tmpid);
+ &post_gb;
+ }
+ elsif ($var eq 'edit_profile') {
+ &secure_checkid($alias, $tmpid);
+ &edit('edit_profile');
+ }
+ elsif ($var eq 'edit_options') {
+ &secure_checkid($alias, $tmpid);
+ &edit('edit_options');
+ }
+ elsif ($var eq 'rm_gb_alias') {
+ &secure_checkid($alias, $tmpid);
+ &rm_gb;
+ }
+ else {
+ &error('Parameter fehlt');
+ }
+}
+sub gb_html {
+ my ($message,$method) = @_;
+ unless ($method eq 'loggedin') {
+ &start_html('Benutzerboard');
+ &menu();
+ }
+ if ($message eq 'post_empty') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Du wolltest soeben einen leeren Eintrag posten. Bitte schreib\n <i>\n zuerst\n </i>\n einen Text und poste\n <u>dann</u>\n !\n </div>\n <hr>\n";
+ }
+ elsif ($message eq 'post_less') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Ein Eintrag muss mindestens aus 30 Zeichen bestehen ...\n </div>\n <hr>\n";
+
+ }
+ elsif ($message eq 'post_ok') {
+ print " <div class=b>\n Meldung:\n </div>\n <div>\n Vielen Dank f\374r Deinen Beitrag. Wenn Du willst, kannst Du jetzt gleich noch einen Eintrag posten ...\n </div>\n <hr>\n";
+ }
+ else {
+ print " <div>\n Falls Du Anregungen oder Verbesserungsvorschl\344ge f\374r die Community hast, dann poste doch einen kleinen Eintrag :-)\n </div>\n <hr>\n";
+ }
+ print qq[ <form action="chat">\n <input type="hidden" name="col" value="$col">\n<input type="hidden" name="secol" value="$secol">\n<input type="hidden" name="maxVerlauf" value="$maxVerlauf">\n<input type="hidden" name="verlaufOrder" value="$verlaufOrder">\n<input type="hidden" name="request" value="divcom">\n <input type="hidden" name="method" value="$method">\n <input type="hidden" name="var" value="post_gb">\n <input type="hidden" name="alias" value="$alias">\n <input type="hidden" name="tmpid" value="$tmpid">\n <input type="hidden" name="tmp" value="guestbook">\n <input type="hidden" name="id" value="y">\n <input size="40" name="msg">\n <font color="ffffff">\n <input type="submit" value="Hinterlassen ...">\n </font>\n </form>\n <hr>\n];
+ if (-e 'data/guestbook') {
+ &error("Konnte dat/guestbook nicht \366ffnen") unless open DATEI, '<data/guestbook';
+ @datei = <DATEI>;
+ close DATEI;
+ print $q->div(@datei);
+ }
+ print $q->end_html;
+}
+sub post_gb {
+ my($secs, $mins, $hours, $days, $months, $years) = &timearray;
+ if ($msg eq '') {
+ if ($id eq 'y') {
+ if ($method eq 'loggedin') {
+ &loggedin('post_empty');
+ } else {
+ &gb_html('post_empty');
+ }
+ }
+ else {
+ &alias_html('post_empty');
+ }
+ $client->shutdown(2);
+ exit 0;
+ }
+ if (length($msg) < 30) {
+ if ($id eq 'y') {
+ if ($method eq 'loggedin') {
+ &loggedin('post_less');
+ } else {
+ &gb_html('post_less');
+ }
+ }
+ else {
+ &alias_html('post_less');
+ }
+ $client->shutdown(2);
+ exit 0;
+ }
+
+ $msg =~ s/</&lt;/g;
+ $msg =~ s/\n/<br>/g;
+ my $tmpath = '';
+ if ($id eq 'y') {
+ $tmpath = 'data/guestbook';
+ }
+ else {
+ $tmpath = "data/user/gbooks/$tmp";
+ }
+ open GB, "$tmpath";
+ my(@gb) = <GB>;
+ close GB;
+ pop @gb if $#gb > 99;
+ my(@newdatei) = "<br><b>$alias schrieb am $days.$months.$years um $hours:$mins:$secs ...</b><br>$msg<br>\n";
+ push @newdatei, @gb;
+ open GB, ">$tmpath";
+ print GB @newdatei;
+ close GB;
+ if ($id eq 'y') {
+ if ($method eq 'loggedin') {
+ &loggedin('post_ok');
+ } else {
+ &gb_html('post_ok');
+ }
+ $client->shutdown(2);
+ exit 0;
+ }
+ &post_prv ($tmp, "<font color=ffffff>$alias hat soeben einen Pin in Dein Profil geh\344ngt ... </font>");
+ &alias_html;
+ $client->shutdown(2);
+ exit 0;
+}
+sub rm_gb {
+ open GB, "<data/user/gbooks/$alias";
+ my(@gbfile) = <GB>;
+ close GB;
+ my(@newgbfile) = ();
+ for ($i = 0; $i <= $#gbfile; ++$i) {
+ push @newgbfile, $gbfile[$i] if $i != $id;
+ }
+ open GB, ">data/user/gbooks/$alias";
+ print GB @newgbfile;
+ close GB;
+ &alias_html('rm_ok');
+}
+sub list_alias_html {
+ &start_html('Alle Benutzer');
+ opendir REGISTERED, 'data/user/options';
+ my(@users) = readdir REGISTERED;
+ closedir REGISTERED;
+ my(@liste) = sort(@users);
+ my $nr = $#users - 1;
+ &menu();
+ print " <div>\n Es sind z.Z. genau $nr Benutzernamen in der Datenbank vorhanden! (Sortiert nach #, A-Z, a-z)\n </div>\n <hr>\n <div>\n";
+ foreach $_ (@liste) {
+ if (-f "data/user/options/$_") {
+ print $q->a({-'href', "chat?request=divcom&var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid"}, "$_"), ' ';
+ }
+ }
+ print " </div>\n</body>\n</html>\n";
+}
+sub alias_html {
+ my $message = $_[0];
+ open COUNTS, "<data/user/counts/$tmp";
+ local $counter = <COUNTS>;
+ close COUNTS;
+ ++$counter;
+ open COUNTS, ">data/user/counts/$tmp";
+ print COUNTS $counter;
+ close COUNTS;
+ &start_html($tmp);
+ &menu();
+ print "";
+ if ($message eq 'rm_ok') {
+ print " <div class=b>\n Meldung:\n </div>\n <div>\n Der von Dir gew\344hlte Eintrag wurde erfolgreich gel\366scht.\n </div>\n <hr>\n";
+ }
+ elsif ($message eq 'post_empty') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Du wolltest soeben einen leeren Eintrag posten. Bitte schreib\n <i>\n zuerst\n </u>\n einen Text und poste\n <u>dann</u>\n !\n <hr>\n";
+ }
+ open PROFILE, "<data/user/profiles/$tmp";
+ @data = <PROFILE>;
+ close PROFILE;
+ print qq[ <div>\n Dieses Profil wurde insgesamt schon $counter mal aufgerufen !\n <br><br>Alias: $tmp\n <br><br>Nachname: $data[0]\n <br><br>Vorname: $data[1]\n <br><br>Alter: $data[2]\n <br><br>Wohnort: $data[3]\n <br><br>E-Mail:\n <a href="mailto:$data[4]">$data[4]</a>\n <br><br>ICQ-Nummer: $data[5]\n <br><br>Homepage: <a href="$data[6]" target="_new">$data[6]</a>\n <br><br>Weiteres:<br>$data[7]\n <hr>\n Hier kannst Du $tmp eine Nachricht hinterlassen!\n <form action="chat">\n <input type="hidden" name="request" value="divcom">\n <input type="hidden" name="var" value="post_gb">\n <input type="hidden" name="alias" value="$alias">\n <input type="hidden" name="tmpid" value="$tmpid">\n <input type="hidden" name="tmp" value="$tmp">\n <input type="text" size="40" name="msg">\n <font color="ffffff">\n <input type="submit" value="Hinterlassen ...">\n </font>\n </form>\n <hr>\n];
+ if (-e "data/user/gbooks/$tmp") {
+ &error("Konnte data/user/gbooks/$tmp nicht \366ffnen") unless open DATEI, "<data/user/gbooks/$tmp";
+ @datei = <DATEI>;
+ close DATEI;
+ my $nr = 1;
+ if ($alias ne $tmp) {
+ foreach $_ (@datei) {
+ print "<br>Eintrag # $nr: $_";
+ ++$nr;
+ }
+ }
+ else {
+ print qq[ <table>\n <form action="chat">\n <input type="hidden" name="request" value="divcom">\n <input type="hidden" name="var" value="rm_gb_alias">\n <input type="hidden" name="alias" value="$alias">\n <input type="hidden" name="tmpid" value="$tmpid">\n <input type="hidden" name="tmp" value="$tmp">\n];
+ for ($i = 0; $i <= $#datei; ++$i) {
+ print qq[ <tr>\n <td>\n <input type="radio" name="id" value="$i">\n </td>\n <td>\n <div class=q>\n <br>\n Eintrag # $nr:\n $datei[$i]\n </div>\n </td>\n </tr>\n];
+ ++$nr;
+ }
+ print qq[ </table>\n <table>\n <tr>\n <td>\n <font color=ffffff>\n <input type="submit" value="Markierten Eintrag l\366schen">\n </font>\n </td>\n <td>\n <font color=ffffff>\n <input type="reset" value="Markierung r\374ckg\344ngig machen">\n </font>\n </td>\n </tr>\n </table>\n </form>\n];
+ }
+ }
+ print $q->end_html;
+}
+sub edit_html {
+ my($method, $message) = @_;
+ &start_html("Benutzerprofil \344ndern");
+ if ($method eq 'edit_options_html') {
+ open DATEI, "<data/user/options/$alias";
+ }
+ elsif ($method eq 'edit_profile_html') {
+ open DATEI, "<data/user/profiles/$alias";
+ }
+ @data = <DATEI>;
+ close DATEI;
+ foreach $_ (@data) {
+ chomp $_;
+ }
+ &menu();
+ if ($method eq 'edit_options_html') {
+ if ($message eq 'edit_options_ok') {
+ print "<div class=b>\n Hinweis:\n</div>\n<div>\n Du hast soeben Deine Chat-Optionen erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren. Um\n weiterzuchatten einfach Fenster schliessen!\n</div>\n<hr>\n";
+ }
+ elsif ($message eq 'edit_pw_wrong') {
+ print "<div class=b>\n ACHTUNG!\n</div>\n<div>\n Du hast soeben versucht, dein Passwort zu \344ndern. Jedoch stimmte die Erste Eingabe nicht mit der Zweiten \374berein.\n Bitte versuch es erneuert ...\n</div>\n<hr>\n";
+ }
+ else {
+ print $q->div('Hier kannst Du Deine Chat-Optionen editieren!'), $q->hr;
+ }
+ print qq[<script lang="javascript" type="text/javascript">\n<!--\n\nfunction radioWert(rObj) {\n for (var i=0; i<rObj.length; i++) if (rObj[i].checked) return rObj[i].value;\n return false;\n}\n\nfunction insertcode( code ) {\n document.optionen.elements[radioWert(document.optionen.eingabe)].value = code;\n}\n\n//-->\n</script>\n\n<form name="optionen" action="chat">\n <input type="hidden" name="var" value="edit_options">\n <table>\n <tr>\n <td>\n <div>\n Dein Passwort\n <font color=ffa500>\n (Gut merken !!)\n </font>\n <br>\n <input type="password" name="id" value="$data[0]">\n </div>\n </td>\n <td width=20>\n </td>\n <td>\n <div>\n Geb hier das Passwort erneuert ein:\n <br>\n <input type="password" name="tmp" value="$data[0]">\n </div>\n </td>\n </tr>\n </table>\n <hr>\n <div>Einstellungen f\374r den Nachrichten-Verlauf</div>\n <table>\n <tr>\n <td>\n <br>\n <div>Anzahl der Nachrichten im Verlauf (Standart = 10)</div>\n <font color=ffffff>\n <select name="maxVerlauf" size="1">\n <option value="$data[3]">$data[3]\n];
+ for ($i = 1; $i <= 50; ++$i) {
+ print qq[<option value="$i">$i];
+ }
+ print qq[ </select>\n </font>\n </td>\n </tr>\n <tr>\n <td>\n <br>\n<div>Wie sollen die Nachrichten im Verlauf angeordnet sein?</div>\n <font color=ffffff>\n <select name="verlaufOrder" size="1">\n <option value="$data[4]">Bisherige Einstellung ($data[4])\n <option value="0">Neue Verlaufnachrichten oben (0)\n <option value="1">Neue Verlaufnachrichten unten (1)\n </select>\n </font>\n </td>\n </tr>\n </table>\n<br>\n <div>PS: Einstellungen des Nachrichten-Verlaufs werden erst nach einem Neueinloggen aktualisiert.</div>\n <hr>\n <table>\n <tr>\n <td>\n <div>\n <input type="radio" name="eingabe" value="col" checked>\n Auswahl von Farbe 1\n <br>\n (Farbe Deines Nicks):\n <br>\n <input name="col" size="6" maxlength="6" value="$data[1]">\n </div>\n </td>\n <td width=20>\n </td>\n <td>\n <div>\n <input type="radio" name="eingabe" value="secol">\n Auswahl von Farbe 2\n <br>\n (Farbe Deiner Nachrichten):\n <br>\n <input name="secol" size="6" maxlength="6" value="$data[2]">\n </div>\n </td>\n </tr>\n </table>\n<br>\n <div>\n Beliebige Auswahl markieren und Farbe w\344hlen. Um Deine Optionen abzuspeichern,\n auf "Daten \344ndern" klicken!\n </div>\n <br>\n];
+ open COLORS, '<templates/colors.sno';
+ @colors = <COLORS>;
+ close COLORS;
+ print @colors;
+ }
+ elsif ($method eq 'edit_profile_html') {
+ if ($message eq 'edit_profile_ok') {
+ print " <div class=b>\n Hinweis:\n </div>\n <div>\n Du hast soeben Dein Profil erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren:\n <hr>\n";
+ }
+ else {
+ print $q->div('Hier kannst Du Dein Profil editieren!'), $q->hr;
+ }
+ print qq[ <form action="chat">\n <input type="hidden" name="var" value="edit_profile">\n <div>\n Dein Nachname:\n <br>\n <input name="nachname" value="$data[0]">\n </div>\n <br>\n <div>\n Dein Vorname:\n <br>\n <input name="vorname" value="$data[1]">\n </div>\n <br>\n <div>\n Dein Alter:\n <br>\n <input name="alter" value="$data[2]">\n </div>\n <br>\n <div>\n Dein Wohnort:\n <br>\n <input name="wohnort" value="$data[3]">\n </div>\n <br>\n <div>\n Deine E-Mail Adresse:\n <br>\n <input name="email" value="$data[4]">\n </div>\n <br>\n <div>\n Deine ICQ-Nummer:\n <br>\n <input name="icq" value="$data[5]">\n </div>\n <br>\n <div>\n Deine Homepage:\n <br>\n <input name="homepage" value="$data[6]">\n </div>\n <br>\n <div>\n Weiteres:\n <br>\n <textarea rows="5" cols="40"name="weiteres" wrap="virtual">$data[7]</textarea>\n </div>\n];
+ }
+ print qq[ <hr>\n <font color=ffffff>\n <input type="hidden" name="request" value="divcom">\n <input type="hidden" name="alias" value="$alias">\n <input type="hidden" name="tmpid" value="$tmpid">\n <input type="hidden" name="room" value="$room">\n <input type="submit" value="Daten \344ndern ...">\n </font>\n </form>\n</body>\n</html>\n];
+}
+sub edit {
+ my $method = $_[0];
+ if ($method eq 'edit_profile') {
+ my $url = $homepage;
+ $url =~ s[^http://*][];
+ $url =~ s[=][];
+ $url =~ s["][];
+ open PROFILE, ">data/user/profiles/$alias";
+ my $profile = "$nachname\n$vorname\n$alter\n$wohnort\n$email\n$icq\nhttp://$url\n$weiteres";
+ $profile =~ s/</&lt;/g;
+ print PROFILE $profile;
+ close PROFILE;
+ &edit_html('edit_profile_html', 'edit_profile_ok');
+ }
+ elsif ($method eq 'edit_options') {
+ if ($id ne $tmp) {
+ &edit_html('edit_options_html', 'edit_pw_wrong');
+ $client->shutdown(2);
+ exit 0;
+ }
+ $id = crypt $id, $cryptkey;
+ open OPTIONS, ">data/user/options/$alias";
+ my $options = "$id\n$col\n$secol\n$maxVerlauf\n$verlaufOrder";
+ $options =~ s/</&lt;/g;
+ print OPTIONS $options;
+ close OPTIONS;
+ open IDENT, "<data/online/ident/$alias";
+ my (@ident) = <IDENT>;
+ close IDENT;
+ open IDENT, ">data/online/ident/$alias";
+ print IDENT $ident[0] . $ident[1] . $ident[2] . "$col\n$secol";
+ close IDENT;
+ my $room = &get_room($alias);
+ &private_javascript($alias, $room, "parent.input.document.inf.col.value = '$col'; parent.input.document.inf.secol.value = '$secol';");
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> <font color='$secol'>hat seine Chat-Einstellungen ge&auml;ndert</font> ...</font></i>", $alias);
+ &post_strmsg($alias, $room, 'col', "$col;$secol");
+ &edit_html('edit_options_html', 'edit_options_ok');
+ }
+}
+1;
diff --git a/0.8.1/modules/hierachie.pm b/0.8.1/modules/hierachie.pm
new file mode 100755
index 0000000..b6f5732
--- /dev/null
+++ b/0.8.1/modules/hierachie.pm
@@ -0,0 +1,77 @@
+sub hierachie {
+ my($alias, $room) = @_;
+ open FILE, "<data/online/rstat/$room";
+ flock FILE, 2;
+ my(@rstat) = <FILE>;
+ close FILE;
+ shift @rstat;
+ shift @rstat;
+ open FILE, '<data/hierachie';
+ flock FILE, 2;
+ my(@hierachie) = <FILE>;
+ close FILE;
+ my(@userlevels) = (@hierachie, @rstat);
+ foreach $_ (@userlevels) {
+ my($name, $level) = split(/<;/, $_, 3);
+ if ($name eq $alias) {
+ chomp $level;
+ return $level;
+ }
+ }
+ return 0;
+}
+sub hierachie_rm {
+ my $alias = shift @_;
+ my @return;
+ open FILE, '<data/hierachie';
+ my(@hierachie) = <FILE>;
+ close FILE;
+ foreach $_ (@hierachie) {
+ push @return, $_ unless /^$alias<;/;
+ }
+ open FILE, '>data/hierachie';
+ print FILE @return;
+ close FILE;
+}
+sub hierachie_rm_rstat {
+ my($alias, $room) = @_;
+ my @return;
+ return unless open FILE, "<data/online/rstat/$room";
+ my(@hierachie) = <FILE>;
+ close FILE;
+ foreach $_ (@hierachie) {
+ push @return, $_ unless /^$alias<;/;
+ }
+ open FILE, ">data/online/rstat/$room";
+ print FILE @return;
+ close FILE;
+}
+sub hierachie_add {
+ my($alias, $level) = @_;
+ &hierachie_rm($alias);
+ open FILE, '>>data/hierachie';
+ print FILE "$alias<;$level\n";
+ close FILE;
+}
+sub hierachie_add_rstat {
+ my($alias, $level, $room) = @_;
+ &hierachie_rm_rstat($alias, $room);
+ return unless open FILE, ">>data/online/rstat/$room";
+ print FILE "$alias<;$level\n";
+ close FILE;
+}
+sub prove_away {
+ my($alias, $room) = @_;
+ return unless open AWAY, "<data/online/rstat/$room.away";
+ @away = <AWAY>;
+ close AWAY;
+ my $name, $away;
+ foreach $_ (@away) {
+ if (/^$alias.*/) {
+ ($name, $away) = split(/<; /, $_, 3);
+ chomp $away;
+ return $away;
+ }
+ }
+}
+1;
diff --git a/0.8.1/modules/htdocs.pm b/0.8.1/modules/htdocs.pm
new file mode 100755
index 0000000..4f1bbeb
--- /dev/null
+++ b/0.8.1/modules/htdocs.pm
@@ -0,0 +1,127 @@
+sub htdocs {
+ if ($var eq 'help_html') {
+ &printfile('templates/help.sno', 'Alle Chatbefehle');
+ }
+ elsif ($var eq 'logo_html') {
+ &start_html('Logo');
+ &logo_html;
+ }
+ elsif ($var eq 'menu_html') {
+ &menu_html;
+ }
+ elsif ($var eq 'logs_html') {
+ &logs_html;
+ }
+ elsif ($var eq 'view_logs_html') {
+ &secure_checkid($alias, $tmpid);
+ &printfile("data/logs/$tmp", 'Logdatei', 'blank') if 7 <= &hierachie($alias);
+ }
+ elsif ($var eq 'superuser_html') {
+ &secure_checkid($alias, $tmpid);
+ &superuser_html;
+ }
+ elsif ($var eq 'chatiquette_html') {
+ &printfile('templates/chatiq.sno', 'Chatiquette');
+ print $q->end_html;
+ }
+ else {
+ print $q->start_html(-'bgcolor', '000000'), $q->end_html;
+ }
+}
+sub menu_html {
+ &start_html("Men\374");
+ print "<div>\n Von hier aus kannst du alle Untermen\374punkte des Systems erreichen:\n</div>\n<hr>\n";
+ &menu();
+ print "</body>\n</html>";
+}
+sub logo_html {
+ print qq[ <layer top=-3 left=0><div style="position:absolute; top:5; left:10">\n <OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"\n codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0"\n WIDTH=48 HEIGHT=48>\n <PARAM NAME=movie VALUE="$gfxpath/ySymbol.swf">\n <PARAM NAME=loop VALUE=false>\n <PARAM NAME=menu VALUE=false>\n <PARAM NAME=quality VALUE=high>\n <PARAM NAME=scale VALUE=noborder>\n <PARAM NAME=wmode VALUE=opaque>\n <PARAM NAME=bgcolor VALUE=$bgcolor>\n <EMBED src="$gfxpath/ySymbol.swf" loop=false menu=false quality=high scale=noborder wmode=opaque bgcolor=$bgcolor WIDTH=48 HEIGHT=48 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED>\n </OBJECT>\n </div></layer>\n];
+ print $q->end_html;
+}
+sub logs_html {
+ &start_html('Logdateien');
+ &menu;
+ print "<div>\n Hier befinden sich alle Logdateien\n</div>\n<hr>\n";
+ if (5 <= &hierachie($alias)) {
+ print $q->div(qq[Folgende Logdateien des Raumes "$standardroom" k\366nnen nur von Oberw\344chtern oder h\366her gelesen werden (Sortiert nach A-Z, a-z):]), $q->br;
+ opendir LOGS, 'data/logs';
+ my(@logs) = readdir LOGS;
+ closedir LOGS;
+ my(@sortedir) = sort(@logs);
+ foreach $_ (@sortedir) {
+ if (-f "data/logs/$_") {
+ print $q->a({-'href', "chat?request=htdocs&alias=$alias&var=view_logs_html&tmp=$_&tmpid=$tmpid", -'target', '_new'}, "$_"), ' ';
+ }
+ }
+ }
+ else {
+ print $q->div("Logdateien k\366nnen nur von Oberw\344chtern (OW) gelesen werden. Du bist jedoch ein W\344chter (W\304) oder ein", qq["Normaler Chatter". Oberw\344chter k\366nnen alles nachlesen, was \366ffentlich im Raum "Cyberbar" gechattet wurde.]), $q->hr;
+ }
+ print $q->end_html;
+}
+sub superuser_html {
+ &start_html ('Superuser');
+ &menu;
+ print "<div>Hallo $alias. Du bist als ";
+ my $hierachie = &hierachie($alias);
+ if (9 <= $hierachie) {
+ print $q->b('Administrator'), ' (AD) eingetragen.</div><br>', $q->br;
+ }
+ elsif (7 <= $hierachie) {
+ print $q->b("Oberw\344chter"), ' (OW) eingetragen.</div><br>', $q->br;
+ }
+ elsif (5 <= $hierachie) {
+ print $q->b("W\344chter"), " (W\304) eingetragen.</div><br>", $q->br;
+ }
+ else {
+ print $q->b('normaler Chatter'), ' (NC) eingetragen.</div><br>', $q->br;
+ }
+ open FILE, 'data/hierachie';
+ my(@hierachie) = <FILE>;
+ close FILE;
+ my @ows, @was, @ads;
+ foreach $_ (@hierachie) {
+ my($name, $level) = split(/<;/, $_, 3);
+ chomp $level;
+ if ($level == 5) {
+ push @was, $name;
+ }
+ elsif ($level == 7) {
+ push @ows, $name;
+ }
+ elsif ($level == 9) {
+ push @ads, $name;
+ }
+ if (3 <= $hierachie) {
+ if ($level == 6) {
+ push @was, "$name!";
+ }
+ elsif ($level == 8) {
+ push @ows, "$name!";
+ }
+ elsif ($level == 10) {
+ push @ads, "$name!";
+ }
+ }
+ }
+ my $nads = $#ads + 1;
+ print '<div>', $q->b('AD'), "s ($nads St\374ck)";
+ foreach $_ (@ads) {
+ print $q->font({-'color', 'ffa500'}, ' ' . $_);
+ }
+ my $nrow = $#ows + 1;
+ print '</div><br><br><div>', $q->b('OW'), "s ($nrow St\374ck)";
+ foreach $_ (@ows) {
+ print $q->font({-'color', 'ffa500'}, ' ' . $_);
+ }
+ my $nrwa = $#was + 1;
+ print '</div><br>', $q->br, '<div>', $q->b("W\304"), "s ($nrwa St\374ck)";
+ foreach $_ (@was) {
+ print $q->font({-'color', 'FFA500'}, ' ' . $_);
+ }
+ print qq[<hr>\n Die jeweiligen F\344higkeiten der Oberw\344chter (OW) und der W\344chter (W\304) sind unter\n "<a href="chat?request=htdocs&var=help_html">Chat-Befehle</a>"\n dokumentiert. Versteckte Superuser k\366nnen nur von anderen Superusern auf\ndieser Liste eingesehen werden!\n</div>\n</body>\n</html>\n];
+}
+sub menu {
+ print "<div>\n <a href='chat?request=divcom&var=edit_profile_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Profil \344ndern</a>\n <a href='chat?request=divcom&var=edit_options_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Optionen</a>\n <a href='chat?request=divcom&var=list_alias_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Benutzer</a>\n <a href='chat?request=htdocs&var=help_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Befehle</a>\n <a href='chat?request=divcom&var=gb_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Board</a>\n <a href='chat?request=htdocs&var=superuser_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Superuser</a>\n <a href='chat?request=htdocs&var=logs_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Logs</a>\n <a href='chat?request=statistic&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Statistik</a>\n <a href='chat?request=htdocs&var=chatiquette_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Chatiquette</a>\n</div>\n<hr>\n";
+}
+1;
diff --git a/0.8.1/modules/input.pm b/0.8.1/modules/input.pm
new file mode 100755
index 0000000..48df243
--- /dev/null
+++ b/0.8.1/modules/input.pm
@@ -0,0 +1,14 @@
+sub input {
+ &rm_away($alias, $room);
+ $maxVerlauf = '10' if $maxVerlauf eq undef;
+ $verlaufOrder = '1' if $verlaufOrder eq undef;
+ if ($tmp eq 'login') {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> hat den Chat im Raum <b>$room</b> betreten ...</font></i>");
+ }
+ print qq[<html>\n<head>\n<script language="JavaScript"><!--\n\n// Einstellungsvariablen\nmaxVerlauf = $maxVerlauf; // Anzahl der Eintr\344ge des Verlaufs\nmaxPreview = 20; // Zeichenl\344nge der Verlaufsvorschau\nverlaufOrder = $verlaufOrder; // Neue Nachrichten von: 0=oben, 1=unten\n//autoAwayTimeout = 5; // Sekunden, nach denen der User 'Away' gesetzt wird\n//autoQuitTimeout = 10; // Sekunden, nach denen der User den Chat verl\344sst\nautoAwayTimeout = 300; // Sekunden, nach denen der User 'Away' gesetzt wird\nautoQuitTimeout = 1200; // Sekunden, nach denen der User den Chat verl\344sst\n\n// Interne Variablen\nuserNotFocused = false; // Wenn User nicht schreibt\nuserAway = false; // Wenn User automatisch auf 'Away' gesetzt ist\nuserAwayTime = 0; // Sekunden, die User 'Away' ist\nfullVerlauf = new Array( maxVerlauf ); // Verlaufspuffer\n\nfunction delout()\n{\n addVerlauf (document.inf.msg.value); // Dem Verlauf eine Nachricht anh\344ngen\n document.inf.msg.focus(); // Fukus in das Eingabeform\n document.inf.msg.select(); // Text im Eigabeform markieren\n document.inf.submit(); // Formular absenden\n return false; // Abbrechen, damit das Frame nicht neu geladen wird\n}\n\nfunction CheckAuswahl()\n{\n id=document.verlaufform.verlauf.selectedIndex; // ID des ausgew\344hlten Feldes\n\n if (fullVerlauf[id-1] != null) // Nur, wenn das Feld nicht leer ist\n {\n document.inf.msg.value = fullVerlauf[id-1]; // Eintrag ins Textfeld\n }\n\n document.verlaufform.verlauf.selectedIndex = 0; // Ersten Eintrag (\334berschrift) ausw\344hlen\n document.inf.msg.focus(); // Eingabefeld fokusieren\n\n return true;\n}\n\nfunction addVerlauf (msg)\n{\n if (msg == "") // Falls msg leer\n return false; // Aufruf ignorieren\n\n if (verlaufOrder) // neue Nachrichten von unten\n {\n for (i=0; i<(maxVerlauf-1); i++) // Alle Eintr\344ge einen aufrutschen\n {\n document.verlaufform.verlauf.options[i+1].text = document.verlaufform.verlauf.options[i+2].text;\n fullVerlauf[i] = fullVerlauf[i+1];\n }\n }\n else // neue Nachrichten von oben\n {\n for (i=(maxVerlauf-2); i>=0; i--) // Alle Eintr\344ge einen aufrutschen\n {\n document.verlaufform.verlauf.options[i+2].text = document.verlaufform.verlauf.options[i+1].text;\n fullVerlauf[i+1] = fullVerlauf[i];\n }\n }\n\n if (msg.length > maxPreview) // Vorschau zuschneiden\n pre = msg.slice(0, maxPreview-3) + "...";\n else\n pre = msg;\n\n if (verlaufOrder) // pos = Position des neuen Eintrags\n pos = maxVerlauf-1;\n else\n pos = 0\n\n document.verlaufform.verlauf.options[pos+1].text = pre; // Neue Vorschau anf\374gen\n fullVerlauf[pos] = msg; // Neuen Eintrag an den Verlauf anf\374gen\n\n// document.verlaufform.verlauf.selectedIndex = maxVerlauf; // Fokus auf den letzten Eintrag\n document.verlaufform.verlauf.selectedIndex = 0; // Fokus auf den ersten Eintrag (\334berschrift)\n}\n\nfunction msgBlur()\n{\n userNotFocused = true;\n userAwayTime = 0;\n userAway = false;\n}\n\nfunction msgFocus()\n{\n userNotFocused = false;\n if (userAway) // Wird ausgef\374hrt, falls User 'Away' war\n {\n ; // nop\n }\n userAwayTime = 0;\n userAway = false;\n}\n\nfunction checkInterval()\n{\n// status = "userNotFocused=" + userNotFocused + "; userAway=" + userAway + "; userAwayTime=" + userAwayTime + ""; // Debug\n if (userNotFocused)\n {\n userAwayTime += 5; // Addiere 5, da nur alle 5Sek ausgef\374hrt\n if (!userAway)\n {\n if (autoAwayTimeout < userAwayTime) // Falls Zeit abgelaufen\n {\n if (document.inf.tmp.value != "away")\n open ("chat?request=postmessage&alias=$alias&tmpid=$tmpid&msg=%2faway&tmp=autoaway","reload"); // 'Away' setzen\n userAway = true;\n }\n }\n else\n {\n if (autoQuitTimeout < userAwayTime) // Falls Zeit abgelaufen\n {\n open ("chat?request=postmessage&alias=$alias&tmpid=$tmpid&msg=%2fexit&tmp=autologout","reload"); // Chat beenden\n }\n }\n }\n\n window.setTimeout("checkInterval()",5000); // In 5 Sekunden wieder aufrufen\n}\n\nfunction initFrame()\n{\n window.setTimeout("checkInterval()",5000); // In 5 Sekunden aufrufen\n document.inf.msg.focus(); // Eingabefeld fokusieren\n}\n//-->\n</script>\n];
+ &style;
+ print qq[</head>\n<body class="blank" onload="initFrame();">\n <div align="left">\n <table border="0" cellpadding="0" cellspacing="0">\n <tr>\n <td>\n <form name="inf" target="reload" action="chat" onsubmit="return delout();">\n <input type="hidden" name="request" value="postmessage">\n <input type="hidden" name="alias" value="$alias">\n <input type="hidden" name="room" value="$room">\n <input type="hidden" name="col" value="$col">\n <input type="hidden" name="secol" value="$secol">\n <input type="hidden" name="tmpid" value="$tmpid">\n <input type="hidden" name="whisper" value="$whisper">\n <input type="hidden" name="tmp" value="$tmp">\n <input size="40" maxlength="300" name="msg" onBlur="msgBlur();" onFocus="msgFocus();">\n </form>\n </td>\n <td><form name="verlaufform">\n <script language="JavaScript"><!--\n document.write("<select size='1' name='verlauf' size='40' onChange='CheckAuswahl();'>");\n document.write("<option>- Nachrichten-Verlauf -</option>");\n for(i=0; i<maxVerlauf; i++) // Leere Verlaufsfelder generieren\n document.write("<option value>(leer)</option>");\n document.write("</select>");\n //-->\n </script>\n </form>\n </td>\n </tr>\n </table>\n </div>\n</body>\n</html>\n];
+ $client->$shutdown(2);
+ exit 0;
+}
+1;
diff --git a/0.8.1/modules/loggedin.pm b/0.8.1/modules/loggedin.pm
new file mode 100755
index 0000000..848505d
--- /dev/null
+++ b/0.8.1/modules/loggedin.pm
@@ -0,0 +1,41 @@
+sub loggedin {
+ &start_html($loginplace, 'blank');
+ print qq[<div>\n <font color='$col'>$alias</font>, sch\366n da\337 Du da bist :-), <a href='chat?request=loggedin&alias=$alias&col=$col&secol=$secol&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder' style="text-decoration: underline; color: red">hier</a> kannst du die Seite aktualisieren.\n</div>\n<hr>\n<div>\n<a href="chat?request=stream&alias=$alias&room=$standardroom&col=$col&secol=$secol&tmp=login&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder" style="text-decoration: underline; color: red; font-size:20px">Hier</a>\nkannst du den Standardraum $standardroom betreten. <br><br>\n];
+ opendir ROOMDIRS, 'data/online/rooms';
+ local(@roomdirs) = readdir ROOMDIRS;
+ close ROOMDIRS;
+ foreach $_ (@roomdirs) {
+ if (-e "data/online/rooms/$_" and $_ ne '..' and $_ ne '.') {
+ my $room = $_;
+
+ open RSTAT, "<data/online/rstat/$room";
+ my(@rstat) = <RSTAT>;
+ close RSTAT;
+
+ my $door = '[<font color=red>Abgesperrt!</font>]' if $rstat[0] eq "1\n";
+
+ opendir ROOMDIR, "data/online/rooms/$room";
+ my(@roomdir) = readdir ROOMDIR;
+ close ROOMDIR;
+
+ my $nr = $#roomdir - 1;
+ if ($door or $_ eq $loginplace) {
+ print $q->b($_), " $door ($nr) ";
+ }
+ else {
+ print $q->b($q->a({-'href', "chat?request=stream&alias=$alias&room=$_&col=$col&secol=$secol&tmp=login&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder"}, "$_")), " ($nr)";
+ }
+ print " Raumthema: $rstat[1]" if $rstat[1] ne "\n";
+ print $q->br;
+ foreach $_ (@roomdir) {
+ if ($_ ne '..' and $_ ne '.') {
+ my $col = &get_ident($_,3);
+ print "<a href='chat?request=divcom&var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid' target='$_' style='color: $col'>$_</a> ";
+ }
+ }
+ print $q->br, $q->br;
+ }
+ }
+ &gb_html($_[0],'loggedin');
+}
+1;
diff --git a/0.8.1/modules/nohup.out b/0.8.1/modules/nohup.out
new file mode 100644
index 0000000..bb27a65
--- /dev/null
+++ b/0.8.1/modules/nohup.out
@@ -0,0 +1,2 @@
+Can't locate config.pm in @INC (@INC contains: /usr/lib/perl5/5.6.1/i686-linux /usr/lib/perl5/5.6.1 /usr/lib/perl5/site_perl/5.6.1/i686-linux /usr/lib/perl5/site_perl/5.6.1 /usr/lib/perl5/site_perl .) at ychatd.pl line 5.
+BEGIN failed--compilation aborted at ychatd.pl line 5.
diff --git a/0.8.1/modules/online.pm b/0.8.1/modules/online.pm
new file mode 100755
index 0000000..4c87fb0
--- /dev/null
+++ b/0.8.1/modules/online.pm
@@ -0,0 +1,167 @@
+sub online {
+ &secure_checkid($alias, $tmpid);
+ my(@away) = &prove_away($alias, $room, 'return_list');
+ for (;;) {
+ for ($i = 0; $i <= $#away; $i += 2) {
+ last if ($away[$i] eq $alias || $room eq $loginplace);
+ }
+ open DATEI, "<data/online/users/$alias";
+ my $oldstamp = <DATEI>;
+ close DATEI;
+ if ($oldstamp > time - 100) {
+ open DATEI, "<data/user/counts/$alias.online";
+ my $online = <DATEI>;
+ close DATEI;
+ my $total = time - $oldstamp + $online;
+ open DATEI, ">data/user/counts/$alias.online";
+ print DATEI $total;
+ close DATEI;
+ }
+ last;
+ }
+ unless (-d "data/online/rooms/$room") {
+ mkdir "data/online/rooms/$room", 511;
+ }
+ open DATEI, ">data/online/users/$alias";
+ print DATEI time;
+ close DATEI;
+
+ open DATEI, ">data/online/rooms/$room/$alias";
+ print DATEI time;
+ close DATEI;
+ open DATEI, '<data/online/prove';
+ my $provetime = <DATEI>;
+ close DATEI;
+
+ &check_online if $provetime < time - 40;
+ print <<END;
+ <html>
+ <head>
+ <meta http-equiv="refresh" content="20" URL="chat?request=online&room=$room&alias=$alias&tmpid=$tmpid">
+ <style type="text/css">\n a { font-family: arial; font-size:11px; color: #ffffef; }\n a:hover { color: #ffffff; }\n </style>\n <style type="text/css" media="all">\n a { text-decoration: none; }\n a:hover { text-decoration:underline; }
+ </style>
+ </head>
+ <body bgcolor="$chatbg">
+END
+
+ opendir ROOM, 'data/online/rooms/' . $room;
+ my(@room) = readdir(ROOM);
+ closedir ROOM;
+
+ my $chatter = $#room - 1;
+ print "<font size='1' color='ffffff' face='arial'>$room ($chatter):</font><table>\n";
+
+ open FILE, "<data/online/rstat/$room";
+ my(@rstat) = <FILE>;
+ close FILE;
+ shift @rstat;
+ shift @rstat;
+
+ open FILE, '<data/hierachie';
+ my(@userlevels) = (<FILE>, @rstat);
+ close FILE;
+
+ open FILE, "<data/online/rstat/$room.away";
+ my(@away) = <FILE>;
+ close FILE;
+
+ my $hierachie;
+ foreach (@userlevels) {
+ my($name, $level) = split(/<;/, $_, 3);
+ if ($name eq $alias) {
+ $hierachie = $level;
+ last;
+ }
+ }
+
+ my %alias;
+ foreach (@room) {
+ if (-f "data/online/rooms/$room/$_") {
+ open IDENT, "data/online/ident/$_";
+ my @ident = <IDENT>;
+ close IDENT;
+ chomp $ident[2];
+ chomp $ident[3];
+ $alias{$ident[2]} = [$_, $ident[3]];
+
+ }
+ }
+
+ @room = undef;
+ foreach my $value (reverse (sort { $a <=> $b } keys %alias)) {
+ push @room, ${$alias{$value}}[0]
+ }
+
+ foreach my $nick (@room) {
+ if (-f "data/online/rooms/$room/$nick") {
+ my $inside = 0;
+ my $col = &get_ident($nick,3);
+ foreach $_ (@away) {
+ my($name, $awaymessage) = split(/<;/, $_, 3);
+ if ($name eq $nick) {
+ chomp $awaymessage;
+ $awaymessage =~ s/=//ig;
+ print "<tr><td><img border='0' title='$awaymessage' alt='$awaymessage' src='$gfxpath/away.gif'></td>";
+ $inside = 2;
+ }
+ }
+ if ($inside == 0) {
+ foreach $_ (@userlevels) {
+ my($name, $level) = split(/<;/, $_, 3);
+ if ($nick eq $name) {
+ chomp $level;
+ $inside = 1;
+ if ($level == 1) {
+ print "<tr><td><img title='Raumbesetzer' alt='Raumbesetzer' src='$gfxpath/rb.gif'></td>";
+ last;
+ }
+ elsif ($level == 2) {
+ print "<tr><td><img title='Die Unschuld vom Land' alt='Die Unschuld vom Land' src='$gfxpath/uvl.gif'></td>";
+ last;
+ }
+ elsif ($level == 3) {
+ print "<tr><td><img title='Tempor&auml;rer W&auml;chter' alt='Tempor&auml;rer W&auml;chter' src='$gfxpath/twa.gif'></td>";
+ last;
+ }
+ elsif ($level == 5) {
+ print "<tr><td><img title='W&auml;chter' alt='W&auml;chter' src='$gfxpath/wa.gif'></td>";
+ last;
+ }
+ elsif ($level == 7) {
+ print "<tr><td><img title='oberw&auml;chter' alt='Oberw&auml;chter' src='$gfxpath/ow.gif'></td>";
+ last;
+ }
+ elsif ($level == 9) {
+ print "<tr><td><img title='Administrator' alt='Administrator' src='$gfxpath/adm.gif'></td>";
+ last;
+ }
+
+ if (5 <= $hierachie) {
+ if ($level == 6) {
+ print "<tr><td><img title='W&auml;chter' alt='Unsichtbarer W&auml;chter' src='$gfxpath/wa-i.gif'></td>";
+ last;
+ }
+ elsif ($level == 8) {
+ print "<tr><td><img title='oberw&auml;chter' alt='Unsichtbarer Oberw&auml;chter' src='$gfxpath/ow-i.gif'></td>";
+ last;
+ }
+ elsif ($level == 10) {
+ print "<tr><td><img title='Administrator' alt='Unsichtbarer Administrator' src='$gfxpath/adm-i.gif'></td>";
+ last;
+ }
+
+ }
+ print '<tr><td></td>';
+ last;
+ }
+ }
+ }
+ if ($inside == 0) {
+ print '<tr><td></td>';
+ }
+ print "<td><a href='chat?request=divcom&var=alias_html&alias=$alias&tmp=$nick&tmpid=$tmpid' target='$nick' style='color: $col'>$nick</a></td></tr>\n";
+ }
+ }
+ print '</table></body></html>';
+}
+1;
diff --git a/0.8.1/modules/postmessage.pm b/0.8.1/modules/postmessage.pm
new file mode 100755
index 0000000..f787534
--- /dev/null
+++ b/0.8.1/modules/postmessage.pm
@@ -0,0 +1,90 @@
+sub postmessage {
+ if (not -e "data/online/rooms/$room/$alias" and $tmp ne 'autoaway' and $tmp ne 'autologout') {
+ &post_prv($alias, "<font color=ffffff>Du befindest Dich nicht im Raum <font color=ffa500>$room</font> und kannst dort auch keine Nachrichten posten!</font>");
+ &reload_html;
+ }
+ elsif (length $msg > 300) {
+ &post_prv($alias, "<font color=ffffff>Deine Nachricht enth\344lt zu viele Zeichen. Maximal sind 300 Zeichen erlaubt.</font>");
+ &reload_html;
+ }
+ if ($tmp eq 'away') {
+ &rm_away($alias, $room);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> hat sich zur\374ck gemeldet ... </font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ &private_javascript($alias, $room, q[parent.input.document.inf.tmp.value = 'notaway';]);
+ }
+ $msg =~ s/</&lt;/g;
+ if (substr($msg, 0, 1) ne '/') {
+ unless ($tmp eq 'autoaway') {
+ foreach $_ ($col, $secol) {
+ &prove_color($alias, $_);
+ }
+ }
+ open MSGFILE, ">>data/msgs/$room";
+ if (not $msg =~ s[/me/][<i>$alias</i>]g || $msg =~ s[/m/][<i><font color=$col>$alias</font></i>]g) {
+ print MSGFILE '!<;' . time . "<;!<;!<;<b><font color='$col'>$alias: <font color='$secol'>$msg<br></font></font></b><;$alias<;\n";
+ }
+ else {
+ $msg =~ s[/me/][<i>$alias</i>]g;
+ $msg =~ s[/m/][<i><font color=$col>$alias</font></i>]g;
+ print MSGFILE '!<;' . time . "<;!<;!<;<b><font color=$secol>$msg</font></font></b><br><;$alias<;\n";
+ }
+ close MSGFILE;
+ opendir PID, "data/online/pids/$room";
+ my(@pids) = readdir PID;
+ closedir PID;
+ foreach $_ (@pids) {
+ kill 'USR1', $_ if -f "data/online/pids/$room/$_";
+ }
+ &log("<b><font color=$col>$alias: <font color=$secol>$msg</font></font></b>") if $room eq $standardroom;
+ &reload_html;
+ }
+ else {
+ &command($msg, $tmp);
+ }
+}
+sub post {
+ my($room, $msg2post, $alias, $secroom) = @_;
+ my(@rooms) = $room;
+ push @rooms, $secroom if $room ne $secroom;
+ foreach my $theroom (@rooms) {
+ open MSGFILE, ">>data/msgs/$theroom";
+ print MSGFILE '!<;' . time . "<;!<;!<;$msg2post<br><;$alias<;\n";
+ close MSGFILE;
+ opendir PID, "data/online/pids/$theroom";
+ my(@pids) = readdir PID;
+ closedir PID;
+ foreach $_ (@pids) {
+ kill 'USR1', $_ if -f "data/online/pids/$theroom/$_";
+ }
+ }
+ &log($msg2post) if $room eq $standardroom;
+}
+sub post_prv {
+ my($alias2post, $msg2post) = @_;
+ my $roomofalias = &get_room($alias2post);
+ return 'false' if not $roomofalias;
+ open MSGFILE, ">>data/msgs/$roomofalias";
+ print MSGFILE "$alias2post<;" . time . "<;!<;!<;$msg2post<br><;$alias<;\n";
+ close MSGFILE;
+ opendir PID, "data/online/pids/$roomofalias";
+ my(@pids) = readdir PID;
+ closedir PID;
+ foreach $_ (@pids) {
+ kill 'USR1', $_ if -f "data/online/pids/$roomofalias/$_";
+ }
+ return 'true';
+}
+sub post_strmsg {
+ my($alias, $room, $command, $action) = @_;
+ open MSGFILE, ">>data/msgs/$room";
+ print MSGFILE "$alias<;" . time . "<;$command<;$action<;!<;!<;\n";
+ close MSGFILE;
+ opendir PID, "data/online/pids/$room";
+ my(@pids) = readdir PID;
+ closedir PID;
+ foreach $_ (@pids) {
+ kill 'USR1', $_ if -f "data/online/pids/$room/$_";
+ }
+}
+
+1;
diff --git a/0.8.1/modules/shared.pm b/0.8.1/modules/shared.pm
new file mode 100755
index 0000000..e458953
--- /dev/null
+++ b/0.8.1/modules/shared.pm
@@ -0,0 +1,353 @@
+sub reload_html {
+ print "<html><body bgcolor='$chatbg'></body></html>";
+ &del_awake();
+ $client->shutdown(2);
+ exit 0;
+}
+sub printfile {
+ my($file2print, $pagetitle, $bodyclass) = @_;
+ &start_html($pagetitle, $bodyclass) if $pagetitle ne '';
+ &menu unless $bodyclass eq 'blank';
+ open FILE2PRINT, "<$file2print";
+ print "$_\n" while defined($_ = <FILE2PRINT>);
+ close FILE2PRINT;
+}
+sub start_html {
+ print "<html><head><title>$title - $_[0]</title>$_[2]";
+ &style;
+ print '</head>';
+ if ($_[1] eq 'start') {
+ print '<body onload="document.login.alias.focus();">';
+ }
+ elsif ($_[1] ne '') {
+ print "<body class=$_[1]>";
+ }
+ else {
+ print '<body>';
+ }
+}
+sub log {
+ my $msg2log = $_[0];
+ my($secs, $mins, $hours, $days, $months, $years) = &timearray;
+ my $js;
+ $hours--;
+ ($msg2log, $js) = split(/<script/, $msg2log, 3);
+ open LOG, ">>data/logs/$days.$months.$years";
+ print LOG "<br><font color=ffffef><i>($hours:$mins:$secs)</i></font> $msg2log\n";
+ close LOG;
+}
+sub timestring {
+ my($mins, $hours) = (localtime)[1, 2];
+ $hours = '0' . $hours if $hours < 10;
+ $mins = '0' . $mins if $mins < 10;
+ return "$hours:$mins";
+}
+sub timearray {
+ my($secs, $mins, $hours, $days, $months, $years) = (localtime)[(0, 1, 2, 3, 4, 5)];
+ $months += 1;
+ $hours = '0' . $hours if $hours < 10;
+ $mins = '0' . $mins if $mins < 10;
+ $secs = '0' . $secs if $secs < 10;
+ $days = '0' . $days if $days < 10;
+ $months = '0' . $months if $months < 10;
+ $years = $years - 100;
+ if ($years < 10) {
+ $years = '200' . $years;
+ }
+ else {
+ $years = '20' . $years;
+ }
+ return $secs, $mins, $hours, $days, $months, $years;
+}
+sub error {
+ my $error_msg = $_[0];
+ &start_html("Error: ($error_msg)");
+ print $q->div("Error: ($error_msg)"), $q->end_html;
+ open ERROR, '>>data/error';
+ print ERROR "Alias: $alias TempID: $tmpid File. $0 PID: $$ Time: " . time . " Message: $error_msg \n";
+ close ERROR;
+ $client->shutdown(2) if $client;
+ exit 0;
+}
+sub check_online {
+ open PROVE, '>data/online/prove';
+ print PROVE time;
+ close PROVE;
+ opendir DIR, 'data/online/rooms';
+ my(@roomdir) = readdir DIR;
+ closedir DIR;
+ foreach my $theroom (@roomdir) {
+ opendir DIR, "data/online/rooms/$theroom";
+ my(@roomusers) = readdir DIR;
+ closedir DIR;
+ my $empty = 1;
+ foreach $user (@roomusers) {
+ if (-f "data/online/rooms/$theroom/$user") {
+ $empty = 0;
+ open USER, "<data/online/rooms/$theroom/$user";
+ my $userstamp = <USER>;
+ close USER;
+ if ($userstamp < time - 40) {
+ unlink "data/online/$theroom/$user";
+ open USER, "<data/online/users/$user";
+ my $userstamp = <USER>;
+ close USER;
+ if ($userstamp < time - 40) {
+ &post($theroom, '<i><font color=ffffff>' . &timestring . " <font color='".&get_ident($user,3)."'>$user</font> hat den Chat verlassen ... </font></i>");
+ if ($user ne $alias) {
+ &rm_alias($user, $theroom);
+ }
+ else {
+ unlink "data/online/rooms/$theroom/$user";
+ }
+ }
+ }
+ }
+ }
+ opendir PIDS, "data/online/pids/$theroom";
+ my(@pids) = readdir PIDS;
+ closedir PIDS;
+ if ($empty == 1) {
+ rmdir "data/online/rooms/$theroom";
+ unlink "data/online/rstat/$theroom";
+ unlink "data/online/rstat/$theroom.away";
+ unlink "data/msgs/$theroom";
+ foreach $_ (@pids) {
+ unlink "data/online/pids/$theroom/$_" if -f "data/online/pids/$theroom/$_";
+ }
+ rmdir "data/online/pids/$theroom";
+ }
+ }
+}
+sub rm_if_loggedin {
+ my $alias = shift;
+ my $room = &get_room($alias);
+ while ($room ne undef) {
+ &rm_alias($alias, $room);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$user</font> hat den Chat verlassen ... </font></i>");
+ $room = &get_room($alias);
+ }
+}
+sub secure_checkid {
+ my($alias2check, $tmpid) = @_;
+ &error("Falsche TempID! $tmpid") unless -f "data/online/tmpid/$alias.$tmpid";
+}
+sub rm_alias {
+ my($alias, $room) = @_;
+ unlink "data/online/rooms/$room/$alias";
+ unlink "data/online/users/$alias";
+ opendir TMPID, 'data/online/tmpid';
+ my(@tmpid) = readdir TMPID;
+ close TMPID;
+ foreach $_ (@tmpid) {
+ unlink "data/online/tmpid/$_" if /^$alias\..+$/;
+ }
+ unlink "data/online/ident/$alias";
+ &rm_rstat($alias, $room);
+}
+sub rm_rstat {
+ my($alias, $room) = @_;
+ open RSTAT, "<data/online/rstat/$room";
+ my(@rstat) = <RSTAT>;
+ close RSTAT;
+ my(@rstat2) = ($rstat[0], $rstat[1]);
+ for ($i = 2; $i <= $#rstat; ++$i) {
+ chomp $rstat[$i];
+ push @rstat2, $rstat[$i] . "\n" unless $rstat[$i] =~ /^$alias<;/;
+ }
+ open RSTAT, ">data/online/rstat/$room";
+ print RSTAT @rstat2;
+ close RSTAT;
+}
+sub rm_away {
+ my($alias, $room) = @_;
+ open AWAY, "<data/online/rstat/$room.away";
+ my(@away) = <AWAY>;
+ close AWAY;
+ my @away2;
+ foreach $_ (@away) {
+ my(@split) = split(/<;/, $_, 0);
+ push @away2, $_ if $alias ne $split[0];
+ }
+ open AWAY, ">data/online/rstat/$room.away";
+ print AWAY @away2;
+ close AWAY;
+}
+sub rm_entry {
+ my($entry, $file) = @_;
+ open ENTRY, "<data/$file";
+ my(@entry) = <ENTRY>;
+ close ENTRY;
+ my @new;
+ foreach $_ (@entry) {
+ push @new, $_ if $entry . "\n" ne $_;
+ }
+ if (@entry != @new) {
+ open ENTRY, ">data/$file";
+ print ENTRY @new;
+ close ENTRY;
+ return 1;
+ }
+ else {
+ return;
+ }
+}
+sub add_entry {
+ my($entry, $file) = @_;
+ open ENTRY, "<data/$file";
+ my(@entry) = <ENTRY>;
+ close ENTRY;
+ foreach $_ (@entry) {
+ chomp $_;
+ return if $entry eq $_;
+ }
+ open ENTRY, ">>data/$file";
+ print ENTRY $entry . "\n";
+ close ENTRY;
+ return 1;
+}
+sub prove_color {
+ my($alias, $color) = @_;
+ my $length = length $color;
+ if ($length > 6 or $length < 6) {
+ &post_prv($alias, "<font color=ffffff>Ung\374ltige Hexadezimalfarbe.</font>");
+ &reload_html;
+ }
+}
+sub kill_alias {
+ my($alias2kill, $alias) = @_;
+ my($secs, $mins, $hours, $days, $months, $years) = &timearray;
+ unlink "data/user/options/$alias2kill";
+ unlink "data/user/profiles/$alias2kill";
+ unlink "data/user/gbooks/$alias2kill";
+ unlink "data/user/counts/$alias2kill";
+ unlink "data/user/counts/$alias2kill.online";
+ unlink "data/user/lastlogin/$alias2kill";
+ unlink "data/user/memos/$alias2kill";
+ &rm_entry($alias2kill, 'ban');
+ open DEL, '>>data/kill';
+ print DEL "($days.$months.$years $hours:$mins:$secs) $alias2kill wurde von $alias gekillt\n";
+ close DEL;
+}
+sub random_color {
+ my(@digit) = ('F', 'C', 'A', 'B', (5, 6, 7, 8, 9));
+ my $dig1 = rand @digit;
+ my $dig2 = rand @digit;
+ my $dig3 = rand @digit;
+ my $dig4 = rand @digit;
+ my $dig5 = rand @digit;
+ my $dig6 = rand @digit;
+ return $digit[$dig1] . $digit[$dig2] . $digit[$dig3] . $digit[$dig4] . $digit[$dig5] . $digit[$dig6];
+}
+sub url_decode {
+ my $t = shift @_;
+ $t =~ s[/][];
+ $t =~ tr/+/ /;
+ while ($t =~ s/%([a-f0-9][a-f0-9])/chr hex $1;/ie) {
+ ();
+ }
+ return $t;
+}
+sub url_encode {
+ my $t = shift @_;
+ while ($t =~ s/([^\w()'*~!.-])/sprintf '%%%02x', $1;/eg) {
+ ();
+ }
+ return $t;
+}
+sub calculate_hpm {
+ my($hits, $starttime) = @_;
+ return sprintf('%.2f', $hits / ((time - $starttime) / 60));
+}
+sub calculate_uptime_hours {
+ my $starttime = shift @_;
+ return sprintf('%.2f', (time - $starttime) / 3600);
+}
+sub private_javascript {
+ my($alias, $room, $javascript) = @_;
+ open MSGFILE, ">>data/msgs/$room";
+ print MSGFILE "$alias<;" . time . qq[<;!<;!<;<script language="JavaScript">$javascript</script><;\n];
+ close MSGFILE;
+ opendir PID, "data/online/pids/$room";
+ my(@pids) = readdir PID;
+ closedir PID;
+ foreach $_ (@pids) {
+ kill 'USR1', $_ if -f "data/online/pids/$room/$_";
+ }
+}
+sub get_theme {
+ my $room = shift @_;
+ open RSTAT, "data/online/rstat/$room";
+ my(@rstat) = <RSTAT>;
+ close RSTAT;
+ chomp $rstat[1];
+ return '<b>Raumthema:</b>' . $rstat[1] if $rstat[1] ne undef;
+}
+sub get_room {
+ my $alias = shift @_;
+ opendir DIR, 'data/online/rooms';
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach my $room (@dir) {
+ opendir DIR, "data/online/rooms/$room";
+ my(@chatter) = readdir DIR;
+ closedir DIR;
+ foreach my $chatter (@chatter) {
+ return $room if $chatter eq $alias;
+ }
+ }
+ return undef;
+}
+sub get_ident {
+ my ($alias,$line) = @_;
+ open IDENT, "data/online/ident/$alias";
+ my (@ident) = <IDENT>;
+ close IDENT;
+ chomp $ident[$line];
+ return $ident[$line];
+}
+sub get_online_users {
+ my @dir = &diropen('data/online/rooms');
+ my @users;
+
+ foreach my $room (@dir) {
+ next if $room =~ /\./;
+ my @room = &diropen("data/online/rooms/$room");
+
+ foreach (@room) {
+ push @users, $_ unless /\./;
+ }
+ }
+ return @users;
+}
+sub get_online_time {
+ my $alias = shift;
+ if (-f "data/user/options/$alias") {
+ open ONLINE, "<data/user/counts/$alias.online";
+ my $online = <ONLINE>;
+ close ONLINE;
+ return sprintf('%.2f', $online / 3600);
+ }
+ return false;
+}
+sub diropen {
+ my $dir = shift;
+
+ opendir DIR, $dir;
+ my @dir = readdir(DIR);
+ closedir(DIR);
+
+ return @dir;
+}
+sub del_awake {
+ unlink "data/online/awake/$$";
+}
+sub debug {
+ open DEBUG, '>>debug';
+ while (@_) {
+ chomp $_;
+ print DEBUG "$_\n";
+ }
+ close DEBUG;
+}
+1;
diff --git a/0.8.1/modules/start.pm b/0.8.1/modules/start.pm
new file mode 100755
index 0000000..4fe416b
--- /dev/null
+++ b/0.8.1/modules/start.pm
@@ -0,0 +1,264 @@
+sub start {
+ if ($var eq 'create_alias_html') {
+ &create_alias_html;
+ }
+ elsif ($var eq 'create_alias') {
+ &create_alias;
+ }
+ elsif ($var eq 'login_html') {
+ &login_html;
+ }
+ elsif ($var eq 'chatiquette_html') {
+ &chatiquette_html;
+ }
+ elsif ($alias eq '') {
+ &login_html;
+ }
+ else {
+ &checklogin;
+ }
+}
+sub login_html {
+ &check_online;
+ my $counter = undef;
+ open COUNT, '<data/count';
+ $counter = <COUNT>;
+ close COUNT;
+ ++$counter;
+ open COUNT, '>data/count';
+ flock COUNT, 2;
+ print COUNT $counter;
+ close COUNT;
+
+ my(@users) = &get_online_users;
+
+ opendir REGISTRED, 'data/user/options';
+ my(@registred) = readdir REGISTRED;
+ closedir REGISTRED;
+
+ my($logtin, $users) = ($#users + 1, $#registred - 1);
+ &start_html("Created & Copyright by Paul C. B\374tow", 'start');
+ print qq[ <center>\n <table width=500>\n <tr>\n <td>\n <center>\n <table>\n <tr>\n <td>\n <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0" WIDTH=240 HEIGHT=240>\n <param name=movie value="$gfxpath/yIntro.swf">\n <param name=loop value=false>\n <param name=menu value=false>\n <param name=quality value=high>\n <param name=scale value=noborder>\n <param name=wmode value=opaque>\n <param name=bgcolor value=$bgcolor>\n <embed src="$gfxpath/yIntro.swf" loop=false menu=false quality=high scale=noborder wmode=opaque bgcolor=$bgcolor WIDTH=240 HEIGHT=240 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED>\n </object>\n </td>\n <td>\n <div>\n yChat: Version $version\n <br><br>\n Letztes Update: $datum\n <br><br>\n Seitenaufrufe: $counter\n <br><br>\n Benutzer registriert: $users\n <br><br>\n Benutzer online: $logtin\n <br><br>\n Benutzerlimit: $limit\n <br><br>\n Beta-yChat: <a href="http://www.java.yChat.de">www.java.yChat.de</a>\n <br><br><a href="http://www.webchat.de" target="_new"> <img src="http://www.webchat.de/webchat.gif" alt="[webchat]" title="[webchat]" border="0"></a><br>\n<img src="http://stats.topwebmaster.net/extern/de/snooper"></div></td>\n </tr>\n </table>\n </center>\n </div>\n <br>\n <br>\n];
+ if ($tmp eq 'true') {
+ print qq[ <div class=b>\n ACHTUNG!\n </div>\n <div>\n Wahrscheinlich existiert Dein Alias "$alias" nicht,\n <br>\n Du hast Dich verschrieben oder das Passwort ist falsch.\n <br>\n Versuch es erneuert !\n </div>\n];
+ }
+ elsif ($tmp eq 'quit') {
+ print qq[ <div>\n Du hast soeben den Chat verlassen.\n <br>\n Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)\n </div>\n];
+ }
+ elsif ($tmp eq 'autologout') {
+ print qq[ <div>\n Du wurdest automatisch aus dem Chat ausgeloggt. Grund: Du warst 20 Minuten inaktiv.\n <br>\n Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)\n </div>\n];
+ }
+ elsif ($tmp eq 'autokick') {
+ print qq[ <div>\n Du wurdest automatisch aus dem Chat katapultiert. Grund: Du hast den Chat geflutet!\n <br>\n Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)\n </div>\n];
+ }
+ elsif ($tmp eq 'banned') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Du wurdest aus dem Chat verbannt!!!\n <br>\n Z.z. kannst Du Dich leider nicht in den Chat einloggen.\n <br>\n Sorry!\n </div>\n";
+ }
+ elsif ($tmp eq 'kick') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Du wurdest soeben aus dem Chat katapultiert!\n <br>\n Schlechtes Verhalten mag die Ursache hierf\374r sein.\n <br>\n Sorry!\n </div>\n";
+ }
+ elsif ($tmp eq 'selfkill') {
+ print qq[ <div>\n Du hast dich soeben ganz und gar aus dem System gel\366scht!\n <br>\n Wenn du dir einen neuen Nick angelen willst, dann einfach auf "Registrieren" klicken! :-)\n </div>\n];
+ }
+ elsif ($tmp eq 'selfkill') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Du wurdest soeben aus dem Chat ausgeloggt!\n <br>\n Ursache hierf\374r mag sein, da\337 der Chat voll war und Du Dich nicht am\n Geschehen beteiligt- und unn\366tige Chatkapazit\344ten in Anspruch\n genommen hast.\n <br>\n Sorry!\n </div>\n";
+ }
+ elsif ($tmp eq 'full') {
+ print "<div class=b>ACHTUNG!</div><div>Der Chat ist leider voll! Bitte versuch Dich sp\344ter noch mal einzuloggen!</div>";
+ }
+ elsif ($var eq 'create_alias') {
+ print q[<div>Du hast sich soeben in die Datenbank eingetragen. Einfach auf "Los Geht's" klicken :-)</div>];
+ }
+ else {
+ print qq[ <div>\n Herzlich willkommen!\n <br>\n Einfach Daten eingeben und auf "Los Geht's" klicken :-)\n </div>\n];
+ }
+ print qq[ <hr>\n <form name="login" method="GET">\n <input type="hidden" name="request" value="start">\n <input type="hidden" name="tmp" value="true">\n <table>\n <tr>\n <td>\n <div>\n Dein Alias:\n <br>\n <input name="alias" value="$alias">\n </div>\n </td>\n <td>\n <div>\n Dein Passwort:\n <br>\n <input type="password" name="pw" value="$pw">\n </div>\n </td>\n </tr>\n </table>\n <br>\n <br>\n <div>\n Solltest Du noch keinen Nick besitzen, dann auf "Registrieren" klicken!\n </div>\n <br>\n <table>\n <tr>\n <td>\n <font color="ffffff">\n <input type="submit" value="Los geht's!">\n </font>\n </form>\n </td>\n <td>\n <form action="chat">\n <input type="hidden" name="request" value="start">\n <input type="hidden" name="var" value="create_alias_html">\n <font color="ffffff">\n <input type="submit" value="Registrieren">\n </font>\n </form>\n </td>\n </tr>\n </table>\n <hr>\n];
+ if ($logtin > 0) {
+ print q[<div>Folgende Personen sind eingeloggt:<br><font size='1'>];
+ foreach $_ (@users) {
+ print "$_ " if -f "data/online/users/$_";
+ }
+ print '</font></div>';
+ }
+ print " </td>\n </tr>\n </table>\n </center>\n</body>\n</html>\n";
+ unless (-d 'data/online/rooms') {
+ mkdir 'data/online/rooms', 511;
+ }
+}
+sub create_alias_html {
+ open BAN, '<data/ban';
+ my(@ban) = <BAN>;
+ close BAN;
+ foreach $_ (@ban) {
+ chomp $_;
+ if ($_ eq 'ip://' . $client->peerhost) {
+ $tmp = 'banned';
+ &login_html;
+ &del_away();
+ $client->shutdown(2);
+ exit 0;
+ }
+ }
+ my $reload = $_[0];
+ &start_html('Registration');
+ print " <center>\n <table width=500>\n <tr>\n <td>\n";
+ if ($reload eq 'alias_exists') {
+ print qq[ <div class=b>\n ACHTUNG!\n </div>\n <div>\n Der von Dir gew\344hlte Benutzername "$alias" existiert in unserer Datenbank bereits. Bitte versuch es erneuert mit\n einem anderen Benutzernamen !\n </div>\n <hr>\n];
+ }
+ elsif ($reload eq 'pw_wrong') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Deine beiden Passworteingaben stimmen nicht \374berein. Bitte geb das Passwort erneuert an um sicherzugehen, da\337\n kein falsches Passwort abgespeichert wird !\n </div>\n <hr>\n";
+ }
+ elsif ($reload eq 'alias_prohibited') {
+ print qq[ <div class=b>\n ACHTUNG!\n </div>\n <div>\n Dein gew\344hlter Benutername "$alias" enth\344lt illegale Zeichen. Bitte versuch einen anderen Benutzernamen!\n </div>\n <hr>\n];
+ }
+ elsif ($reload eq 'alias_length') {
+ print qq[ <div class=b>\n ACHTUNG!\n </div>\n <div>\n Dein gew\344hlter Benutername "$alias" enth\344lt zu viele Zeichen. Es sind maximal 15 Zeichen erlaubt!!\n </div>\n <hr>\n];
+ }
+ else {
+ print " <div>\n Hier kannst Du Dich registrieren. Bitte beachte, da\337 die Passworteingabefelder \374bereinstimmen!\n </div>\n <hr>\n";
+ }
+ print qq[ <form action="chat">\n <input type="hidden" name="request" value="start">\n <input type="hidden" name="var" value="create_alias">\n <div>\n Dein Alias:\n <font color="ffa500">\n (Mu\337 angegeben werden)\n </font>\n <br>\n <input name="alias" VALUE="$alias">\n </div>\n <br>\n <div>\n Dein gew\374nschtes Passwort:\n <br>\n <input type="password" name="pw" value="$pw">\n </div>\n <br>\n <div>\n Geb hier Dein Passwort erneuert ein:\n <br>\n <input type="password" name="tmp">\n </div>\n <br>\n <font color=ffffff>\n <input type="submit" value="Registrieren">\n </font>\n <br>\n </form>\n <hr>\n <div>\n Um den Chat zu betreten m\374ssen die Daten nach der Registration auf der Startseite erneuert best\344tigt werden !\n </div>\n </td>\n </tr>\n </table>\n</center>\n</body>\n</html>\n];
+}
+sub checklogin {
+ opendir USERS, 'data/online/users';
+ my(@users) = readdir USERS;
+ closedir USERS;
+ my $users = $#users;
+ if ($users > $limit && 3 > &hierachie($alias)) {
+ $tmp = 'full';
+ &login_html;
+ &del_away();
+ $client->shutdown(2);
+ exit 0;
+ }
+ my $lognotexists = 'true';
+ opendir USERDIR, 'data/user/options';
+ my(@userdir) = readdir USERDIR;
+ closedir USERDIR;
+ foreach $user (@userdir) {
+ if ($user eq $alias) {
+ open OPTIONS, "<data/user/options/$alias";
+ my(@options) = <OPTIONS>;
+ close OPTIONS;
+ foreach $_ (@options) {
+ chomp $_;
+ }
+ if ((crypt $pw, $cryptkey) eq $options[0] || $options[0] eq $pw) {
+ open BAN, '<data/ban';
+ my(@ban) = <BAN>;
+ close BAN;
+ foreach $_ (@ban) {
+ chomp $_;
+ if ($_ eq $alias or $_ eq 'ip://' . $client->peerhost) {
+ if (-f "data/online/users/$admin") {
+ &post_prv($admin, "<font color=ffffff><font color=ffa500>$_</font> kann sich nicht einloggen (Ist verbannt)!!</font>");
+ }
+ $tmp = 'banned';
+ &login_html;
+ &del_away();
+ $client->shutdown(2);
+ exit 0;
+ }
+ }
+ if ($options[1] eq undef) {
+ $col = &random_color;
+ }
+ else {
+ $col = $options[1];
+ }
+ if ($options[2] eq undef) {
+ $secol = &random_color;
+ }
+ else {
+ $secol = $options[2];
+ }
+ if ($options[3] eq undef) {
+ $maxVerlauf = '10';
+ }
+ else {
+ $maxVerlauf = $options[3];
+ }
+ if ($options[4] eq undef) {
+ $verlaufOrder = '1';
+ }
+ else {
+ $verlaufOrder = $options[4];
+ }
+ &rm_if_loggedin($alias);
+ # Sorry weil so ausführlich, der Code-Optimizer formulierte dies um!
+ my(@digit) = (('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'), (0, 1, 2, 3, 4, 5, 6, 7, 8, 9), '.');
+ my $num1 = rand @digit;
+ my $num2 = rand @digit;
+ my $num3 = rand @digit;
+ my $num4 = rand @digit;
+ my $num5 = rand @digit;
+ my $num6 = rand @digit;
+ my $num7 = rand @digit;
+ my $num8 = rand @digit;
+ my $num9 = rand @digit;
+ my $num10 = rand @digit;
+ my $num11 = rand @digit;
+ my $num12 = rand @digit;
+ $tmpid = $digit[$num1] . $digit[$num2] . $digit[$num3] . $digit[$num4] . $digit[$num5] . $digit[$num6] . $digit[$num7] . $digit[$num8] . $digit[$num9] . $digit[$num10] . $digit[$num11] . $digit[$num12];
+ open TMPID, ">data/online/tmpid/$alias.$tmpid";
+ print TMPID $alias;
+ close TMPID;
+ open IDENT, ">data/online/ident/$alias";
+ print IDENT $client->peerhost . "\n$tmpid\n" . &get_online_time($alias) . "\n$col\n$secol\n";
+ close IDENT;
+ open LASTLOGIN, ">data/user/lastlogin/$alias";
+ print LASTLOGIN time;
+ close LASTLOGIN;
+ &frameset_html;
+ &del_away();
+ $client->shutdown(2);
+ exit 0;
+ }
+ else {
+ $lognotexists = 'false';
+ }
+ }
+ }
+ &login_html;
+}
+sub create_alias {
+ if ($alias =~ /\W/ or $alias eq '') {
+ goto CREATE if $alias =~ /[-]/ and not $alias =~ /\W/;
+ &create_alias_html('alias_prohibited');
+ &del_away();
+ $client->shutdown(2);
+ exit 0;
+ }
+ elsif ($pw ne $tmp) {
+ &create_alias_html('pw_wrong');
+ &del_away();
+ $client->shutdown(2);
+ exit 0;
+ }
+ elsif (length $alias >= 15) {
+ &create_alias_html('alias_length');
+ &del_away();
+ $client->shutdown(2);
+ exit 0;
+ }
+ CREATE: opendir USERDIR, 'data/user/options';
+ my(@user) = readdir USERDIR;
+ close USERDIR;
+ foreach $user (@user) {
+ if ($user eq $alias) {
+ &create_alias_html('alias_exists');
+ &del_away();
+ $client->shutdown(2);
+ exit 0;
+ }
+ }
+ $pw = crypt $pw, $cryptkey;
+ open OPTIONS, ">data/user/options/$alias";
+ print OPTIONS $pw . "\n";
+ close OPTIONS;
+ &login_html;
+}
+sub frameset_html {
+ print qq[<html>\n <head>\n <title>\n $title\n </title>\n </head>\n<frameset border=0 frameborder=0 framespacing=0 cols="130,*">\n <frameset border=0 frameborder=0 framespacing=0 rows="*,55">\n <frame name="online" src="chat?request=online&room=$loginplace&alias=$alias&tmpid=$tmpid">\n <frameset border=0 frameborder=0 framespacing=0 cols="70,*">\n <frame name="logo" src="chat?request=htdocs&var=logo_html" scrolling="no">\n <frame name="reload" src="chat?request=htdocs" scrolling="no">\n </frameset>\n </frameset>\n <frameset border=0 frameborder=0 framespacing=0 rows="*,55">\n <frame name='main' src='chat?request=loggedin&alias=$alias&col=$col&secol=$secol&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder'>\n <frame name="input" src="chat?request=htdocs" scrolling="no">\n </frameset>\n</frameset>\n</html>\n];
+}
+1;
diff --git a/0.8.1/modules/statistic.pm b/0.8.1/modules/statistic.pm
new file mode 100755
index 0000000..9d23f8b
--- /dev/null
+++ b/0.8.1/modules/statistic.pm
@@ -0,0 +1,148 @@
+sub statistic {
+ &start_html('Statistiken');
+ &menu;
+ print $q->div('yChat Statistiken'), $q->hr, $q->div($q->a({-'href', "chat?request=statistic&var=ranking&alias=$alias&tmpid=$tmpid"}, 'Rankings'), ' | ', $q->a({-'href', "chat?request=statistic&var=del&alias=$alias&tmpid=$tmpid"}, 'Loginstatistiken'), ' | ', $q->a({-'href', "chat?request=statistic&var=statistic&alias=$alias&tmpid=$tmpid"}, 'DB-Statistik'), ' | ', $q->a({-'href', "chat?request=statistic&var=var&alias=$alias&tmpid=$tmpid"}, 'Umgebungsvariablen')), $q->hr;
+ if ($var eq 'ranking') {
+ opendir COUNTS, 'data/user/counts';
+ my(@counts) = readdir COUNTS;
+ closedir COUNTS;
+ print '<div>';
+ my $nr_start = $start;
+ my $nr_end = $end;
+ my %online;
+ my $rank;
+ my $nr;
+ foreach $_ (@counts) {
+ if (-f "data/user/counts/$_") {
+ if (s/.online//g) {
+ open TOTAL, "<data/user/counts/$_.online";
+ my $total = <TOTAL>;
+ close TOTAL;
+ $online{sprintf '%.2f', $total / 3600} = $_;
+ }
+ }
+ }
+ print '<div>', $q->b('Rankings:'), $q->br, '<table><tr><td><div><b>#:</b></div></td><td><b><div>St.:</div></b></td><td><b><div>Name:</div></b></td></tr>';
+ if (not $nr_start) {
+ $nr_start = 1;
+ }
+ if (not $nr_end) {
+ $nr_end = 20;
+ }
+ foreach $wert (reverse (sort { $a <=> $b } keys %online)) {
+ ++$nr;
+ if ($online{$wert} eq $alias) {
+ $rank = $nr;
+ last if $nr > $nr_end;
+ }
+ next if ($nr < $nr_start or $nr > $nr_end);
+ print q[<tr><td><font color='ffffff' size='1' face='arial'>] . $nr . q[</font></td><td><font color='ffffff' size='1' face='arial'> ] . $wert . "h </font></td><td> <a href='chat?request=divcom&var=alias_html&alias=$alias&tmp=$online{$wert}&tmpid=$tmpid'><font size='1' face='arial'>$online{$wert}</font></a></td></tr>\n";
+ }
+ print '</table>', $q->hr;
+ $nr_start -= 20;
+ $nr_end -= 20;
+ print "Rankings von <a href='chat?request=statistic&var=ranking&start=$nr_start&end=$nr_end&alias=$alias&tmpid=$tmpid'>$nr_start bis $nr_end</a> anzeigen ...<br>" if $nr_start > 0;
+ $nr_start += 40;
+ $nr_end += 40;
+ print "Rankings von <a href='chat?request=statistic&var=ranking&start=$nr_start&end=$nr_end&alias=$alias&tmpid=$tmpid'>$nr_start bis $nr_end</a> anzeigen ...", $q->br, $q->br, $q->b("$alias, Du befindest Dich auf Rank $rank</div>");
+ }
+ elsif ($var eq 'del') {
+# print '<div>', $q->b('Alte Benutzer l&ouml;schen:'), $q->br, "Benutzer, die sich 1440 Stunden (60 Tage) nicht mehr in das System eingeloggt haben, werden gel\366scht.", $q->br, $q->br;
+ opendir USER, 'data/user/options';
+ my(@user) = readdir USER;
+ closedir USER;
+ @user = sort(@user);
+ my $i = 0;
+ my $j;
+ my $k = 0;
+ my $l = 0;
+ my $full = $tmp;
+ foreach $_ (@user) {
+ if (-f "data/user/lastlogin/$_") {
+ open LOGIN, "<data/user/lastlogin/$_";
+ my $login = <LOGIN>;
+ close LOGIN;
+ $login = sprintf('%.2f', (time - $login) / 3600);
+ ++$j;
+ if (999 < $login and $login < 1440) {
+ ++$k;
+ print $q->font({-'color', 'ff6600'}, $q->b("$j($k) $_ Letztes Login vor: " . $login . 'h')), $q->br, "\n" if $full ne undef;
+ }
+ elsif ($login < 48) {
+ ++$l;
+ print $q->font({-'color', 'ffffef'}, $q->b("$j($l) $_ Letztes Login vor: " . $login . 'h')), $q->br, "\n" if $full ne undef;
+ }
+ elsif ($login < 1440) {
+ print $q->font({-'color', 'ffa500'}, $q->b("$j($l) $_ Letztes Login vor: " . $login . 'h')), $q->br, "\n" if $full ne undef;
+ }
+ else {
+ ++$k;
+ &kill_it($_, $i++, $login);
+ }
+ }
+ elsif (-f "data/user/options/$_") {
+ &kill_it($_, $i++);
+ }
+ }
+ print $q->hr if $full ne undef;
+ print '</div>', $q->div($q->b("$j Benutzer befinden sich in der Datenbank!", $q->br, $q->font({-'color', 'ffffef'}, "$l Benutzer haben sich innerhalb der letzten 48 Stunden eingeloggt!"), $q->br, $q->font({-'color', 'ffa500'}, "$k Benutzer haben sich &uuml;ber 1000 Stunden nicht mehr eingeloggt!"), $q->br, $q->font({-'color', 'ff0000'}, "$i Benutzer wurden gerade eben gel\366scht!")), $q->br, $q->br, 'PS: Jeder registrierte Benutzername wird nur einmal gez&auml;hlt!');
+ print $q->br, $q->div('(', $q->a({-'href', "chat?request=statistic&var=del&tmp=true&alias=$alias&tmpid=$tmpid"}, 'Vollst&auml;ndige Ansicht'), ')') if $full eq undef;
+ }
+ elsif ($var eq 'var') {
+ print '<div>', $q->b('Server Umgebungsvariablen:'), $q->br, $q->br, 'Die Serverumgebungsvariablen k&ouml;nnen nur von Oberw&auml;chtern oder h&ouml;her eingesehen werden!', $q->br, $q->br;
+ if (7 <= &hierachie($alias)) {
+ while (($key, $value) = each %ENV) {
+ print "$key = $value\n", $q->br;
+ }
+ }
+ print '</div>';
+ }
+ elsif ($var eq 'statistic') {
+ print $q->div($q->b('yChat-DB Statistik:')), $q->br;
+ $files = 0;
+ $size = 0;
+ $directorys = 1;
+ &zaehle('data');
+ $size = sprintf('%.2f', $size / 1048576);
+ print $q->div("Dateien insgesamt: $files", $q->br, "MB insgesamt: $size", $q->br, "Verzeichnisse insgesamt: $directorys");
+ }
+ print $q->end_html;
+}
+sub zaehle {
+ local($dir, $data) = @_;
+ $dir = "$dir/$data" if $data ne undef;
+ opendir DATA, $dir;
+ local(@data) = readdir DATA;
+ closedir DATA;
+ $files2 = 0;
+ foreach $_ (@data) {
+ if (-f "$dir/$_") {
+ ++$files;
+ ++$files2;
+ $size += -s "$dir/$_";
+ }
+ elsif (-d "$dir/$_" and $_ ne '.' and $_ ne '..') {
+ ++$directorys;
+ &zaehle($dir, $_);
+ }
+ }
+}
+sub kill_it {
+ my($rm, $nr, $login) = @_;
+ $login = 'XXXXXX' if $login eq undef;
+ print $q->font({-'color', 'ff0000'}, $q->b("$j($nr) $rm Letztes Login vor: " . $login . 'h (wurde gel&ouml;scht)')), $q->br, "\n";
+ print q[<font size='1' color='ffffef'>];
+ print 'options ' if unlink "data/user/options/$rm";
+ print 'profiles ' if unlink "data/user/profiles/$rm";
+ print 'gbooks ' if unlink "data/user/gbooks/$rm";
+ print 'counts ' if unlink "data/user/counts/$rm";
+ print 'counts.online ' if unlink 'data/user/counts/' . $rm . '.online';
+ print 'lastlogin ' if unlink "data/user/lastlogin/$rm";
+ print 'memos' if unlink "data/user/memos/$rm";
+ print '</font><hr>';
+ open DEL, '>>data/kill';
+ print DEL "$rm wurde automatisch gekillt [$alias]\n";
+ close DEL;
+ return;
+}
+1;
diff --git a/0.8.1/modules/stream.pm b/0.8.1/modules/stream.pm
new file mode 100755
index 0000000..2885d8b
--- /dev/null
+++ b/0.8.1/modules/stream.pm
@@ -0,0 +1,170 @@
+sub stream {
+ unlink "data/online/rooms/$loginplace/$alias";
+ &secure_checkid($alias, $tmpid);
+ my $pid = $$;
+ $SIG{'CHLD'} = 'IGNORE';
+ ++$|;
+ print qq[<html>\n <head>\n<script language="JavaScript">\n<!--\n open('chat?request=online&room=$room&alias=$alias&tmpid=$tmpid','online');\n open('chat?request=input&alias=$alias&room=$room&col=$col&secol=$secol&tmp=login&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder','input');\n\n// open('chat?request=input&alias=$alias&room=$room&col=$col&secol=$secol&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder','input');\n\n// Scroll-Routine von Anklepper (http://www.anklepper.de)\n// speziell f\374r yChat (http://www.yChat.de), Copyright 2000\nscrolling = true;\nmoves_steps = 4;\nmoves_interval = 4;\nfunction moves()\n{\n if( scrolling != false )\n window.scrollBy( 0, moves_steps );\n window.setTimeout( "moves()", moves_interval );\n}\nmoves();\n//-->\n</script>\n</head>\n<body bgcolor="$chatbg">\n];
+ &check_online;
+ print "<font size=1 color=ffffff face=arial>$title - Letzte &Auml;nderung $datum\n; Der Chat wird geladen...\n<br>";
+ sleep 1;
+ print "<b>Hallo <font color=$col>$alias</font></b>, mit dem Befehl /menu kannst du das Chat-Men&uuml; aufrufen!<br>";
+ sleep 1;
+ print "Du befindest dich im Raum <b>$room</b>: " . get_theme($room) . "<br>\n";
+ print "</font>\n";
+
+ if (-f "data/user/memos/$alias") {
+ open MEMOS, "<data/user/memos/$alias";
+ my(@memos) = <MEMOS>;
+ close MEMOS;
+ my $memos;
+ foreach $_ (@memos) {
+ $memos .= $_;
+ }
+ print $memos;
+ unlink "data/user/memos/$alias";
+ }
+
+ my ($change_room,
+ $startime,
+ $flooding,
+ @ignore,
+ @flood);
+
+ OPENMSGFILE:
+ $change_room = 0;
+ $startime = time;
+ $flooding = 0;
+ unless (-f "data/online/rstat/$room") {
+ open DATEI, ">data/online/rstat/$room";
+ print DATEI "0\n\n$alias<;1\n";
+ close DATEI;
+ }
+ open DATEI, ">data/online/users/$alias";
+ print DATEI time;
+ close DATEI;
+ open DATEI, ">data/online/rooms/$room/$alias";
+ print DATEI time;
+ close DATEI;
+ if (-e "data/msgs/$room") {
+ open MSGFILE, "<data/msgs/$room";
+ mkdir 'data/online/pids', 511 unless -d 'data/online/pids';
+ mkdir "data/online/pids/$room", 511 unless -d "data/online/pids/$room";
+ open PID, ">data/online/pids/$room/$pid";
+ print PID time;
+ close PID;
+ }
+ else {
+ sleep 1;
+ goto OPENMSGFILE;
+ }
+ &sendmsgs;
+ while (-f "data/online/users/$alias") {
+ local $SIG{'USR1'} = \&sendmsgs;
+ goto OPENMSGFILE if $change_room == 1;
+ unlink "data/online/rooms/$loginplace/$alias"
+ if (-f "data/online/rooms/$loginplace/$alias");
+ sleep 15;
+ print "\n";
+ }
+ sub sendmsgs {
+ for ($curpos = tell MSGFILE; defined($_ = <MSGFILE>); $curpos = tell MSGFILE) {
+ my($address, $stamp, $command, $action, $message, $from) = split(/<;/, $_, 7);
+ if ($address =~ /$\!/ or $address eq $alias) {
+ if ($stamp > $startime) {
+ if ($command eq 'col') {
+ ($col, $secol) = split(/;/, $action, 3);
+ }
+ elsif ($command eq 'cr') {
+ unlink "data/online/pids/$room/$pid";
+ $room = $action;
+ close MSGFILE;
+ $change_room = 1;
+ }
+ elsif ($command eq 'ig') {
+ my @temp;
+ my $add2list = 1;
+ foreach $_ (@ignore) {
+ if ($action ne $_) {
+ push @temp, $_;
+ }
+ else {
+ $add2list = 0;
+ }
+ }
+ if ($add2list == 1) {
+ push @ignore, $action;
+ print "<font color='#ffffff'><font color='#ffa500'>$action</font> wird nun ignoriert!</font><br>\n";
+ &post_prv_extra($action, "<font color='#ff0000'>Du wirst nun von $alias ignoriert!</font>");
+ }
+ else {
+ @ignore = @temp;
+ print "<font color='#ffffff'><font color='#ffa500'>$action</font> wird nun nicht mehr ignoriert!</font><br>\n";
+ &post_prv_extra($action, "<font color='#ff0000'>Du wirst nun von $alias nicht mehr ignoriert!</font>");
+ }
+ }
+ elsif ($command eq 'igl') {
+ my $ignored;
+ foreach $_ (@ignore) {
+ $ignored .= "$_ ";
+ }
+ if ($#ignore == -1) {
+ print "<font color='#ffffff'>Momentan wird keine Person von dir ignoriert!</font><br>\n";
+ }
+ else {
+ print "<font color='#ffffff'>Folgende Personen werden von dir ignoriert: <font color='#ffa500'>$ignored</font>!</font><br>\n";
+ }
+ }
+ elsif ($command eq 'quit') {
+ print "<script language='JavaScript'>\n";
+ print "open('chat?request=online&room=$loginplace&alias=$alias&tmpid=$tmpid','online');\n";
+ print "open('chat?request=htdocs','input');\n";
+ print "open('chat?request=loggedin&alias=$alias&col=$col&secol=$secol&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder','main');\n";
+ print "</script>\n";
+ last;
+ }
+ elsif ($change_room != 1) {
+ my $ignored = 0;
+ foreach $_ (@ignore) {
+ if ($_ eq $from) {
+ $ignored = 1;
+ last;
+ }
+ }
+ if ($ignored != 1) {
+ print "$message\n";
+ }
+ else {
+ $address =~ s/!//;
+ &post_prv_extra($from, "<font color='#ff0000'>Du wirst von $alias ignoriert!</font>") if $address eq $alias;
+ }
+ }
+ push @flood, $address . $command . $action . $message . $from;
+ if ($flood[0] eq $flood[1] and $flood[0] eq $flood[2] and $flood[0] eq $flood[3]) {
+ print "<i><font color=red>$from flutet den Chat !</font></i><br>\n";
+ if ($from eq $alias and $flooding++ and $flooding >= 4) {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='ffa500'><b>Das System</b></font> katapultiert <font color='".&get_ident($alias,3)."'>$alias</font>> wegen Fluten des Chats nach draussen ... </font></i>", $alias);
+ print "<script language='JavaScript'>open('chat?request=start&tmp=autokick','_top');</script>\n";
+ &rm_alias($alias, $room);
+ }
+ }
+ else {
+ $flooding = 0;
+ }
+ shift @flood if $#flood > 2;
+ }
+ }
+ }
+ seek MSGFILE, $curpos, 0;
+ }
+ unlink "data/online/pids/$room/$pid";
+}
+sub post_prv_extra {
+ my($alias, $message) = @_;
+ my $helpid = fork;
+ if ($helpid == 0) {
+ &post_prv($alias, $message);
+ exit 0;
+ }
+}
+1;
diff --git a/0.8.1/modules/webchat.pm b/0.8.1/modules/webchat.pm
new file mode 100755
index 0000000..90f8731
--- /dev/null
+++ b/0.8.1/modules/webchat.pm
@@ -0,0 +1,22 @@
+sub webchat {
+ my @rooms = &diropen('data/online/rooms');
+ my $output;
+
+ foreach my $room (@rooms) {
+ next if ($room =~ /\./);
+ my @users = &diropen("data/online/rooms/$room") or print "$!\n";
+
+ foreach my $user (@users) {
+ next if ($user =~ /\./);
+ open FILE, "data/online/rooms/$room/$user";
+ my $timestamp = <FILE>;
+ close FILE;
+ chomp $timestamp;
+
+ $output = $output . "($user)($timestamp)($room)\n";
+ }
+ }
+
+ print $output;
+}
+1;
diff --git a/0.8.1/modules/ychatd.pl b/0.8.1/modules/ychatd.pl
new file mode 100755
index 0000000..f804436
--- /dev/null
+++ b/0.8.1/modules/ychatd.pl
@@ -0,0 +1,94 @@
+#!/usr/bin/perl
+use CGI;
+$q = new CGI;
+
+use config;
+use modules::commands;
+use modules::changeroom;
+use modules::divcom;
+use modules::hierachie;
+use modules::htdocs;
+use modules::input;
+use modules::loggedin;
+use modules::online;
+use modules::postmessage;
+use modules::shared;
+use modules::start;
+use modules::statistic;
+use modules::stream;
+use modules::webchat;
+use IO::Socket;
+use Socket;
+use POSIX;
+
+$SIG{'CHLD'} = 'IGNORE';
+
+$mainsocket = 'IO::Socket::INET'->new('LocalHost', "$localhost", 'LocalPort', $localport, 'Porto', 'tcp', 'Listen', $limit + 10, 'Reuse', 1);
+die "Kann Server-Socket nicht erzeugen: $!\n" unless $mainsocket;
+
+print "yChat wurde auf $localhost:$localport gestartet...\n";
+
+$STARTIME = time;
+
+#Debugging only
+#open AWAKE, ">data/online/awake/-$$-";
+#print AWAKE "$STARTIME - Daemon";
+#close AWAKE;
+
+while ($client = $mainsocket->accept) {
+ print $client "HTTP/1.1 200 OK\nContent-type:text/html\n\n";
+
+ ++$HITS;
+ $pid = fork;
+ if ($pid == 0) {
+ my @reqheader;
+
+ $rv = $client->recv($reqheader[0], POSIX::BUFSIZ, 0);
+ @reqheader = split "\n", $reqheader[0];
+
+ my $requeststring;
+ my(@tmp) = split(/\s+/, $reqheader[0], 0);
+
+ if ($tmp[0] eq 'GET') {
+ $requeststring = $tmp[1];
+
+ } else {
+ $requeststring = 'chat?'.$reqheader[-1];
+ }
+
+ #Debug only
+ #open AWAKE, ">data/online/awake/$$";
+ #print AWAKE $requeststring;
+ #close AWAKE;
+
+ @tmp = split(/\?/, $requeststring, 0);
+ @tmp = split(/&/, $tmp[1], 0);
+ my %variables;
+
+ foreach $_ (@tmp) {
+ my(@tmp) = split(/=/, $_, 0);
+ next if $tmp[0] eq 'admin' or $tmp[0] eq 'mogeladmin';
+ $tmp[0] =~ s[/][];
+ $variables{$tmp[0]} = &url_decode($tmp[1]);
+ }
+
+ foreach $_ (keys %variables) {
+ $variables{$_} =~ s/'/\\'/g;
+ my $eval = "\$$_ = '" . $variables{$_} . "';";
+ # print "$eval\n";
+ eval $eval;
+ }
+ *STD = *STDOUT;
+ *STDOUT = $client;
+ if ($request) {
+ &secure_checkid($alias, $tmpid) if $request != 'start';
+ eval "&$request";
+ }
+ else {
+ &start;
+ }
+ &del_awake();
+ $client->shutdown(2);
+ exit 0;
+ }
+}
diff --git a/0.8.1/setup.sh b/0.8.1/setup.sh
new file mode 100755
index 0000000..944c2f4
--- /dev/null
+++ b/0.8.1/setup.sh
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+mke2fs /dev/ram0
+mke2fs /dev/ram1
+
+mkdir data
+cd data
+mkdir {logs,msgs,user,online}
+mount /dev/ram0 msgs
+mount /dev/ram1 online
+cd user
+mkdir {counts,memos,options,profiles,gbooks,lastlogin}
+cd ../online
+mkdir {rstat,rooms,pids,users,ident,tmpid,awake}
+cd ..
+
+chmod 700 * -R
+chown yC * -R
+
diff --git a/0.8.1/templates/chatiq.sno b/0.8.1/templates/chatiq.sno
new file mode 100755
index 0000000..2a024f5
--- /dev/null
+++ b/0.8.1/templates/chatiq.sno
@@ -0,0 +1 @@
+<div><h2>Chatiquette</h2></div><hr><div>Hier einige Grundlagen ...</div><style type="text/css"> li { color: #ffffff }</style><ul><li><div>Vergiss nie, dass am anderen Ende auch nur Menschen sitzen. Diese m&ouml;gen es gar nicht, angep&ouml;belt, beleidigt oder in sonstiger Weise angegriffen zu werden.</div></li><li><div>St&ouml;rend ist auch immer, wenn ein privater Streit im Chat ausgetragen wird. Tragt eure privaten Sachen ausserhalb des Chats aus.<br>Selbst wenn es nur Spass ist - weiss der Rest im Chat das?</div></li><li><div>Dauergeschrei f&auml;llt auch immer wieder st&ouml;rend auf. Was in Grossbuchstaben geschrieben wird, wird als Schreien bezeichnet.</div></li><li><div>Unsere ganz besonderen Spezialisten wollen auch immer wieder rausfliegen. Um das zu erreichen, senden sie die ganze Zeit Unsinn.</div></li><li><div>Diskussionen sind dagegen kein Problem. Daf&uuml;r ist ein Chat ja da. Sobald allerdings das Thema der Diskussion zu sehr entgleist, sollte die Diskussion in einen etwas weniger &ouml;ffentlichen Raum verlegt werden.</div></li></ul><div>Daraus ergeben sich folgende Regeln:</div><ul><li><div>keinen beleidigenden Wortschatz verwenden</div></li><li><div>obz&ouml;ner und verfassungsfeindlicher Wortschatz f&auml;llt auch weg</div></li><li><div>streitet euch woanders oder in einem privaten Raum</div></li><li><div>schreit nich so viel</div></li><li><div>schreibt keinen Unsinn, der so aussieht, als ob eure Katze über die Tastatur gelaufen ist</div></li><li><div>schreibt nicht zu schnell hintereinander, besonders nicht dasselbe</div></li><li><div>verlagert die Diskussion, wenn sich jemand gest&ouml;rt f&uuml;hlt</div></li><li><div>Diese Liste ist nicht vollst&auml;ndig. Mit dem gesunden Menschenverstand sollte es eigentlich m&ouml;glich sein, sich die nicht aufgef&uuml;hrten Punkte zu denken.</div></li></ul><div>So - nach den ganzen "lass-es-bessers" noch ein paar &Uuml;berlebenstips:</div><ul><li><div>beachte die oben stehenden Punkte ;-)</div></li><li><div>es macht sich immer gut, beim Reinkommen mal zu gr&uuml;ssen</div></li><li><div>warte nicht, bis man/frau dich anspricht - werde selbst aktiv und gib deinen Senf dazu</div></li><li><div>es gibt meist kein allgemein anerkanntes Gespr&auml;chsthema - lies dich einfach rein</div></li><li><div>die frage &quot;wer will chatten&quot; ist eigentlich &uuml;berfl&uuml;ssig in einem Chat (wir warten doch alle nur aufs Ufo ;-)</div></li><li><div>fang nich sofort mit den W-Fragen (woher, wie alt, weiblich oder männlich?) an - es st&ouml;rt einige Leute</div></li></ul><div>Problematisch f&uuml;r die W&auml;chter und Oberw&auml;chter ist:</div><ul><li><div>&quot;der nervt mich - schmeiss den mal raus&quot; ist oft nicht nachvollziehbar, weil der W&Auml; oder OW die Vorgeschichte - die vielleicht ausserhalb des yChat stattgefunden hat - nicht kennt oder keinen Beweis daf&uuml;r hat.</div></li></ul><hr><div><h2>Richtlinien f&uuml;r den gestressten W&Auml; und OW:</h2></div><ul><li><div>Du hast die Macht - aber mi&szlig;brauche sie nicht!</div></li><li><div>Leute, die ganz offensichtlich st&ouml;ren wollen und dabei den Chatbetrieb massiv behindern, sofort rausschmeissen! Kriterien dazu:</div><ul><li><div>Fluten des Chats</div></li><li><div>Wiederholung von Parolen</div></li><li><div>Exzessive Nutzung von zuf&auml;lligen Buchstaben-/Zeichenfolgen</div></li><li><div>usw...</div></li></ul></li><li><div>Bei den anderen vorher noch eine Warnung aussprechen...</div></li><li><div>Nicht vergessen: auch f&uuml;r euch gelten die oben aufgef&uuml;hrten Regeln!</div></li><li><div>Vergabe von Raumbesetzer- und W&auml;chterrechten:<br>(dies gilt f&uuml;r RB-Vergabe in der Cyberbar, W&Auml; allgemein)</div><ul><li><div>Um RB oder W&Auml; betteln wird schon mal gar nicht beachtet.</div></li><li><div>Wer W&Auml; wird, soll sichs verdienen - z.B. durch h&auml;ufiges Helfen bei Neulingen.</div></li><li><div>Ein W&Auml; sollte schon &ouml;fter im Chat sein.</div></li><li><div>Oberw&auml;chter zu werden ist sehr schwierig. Frag gar nicht erst danach ;-)</div></li></ul></ul><div>Wer meint, von einem W&auml;chter oder Oberw&auml;chter ungerecht behandelt worden zu sein (z.B. weil dieser wegen persönlichen Streitigkeiten rausschmeisst), richte seine Klage an einen Oberw&auml;chter oder direkt an den obersten Boss: Snooper (<a href="mailto:admin@ychat.de">admin@ychat.de</a>).</div> \ No newline at end of file
diff --git a/0.8.1/templates/colors.sno b/0.8.1/templates/colors.sno
new file mode 100755
index 0000000..3640b9e
--- /dev/null
+++ b/0.8.1/templates/colors.sno
@@ -0,0 +1,290 @@
+ <table cellspacing=0 cellpadding=5 border=0>
+ <tr>
+ <td bgcolor="000000"><span style="color:#FFFFFF; text-decoration:line-through;">000000</span></td>
+ <td bgcolor="000033"><span style="color:#FFFFFF; text-decoration:line-through;">000033</span></td>
+ <td bgcolor="000066"><span style="color:#FFFFFF; text-decoration:line-through;">000066</span></td>
+ <td bgcolor="000099"><span style="color:#FFFFFF; text-decoration:line-through;">000099</span></td>
+ <td bgcolor="0000CC"><span style="color:#FFFFFF; text-decoration:line-through;">0000CC</span></td>
+ <td bgcolor="0000FF"><a href="javascript:insertcode('0000FF');" style="color:#FFFFFF;">0000FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="003300"><span style="color:#FFFFFF; text-decoration:line-through;">003300</span></td>
+ <td bgcolor="003333"><span style="color:#FFFFFF; text-decoration:line-through;">003333</span></td>
+ <td bgcolor="003366"><span style="color:#FFFFFF; text-decoration:line-through;">003366</span></td>
+ <td bgcolor="003399"><a href="javascript:insertcode('003399');" style="color:#FFFFFF;">003399</a></td>
+ <td bgcolor="0033CC"><a href="javascript:insertcode('0033CC');" style="color:#FFFFFF;">0033CC</a></td>
+ <td bgcolor="0033FF"><a href="javascript:insertcode('0033FF');" style="color:#FFFFFF;">0033FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="006600"><span style="color:#FFFFFF; text-decoration:line-through;">006600</span></td>
+ <td bgcolor="006633"><span style="color:#FFFFFF; text-decoration:line-through;">006633</span></td>
+ <td bgcolor="006666"><a href="javascript:insertcode('006666');" style="color:#FFFFFF;">006666</a></td>
+ <td bgcolor="006699"><a href="javascript:insertcode('006699');" style="color:#FFFFFF;">006699</a></td>
+ <td bgcolor="0066CC"><a href="javascript:insertcode('0066CC');" style="color:#FFFFFF;">0066CC</a></td>
+ <td bgcolor="0066FF"><a href="javascript:insertcode('0066FF');" style="color:#FFFFFF;">0066FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="009900"><a href="javascript:insertcode('009900');" style="color:#FFFFFF;">009900</a></td>
+ <td bgcolor="009933"><a href="javascript:insertcode('009933');" style="color:#FFFFFF;">009933</a></td>
+ <td bgcolor="009966"><a href="javascript:insertcode('009966');" style="color:#FFFFFF;">009966</a></td>
+ <td bgcolor="009999"><a href="javascript:insertcode('009999');" style="color:#FFFFFF;">009999</a></td>
+ <td bgcolor="0099CC"><a href="javascript:insertcode('0099CC');" style="color:#FFFFFF;">0099CC</a></td>
+ <td bgcolor="0099FF"><a href="javascript:insertcode('0099FF');" style="color:#FFFFFF;">0099FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00CC00"><a href="javascript:insertcode('00CC00');" style="color:#000000;">00CC00</a></td>
+ <td bgcolor="00CC33"><a href="javascript:insertcode('00CC33');" style="color:#000000;">00CC33</a></td>
+ <td bgcolor="00CC66"><a href="javascript:insertcode('00CC66');" style="color:#000000;">00CC66</a></td>
+ <td bgcolor="00CC99"><a href="javascript:insertcode('00CC99');" style="color:#000000;">00CC99</a></td>
+ <td bgcolor="00CCCC"><a href="javascript:insertcode('00CCCC');" style="color:#000000;">00CCCC</a></td>
+ <td bgcolor="00CCFF"><a href="javascript:insertcode('00CCFF');" style="color:#000000;">00CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00FF00"><a href="javascript:insertcode('00FF00');" style="color:#000000;">00FF00</a></td>
+ <td bgcolor="00FF33"><a href="javascript:insertcode('00FF33');" style="color:#000000;">00FF33</a></td>
+ <td bgcolor="00FF66"><a href="javascript:insertcode('00FF66');" style="color:#000000;">00FF66</a></td>
+ <td bgcolor="00FF99"><a href="javascript:insertcode('00FF99');" style="color:#000000;">00FF99</a></td>
+ <td bgcolor="00FFCC"><a href="javascript:insertcode('00FFCC');" style="color:#000000;">00FFCC</a></td>
+ <td bgcolor="00FFFF"><a href="javascript:insertcode('00FFFF');" style="color:#000000;">00FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="330000"><span style="color:#FFFFFF; text-decoration:line-through;">330000</span></td>
+ <td bgcolor="330033"><span style="color:#FFFFFF; text-decoration:line-through;">330033</span></td>
+ <td bgcolor="330066"><span style="color:#FFFFFF; text-decoration:line-through;">330066</span></td>
+ <td bgcolor="330099"><a href="javascript:insertcode('330099');" style="color:#FFFFFF;">330099</a></td>
+ <td bgcolor="3300CC"><a href="javascript:insertcode('3300CC');" style="color:#FFFFFF;">3300CC</a></td>
+ <td bgcolor="3300FF"><a href="javascript:insertcode('3300FF');" style="color:#FFFFFF;">3300FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="333300"><span style="color:#FFFFFF; text-decoration:line-through;">333300</span></td>
+ <td bgcolor="333333"><span style="color:#FFFFFF; text-decoration:line-through;">333333</span></td>
+ <td bgcolor="333366"><a href="javascript:insertcode('333366');" style="color:#FFFFFF;">333366</a></td>
+ <td bgcolor="333399"><a href="javascript:insertcode('333399');" style="color:#FFFFFF;">333399</a></td>
+ <td bgcolor="3333CC"><a href="javascript:insertcode('3333CC');" style="color:#FFFFFF;">3333CC</a></td>
+ <td bgcolor="3333FF"><a href="javascript:insertcode('3333FF');" style="color:#FFFFFF;">3333FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="336600"><a href="javascript:insertcode('336600');" style="color:#FFFFFF;">336600</a></td>
+ <td bgcolor="336633"><a href="javascript:insertcode('336633');" style="color:#FFFFFF;">336633</a></td>
+ <td bgcolor="336666"><a href="javascript:insertcode('336666');" style="color:#FFFFFF;">336666</a></td>
+ <td bgcolor="336699"><a href="javascript:insertcode('336699');" style="color:#FFFFFF;">336699</a></td>
+ <td bgcolor="3366CC"><a href="javascript:insertcode('3366CC');" style="color:#FFFFFF;">3366CC</a></td>
+ <td bgcolor="3366FF"><a href="javascript:insertcode('3366FF');" style="color:#FFFFFF;">3366FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="339900"><a href="javascript:insertcode('339900');" style="color:#FFFFFF;">339900</a></td>
+ <td bgcolor="339933"><a href="javascript:insertcode('339933');" style="color:#FFFFFF;">339933</a></td>
+ <td bgcolor="339966"><a href="javascript:insertcode('339966');" style="color:#FFFFFF;">339966</a></td>
+ <td bgcolor="339999"><a href="javascript:insertcode('339999');" style="color:#FFFFFF;">339999</a></td>
+ <td bgcolor="3399CC"><a href="javascript:insertcode('3399CC');" style="color:#FFFFFF;">3399CC</a></td>
+ <td bgcolor="3399FF"><a href="javascript:insertcode('3399FF');" style="color:#FFFFFF;">3399FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33CC00"><a href="javascript:insertcode('33CC00');" style="color:#000000;">33CC00</a></td>
+ <td bgcolor="33CC33"><a href="javascript:insertcode('33CC33');" style="color:#000000;">33CC33</a></td>
+ <td bgcolor="33CC66"><a href="javascript:insertcode('33CC66');" style="color:#000000;">33CC66</a></td>
+ <td bgcolor="33CC99"><a href="javascript:insertcode('33CC99');" style="color:#000000;">33CC99</a></td>
+ <td bgcolor="33CCCC"><a href="javascript:insertcode('33CCCC');" style="color:#000000;">33CCCC</a></td>
+ <td bgcolor="33CCFF"><a href="javascript:insertcode('33CCFF');" style="color:#000000;">33CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33FF00"><a href="javascript:insertcode('33FF00');" style="color:#000000;">33FF00</a></td>
+ <td bgcolor="33FF33"><a href="javascript:insertcode('33FF33');" style="color:#000000;">33FF33</a></td>
+ <td bgcolor="33FF66"><a href="javascript:insertcode('33FF66');" style="color:#000000;">33FF66</a></td>
+ <td bgcolor="33FF99"><a href="javascript:insertcode('33FF99');" style="color:#000000;">33FF99</a></td>
+ <td bgcolor="33FFCC"><a href="javascript:insertcode('33FFCC');" style="color:#000000;">33FFCC</a></td>
+ <td bgcolor="33FFFF"><a href="javascript:insertcode('33FFFF');" style="color:#000000;">33FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="660000"><span style="color:#FFFFFF; text-decoration:line-through;">660000</span></td>
+ <td bgcolor="660033"><span style="color:#FFFFFF; text-decoration:line-through;">660033</span></td>
+ <td bgcolor="660066"><a href="javascript:insertcode('660066');" style="color:#FFFFFF;">660066</a></td>
+ <td bgcolor="660099"><a href="javascript:insertcode('660099');" style="color:#FFFFFF;">660099</a></td>
+ <td bgcolor="6600CC"><a href="javascript:insertcode('6600CC');" style="color:#FFFFFF;">6600CC</a></td>
+ <td bgcolor="6600FF"><a href="javascript:insertcode('6600FF');" style="color:#FFFFFF;">6600FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="663300"><a href="javascript:insertcode('663300');" style="color:#FFFFFF;">663300</a></td>
+ <td bgcolor="663333"><a href="javascript:insertcode('663333');" style="color:#FFFFFF;">663333</a></td>
+ <td bgcolor="663366"><a href="javascript:insertcode('663366');" style="color:#FFFFFF;">663366</a></td>
+ <td bgcolor="663399"><a href="javascript:insertcode('663399');" style="color:#FFFFFF;">663399</a></td>
+ <td bgcolor="6633CC"><a href="javascript:insertcode('6633CC');" style="color:#FFFFFF;">6633CC</a></td>
+ <td bgcolor="6633FF"><a href="javascript:insertcode('6633FF');" style="color:#FFFFFF;">6633FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="666600"><a href="javascript:insertcode('666600');" style="color:#FFFFFF;">666600</a></td>
+ <td bgcolor="666633"><a href="javascript:insertcode('666633');" style="color:#FFFFFF;">666633</a></td>
+ <td bgcolor="666666"><a href="javascript:insertcode('666666');" style="color:#FFFFFF;">666666</a></td>
+ <td bgcolor="666699"><a href="javascript:insertcode('666699');" style="color:#FFFFFF;">666699</a></td>
+ <td bgcolor="6666CC"><a href="javascript:insertcode('6666CC');" style="color:#FFFFFF;">6666CC</a></td>
+ <td bgcolor="6666FF"><a href="javascript:insertcode('6666FF');" style="color:#FFFFFF;">6666FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="669900"><a href="javascript:insertcode('669900');" style="color:#000000;">669900</a></td>
+ <td bgcolor="669933"><a href="javascript:insertcode('669933');" style="color:#000000;">669933</a></td>
+ <td bgcolor="669966"><a href="javascript:insertcode('669966');" style="color:#000000;">669966</a></td>
+ <td bgcolor="669999"><a href="javascript:insertcode('669999');" style="color:#000000;">669999</a></td>
+ <td bgcolor="6699CC"><a href="javascript:insertcode('6699CC');" style="color:#000000;">6699CC</a></td>
+ <td bgcolor="6699FF"><a href="javascript:insertcode('6699FF');" style="color:#000000;">6699FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66CC00"><a href="javascript:insertcode('66CC00');" style="color:#000000;">66CC00</a></td>
+ <td bgcolor="66CC33"><a href="javascript:insertcode('66CC33');" style="color:#000000;">66CC33</a></td>
+ <td bgcolor="66CC66"><a href="javascript:insertcode('66CC66');" style="color:#000000;">66CC66</a></td>
+ <td bgcolor="66CC99"><a href="javascript:insertcode('66CC99');" style="color:#000000;">66CC99</a></td>
+ <td bgcolor="66CCCC"><a href="javascript:insertcode('66CCCC');" style="color:#000000;">66CCCC</a></td>
+ <td bgcolor="66CCFF"><a href="javascript:insertcode('66CCFF');" style="color:#000000;">66CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66FF00"><a href="javascript:insertcode('66FF00');" style="color:#000000;">66FF00</a></td>
+ <td bgcolor="66FF33"><a href="javascript:insertcode('66FF33');" style="color:#000000;">66FF33</a></td>
+ <td bgcolor="66FF66"><a href="javascript:insertcode('66FF66');" style="color:#000000;">66FF66</a></td>
+ <td bgcolor="66FF99"><a href="javascript:insertcode('66FF99');" style="color:#000000;">66FF99</a></td>
+ <td bgcolor="66FFCC"><a href="javascript:insertcode('66FFCC');" style="color:#000000;">66FFCC</a></td>
+ <td bgcolor="66FFFF"><a href="javascript:insertcode('66FFFF');" style="color:#000000;">66FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="990000"><a href="javascript:insertcode('990000');" style="color:#FFFFFF;">990000</a></td>
+ <td bgcolor="990033"><a href="javascript:insertcode('990033');" style="color:#FFFFFF;">990033</a></td>
+ <td bgcolor="990066"><a href="javascript:insertcode('990066');" style="color:#FFFFFF;">990066</a></td>
+ <td bgcolor="990099"><a href="javascript:insertcode('990099');" style="color:#FFFFFF;">990099</a></td>
+ <td bgcolor="9900CC"><a href="javascript:insertcode('9900CC');" style="color:#FFFFFF;">9900CC</a></td>
+ <td bgcolor="9900FF"><a href="javascript:insertcode('9900FF');" style="color:#FFFFFF;">9900FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="993300"><a href="javascript:insertcode('993300');" style="color:#FFFFFF;">993300</a></td>
+ <td bgcolor="993333"><a href="javascript:insertcode('993333');" style="color:#FFFFFF;">993333</a></td>
+ <td bgcolor="993366"><a href="javascript:insertcode('993366');" style="color:#FFFFFF;">993366</a></td>
+ <td bgcolor="993399"><a href="javascript:insertcode('993399');" style="color:#FFFFFF;">993399</a></td>
+ <td bgcolor="9933CC"><a href="javascript:insertcode('9933CC');" style="color:#FFFFFF;">9933CC</a></td>
+ <td bgcolor="9933FF"><a href="javascript:insertcode('9933FF');" style="color:#FFFFFF;">9933FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="996600"><a href="javascript:insertcode('996600');" style="color:#FFFFFF;">996600</a></td>
+ <td bgcolor="996633"><a href="javascript:insertcode('996633');" style="color:#FFFFFF;">996633</a></td>
+ <td bgcolor="996666"><a href="javascript:insertcode('996666');" style="color:#FFFFFF;">996666</a></td>
+ <td bgcolor="996699"><a href="javascript:insertcode('996699');" style="color:#FFFFFF;">996699</a></td>
+ <td bgcolor="9966CC"><a href="javascript:insertcode('9966CC');" style="color:#FFFFFF;">9966CC</a></td>
+ <td bgcolor="9966FF"><a href="javascript:insertcode('9966FF');" style="color:#FFFFFF;">9966FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="999900"><a href="javascript:insertcode('999900');" style="color:#000000;">999900</a></td>
+ <td bgcolor="999933"><a href="javascript:insertcode('999933');" style="color:#000000;">999933</a></td>
+ <td bgcolor="999966"><a href="javascript:insertcode('999966');" style="color:#000000;">999966</a></td>
+ <td bgcolor="999999"><a href="javascript:insertcode('999999');" style="color:#000000;">999999</a></td>
+ <td bgcolor="9999CC"><a href="javascript:insertcode('9999CC');" style="color:#000000;">9999CC</a></td>
+ <td bgcolor="9999FF"><a href="javascript:insertcode('9999FF');" style="color:#000000;">9999FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99CC00"><a href="javascript:insertcode('99CC00');" style="color:#000000;">99CC00</a></td>
+ <td bgcolor="99CC33"><a href="javascript:insertcode('99CC33');" style="color:#000000;">99CC33</a></td>
+ <td bgcolor="99CC66"><a href="javascript:insertcode('99CC66');" style="color:#000000;">99CC66</a></td>
+ <td bgcolor="99CC99"><a href="javascript:insertcode('99CC99');" style="color:#000000;">99CC99</a></td>
+ <td bgcolor="99CCCC"><a href="javascript:insertcode('99CCCC');" style="color:#000000;">99CCCC</a></td>
+ <td bgcolor="99CCFF"><a href="javascript:insertcode('99CCFF');" style="color:#000000;">99CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99FF00"><a href="javascript:insertcode('99FF00');" style="color:#000000;">99FF00</a></td>
+ <td bgcolor="99FF33"><a href="javascript:insertcode('99FF33');" style="color:#000000;">99FF33</a></td>
+ <td bgcolor="99FF66"><a href="javascript:insertcode('99FF66');" style="color:#000000;">99FF66</a></td>
+ <td bgcolor="99FF99"><a href="javascript:insertcode('99FF99');" style="color:#000000;">99FF99</a></td>
+ <td bgcolor="99FFCC"><a href="javascript:insertcode('99FFCC');" style="color:#000000;">99FFCC</a></td>
+ <td bgcolor="99FFFF"><a href="javascript:insertcode('99FFFF');" style="color:#000000;">99FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC0000"><a href="javascript:insertcode('CC0000');" style="color:#FFFFFF;">CC0000</a></td>
+ <td bgcolor="CC0033"><a href="javascript:insertcode('CC0033');" style="color:#FFFFFF;">CC0033</a></td>
+ <td bgcolor="CC0066"><a href="javascript:insertcode('CC0066');" style="color:#FFFFFF;">CC0066</a></td>
+ <td bgcolor="CC0099"><a href="javascript:insertcode('CC0099');" style="color:#FFFFFF;">CC0099</a></td>
+ <td bgcolor="CC00CC"><a href="javascript:insertcode('CC00CC');" style="color:#FFFFFF;">CC00CC</a></td>
+ <td bgcolor="CC00FF"><a href="javascript:insertcode('CC00FF');" style="color:#FFFFFF;">CC00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC3300"><a href="javascript:insertcode('CC3300');" style="color:#FFFFFF;">CC3300</a></td>
+ <td bgcolor="CC3333"><a href="javascript:insertcode('CC3333');" style="color:#FFFFFF;">CC3333</a></td>
+ <td bgcolor="CC3366"><a href="javascript:insertcode('CC3366');" style="color:#FFFFFF;">CC3366</a></td>
+ <td bgcolor="CC3399"><a href="javascript:insertcode('CC3399');" style="color:#FFFFFF;">CC3399</a></td>
+ <td bgcolor="CC33CC"><a href="javascript:insertcode('CC33CC');" style="color:#FFFFFF;">CC33CC</a></td>
+ <td bgcolor="CC33FF"><a href="javascript:insertcode('CC33FF');" style="color:#FFFFFF;">CC33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC6600"><a href="javascript:insertcode('CC6600');" style="color:#000000;">CC6600</a></td>
+ <td bgcolor="CC6633"><a href="javascript:insertcode('CC6633');" style="color:#000000;">CC6633</a></td>
+ <td bgcolor="CC6666"><a href="javascript:insertcode('CC6666');" style="color:#000000;">CC6666</a></td>
+ <td bgcolor="CC6699"><a href="javascript:insertcode('CC6699');" style="color:#000000;">CC6699</a></td>
+ <td bgcolor="CC66CC"><a href="javascript:insertcode('CC66CC');" style="color:#000000;">CC66CC</a></td>
+ <td bgcolor="CC66FF"><a href="javascript:insertcode('CC66FF');" style="color:#000000;">CC66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC9900"><a href="javascript:insertcode('CC9900');" style="color:#000000;">CC9900</a></td>
+ <td bgcolor="CC9933"><a href="javascript:insertcode('CC9933');" style="color:#000000;">CC9933</a></td>
+ <td bgcolor="CC9966"><a href="javascript:insertcode('CC9966');" style="color:#000000;">CC9966</a></td>
+ <td bgcolor="CC9999"><a href="javascript:insertcode('CC9999');" style="color:#000000;">CC9999</a></td>
+ <td bgcolor="CC99CC"><a href="javascript:insertcode('CC99CC');" style="color:#000000;">CC99CC</a></td>
+ <td bgcolor="CC99FF"><a href="javascript:insertcode('CC99FF');" style="color:#000000;">CC99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCCC00"><a href="javascript:insertcode('CCCC00');" style="color:#000000;">CCCC00</a></td>
+ <td bgcolor="CCCC33"><a href="javascript:insertcode('CCCC33');" style="color:#000000;">CCCC33</a></td>
+ <td bgcolor="CCCC66"><a href="javascript:insertcode('CCCC66');" style="color:#000000;">CCCC66</a></td>
+ <td bgcolor="CCCC99"><a href="javascript:insertcode('CCCC99');" style="color:#000000;">CCCC99</a></td>
+ <td bgcolor="CCCCCC"><a href="javascript:insertcode('CCCCCC');" style="color:#000000;">CCCCCC</a></td>
+ <td bgcolor="CCCCFF"><a href="javascript:insertcode('CCCCFF');" style="color:#000000;">CCCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCFF00"><a href="javascript:insertcode('CCFF00');" style="color:#000000;">CCFF00</a></td>
+ <td bgcolor="CCFF33"><a href="javascript:insertcode('CCFF33');" style="color:#000000;">CCFF33</a></td>
+ <td bgcolor="CCFF66"><a href="javascript:insertcode('CCFF66');" style="color:#000000;">CCFF66</a></td>
+ <td bgcolor="CCFF99"><a href="javascript:insertcode('CCFF99');" style="color:#000000;">CCFF99</a></td>
+ <td bgcolor="CCFFCC"><a href="javascript:insertcode('CCFFCC');" style="color:#000000;">CCFFCC</a></td>
+ <td bgcolor="CCFFFF"><a href="javascript:insertcode('CCFFFF');" style="color:#000000;">CCFFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF0000"><a href="javascript:insertcode('FF0000');" style="color:#FFFFFF;">FF0000</a></td>
+ <td bgcolor="FF0033"><a href="javascript:insertcode('FF0033');" style="color:#FFFFFF;">FF0033</a></td>
+ <td bgcolor="FF0066"><a href="javascript:insertcode('FF0066');" style="color:#FFFFFF;">FF0066</a></td>
+ <td bgcolor="FF0099"><a href="javascript:insertcode('FF0099');" style="color:#FFFFFF;">FF0099</a></td>
+ <td bgcolor="FF00CC"><a href="javascript:insertcode('FF00CC');" style="color:#FFFFFF;">FF00CC</a></td>
+ <td bgcolor="FF00FF"><a href="javascript:insertcode('FF00FF');" style="color:#FFFFFF;">FF00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF3300"><a href="javascript:insertcode('FF3300');" style="color:#FFFFFF;">FF3300</a></td>
+ <td bgcolor="FF3333"><a href="javascript:insertcode('FF3333');" style="color:#FFFFFF;">FF3333</a></td>
+ <td bgcolor="FF3366"><a href="javascript:insertcode('FF3366');" style="color:#FFFFFF;">FF3366</a></td>
+ <td bgcolor="FF3399"><a href="javascript:insertcode('FF3399');" style="color:#FFFFFF;">FF3399</a></td>
+ <td bgcolor="FF33CC"><a href="javascript:insertcode('FF33CC');" style="color:#FFFFFF;">FF33CC</a></td>
+ <td bgcolor="FF33FF"><a href="javascript:insertcode('FF33FF');" style="color:#FFFFFF;">FF33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF6600"><a href="javascript:insertcode('FF6600');" style="color:#000000;">FF6600</a></td>
+ <td bgcolor="FF6633"><a href="javascript:insertcode('FF6633');" style="color:#000000;">FF6633</a></td>
+ <td bgcolor="FF6666"><a href="javascript:insertcode('FF6666');" style="color:#000000;">FF6666</a></td>
+ <td bgcolor="FF6699"><a href="javascript:insertcode('FF6699');" style="color:#000000;">FF6699</a></td>
+ <td bgcolor="FF66CC"><a href="javascript:insertcode('FF66CC');" style="color:#000000;">FF66CC</a></td>
+ <td bgcolor="FF66FF"><a href="javascript:insertcode('FF66FF');" style="color:#000000;">FF66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF9900"><a href="javascript:insertcode('FF9900');" style="color:#000000;">FF9900</a></td>
+ <td bgcolor="FF9933"><a href="javascript:insertcode('FF9933');" style="color:#000000;">FF9933</a></td>
+ <td bgcolor="FF9966"><a href="javascript:insertcode('FF9966');" style="color:#000000;">FF9966</a></td>
+ <td bgcolor="FF9999"><a href="javascript:insertcode('FF9999');" style="color:#000000;">FF9999</a></td>
+ <td bgcolor="FF99CC"><a href="javascript:insertcode('FF99CC');" style="color:#000000;">FF99CC</a></td>
+ <td bgcolor="FF99FF"><a href="javascript:insertcode('FF99FF');" style="color:#000000;">FF99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFCC00"><a href="javascript:insertcode('FFCC00');" style="color:#000000;">FFCC00</a></td>
+ <td bgcolor="FFCC33"><a href="javascript:insertcode('FFCC33');" style="color:#000000;">FFCC33</a></td>
+ <td bgcolor="FFCC66"><a href="javascript:insertcode('FFCC66');" style="color:#000000;">FFCC66</a></td>
+ <td bgcolor="FFCC99"><a href="javascript:insertcode('FFCC99');" style="color:#000000;">FFCC99</a></td>
+ <td bgcolor="FFCCCC"><a href="javascript:insertcode('FFCCCC');" style="color:#000000;">FFCCCC</a></td>
+ <td bgcolor="FFCCFF"><a href="javascript:insertcode('FFCCFF');" style="color:#000000;">FFCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFFF00"><a href="javascript:insertcode('FFFF00');" style="color:#000000;">FFFF00</a></td>
+ <td bgcolor="FFFF33"><a href="javascript:insertcode('FFFF33');" style="color:#000000;">FFFF33</a></td>
+ <td bgcolor="FFFF66"><a href="javascript:insertcode('FFFF66');" style="color:#000000;">FFFF66</a></td>
+ <td bgcolor="FFFF99"><a href="javascript:insertcode('FFFF99');" style="color:#000000;">FFFF99</a></td>
+ <td bgcolor="FFFFCC"><a href="javascript:insertcode('FFFFCC');" style="color:#000000;">FFFFCC</a></td>
+ <td bgcolor="FFFFFF"><a href="javascript:insertcode('FFFFFF');" style="color:#000000;">FFFFFF</a></td>
+ </tr>
+</table> \ No newline at end of file
diff --git a/0.8.1/templates/help.sno b/0.8.1/templates/help.sno
new file mode 100755
index 0000000..e1f6de9
--- /dev/null
+++ b/0.8.1/templates/help.sno
@@ -0,0 +1,79 @@
+<div>
+ Alle Chat-Befehle:
+</div>
+<hr>
+<table border=1>
+<tr><th><div>SU</div></th><th><div>Befehl</div></th><th><div>Beschreibung</div></th></tr>
+<tr><td><div>NC</div></td><td><div>/about</div></td><td><div>Zeigt aktuelle Version und andere Infos der Community an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/away <font color=red>Nachricht</font></div></td><td><div>Abmelden mit einer<font color=red>Abmeldenachricht</font></div></td></tr>
+<tr><td><div>NC</div></td><td><div>/clear</div></td><td><div>Bildschirm wird gelöscht</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/col <font color=red>XXXXXX</font> <font color=ffa500>XXXXXX</font></div></td><td><div>Farbe/n (<font color=red>Namensfarbe</font> / <font color=ffa500>Textfarbe</font>) wechseln. Angabe in Hexadezimal. Wird gar keine Farbe angegeben, dann wird eine zufällige generiert!</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/date</div></td><td><div>Zeigt aktuelles Datum und Urzeit an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/exit</div></td><td><div>Komplett aus dem System ausloggen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/getcol <font color=red>Alias</font></div></td><td><div>Zeigt an welche Farb-Codes <font color=red>Alias</font> zum Chatten verwendet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/hits</div></td><td><div>Zeigt an vor wieviel Stunden der Chat-Server neugestartet wurde und die Hits und Hits per Minute seit dieser Zeit</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ig <font color=red>Alias</font></div></td><td><div>Setzt/entfernt <font color=red>Alias</font> auf/aus die/der Ignorierliste. Wird das Argument weggelassen, so wird die Liste aller ignorierten Personen angezeigt</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/j <font color=red>Raumname</font></div></td><td><div>Raum wechseln/erstellen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ju <font color=red>Alias</font></div></td><td><div>In den Raum wechseln/folgen, wo sich <font color=red>Alias</font> befindet.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/m <font color=red>Aktion</font></div></td><td><div>Handeln mit 2 Farben</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/me <font color=red>Aktion</font></div></td><td><div>Handeln mit einer Farbe</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/memo <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine <font color=ffa500>Memonachricht</font> hinterlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/msg <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine private <font color=ffa500>Nachricht</font> flüstern</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ <font color=ffa500>Nachricht</font></div></td><td><div>Eine private <font color=ffa500>Nachricht</font> demjenigen flüstern, dem zuletzt eine geflüstert wurde</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/online <font color=red>Alias</font></div></td><td><div>Zeigt Onlineminuten von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/q</div></td><td><div>Chat verlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/rmgb</div></td><td><div>Das eigene Gästebuch komplett weglöschen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/s <font color=red>Nachricht</font></div></td><td><div><font color=red>Nachricht</font> schreien</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/seen <font color=red>Alias</font></div></td><td><div>Zeigt an, vor wieviel Stunden sich <font color=red>Nachricht</font> zum letzten Mal in das System eingelogt hat</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/selfkill</div></td><td><div>Sich selbst ganz und gar aus dem System entfernen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/sep <font color=red>Raumname</font></div></td><td><div>In den Raum <font color=red>Raumnamen</font> wechseln und gleichzeitig absperren</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/uptime</div></td><td><div>Siehe Befehl "/hits"</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/w</div></td><td><div>Zeigt an, wer sich im aktuellen Raum befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc <font color=red>Raum</font></div></td><td><div>Zeigt an, wer sich im <font color=red>Raum</font> befindet. Wird kein Raum angegeben, dann wird ledeglich angezeigt, wer sich im System befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc/</div></td><td><div>Zeigt alle offenen Räume und deren Chatter an</div></td></tr>
+<tr><td><div>NC</div></td><td> <div>/wj <font color=red>Alias</font></div></td><td><div>Zeigt an, in welchen Raum sich <font color=red>Alias</font> befindet</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/l</div></td><td><div>Der aktuelle Raum wird ab- bzw. aufgesperrt</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/rsu <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> die Raumbesetzerrechte entnehmen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/su <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Raumbesetzer ernennen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/t <font color=red>Thema</font></div></td><td><div>Dem Raum wird ein <font color=red>Thema</font> gegeben</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban</div></td><td><div>Zeigt alle verbannten Benutzer an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> verbannen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/rban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> "entbannen"</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/banip <font color=red>Alias</font></div></td><td><div>Die IP-Nummer von <font color=red>Alias</font> verbannen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/rbanip ip://<font color=red>x.x.x.x</font></div></td><td><div>Die IP-Nummer <font color=red>x.x.x.x</font> "entbannen"</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ip <font color=red>Alias</font></div></td><td><div>Zeigt die IP-Nummer von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/img</div></td><td><div>Versteckt/reaktiviert das eigene Superuser-Logo im Online-Frame</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/k <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird aus dem Chat katapultiert!</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/o <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird aus dem Chat ausgeloggt!</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/sl <font color=red>Raum</font></div></td><td><div>Einen anderen <font color=ffa500>Raum</font> absperren</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ss <font color=red>Raum</font> <font color=ffa500>Nachricht</font></div></td><td><div>Eine <font color=ffa500>Nachricht</font> in <font color=red>Raum</font> hinüber rufen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/st <font color=red>Raum</font> <font color=ffa500>Thema</font></div></td><td><div>Einem anderen <font color=red>Raum</font> ein <font color=ffa500>Thema</font > geben</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/status <font color=ffa500>Alias</font></div></td><td><div>Zeigt den Superuserstatus von <font color=ffa500>Alias</font> an</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/kill <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird ganz und gar aus dem System entfernt</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/wa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Wächter ernennen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/rwa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom Wächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/sys <font color=red>Nachricht</font></div></td><td><div>Systemnachricht schreiben. (Erscheint in allen existierenden Räumen)</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/twa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum temporären Wächter ernennen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/rtwa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom temporären Wächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=red>AD</font></div></td><td><div>/cool <font color=red>Nachricht</font></div></td><td><div>Gibt für den aktuellen Raum eine Systemmeldung aus</div></td></tr>
+<tr><td><div><font color=red>AD</font></div></td><td><div>/id <font color=red>Alias</font></div></td><td><div>Zeigt TempID von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div><font color=red>AD</font></div></td><td><div>/ow <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Oberwächter ernennen</div></td></tr>
+<tr><td><div><font color=red>AD</font></div></td><td><div>/row <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom Oberwächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=red>AD</font></div></td><td><div>/pw <font color=red>Alias</font></div></td><td><div>Zeigt das Passwort von <font color=red>Alias</font> an</div></td></tr>
+
+</table><hr>
+<div>
+ Zur Erklärung: NC steht für "Normale Chatter", RB für "Raumbesetzer", WÄ für "Wächter" und OW für "Oberwächter".
+ Obrige Befehle können nur von der/den jeweiligen Benutzergruppe/n ausgeführt werden.<br><br>
+ Allerdings gibt es folgendes zu beachten: Oberwächter verfügen über alle Chatbefehle. Normale Wächter über alle Chatbefehle, außer über die der Oberwächter.
+ Raumbesetzer können nur Raumbesetzerbefehle und die Befehle der normalen Chatter durchführen. Normale Chatter haben ledeglich die Standardbefehle zu verwenden.<br><br>
+ Weitere Besonderheiten der Wächter und Oberwächter:<br><br>
+ Wächter und Oberwächter können ....<br>
+ ... abgesperrte Chaträume problemlos betreten.<br>
+ ... nicht gekickt, verbannt oder gekillt werden.<br><br>
+ Nur Oberwächer können Logdateien der Cyberbar lesen!<br><br>
+ Oberwächter ernennt nur der Systemadministrator! Dieser wiederum hat weitere spezielle Befehle die geheim sind und die nur ihm
+ vorbehalten sind und ihm das Administrieren erleichtert.
+</div>
+</body>
+</html>
diff --git a/0.8.1/ychatd.pl b/0.8.1/ychatd.pl
new file mode 100755
index 0000000..f804436
--- /dev/null
+++ b/0.8.1/ychatd.pl
@@ -0,0 +1,94 @@
+#!/usr/bin/perl
+use CGI;
+$q = new CGI;
+
+use config;
+use modules::commands;
+use modules::changeroom;
+use modules::divcom;
+use modules::hierachie;
+use modules::htdocs;
+use modules::input;
+use modules::loggedin;
+use modules::online;
+use modules::postmessage;
+use modules::shared;
+use modules::start;
+use modules::statistic;
+use modules::stream;
+use modules::webchat;
+use IO::Socket;
+use Socket;
+use POSIX;
+
+$SIG{'CHLD'} = 'IGNORE';
+
+$mainsocket = 'IO::Socket::INET'->new('LocalHost', "$localhost", 'LocalPort', $localport, 'Porto', 'tcp', 'Listen', $limit + 10, 'Reuse', 1);
+die "Kann Server-Socket nicht erzeugen: $!\n" unless $mainsocket;
+
+print "yChat wurde auf $localhost:$localport gestartet...\n";
+
+$STARTIME = time;
+
+#Debugging only
+#open AWAKE, ">data/online/awake/-$$-";
+#print AWAKE "$STARTIME - Daemon";
+#close AWAKE;
+
+while ($client = $mainsocket->accept) {
+ print $client "HTTP/1.1 200 OK\nContent-type:text/html\n\n";
+
+ ++$HITS;
+ $pid = fork;
+ if ($pid == 0) {
+ my @reqheader;
+
+ $rv = $client->recv($reqheader[0], POSIX::BUFSIZ, 0);
+ @reqheader = split "\n", $reqheader[0];
+
+ my $requeststring;
+ my(@tmp) = split(/\s+/, $reqheader[0], 0);
+
+ if ($tmp[0] eq 'GET') {
+ $requeststring = $tmp[1];
+
+ } else {
+ $requeststring = 'chat?'.$reqheader[-1];
+ }
+
+ #Debug only
+ #open AWAKE, ">data/online/awake/$$";
+ #print AWAKE $requeststring;
+ #close AWAKE;
+
+ @tmp = split(/\?/, $requeststring, 0);
+ @tmp = split(/&/, $tmp[1], 0);
+ my %variables;
+
+ foreach $_ (@tmp) {
+ my(@tmp) = split(/=/, $_, 0);
+ next if $tmp[0] eq 'admin' or $tmp[0] eq 'mogeladmin';
+ $tmp[0] =~ s[/][];
+ $variables{$tmp[0]} = &url_decode($tmp[1]);
+ }
+
+ foreach $_ (keys %variables) {
+ $variables{$_} =~ s/'/\\'/g;
+ my $eval = "\$$_ = '" . $variables{$_} . "';";
+ # print "$eval\n";
+ eval $eval;
+ }
+ *STD = *STDOUT;
+ *STDOUT = $client;
+ if ($request) {
+ &secure_checkid($alias, $tmpid) if $request != 'start';
+ eval "&$request";
+ }
+ else {
+ &start;
+ }
+ &del_awake();
+ $client->shutdown(2);
+ exit 0;
+ }
+}