PageRenderTime 59ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 1ms

/src/httpd.c

https://github.com/abd88a159bbe/Lac
C | 1021 lines | 780 code | 187 blank | 54 comment | 195 complexity | affff2c94945dc77c8ff4685507629c2 MD5 | raw file
Possible License(s): BSD-2-Clause, LGPL-2.0
  1. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  2. * ___ _______ ________ | *
  3. * |###| |#######| |########| (R) | Lac *
  4. * |###| |###|^|###| |###|^^|###| | *
  5. * |###| |###| |###| |###| ^^^ | ekipa programistyczna: *
  6. * |###| |###|_|###| |###| | Lam, Qwert, Ulryk, Vigud *
  7. * |###| |#########| |###| | Tissarius, Cadaver *
  8. * |###| |###|^|###| |###| | Alandar, Gimza *
  9. * |###| |###| |###| |###| ___ | trzy grosze dolozyli: *
  10. * |###|______ |###| |###| |###|__|###| | Varda, Nop, Fuyara *
  11. * |##########| |###| |###| |########| | Albi, Malven, Muzgus *
  12. * ^^^^^^^^^^ ^^^ ^^^ ^^^^^^^^ | *
  13. * ----------------------------------------------------------------------- *
  14. * LACMud improvements copyright (C) 1997 - 2012 by Leszek Matok et al. *
  15. * EnvyMud 2.2 improvements copyright (C) 1996, 1997 by Michael Quan. *
  16. * EnvyMud 2.0 improvements copyright (C) 1995 by Michael Quan and *
  17. * Mitchell Tse. *
  18. * Envy Diku Mud improvements copyright (C) 1994 by Michael Quan, David *
  19. * Love, Guilherme 'Willie' Arnold, and Mitchell Tse. *
  20. * Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael *
  21. * Chastain, Michael Quan, and Mitchell Tse. *
  22. * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
  23. * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
  24. * ----------------------------------------------------------------------- *
  25. * In order to use any part of this Lac Diku Mud, you must comply with *
  26. * the original Diku license in 'license.doc', the Merc license in *
  27. * 'license.txt', the Envy license in 'license.nvy', as well as the Lac *
  28. * license in 'license.lac'. In particular, you may not remove either of *
  29. * these copyright notices. *
  30. * ----------------------------------------------------------------------- *
  31. * Ulryk 2004: nowa, ulepszona wersja zintegrowanego serwera www *
  32. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  33. #include "merc.h"
  34. char *http2lac args( ( char *arg ) );
  35. void get_help_topic args( ( char *arg, char *topic ) );
  36. int zrob_odnosnik args( ( char *arg, char *link ) );
  37. bool html_header args( ( WHO_DESCRIPTOR_DATA *d, const char *tytul ) );
  38. bool html_foot args( ( WHO_DESCRIPTOR_DATA *d ) );
  39. bool html_time args( ( WHO_DESCRIPTOR_DATA *d ) );
  40. bool html_weather args( ( WHO_DESCRIPTOR_DATA *d ) );
  41. HTML( html_clans );
  42. const struct html_page_type html_page_table [ ] =
  43. {
  44. {
  45. "/kto", "kto gra", "Zobacz list๊ aktualnie grajฑcych", html_who
  46. },
  47. {
  48. "/pomoc", "pomoc", "Poczytaj pomoc", html_help
  49. },
  50. {
  51. "/polecenia", "polecenia", "Zobacz list๊ polece๑", html_commands
  52. },
  53. {
  54. "/profesje", "profesje", "Zobacz list๊ profesji", html_slist
  55. },
  56. {
  57. "/krainy", "krainy", "Zobacz list๊ krain", html_areas
  58. },
  59. #if defined( KLANY )
  60. {
  61. "/klany", "klany", "Zobacz list๊ klan๓w", html_clans
  62. },
  63. #endif
  64. /*
  65. {
  66. "/nowosci", "nowoถci", "Zapoznaj si๊ z nowoถciami", html_news
  67. },
  68. */
  69. /* ponizej umieszczac jedynie adresy z NULLowymi opisami */
  70. {
  71. "/robots.txt", NULL, NULL, html_404
  72. },
  73. {
  74. "/favicon.ico", NULL, NULL, html_404
  75. },
  76. {
  77. NULL, NULL, NULL, NULL
  78. }
  79. };
  80. char * const html_day_name [] =
  81. {
  82. "ksi๊ฟyca", "byka", "kณamstwa", "gromu", "wolnoถci",
  83. "wielkich bog๓w", "sณo๑ca"
  84. };
  85. char * const html_month_name [] =
  86. {
  87. "zimy", "wilka", "lodowego olbrzyma", "dawnej pot๊gi",
  88. "wielkiej walki", "wiosny", "przyrody", "bณahoถci", "smoka",
  89. "sณo๑ca", "ciepณa", "bitwy", "ciemnych odcieni", "cieni",
  90. "dณugich cieni", "dawnej ciemnoถci", "wielkiego zณa"
  91. };
  92. HTML_FUN *szukaj_strony( char *arg )
  93. {
  94. int i;
  95. for ( i = 0; html_page_table[ i ].name; i++ )
  96. if ( !str_prefix( html_page_table[ i ].name, arg ) )
  97. return html_page_table[ i ].fun;
  98. return html_index;
  99. }
  100. char *http2lac( char *arg )
  101. {
  102. char *p = arg;
  103. char buf[ MSL ];
  104. int i = 0;
  105. if ( *p == '\0' )
  106. return arg;
  107. while ( *p != '\0' )
  108. {
  109. if ( *p == '+' )
  110. buf[ i ] = ' ';
  111. else if ( !str_prefix( "%A1", p ) || ( !str_prefix( "%B1", p ) ) )
  112. {
  113. buf[ i ] = '`';
  114. i++;
  115. buf[ i ] = 'a';
  116. p += 2;
  117. }
  118. else if ( !str_prefix( "%C6", p ) || ( !str_prefix( "%E6", p ) ) )
  119. {
  120. buf[ i ] = '`';
  121. i++;
  122. buf[ i ] = 'c';
  123. p += 2;
  124. }
  125. else if ( !str_prefix( "%CA", p ) || ( !str_prefix( "%EA", p ) ) )
  126. {
  127. buf[ i ] = '`';
  128. i++;
  129. buf[ i ] = 'e';
  130. p += 2;
  131. }
  132. else if ( !str_prefix( "%A3", p ) || ( !str_prefix( "%B3", p ) ) )
  133. {
  134. buf[ i ] = '`';
  135. i++;
  136. buf[ i ] = 'l';
  137. p += 2;
  138. }
  139. else if ( !str_prefix( "%D1", p ) || ( !str_prefix( "%F1", p ) ) )
  140. {
  141. buf[ i ] = '`';
  142. i++;
  143. buf[ i ] = 'n';
  144. p += 2;
  145. }
  146. else if ( !str_prefix( "%D3", p ) || ( !str_prefix( "%F3", p ) ) )
  147. {
  148. buf[ i ] = '`';
  149. i++;
  150. buf[ i ] = 'o';
  151. p += 2;
  152. }
  153. else if ( !str_prefix( "%A6", p ) || ( !str_prefix( "%B6", p ) ) )
  154. {
  155. buf[ i ] = '`';
  156. i++;
  157. buf[ i ] = 's';
  158. p += 2;
  159. }
  160. else if ( !str_prefix( "%AC", p ) || ( !str_prefix( "%BC", p ) ) )
  161. {
  162. buf[ i ] = '`';
  163. i++;
  164. buf[ i ] = 'x';
  165. p += 2;
  166. }
  167. else if ( !str_prefix( "%AF", p ) || ( !str_prefix( "%BF", p ) ) )
  168. {
  169. buf[ i ] = '`';
  170. i++;
  171. buf[ i ] = 'z';
  172. p += 2;
  173. }
  174. else if ( !str_prefix( "%20", p ) )
  175. {
  176. buf[ i ] = ' ';
  177. p += 2;
  178. }
  179. else if ( !str_prefix( "%21", p ) )
  180. {
  181. buf[ i ] = '!';
  182. p += 2;
  183. }
  184. else if ( !str_prefix( "%22", p ) )
  185. {
  186. buf[ i ] = '\"';
  187. p += 2;
  188. }
  189. else if ( !str_prefix( "%26", p ) )
  190. {
  191. buf[ i ] = '&';
  192. p += 2;
  193. }
  194. else if ( !str_prefix( "%27", p ) )
  195. {
  196. buf[ i ] = '\'';
  197. p += 2;
  198. }
  199. else if ( !str_prefix( "%2C", p ) )
  200. {
  201. buf[ i ] = ',';
  202. p += 2;
  203. }
  204. else if ( !str_prefix( "%2F", p ) )
  205. {
  206. buf[ i ] = '/';
  207. p += 2;
  208. }
  209. else if ( !str_prefix( "%3B", p ) )
  210. {
  211. buf[ i ] = ';';
  212. p += 2;
  213. }
  214. else if ( !str_prefix( "%3C", p ) )
  215. {
  216. buf[ i ] = '<';
  217. p += 2;
  218. }
  219. else if ( !str_prefix( "%3D", p ) )
  220. {
  221. buf[ i ] = '=';
  222. p += 2;
  223. }
  224. else if ( !str_prefix( "%3F", p ) )
  225. {
  226. buf[ i ] = '?';
  227. p += 2;
  228. }
  229. else if ( !str_prefix( "%60", p ) )
  230. {
  231. buf[ i ] = '`';
  232. p += 2;
  233. }
  234. else if ( !str_prefix( "%2E", p ) )
  235. {
  236. buf[ i ] = '.';
  237. p += 2;
  238. }
  239. else
  240. buf[ i ] = *p;
  241. i++;
  242. p++;
  243. }
  244. buf[ i ] = '\0';
  245. strcpy( arg, buf );
  246. return arg;
  247. }
  248. void http_log( WHO_DESCRIPTOR_DATA *d )
  249. {
  250. char *strtime;
  251. strtime = ctime( &current_time );
  252. strtime[ strlen( strtime ) - 1 ] = '\0';
  253. fprintf( httpdlog, "%s :: %s :: %s :: UA: %s :: Ref: %s\n",
  254. strtime,
  255. d->host,
  256. http2lac( d->zapytanie ),
  257. d->klient,
  258. d->referer );
  259. return;
  260. }
  261. void get_help_topic( char *arg, char *topic )
  262. {
  263. char *p = arg;
  264. while ( ( *p++ != '\0' ) && ( *p != '=' ) && ( *p != '/' ) )
  265. ;
  266. if ( *p == '\0' )
  267. return;
  268. strcpy( topic, ++p );
  269. topic = http2lac( topic );
  270. return;
  271. }
  272. bool get_who_data( char *arg, WHO_DESCRIPTOR_DATA *d )
  273. {
  274. char *p;
  275. int i = 0;
  276. if ( !( p = strstr( arg, "HTTP/" ) ) || str_prefix( "GET", arg ) )
  277. {
  278. strcpy( d->zapytanie, "(blad)" );
  279. strcpy( d->klient, "(brak danych)" );
  280. strcpy( d->referer, "(brak)" );
  281. return FALSE;
  282. }
  283. strncpy( d->odnosnik, arg + 4, p - arg - 5 );
  284. if ( p - arg - 3 < MAX_INPUT_LENGTH )
  285. d->odnosnik[ p - arg - 4 ] = '\0';
  286. else
  287. d->odnosnik[ MAX_INPUT_LENGTH - 1 ] = '\0';
  288. while ( !isspace( (int) *p ) )
  289. p++;
  290. strncpy( d->zapytanie, arg, p - arg );
  291. if ( p - arg + 2 < MAX_INPUT_LENGTH )
  292. d->zapytanie[ p - arg + 1 ] = '\0';
  293. else
  294. d->zapytanie[ MAX_INPUT_LENGTH - 1 ] = '\0';
  295. if ( !( p = strstr( arg, "User-Agent:" ) ) )
  296. strcpy( d->klient, "(brak danych)" );
  297. else
  298. {
  299. p += 12;
  300. while ( *p != '\n' && *p != '\0' && ( i < MAX_STRING_LENGTH ) )
  301. d->klient[ i++ ] = *p++;
  302. d->klient[ i ? i - 1 : i ] = '\0';
  303. }
  304. if ( !( p = strstr( arg, "Referer:" ) ) )
  305. {
  306. strcpy( d->referer, "(brak)" );
  307. return TRUE;
  308. }
  309. p += 9;
  310. i = 0;
  311. while ( *p != '\n' && *p != '\0' && ( i < MAX_STRING_LENGTH ) )
  312. d->referer[ i++ ] = *p++;
  313. d->referer[ i ? i - 1 : i ] = '\0';
  314. return TRUE;
  315. }
  316. int zrob_odnosnik( char *arg, char *link )
  317. {
  318. char buf[ MAX_STRING_LENGTH ];
  319. char buf1[ MAX_STRING_LENGTH ];
  320. char buf3[ MAX_STRING_LENGTH ];
  321. int i, j, z;
  322. for ( i = 0; arg[ i ] != '\0' && arg[ i ] != '{'; i++ )
  323. buf3[ i ] = arg[ i ];
  324. buf3[ i ] = '\0';
  325. z = i;
  326. #if defined( LINK_CHECK )
  327. {
  328. HELP_DATA *help;
  329. char buf2[ MSL ];
  330. char *pomwsk;
  331. bool zmienilem = FALSE;
  332. pomwsk = buf3;
  333. while ( *pomwsk == ' ' )
  334. pomwsk++;
  335. /* to jest "na chwile", bedzie dzialac dopoki nie mamy pomocy z " " */
  336. while ( *pomwsk )
  337. if ( *pomwsk == ' ' && *( pomwsk + 1 ) == ' ' )
  338. {
  339. *pomwsk = '\0';
  340. zmienilem = TRUE;
  341. }
  342. else
  343. pomwsk++;
  344. pomwsk = buf3;
  345. while ( *pomwsk == ' ' )
  346. pomwsk++;
  347. for ( help = help_first; help; help = help->next )
  348. if ( is_name2( pomwsk, help->keyword ) )
  349. break;
  350. if ( !help )
  351. {
  352. sprintf( buf2, "Bledny odnosnik '%s'", pomwsk );
  353. log_string( buf2 );
  354. }
  355. if ( zmienilem )
  356. {
  357. pomwsk = buf3;
  358. while ( *pomwsk )
  359. pomwsk++;
  360. *pomwsk = ' ';
  361. }
  362. }
  363. #endif /* defined( LINK_CHECK ) */
  364. colourconv( buf1, buf3, NULL, sizeof( buf1 ) );
  365. j = 0;
  366. for ( i = 0; buf1[ i ] != '\0'; i++ )
  367. {
  368. /* Lam: do_slist podkresla cala linie, ale odnosnik ma prowadzic
  369. do prawdziwej pomocy, bez spacji */
  370. if ( !j && buf1[ i ] == ' ' )
  371. continue;
  372. if ( buf1[ i ] == ' '
  373. && ( buf1[ i + 1 ] == ' '
  374. || buf1[ i + 1 ] == '\0' ) )
  375. {
  376. continue;
  377. }
  378. if ( buf1[ i ] < 65
  379. || buf1[ i ] > 122
  380. || ( buf1[ i ] > 90 && buf1[ i ] < 97 ) )
  381. {
  382. sprintf( &buf[ j ], "%%%02X", (unsigned char) buf1[ i ] );
  383. j += 3;
  384. }
  385. else
  386. {
  387. buf[ j ] = buf1[ i ];
  388. j++;
  389. }
  390. }
  391. buf[ j ] = '\0';
  392. sprintf( link, "<a href=\"/pomoc?p=%s\">%s</a>",
  393. buf, lac2html( buf3, FALSE ) );
  394. return z;
  395. }
  396. /* UWAGA: FIXME: TODO: zmienia buf w miejscu!
  397. - nie sprawdza wielkosci buf (i jej nie zna)
  398. - wywolujacy moze nie miec miejsca na zmiany && w &amp;&amp;
  399. - GCC pozwala podac tej funkcji staly lancuch z segmentu kodu - blad
  400. Uwazajcie na te funkcje i naprawcie to kiedys! */
  401. char *lac2html( char *buf, bool mysql )
  402. {
  403. char buf2[ MAX_STRING_LENGTH * 25 ];
  404. char buf3[ MAX_STRING_LENGTH ];
  405. int i = 0;
  406. buf2[ 0 ] = '\0';
  407. /* konwersja <, >, &, \n\r */
  408. for ( i = 0; buf[ i ] != '\0'; i++ )
  409. {
  410. if ( buf[ i ] == '<' )
  411. strcat( buf2, "&lt;" );
  412. else if ( buf[ i ] == '>' )
  413. strcat( buf2, "&gt;" );
  414. else if ( buf[ i ] == '&' )
  415. strcat( buf2, "&amp;" );
  416. else if ( buf[ i ] == '\n'
  417. || buf[ i ] == '\r' )
  418. {
  419. /* Lam: MSIE nie umie obsluzyc <br><br> jako linii odstepu */
  420. if ( strlen( buf2 ) > 4
  421. && !str_cmp( &buf2[ strlen( buf2 ) - 4 ], "<br>" ) )
  422. strcat( buf2, " <br>" );
  423. else
  424. strcat( buf2, "<br>" );
  425. if ( buf[ i ] == '\n' && buf[ i + 1 ] == '\r' )
  426. i++;
  427. }
  428. else if ( buf[ i ] == '{' && buf[ i + 1 ] == '?' )
  429. {
  430. i += 1;
  431. i += zrob_odnosnik( buf + i + 1, buf3 );
  432. strcat( buf2, buf3 );
  433. }
  434. else if ( buf[ i ] == '\'' && mysql )
  435. strcat( buf2, "\\'" );
  436. else if ( buf[ i ] == '\\' && mysql )
  437. strcat( buf2, "\\\\" );
  438. else
  439. sprintf( buf2, "%s%c", buf2, buf[ i ] );
  440. }
  441. strcpy( buf, buf2 );
  442. return buf;
  443. }
  444. bool html_header( WHO_DESCRIPTOR_DATA *d, const char *tytul )
  445. {
  446. char buf[ MAX_STRING_LENGTH ];
  447. int day;
  448. day = time_info.day + 1;
  449. sprintf( buf, "HTTP/1.1 200 OK\n"
  450. "Date: godzina %d, dzie๑ %s, %d dzie๑ miesiฑca %s\n"
  451. "Server: " LAC_VERSION "\n"
  452. "Connection: close\n"
  453. "Content-Type: text/html; charset=iso-8859-2\n\n",
  454. time_info.hour,
  455. html_day_name[ day % 7 ],
  456. day,
  457. html_month_name[ time_info.month ] );
  458. /* Lam: duze uproszczenie, ale pod Linuksem zawsze mi sie udaje wypchnac wszystko */
  459. STH( d, buf );
  460. sprintf( buf,
  461. "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\n\
  462. \"http://www.w3.org/TR/html4/loose.dtd\">\n\
  463. <html>\n<head><title>%s</title>\n\
  464. <meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-2\">\n\
  465. <meta name=\"Language\" content=\"pl\">\n\
  466. <meta name=\"Keywords\" content=\"Lac,MUD,wojownik,mag,kleryk,paladyn,gra\">\n\
  467. <STYLE TYPE=\"text/css\">\n\
  468. <!--\n\
  469. body { margin-left: 1cm; margin-right: 1cm }\n\
  470. a { color: #0de50d; text-decoration: none }\n\
  471. a:visited { color: #0de50d; text-decoration: none }\n\
  472. a:hover { color: #e01818; text-decoration: none }\n\
  473. --></STYLE></head>\n\
  474. <body bgcolor=\"#000000\" text=\"#aaaaaa\">\n\
  475. <center><h1><b>Lac</b></h1><h2>prawdziwie polski mud</h2>\n\
  476. <hr size=4 width=\"100%%\">\n\
  477. <h2>Witaj na stronie informacyjnej generowanej przez Laca.</h2>\n\
  478. <h2><a href=\"telnet://%s:4000\">Poณฑcz si๊!</a> albo <a href=\"http://%s/\">zajrzyj na stron๊.</a></h2></center>\n",
  479. tytul, MUD_HOST, WWW_HOST );
  480. STH( d, buf );
  481. return TRUE;
  482. }
  483. bool html_foot( WHO_DESCRIPTOR_DATA *d )
  484. {
  485. char buf[ MAX_STRING_LENGTH ];
  486. char buf2[ MAX_INPUT_LENGTH ];
  487. int i;
  488. sprintf( buf, "<center><hr size=4 width=\"100%%\">\n\
  489. <a href=\"/\">spis treถci</a> |\n" );
  490. for ( i = 0; html_page_table[ i ].name; i++ )
  491. {
  492. if ( html_page_table[ i ].short_link )
  493. {
  494. sprintf( buf2, "<a href=\"%s\">%s</a>%s",
  495. html_page_table[ i ].name,
  496. html_page_table[ i ].short_link,
  497. ( html_page_table[ i + 1 ].short_link ) ? " |\n" : "\n" );
  498. strcat( buf, buf2 );
  499. }
  500. }
  501. strcat( buf, "</center></body></html>" );
  502. STH( d, buf );
  503. return TRUE;
  504. }
  505. bool html_time( WHO_DESCRIPTOR_DATA *d )
  506. {
  507. char buf[ MAX_STRING_LENGTH ];
  508. int day;
  509. day = time_info.day + 1;
  510. sprintf( buf,
  511. "<p>Jest godzina %d, dzie๑ %s, %d dzie๑ miesiฑca %s.</p>\n",
  512. time_info.hour,
  513. html_day_name[ day % 7 ],
  514. day,
  515. html_month_name[ time_info.month ] );
  516. STH( d, buf );
  517. return TRUE;
  518. }
  519. bool html_weather( WHO_DESCRIPTOR_DATA *d )
  520. {
  521. char buf [ MAX_STRING_LENGTH ];
  522. static char * const sky_look[ 4 ] =
  523. {
  524. "bezchmurne",
  525. "pochmurne",
  526. "deszczowe",
  527. "przecinane bณyskawicami"
  528. };
  529. sprintf( buf,
  530. "<p>Niebo jest %s i %s.</p>\n",
  531. sky_look[ weather_info.sky ],
  532. weather_info.change >= 0
  533. ? "wieje ciepณy wiaterek z poณudnia"
  534. : "wieje zimny wiatr z p๓ณnocy" );
  535. STH( d, buf );
  536. return TRUE;
  537. }
  538. HTML( html_index )
  539. {
  540. char buf[ MAX_STRING_LENGTH ];
  541. char buf2[ MAX_INPUT_LENGTH ];
  542. int i;
  543. if ( !html_header( d, LAC_VERSION ) )
  544. return;
  545. sprintf( buf, "<center>\n" );
  546. for ( i = 0; html_page_table[ i ].name; i++ )
  547. if ( html_page_table[ i ].long_link )
  548. {
  549. sprintf( buf2, "<a href=\"%s\">%s</a><br>\n",
  550. html_page_table[ i ].name,
  551. html_page_table[ i ].long_link );
  552. strcat( buf, buf2 );
  553. }
  554. strcat( buf, "<a href=\"http://forum.lac.pl/\">Odwiedผ forum</a><br>\n"
  555. "<a href=\"http://opisomat.lac.pl/\">Odwiedผ opisomat</a><br>\n"
  556. "<a href=\"http://bledomat.lac.pl/\">Odwiedผ bณ๊domat</a><br>\n"
  557. "</center>\n" );
  558. STH( d, buf );
  559. html_foot( d );
  560. return;
  561. }
  562. HTML( html_who )
  563. {
  564. char buf[ MAX_STRING_LENGTH ];
  565. if ( !html_header( d, "Gracze Laca" )
  566. || !html_time( d )
  567. || !html_weather( d ) )
  568. {
  569. return;
  570. }
  571. sprintf( buf, "<center><h3><b>Gracze Laca</b></h3></center>\n"
  572. "<pre><span style=\"color: #aaaaaa;\">" );
  573. STH( d, buf );
  574. real_who( NULL, "", d );
  575. html_foot( d );
  576. return;
  577. }
  578. HTML( html_help )
  579. {
  580. char buf [ MAX_STRING_LENGTH ];
  581. char temat [ MAX_INPUT_LENGTH ];
  582. char haslo [ MAX_INPUT_LENGTH ];
  583. char skroty[ MAX_STRING_LENGTH ];
  584. temat[ 0 ] = haslo[ 0 ] = skroty[ 0 ] = '\0';
  585. get_help_topic( d->odnosnik, temat );
  586. if ( temat[ 0 ] == '\0' )
  587. sprintf( temat, "podsumowaniexxx" );
  588. sprawdz_hasla( temat, haslo, skroty, 1 );
  589. /* wolalbym liste slow kluczowych dla pomocy z poziomem 0, ktore i tak
  590. to pokazuja */
  591. colourconv( buf, ( *haslo && str_cmp( haslo, "podsumowaniexxx" ) )
  592. ? lac2html( haslo, FALSE ) : "Pomoc",
  593. NULL, sizeof( buf ) );
  594. if ( !html_header( d, buf ) )
  595. return;
  596. strcpy( buf,
  597. "<form action=\"/pomoc\" method=\"get\">\n\
  598. <input name=\"p\">\n\
  599. <input type=\"submit\" value=\"Szukaj\">\n\
  600. </form>\n\
  601. <pre><span>" );
  602. STH( d, buf );
  603. if ( haslo[ 0 ] != '\0' )
  604. real_help( 0, haslo, skroty, d );
  605. else
  606. {
  607. char skroty_html[ MAX_STRING_LENGTH * 5 ];
  608. colourconv( skroty_html, lac2html( skroty, FALSE ), NULL,
  609. sizeof( skroty_html ) );
  610. STH( d, skroty_html );
  611. }
  612. sprintf( buf, "</span></pre>" );
  613. STH( d, buf );
  614. html_foot( d );
  615. return;
  616. }
  617. HTML( html_areas )
  618. {
  619. ZONE_DATA *strefa;
  620. char buf[ MAX_STRING_LENGTH ];
  621. if ( !html_header( d, "Krainy Laca" ) )
  622. return;
  623. sprintf( buf, "<pre><span>" );
  624. STH( d, buf );
  625. for ( strefa = zone_first; strefa; strefa = strefa->next )
  626. {
  627. char wyjbuf [ MSL * 3 ];
  628. sprintf( buf, "<br><b>Krainy</b> {B%s{x (w`ladca: %s%s%s)<br>",
  629. strefa->dopelniacz,
  630. str_cmp( "dupa", strefa->wladca ) ?
  631. strefa->wladca : "ukryty",
  632. strefa->namiestnik && *strefa->namiestnik ?
  633. "; namiestnik: " : "",
  634. strefa->namiestnik ? strefa->namiestnik : "" );
  635. colourconv( wyjbuf, buf, NULL, sizeof( wyjbuf ) );
  636. STH( d, wyjbuf );
  637. real_areas( NULL, strefa->nazwa, d );
  638. }
  639. sprintf( buf, "</span></pre>" );
  640. STH( d, buf );
  641. html_foot( d );
  642. return;
  643. }
  644. HTML( html_maps )
  645. {
  646. return;
  647. }
  648. HTML( html_news )
  649. {
  650. char buf [ MAX_STRING_LENGTH ];
  651. char buf2[ MAX_STRING_LENGTH * 3 ];
  652. if ( !html_header( d, "Nowoถci Laca" ) )
  653. return;
  654. strcpy( buf, "<pre><span>" );
  655. STH( d, buf );
  656. strcpy( buf, lac_nowosci );
  657. colourconv( buf2, lac2html( buf, FALSE ), NULL, sizeof( buf2 ) );
  658. STH( d, buf2 );
  659. strcpy( buf, "</span></pre>" );
  660. STH( d, buf );
  661. html_foot( d );
  662. return;
  663. }
  664. /* Lam 1.5.2004 */
  665. HTML( html_slist )
  666. {
  667. char buf[ MSL ], buf1[ MSL ], buf2[ MSL ], profesja[ MIL ];
  668. int p;
  669. profesja[ 0 ] = '\0';
  670. get_help_topic( d->odnosnik, profesja );
  671. if ( !*profesja )
  672. {
  673. if ( !html_header( d, "Lista profesji Laca" ) )
  674. return;
  675. strcpy( buf, "<span>" );
  676. STH( d, buf );
  677. strcpy( buf, "Lista profesji:<br>\n" );
  678. for ( p = 0; p < MAX_CLASS; p++ )
  679. if ( *class_table[ p ].races )
  680. {
  681. sprintf( buf2, "- {?%s{x (%s)",
  682. class_table[ p ].long_name,
  683. class_table[ p ].pl_name );
  684. colourconv( buf1, lac2html( buf2, FALSE ), NULL, sizeof( buf1 ) );
  685. strcat( buf, buf1 );
  686. sprintf( buf1, " (<a href=\"/profesje/%s\">lista umiej๊tnoถci</a>)<br>\n",
  687. class_table[ p ].who_name );
  688. strcat( buf, buf1 );
  689. }
  690. STH( d, buf );
  691. strcpy( buf, "</span>" );
  692. STH( d, buf );
  693. }
  694. else
  695. {
  696. for ( p = 0; p < MAX_CLASS; p++ )
  697. if ( !str_cmp( profesja, class_table[ p ].who_name ) )
  698. break;
  699. if ( p == MAX_CLASS )
  700. strcpy( buf, "Umiej๊tnoถci profesji" );
  701. else
  702. sprintf( buf, "%s: umiej๊tnoถci", class_table[ p ].long_name );
  703. if ( !html_header( d, buf ) )
  704. return;
  705. strcpy( buf, "<pre><span>" );
  706. STH( d, buf );
  707. real_slist( NULL, profesja, d );
  708. strcpy( buf, "</span></pre>" );
  709. STH( d, buf );
  710. }
  711. html_foot( d );
  712. return;
  713. }
  714. /*
  715. * Lam 18.8.2005
  716. */
  717. HTML( html_commands )
  718. {
  719. char buf[ MSL ], buf1[ MSL * 3 ], buf2[ MSL * 6 ];
  720. int cmd, col;
  721. if ( !html_header( d, "Polecenia Laca" ) )
  722. return;
  723. strcpy( buf, "<pre><span>" );
  724. STH( d, buf );
  725. strcpy( buf, "{WWszystkie polecenia dost๊pne w Lacu:{x\n\n" );
  726. colourconv( buf2, lac2html( buf, FALSE ), NULL, sizeof( buf2 ) );
  727. STH( d, buf2 );
  728. buf1[ 0 ] = '\0';
  729. col = 0;
  730. for ( cmd = 0; cmd_table[ cmd ].name[ 0 ] != '\0'; cmd++ )
  731. if ( cmd_table[ cmd ].level < LEVEL_HERO
  732. && !IS_SET( cmd_table[ cmd ].restr, CMD_NOTLISTED ) )
  733. {
  734. sprintf( buf, "{?%s{x", wyrownaj( cmd_table[ cmd ].name, -16 ) );
  735. strcat( buf1, buf );
  736. if ( ++col % 5 == 0 )
  737. strcat( buf1, "\n\r" );
  738. }
  739. if ( col % 5 != 0 )
  740. strcat( buf1, "\n\r" );
  741. colourconv( buf2, lac2html( buf1, FALSE ), NULL, sizeof( buf2 ) );
  742. STH( d, buf2 );
  743. strcpy( buf, "</span></pre>" );
  744. STH( d, buf );
  745. html_foot( d );
  746. return;
  747. }
  748. HTML( html_clans )
  749. {
  750. char buf[ MSL ];
  751. char klan[ MIL ];
  752. klan[ 0 ] = '\0';
  753. get_help_topic( d->odnosnik, klan );
  754. if ( !html_header( d, *klan ? "Informacja o klanie" : "Klany Laca" ) )
  755. return;
  756. strcpy( buf, "<pre><span>" );
  757. STH( d, buf );
  758. if ( !*klan )
  759. real_clan_lista( NULL, "", d );
  760. else
  761. {
  762. char buf1[ MAX_STRING_LENGTH ];
  763. CLAN_DATA *cl;
  764. if ( !( cl = clan_lookup2( klan ) )
  765. || !can_see_clan( NULL, cl ) )
  766. {
  767. STH( d, "Nie znam takiego klanu.<br></span></pre>" );
  768. html_foot( d );
  769. return;
  770. }
  771. if ( !( cl->statut ) || !( *cl->statut ) )
  772. sprintf( buf, "Klan {W%s{x nie ma statutu.\n\r\n\r", cl->dop );
  773. else
  774. {
  775. sprintf( buf, "Statut klanu {W%s{x:\n\r", cl->dop );
  776. strcat( buf, cl->statut );
  777. strcat( buf, "{x\n\r" );
  778. }
  779. colourconv( buf1, lac2html( buf, FALSE ), NULL, sizeof( buf1 ) );
  780. STH( d, buf1 );
  781. real_clan_info( NULL, cl, d );
  782. STH( d, "<a href=\"/klany\">&lt;&lt; wr๓ๆ</a><br>" );
  783. }
  784. strcpy( buf, "</span></pre>" );
  785. STH( d, buf );
  786. html_foot( d );
  787. return;
  788. }
  789. HTML( html_404 )
  790. {
  791. char buf[ MAX_STRING_LENGTH ];
  792. int day;
  793. day = time_info.day + 1;
  794. sprintf( buf, "HTTP/1.1 404 Not Found\n"
  795. "Date: godzina %d, dzie๑ %s, %d dzie๑ miesiฑca %s\n"
  796. "Server: " LAC_VERSION "\n"
  797. "Connection: close\n"
  798. "Content-Type: text/html; charset=iso-8859-2\n\n",
  799. time_info.hour,
  800. html_day_name[ day % 7 ],
  801. day,
  802. html_month_name[ time_info.month ] );
  803. STH( d, buf );
  804. sprintf( buf,
  805. "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\n\
  806. \"http://www.w3.org/TR/html4/loose.dtd\">\n\
  807. <html>\n<head><title>Bณฑd 404: %s</title>\n\
  808. <STYLE TYPE=\"text/css\">\n\
  809. <!--\n\
  810. body { margin-left: 1cm; margin-right: 1cm }\n\
  811. a { color: #0de50d; text-decoration: none }\n\
  812. a:visited { color: #0de50d; text-decoration: none }\n\
  813. a:hover { color: #e01818; text-decoration: none }\n\
  814. p { margin: 0px 2cm; }\n\
  815. --></STYLE></head>\n\
  816. <body bgcolor=\"#000000\" text=\"#aaaaaa\">\n\
  817. <center><h1><b>Lac</b></h1><hr size=4 width=\"100%%\"></center>\n\
  818. <h2>Podana przez ciebie strona nie istnieje.</h2>\n\
  819. <p>Moฟliwe, ฟe podaณeถ/aถ bณdny adres strony, strona zostaณa usunita lub\n\
  820. zmieniณa lokalizacj. Wr๓ๆ na <a href=\"/\">stron๊</a> gณ๓wnฑ.</p>\n\
  821. <br>\n<h3>Bณฑd 404</h3>\n\
  822. <p>%s</p>\n",
  823. LAC_VERSION, LAC_VERSION );
  824. STH( d, buf );
  825. html_foot( d );
  826. return;
  827. }