Guest User

Untitled

a guest
Jun 9th, 2011
1,269
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. [18:09] +pekahucoa: package Forum;
  2.  
  3. use strict;
  4. use Data::Dumper;
  5. use utf8;
  6. use CompiledTemplate;
  7. use RealplexorApi;
  8. use POSIX;
  9. use Tie::IxHash;
  10. use Image::Size;
  11. require 'text_tools.pl';
  12. #use Digest::MD5 qw(md5_hex);
  13. #use File::Copy;
  14. #use Image::Size;
  15. ##############
  16.  
  17. sub new {
  18. my $self=$_[1];
  19.  
  20. $self->{rpl}=RealplexorApi->new($self->{rpl});
  21. $self->{lang}=require 'Forum.lang.pl';
  22.  
  23. bless $self;
  24.  
  25.  
  26.  
  27.  
  28.  
  29. $self->{ONLINE_TIME}=20;
  30. $self->{CACHE_TIME}=100;
  31.  
  32. $self->{'sort_time'}=Tie::IxHash->new(sticked => -1, moderated => -1, time => -1);
  33. $self->{'sort_lasthit'}=Tie::IxHash->new(sticked => -1, moderated => -1, lasthit => -1);
  34. #$self->{'sort_rating'}=Tie::IxHash->new(sticked => -1, moderated => -1, time => -1, rating => -1);
  35.  
  36. $self->{db}{settings}{forum}->save({
  37.  
  38. _id => 'nyan',
  39. tpl => 'nyan',
  40.  
  41. SORTING => 'lasthit',
  42.  
  43. THREADS_PER_PAGE => 25,
  44. POSTS_PER_PAGE=> 15,
  45.  
  46. PREMODERATION => 0,
  47. RANDNAMES => 0,
  48. FILETYPES => {gif => undef ,png => undef ,jpg => undef ,jpeg => undef },
  49. MAX_FILESIZE=> 1024*1024*10,
  50.  
  51.  
  52.  
  53. MAX_H => 20000,
  54. MAX_W => 20000,
  55. T_H => 200,
  56. T_W => 200,
  57.  
  58. TEXT_LENGTH => 1024*4,
  59. SUBJECT_LENGTH => 50,
  60. ANON_POSTS => 1,
  61. ANON_THREADS => 1,
  62. FILES => 5,
  63. TAGS => 5,
  64.  
  65. VOTE => 1,
  66. ANON_VOTE => 1,
  67.  
  68. BBCODE => {
  69. sup => ['<sup>', '</sup>'],
  70. sub => ['<sub>', '</sub>'],
  71. big => ['<span style="font-size:36px;">', '</span>'],
  72. small => ['<span style="font-size:8px;">', '</span>'],
  73. center => ['<center>', '</div>'],
  74. right => ['<div style="float:right">', '</center>'],
  75. b => ['<strong>', '</strong>'],
  76. unown => ['<h2>', '</h2>'],
  77. ascii => ['<pre>', '</pre>'],
  78. i => ['<em>', '</em>'],
  79. code => ['<code>', '</code>'],
  80. s => ['<del>', '</del>'],
  81. hide => ['<span class="hide">', '</span>'],
  82. u => ['<span class="u">', '</span>'],
  83. o => ['<span class="o">', '</span>'],
  84. spoiler => ['<span class="spoiler">', '</span>'],
  85. redfont => ['<font color="red">', '</font>'],
  86. }
  87.  
  88. });
  89.  
  90.  
  91. $self->{db}{settings}{forum}->save({
  92.  
  93. _id => 'test',
  94. tpl => 'test',
  95. SORTING => 'lasthit',
  96.  
  97. THREADS_PER_PAGE => 25,
  98. POSTS_PER_PAGE=> 15,
  99.  
  100. PREMODERATION => 0,
  101. RANDNAMES => 0,
  102. FILETYPES => {gif => undef ,png => undef ,jpg => undef ,jpeg => undef },
  103. MAX_FILESIZE=> 1024*1024*10,
  104.  
  105.  
  106.  
  107. MAX_H => 20000,
  108. MAX_W => 20000,
  109. T_H => 200,
  110. T_W => 200,
  111.  
  112. TEXT_LENGTH => 1024*4,
  113. SUBJECT_LENGTH => 50,
  114. ANON_POSTS => 1,
  115. ANON_THREADS => 1,
  116. FILES => 5,
  117. TAGS => 5,
  118.  
  119. VOTE => 1,
  120. ANON_VOTE => 1,
  121.  
  122. BBCODE => {
  123. sup => ['<sup>', '</sup>'],
  124. sub => ['<sub>', '</sub>'],
  125. big => ['<span style="font-size:36px;">', '</span>'],
  126. small => ['<span style="font-size:8px;">', '</span>'],
  127. center => ['<center>', '</div>'],
  128. right => ['<div style="float:right">', '</center>'],
  129. b => ['<strong>', '</strong>'],
  130. unown => ['<h2>', '</h2>'],
  131. ascii => ['<pre>', '</pre>'],
  132. i => ['<em>', '</em>'],
  133. code => ['<code>', '</code>'],
  134. s => ['<del>', '</del>'],
  135. hide => ['<span class="hide">', '</span>'],
  136. u => ['<span class="u">', '</span>'],
  137. o => ['<span class="o">', '</span>'],
  138. spoiler => ['<span class="spoiler">', '</span>'],
  139. redfont => ['<font color="red">', '</font>'],
  140. }
  141.  
  142. });
  143.  
  144.  
  145. $self->_load_settings;
  146. $self->rebuild_cache;
  147.  
  148. for(keys %{$self->{SECTIONS}}){
  149. mkdir('forum/'.$_) unless(-d('forum/'.$_));
  150. }
  151.  
  152.  
  153.  
  154.  
  155.  
  156. return $self;
  157. }
  158. #################
  159.  
  160. # Подгружаем все
  161. use lib '.';
  162. use forum::Posting;
  163. use forum::Admin;
  164. use forum::Cache;
  165. use forum::Files;
  166. use forum::Comet;
  167. use forum::Settings;
  168.  
  169. sub section{
  170. my($self,$SECTION,$data)=@_;
  171.  
  172. $data->{SORTING}=$self->{SECTIONS}{$SECTION}{SORTING} unless($data->{SORTING} eq 'time' or $data->{SORTING} eq 'lasthit');
  173.  
  174.  
  175. my $pages=$self->{mem}->get('pcnt'.$SECTION); # количество страниц # кеш
  176. unless($pages){
  177. my $count=$self->{db}{forum}{threads}->count({section=>$SECTION});
  178.  
  179. $pages= ceil($count/$self->{SECTIONS}{$SECTION}{THREADS_PER_PAGE});
  180.  
  181. $self->{mem}->set('pcnt'.$SECTION,$pages,$self->{CACHE_TIME});
  182. };
  183.  
  184.  
  185.  
  186. $data->{page}=$pages if($data->{page}>$pages);
  187. $data->{page}=1 if($data->{page}<1);
  188. $data->{page}--;
  189.  
  190.  
  191.  
  192.  
  193.  
  194. my @threads=$self->{db}{forum}{threads}->find(
  195.  
  196. ($data->{hidden} or !$self->{SECTIONS}{$SECTION}{PREMODERATION} or $self->{cgi}->session->{level}>2) ? {section=>$SECTION} : {section=>$SECTION, moderated=> 1} # если премодерация отключена и включен режим скрытых постов или пользователь - модератор, то выводим все сообщения, иначе только одобренные
  197.  
  198. ,{
  199. sort_by=>$self->{'sort_'.$data->{SORTING}},
  200. limit => $self->{SECTIONS}{$SECTION}{THREADS_PER_PAGE},
  201. skip => $data->{page}*$self->{SECTIONS}{$SECTION}{THREADS_PER_PAGE}
  202. })->all;
  203.  
  204. if(1){
  205. my @oids; push @oids, $_->{_id}->value for(@threads);
  206. my $online=$self->_get_online(@oids);
  207.  
  208. $_->{online}=$online->{$_->{_id}->value} for(@threads);
  209.  
  210. @threads=sort {$b->{online} <=> $a->{online}} @threads;
  211. }
  212.  
  213.  
  214. $self->{cgi}->header;
  215. print $self->{SECTIONS}{$SECTION}{tpl}->threads({
  216. threads =>\@threads,
  217. pages=>$pages,
  218. });
  219.  
  220. }
  221.  
  222.  
  223.  
  224. ############# Вспомогательные обработчики
  225.  
  226. sub _translit
  227. { ($_)=@_;
  228.  
  229. #
  230. # Fonetic correct translit
  231. #
  232.  
  233. s/Сх/Sh/g; s/сх/sh/g; s/СХ/SH/g;
  234. s/Ш/Sh/g; s/ш/sh/g;
  235.  
  236. s/Сцх/Sch/g; s/сцх/sch/g; s/СЦХ/SCH/g;
  237. s/Щ/Sch/g; s/щ/sch/g;
  238.  
  239. s/Цх/Ch/g; s/цх/ch/g; s/ЦХ/CH/g;
  240. s/Ч/Ch/g; s/ч/ch/g;
  241.  
  242. s/Йа/Ja/g; s/йа/ja/; s/ЙА/JA/g;
  243. s/Я/Ja/g; s/я/ja/g;
  244.  
  245. s/Йо/Jo/g; s/йо/jo/g; s/ЙО/JO/g;
  246. s/Ё/Jo/g; s/ё/jo/g;
  247.  
  248. s/Йу/Ju/g; s/йу/ju/g; s/ЙУ/JU/g;
  249. s/Ю/Ju/g; s/ю/ju/g;
  250.  
  251. s/Э/E/g; s/э/e/g;
  252. s/Е/E/g; s/е/e/g;
  253.  
  254. s/Зх/Zh/g; s/зх/zh/g; s/ЗХ/ZH/g;
  255. s/Ж/Zh/g; s/ж/zh/g;
  256.  
  257. s/[ЪъЬь]//g;
  258. s/ /-/g;
  259.  
  260. tr/
  261. абвгдзийклмнопрстуфхцыАБВГДЗИЙКЛМHОПРСТУФХЦЫ/
  262. abvgdzijklmnoprstufhcyABVGDZIJKLMNOPRSTUFHCY/;
  263.  
  264.  
  265.  
  266. s/[^A-z_0-9-]//g;
  267. return $_;
  268.  
  269. }
  270.  
  271. 'Анимеаниме - свободное общение^W каваенье и някание';
  272. [18:09] +pekahucoa: package Forum;
  273.  
  274. use strict;
  275. use Data::Dumper;
  276. use utf8;
  277. use CompiledTemplate;
  278. use RealplexorApi;
  279. use POSIX;
  280. use Tie::IxHash;
  281. use Image::Size;
  282. require 'text_tools.pl';
  283. #use Digest::MD5 qw(md5_hex);
  284. #use File::Copy;
  285. #use Image::Size;
  286. ##############
  287.  
  288. sub new {
  289. my $self=$_[1];
  290.  
  291. $self->{rpl}=RealplexorApi->new($self->{rpl});
  292. $self->{lang}=require 'Forum.lang.pl';
  293.  
  294. bless $self;
  295.  
  296.  
  297.  
  298.  
  299.  
  300. $self->{ONLINE_TIME}=20;
  301. $self->{CACHE_TIME}=100;
  302.  
  303. $self->{'sort_time'}=Tie::IxHash->new(sticked => -1, moderated => -1, time => -1);
  304. $self->{'sort_lasthit'}=Tie::IxHash->new(sticked => -1, moderated => -1, lasthit => -1);
  305. #$self->{'sort_rating'}=Tie::IxHash->new(sticked => -1, moderated => -1, time => -1, rating => -1);
  306.  
  307. $self->{db}{settings}{forum}->save({
  308.  
  309. _id => 'nyan',
  310. tpl => 'nyan',
  311.  
  312. SORTING => 'lasthit',
  313.  
  314. THREADS_PER_PAGE => 25,
  315. POSTS_PER_PAGE=> 15,
  316.  
  317. PREMODERATION => 0,
  318. RANDNAMES => 0,
  319. FILETYPES => {gif => undef ,png => undef ,jpg => undef ,jpeg => undef },
  320. MAX_FILESIZE=> 1024*1024*10,
  321.  
  322.  
  323.  
  324. MAX_H => 20000,
  325. MAX_W => 20000,
  326. T_H => 200,
  327. T_W => 200,
  328.  
  329. TEXT_LENGTH => 1024*4,
  330. SUBJECT_LENGTH => 50,
  331. ANON_POSTS => 1,
  332. ANON_THREADS => 1,
  333. FILES => 5,
  334. TAGS => 5,
  335.  
  336. VOTE => 1,
  337. ANON_VOTE => 1,
  338.  
  339. BBCODE => {
  340. sup => ['<sup>', '</sup>'],
  341. sub => ['<sub>', '</sub>'],
  342. big => ['<span style="font-size:36px;">', '</span>'],
  343. small => ['<span style="font-size:8px;">', '</span>'],
  344. center => ['<center>', '</div>'],
  345. right => ['<div style="float:right">', '</center>'],
  346. b => ['<strong>', '</strong>'],
  347. unown => ['<h2>', '</h2>'],
  348. ascii => ['<pre>', '</pre>'],
  349. i => ['<em>', '</em>'],
  350. code => ['<code>', '</code>'],
  351. s => ['<del>', '</del>'],
  352. hide => ['<span class="hide">', '</span>'],
  353. u => ['<span class="u">', '</span>'],
  354. o => ['<span class="o">', '</span>'],
  355. spoiler => ['<span class="spoiler">', '</span>'],
  356. redfont => ['<font color="red">', '</font>'],
  357. }
  358.  
  359. });
  360.  
  361.  
  362. $self->{db}{settings}{forum}->save({
  363.  
  364. _id => 'test',
  365. tpl => 'test',
  366. SORTING => 'lasthit',
  367.  
  368. THREADS_PER_PAGE => 25,
  369. POSTS_PER_PAGE=> 15,
  370.  
  371. PREMODERATION => 0,
  372. RANDNAMES => 0,
  373. FILETYPES => {gif => undef ,png => undef ,jpg => undef ,jpeg => undef },
  374. MAX_FILESIZE=> 1024*1024*10,
  375.  
  376.  
  377.  
  378. MAX_H => 20000,
  379. MAX_W => 20000,
  380. T_H => 200,
  381. T_W => 200,
  382.  
  383. TEXT_LENGTH => 1024*4,
  384. SUBJECT_LENGTH => 50,
  385. ANON_POSTS => 1,
  386. ANON_THREADS => 1,
  387. FILES => 5,
  388. TAGS => 5,
  389.  
  390. VOTE => 1,
  391. ANON_VOTE => 1,
  392.  
  393. BBCODE => {
  394. sup => ['<sup>', '</sup>'],
  395. sub => ['<sub>', '</sub>'],
  396. big => ['<span style="font-size:36px;">', '</span>'],
  397. small => ['<span style="font-size:8px;">', '</span>'],
  398. center => ['<center>', '</div>'],
  399. right => ['<div style="float:right">', '</center>'],
  400. b => ['<strong>', '</strong>'],
  401. unown => ['<h2>', '</h2>'],
  402. ascii => ['<pre>', '</pre>'],
  403. i => ['<em>', '</em>'],
  404. code => ['<code>', '</code>'],
  405. s => ['<del>', '</del>'],
  406. hide => ['<span class="hide">', '</span>'],
  407. u => ['<span class="u">', '</span>'],
  408. o => ['<span class="o">', '</span>'],
  409. spoiler => ['<span class="spoiler">', '</span>'],
  410. redfont => ['<font color="red">', '</font>'],
  411. }
  412.  
  413. });
  414.  
  415.  
  416. $self->_load_settings;
  417. $self->rebuild_cache;
  418.  
  419. for(keys %{$self->{SECTIONS}}){
  420. mkdir('forum/'.$_) unless(-d('forum/'.$_));
  421. }
  422.  
  423.  
  424.  
  425.  
  426.  
  427. return $self;
  428. }
  429. #################
  430.  
  431. # Подгружаем все
  432. use lib '.';
  433. use forum::Posting;
  434. use forum::Admin;
  435. use forum::Cache;
  436. use forum::Files;
  437. use forum::Comet;
  438. use forum::Settings;
  439.  
  440. sub section{
  441. my($self,$SECTION,$data)=@_;
  442.  
  443. $data->{SORTING}=$self->{SECTIONS}{$SECTION}{SORTING} unless($data->{SORTING} eq 'time' or $data->{SORTING} eq 'lasthit');
  444.  
  445.  
  446. my $pages=$self->{mem}->get('pcnt'.$SECTION); # количество страниц # кеш
  447. unless($pages){
  448. my $count=$self->{db}{forum}{threads}->count({section=>$SECTION});
  449.  
  450. $pages= ceil($count/$self->{SECTIONS}{$SECTION}{THREADS_PER_PAGE});
  451.  
  452. $self->{mem}->set('pcnt'.$SECTION,$pages,$self->{CACHE_TIME});
  453. };
  454.  
  455.  
  456.  
  457. $data->{page}=$pages if($data->{page}>$pages);
  458. $data->{page}=1 if($data->{page}<1);
  459. $data->{page}--;
  460.  
  461.  
  462.  
  463.  
  464.  
  465. my @threads=$self->{db}{forum}{threads}->find(
  466.  
  467. ($data->{hidden} or !$self->{SECTIONS}{$SECTION}{PREMODERATION} or $self->{cgi}->session->{level}>2) ? {section=>$SECTION} : {section=>$SECTION, moderated=> 1} # если премодерация отключена и включен режим скрытых постов или пользователь - модератор, то выводим все сообщения, иначе только одобренные
  468.  
  469. ,{
  470. sort_by=>$self->{'sort_'.$data->{SORTING}},
  471. limit => $self->{SECTIONS}{$SECTION}{THREADS_PER_PAGE},
  472. skip => $data->{page}*$self->{SECTIONS}{$SECTION}{THREADS_PER_PAGE}
  473. })->all;
  474.  
  475. if(1){
  476. my @oids; push @oids, $_->{_id}->value for(@threads);
  477. my $online=$self->_get_online(@oids);
  478.  
  479. $_->{online}=$online->{$_->{_id}->value} for(@threads);
  480.  
  481. @threads=sort {$b->{online} <=> $a->{online}} @threads;
  482. }
  483.  
  484.  
  485. $self->{cgi}->header;
  486. print $self->{SECTIONS}{$SECTION}{tpl}->threads({
  487. threads =>\@threads,
  488. pages=>$pages,
  489. });
  490.  
  491. }
  492.  
  493.  
  494.  
  495. ############# Вспомогательные обработчики
  496.  
  497. sub _translit
  498. { ($_)=@_;
  499.  
  500. #
  501. # Fonetic correct translit
  502. #
  503.  
  504. s/Сх/Sh/g; s/сх/sh/g; s/СХ/SH/g;
  505. s/Ш/Sh/g; s/ш/sh/g;
  506.  
  507. s/Сцх/Sch/g; s/сцх/sch/g; s/СЦХ/SCH/g;
  508. s/Щ/Sch/g; s/щ/sch/g;
  509.  
  510. s/Цх/Ch/g; s/цх/ch/g; s/ЦХ/CH/g;
  511. s/Ч/Ch/g; s/ч/ch/g;
  512.  
  513. s/Йа/Ja/g; s/йа/ja/; s/ЙА/JA/g;
  514. s/Я/Ja/g; s/я/ja/g;
  515.  
  516. s/Йо/Jo/g; s/йо/jo/g; s/ЙО/JO/g;
  517. s/Ё/Jo/g; s/ё/jo/g;
  518.  
  519. s/Йу/Ju/g; s/йу/ju/g; s/ЙУ/JU/g;
  520. s/Ю/Ju/g; s/ю/ju/g;
  521.  
  522. s/Э/E/g; s/э/e/g;
  523. s/Е/E/g; s/е/e/g;
  524.  
  525. s/Зх/Zh/g; s/зх/zh/g; s/ЗХ/ZH/g;
  526. s/Ж/Zh/g; s/ж/zh/g;
  527.  
  528. s/[ЪъЬь]//g;
  529. s/ /-/g;
  530.  
  531. tr/
  532. абвгдзийклмнопрстуфхцыАБВГДЗИЙКЛМHОПРСТУФХЦЫ/
  533. abvgdzijklmnoprstufhcyABVGDZIJKLMNOPRSTUFHCY/;
  534.  
  535.  
  536.  
  537. s/[^A-z_0-9-]//g;
  538. return $_;
  539.  
  540. }
  541.  
  542. 'Анимеаниме - свободное общение^W каваенье и някание';
  543. [18:10] +pekahucoa: package Forum;
  544.  
  545. use strict;
  546. use Data::Dumper;
  547. use utf8;
  548. use CompiledTemplate;
  549. use RealplexorApi;
  550. use POSIX;
  551. use Tie::IxHash;
  552. use Image::Size;
  553. require 'text_tools.pl';
  554. #use Digest::MD5 qw(md5_hex);
  555. #use File::Copy;
  556. #use Image::Size;
  557. ##############
  558.  
  559. sub new {
  560. my $self=$_[1];
  561.  
  562. $self->{rpl}=RealplexorApi->new($self->{rpl});
  563. $self->{lang}=require 'Forum.lang.pl';
  564.  
  565. bless $self;
  566.  
  567.  
  568.  
  569.  
  570.  
  571. $self->{ONLINE_TIME}=20;
  572. $self->{CACHE_TIME}=100;
  573.  
  574. $self->{'sort_time'}=Tie::IxHash->new(sticked => -1, moderated => -1, time => -1);
  575. $self->{'sort_lasthit'}=Tie::IxHash->new(sticked => -1, moderated => -1, lasthit => -1);
  576. #$self->{'sort_rating'}=Tie::IxHash->new(sticked => -1, moderated => -1, time => -1, rating => -1);
  577.  
  578. $self->{db}{settings}{forum}->save({
  579.  
  580. _id => 'nyan',
  581. tpl => 'nyan',
  582.  
  583. SORTING => 'lasthit',
  584.  
  585. THREADS_PER_PAGE => 25,
  586. POSTS_PER_PAGE=> 15,
  587.  
  588. PREMODERATION => 0,
  589. RANDNAMES => 0,
  590. FILETYPES => {gif => undef ,png => undef ,jpg => undef ,jpeg => undef },
  591. MAX_FILESIZE=> 1024*1024*10,
  592.  
  593.  
  594.  
  595. MAX_H => 20000,
  596. MAX_W => 20000,
  597. T_H => 200,
  598. T_W => 200,
  599.  
  600. TEXT_LENGTH => 1024*4,
  601. SUBJECT_LENGTH => 50,
  602. ANON_POSTS => 1,
  603. ANON_THREADS => 1,
  604. FILES => 5,
  605. TAGS => 5,
  606.  
  607. VOTE => 1,
  608. ANON_VOTE => 1,
  609.  
  610. BBCODE => {
  611. sup => ['<sup>', '</sup>'],
  612. sub => ['<sub>', '</sub>'],
  613. big => ['<span style="font-size:36px;">', '</span>'],
  614. small => ['<span style="font-size:8px;">', '</span>'],
  615. center => ['<center>', '</div>'],
  616. right => ['<div style="float:right">', '</center>'],
  617. b => ['<strong>', '</strong>'],
  618. unown => ['<h2>', '</h2>'],
  619. ascii => ['<pre>', '</pre>'],
  620. i => ['<em>', '</em>'],
  621. code => ['<code>', '</code>'],
  622. s => ['<del>', '</del>'],
  623. hide => ['<span class="hide">', '</span>'],
  624. u => ['<span class="u">', '</span>'],
  625. o => ['<span class="o">', '</span>'],
  626. spoiler => ['<span class="spoiler">', '</span>'],
  627. redfont => ['<font color="red">', '</font>'],
  628. }
  629.  
  630. });
  631.  
  632.  
  633. $self->{db}{settings}{forum}->save({
  634.  
  635. _id => 'test',
  636. tpl => 'test',
  637. SORTING => 'lasthit',
  638.  
  639. THREADS_PER_PAGE => 25,
  640. POSTS_PER_PAGE=> 15,
  641.  
  642. PREMODERATION => 0,
  643. RANDNAMES => 0,
  644. FILETYPES => {gif => undef ,png => undef ,jpg => undef ,jpeg => undef },
  645. MAX_FILESIZE=> 1024*1024*10,
  646.  
  647.  
  648.  
  649. MAX_H => 20000,
  650. MAX_W => 20000,
  651. T_H => 200,
  652. T_W => 200,
  653.  
  654. TEXT_LENGTH => 1024*4,
  655. SUBJECT_LENGTH => 50,
  656. ANON_POSTS => 1,
  657. ANON_THREADS => 1,
  658. FILES => 5,
  659. TAGS => 5,
  660.  
  661. VOTE => 1,
  662. ANON_VOTE => 1,
  663.  
  664. BBCODE => {
  665. sup => ['<sup>', '</sup>'],
  666. sub => ['<sub>', '</sub>'],
  667. big => ['<span style="font-size:36px;">', '</span>'],
  668. small => ['<span style="font-size:8px;">', '</span>'],
  669. center => ['<center>', '</div>'],
  670. right => ['<div style="float:right">', '</center>'],
  671. b => ['<strong>', '</strong>'],
  672. unown => ['<h2>', '</h2>'],
  673. ascii => ['<pre>', '</pre>'],
  674. i => ['<em>', '</em>'],
  675. code => ['<code>', '</code>'],
  676. s => ['<del>', '</del>'],
  677. hide => ['<span class="hide">', '</span>'],
  678. u => ['<span class="u">', '</span>'],
  679. o => ['<span class="o">', '</span>'],
  680. spoiler => ['<span class="spoiler">', '</span>'],
  681. redfont => ['<font color="red">', '</font>'],
  682. }
  683.  
  684. });
  685.  
  686.  
  687. $self->_load_settings;
  688. $self->rebuild_cache;
  689.  
  690. for(keys %{$self->{SECTIONS}}){
  691. mkdir('forum/'.$_) unless(-d('forum/'.$_));
  692. }
  693.  
  694.  
  695.  
  696.  
  697.  
  698. return $self;
  699. }
  700. #################
  701.  
  702. # Подгружаем все
  703. use lib '.';
  704. use forum::Posting;
  705. use forum::Admin;
  706. use forum::Cache;
  707. use forum::Files;
  708. use forum::Comet;
  709. use forum::Settings;
  710.  
  711. sub section{
  712. my($self,$SECTION,$data)=@_;
  713.  
  714. $data->{SORTING}=$self->{SECTIONS}{$SECTION}{SORTING} unless($data->{SORTING} eq 'time' or $data->{SORTING} eq 'lasthit');
  715.  
  716.  
  717. my $pages=$self->{mem}->get('pcnt'.$SECTION); # количество страниц # кеш
  718. unless($pages){
  719. my $count=$self->{db}{forum}{threads}->count({section=>$SECTION});
  720.  
  721. $pages= ceil($count/$self->{SECTIONS}{$SECTION}{THREADS_PER_PAGE});
  722.  
  723. $self->{mem}->set('pcnt'.$SECTION,$pages,$self->{CACHE_TIME});
  724. };
  725.  
  726.  
  727.  
  728. $data->{page}=$pages if($data->{page}>$pages);
  729. $data->{page}=1 if($data->{page}<1);
  730. $data->{page}--;
  731.  
  732.  
  733.  
  734.  
  735.  
  736. my @threads=$self->{db}{forum}{threads}->find(
  737.  
  738. ($data->{hidden} or !$self->{SECTIONS}{$SECTION}{PREMODERATION} or $self->{cgi}->session->{level}>2) ? {section=>$SECTION} : {section=>$SECTION, moderated=> 1} # если премодерация отключена и включен режим скрытых постов или пользователь - модератор, то выводим все сообщения, иначе только одобренные
  739.  
  740. ,{
  741. sort_by=>$self->{'sort_'.$data->{SORTING}},
  742. limit => $self->{SECTIONS}{$SECTION}{THREADS_PER_PAGE},
  743. skip => $data->{page}*$self->{SECTIONS}{$SECTION}{THREADS_PER_PAGE}
  744. })->all;
  745.  
  746. if(1){
  747. my @oids; push @oids, $_->{_id}->value for(@threads);
  748. my $online=$self->_get_online(@oids);
  749.  
  750. $_->{online}=$online->{$_->{_id}->value} for(@threads);
  751.  
  752. @threads=sort {$b->{online} <=> $a->{online}} @threads;
  753. }
  754.  
  755.  
  756. $self->{cgi}->header;
  757. print $self->{SECTIONS}{$SECTION}{tpl}->threads({
  758. threads =>\@threads,
  759. pages=>$pages,
  760. });
  761.  
  762. }
  763.  
  764.  
  765.  
  766. ############# Вспомогательные обработчики
  767.  
  768. sub _translit
  769. { ($_)=@_;
  770.  
  771. #
  772. # Fonetic correct translit
  773. #
  774.  
  775. s/Сх/Sh/g; s/сх/sh/g; s/СХ/SH/g;
  776. s/Ш/Sh/g; s/ш/sh/g;
  777.  
  778. s/Сцх/Sch/g; s/сцх/sch/g; s/СЦХ/SCH/g;
  779. s/Щ/Sch/g; s/щ/sch/g;
  780.  
  781. s/Цх/Ch/g; s/цх/ch/g; s/ЦХ/CH/g;
  782. s/Ч/Ch/g; s/ч/ch/g;
  783.  
  784. s/Йа/Ja/g; s/йа/ja/; s/ЙА/JA/g;
  785. s/Я/Ja/g; s/я/ja/g;
  786.  
  787. s/Йо/Jo/g; s/йо/jo/g; s/ЙО/JO/g;
  788. s/Ё/Jo/g; s/ё/jo/g;
  789.  
  790. s/Йу/Ju/g; s/йу/ju/g; s/ЙУ/JU/g;
  791. s/Ю/Ju/g; s/ю/ju/g;
  792.  
  793. s/Э/E/g; s/э/e/g;
  794. s/Е/E/g; s/е/e/g;
  795.  
  796. s/Зх/Zh/g; s/зх/zh/g; s/ЗХ/ZH/g;
  797. s/Ж/Zh/g; s/ж/zh/g;
  798.  
  799. s/[ЪъЬь]//g;
  800. s/ /-/g;
  801.  
  802. tr/
  803. абвгдзийклмнопрстуфхцыАБВГДЗИЙКЛМHОПРСТУФХЦЫ/
  804. abvgdzijklmnoprstufhcyABVGDZIJKLMNOPRSTUFHCY/;
  805.  
  806.  
  807.  
  808. s/[^A-z_0-9-]//g;
  809. return $_;
  810.  
  811. }
  812.  
  813. 'Анимеаниме - свободное общение^W каваенье и някание';
  814. [18:10] +pekahucoa: package Forum;
  815.  
  816. use strict;
  817. use Data::Dumper;
  818. use utf8;
  819. use CompiledTemplate;
  820. use RealplexorApi;
  821. use POSIX;
  822. use Tie::IxHash;
  823. use Image::Size;
  824. require 'text_tools.pl';
  825. #use Digest::MD5 qw(md5_hex);
  826. #use File::Copy;
  827. #use Image::Size;
  828. ##############
  829.  
  830. sub new {
  831. my $self=$_[1];
  832.  
  833. $self->{rpl}=RealplexorApi->new($self->{rpl});
  834. $self->{lang}=require 'Forum.lang.pl';
  835.  
  836. bless $self;
  837.  
  838.  
  839.  
  840.  
  841.  
  842. $self->{ONLINE_TIME}=20;
  843. $self->{CACHE_TIME}=100;
  844.  
  845. $self->{'sort_time'}=Tie::IxHash->new(sticked => -1, moderated => -1, time => -1);
  846. $self->{'sort_lasthit'}=Tie::IxHash->new(sticked => -1, moderated => -1, lasthit => -1);
  847. #$self->{'sort_rating'}=Tie::IxHash->new(sticked => -1, moderated => -1, time => -1, rating => -1);
  848.  
  849. $self->{db}{settings}{forum}->save({
  850.  
  851. _id => 'nyan',
  852. tpl => 'nyan',
  853.  
  854. SORTING => 'lasthit',
  855.  
  856. THREADS_PER_PAGE => 25,
  857. POSTS_PER_PAGE=> 15,
  858.  
  859. PREMODERATION => 0,
  860. RANDNAMES => 0,
  861. FILETYPES => {gif => undef ,png => undef ,jpg => undef ,jpeg => undef },
  862. MAX_FILESIZE=> 1024*1024*10,
  863.  
  864.  
  865.  
  866. MAX_H => 20000,
  867. MAX_W => 20000,
  868. T_H => 200,
  869. T_W => 200,
  870.  
  871. TEXT_LENGTH => 1024*4,
  872. SUBJECT_LENGTH => 50,
  873. ANON_POSTS => 1,
  874. ANON_THREADS => 1,
  875. FILES => 5,
  876. TAGS => 5,
  877.  
  878. VOTE => 1,
  879. ANON_VOTE => 1,
  880.  
  881. BBCODE => {
  882. sup => ['<sup>', '</sup>'],
  883. sub => ['<sub>', '</sub>'],
  884. big => ['<span style="font-size:36px;">', '</span>'],
  885. small => ['<span style="font-size:8px;">', '</span>'],
  886. center => ['<center>', '</div>'],
  887. right => ['<div style="float:right">', '</center>'],
  888. b => ['<strong>', '</strong>'],
  889. unown => ['<h2>', '</h2>'],
  890. ascii => ['<pre>', '</pre>'],
  891. i => ['<em>', '</em>'],
  892. code => ['<code>', '</code>'],
  893. s => ['<del>', '</del>'],
  894. hide => ['<span class="hide">', '</span>'],
  895. u => ['<span class="u">', '</span>'],
  896. o => ['<span class="o">', '</span>'],
  897. spoiler => ['<span class="spoiler">', '</span>'],
  898. redfont => ['<font color="red">', '</font>'],
  899. }
  900.  
  901. });
  902.  
  903.  
  904. $self->{db}{settings}{forum}->save({
  905.  
  906. _id => 'test',
  907. tpl => 'test',
  908. SORTING => 'lasthit',
  909.  
  910. THREADS_PER_PAGE => 25,
  911. POSTS_PER_PAGE=> 15,
  912.  
  913. PREMODERATION => 0,
  914. RANDNAMES => 0,
  915. FILETYPES => {gif => undef ,png => undef ,jpg => undef ,jpeg => undef },
  916. MAX_FILESIZE=> 1024*1024*10,
  917.  
  918.  
  919.  
  920. MAX_H => 20000,
  921. MAX_W => 20000,
  922. T_H => 200,
  923. T_W => 200,
  924.  
  925. TEXT_LENGTH => 1024*4,
  926. SUBJECT_LENGTH => 50,
  927. ANON_POSTS => 1,
  928. ANON_THREADS => 1,
  929. FILES => 5,
  930. TAGS => 5,
  931.  
  932. VOTE => 1,
  933. ANON_VOTE => 1,
  934.  
  935. BBCODE => {
  936. sup => ['<sup>', '</sup>'],
  937. sub => ['<sub>', '</sub>'],
  938. big => ['<span style="font-size:36px;">', '</span>'],
  939. small => ['<span style="font-size:8px;">', '</span>'],
  940. center => ['<center>', '</div>'],
  941. right => ['<div style="float:right">', '</center>'],
  942. b => ['<strong>', '</strong>'],
  943. unown => ['<h2>', '</h2>'],
  944. ascii => ['<pre>', '</pre>'],
  945. i => ['<em>', '</em>'],
  946. code => ['<code>', '</code>'],
  947. s => ['<del>', '</del>'],
  948. hide => ['<span class="hide">', '</span>'],
  949. u => ['<span class="u">', '</span>'],
  950. o => ['<span class="o">', '</span>'],
  951. spoiler => ['<span class="spoiler">', '</span>'],
  952. redfont => ['<font color="red">', '</font>'],
  953. }
  954.  
  955. });
  956.  
  957.  
  958. $self->_load_settings;
  959. $self->rebuild_cache;
  960.  
  961. for(keys %{$self->{SECTIONS}}){
  962. mkdir('forum/'.$_) unless(-d('forum/'.$_));
  963. }
  964.  
  965.  
  966.  
  967.  
  968.  
  969. return $self;
  970. }
  971. #################
  972.  
  973. # Подгружаем все
  974. use lib '.';
  975. use forum::Posting;
  976. use forum::Admin;
  977. use forum::Cache;
  978. use forum::Files;
  979. use forum::Comet;
  980. use forum::Settings;
  981.  
  982. sub section{
  983. my($self,$SECTION,$data)=@_;
  984.  
  985. $data->{SORTING}=$self->{SECTIONS}{$SECTION}{SORTING} unless($data->{SORTING} eq 'time' or $data->{SORTING} eq 'lasthit');
  986.  
  987.  
  988. my $pages=$self->{mem}->get('pcnt'.$SECTION); # количество страниц # кеш
  989. unless($pages){
  990. my $count=$self->{db}{forum}{threads}->count({section=>$SECTION});
  991.  
  992. $pages= ceil($count/$self->{SECTIONS}{$SECTION}{THREADS_PER_PAGE});
  993.  
  994. $self->{mem}->set('pcnt'.$SECTION,$pages,$self->{CACHE_TIME});
  995. };
  996.  
  997.  
  998.  
  999. $data->{page}=$pages if($data->{page}>$pages);
  1000. $data->{page}=1 if($data->{page}<1);
  1001. $data->{page}--;
  1002.  
  1003.  
  1004.  
  1005.  
  1006.  
  1007. my @threads=$self->{db}{forum}{threads}->find(
  1008.  
  1009. ($data->{hidden} or !$self->{SECTIONS}{$SECTION}{PREMODERATION} or $self->{cgi}->session->{level}>2) ? {section=>$SECTION} : {section=>$SECTION, moderated=> 1} # если премодерация отключена и включен режим скрытых постов или пользователь - модератор, то выводим все сообщения, иначе только одобренные
  1010.  
  1011. ,{
  1012. sort_by=>$self->{'sort_'.$data->{SORTING}},
  1013. limit => $self->{SECTIONS}{$SECTION}{THREADS_PER_PAGE},
  1014. skip => $data->{page}*$self->{SECTIONS}{$SECTION}{THREADS_PER_PAGE}
  1015. })->all;
  1016.  
  1017. if(1){
  1018. my @oids; push @oids, $_->{_id}->value for(@threads);
  1019. my $online=$self->_get_online(@oids);
  1020.  
  1021. $_->{online}=$online->{$_->{_id}->value} for(@threads);
  1022.  
  1023. @threads=sort {$b->{online} <=> $a->{online}} @threads;
  1024. }
  1025.  
  1026.  
  1027. $self->{cgi}->header;
  1028. print $self->{SECTIONS}{$SECTION}{tpl}->threads({
  1029. threads =>\@threads,
  1030. pages=>$pages,
  1031. });
  1032.  
  1033. }
  1034.  
  1035.  
  1036.  
  1037. ############# Вспомогательные обработчики
  1038.  
  1039. sub _translit
  1040. { ($_)=@_;
  1041.  
  1042. #
  1043. # Fonetic correct translit
  1044. #
  1045.  
  1046. s/Сх/Sh/g; s/сх/sh/g; s/СХ/SH/g;
  1047. s/Ш/Sh/g; s/ш/sh/g;
  1048.  
  1049. s/Сцх/Sch/g; s/сцх/sch/g; s/СЦХ/SCH/g;
  1050. s/Щ/Sch/g; s/щ/sch/g;
  1051.  
  1052. s/Цх/Ch/g; s/цх/ch/g; s/ЦХ/CH/g;
  1053. s/Ч/Ch/g; s/ч/ch/g;
  1054.  
  1055. s/Йа/Ja/g; s/йа/ja/; s/ЙА/JA/g;
  1056. s/Я/Ja/g; s/я/ja/g;
  1057.  
  1058. s/Йо/Jo/g; s/йо/jo/g; s/ЙО/JO/g;
  1059. s/Ё/Jo/g; s/ё/jo/g;
  1060.  
  1061. s/Йу/Ju/g; s/йу/ju/g; s/ЙУ/JU/g;
  1062. s/Ю/Ju/g; s/ю/ju/g;
  1063.  
  1064. s/Э/E/g; s/э/e/g;
  1065. s/Е/E/g; s/е/e/g;
  1066.  
  1067. s/Зх/Zh/g; s/зх/zh/g; s/ЗХ/ZH/g;
  1068. s/Ж/Zh/g; s/ж/zh/g;
  1069.  
  1070. s/[ЪъЬь]//g;
  1071. s/ /-/g;
  1072.  
  1073. tr/
  1074. абвгдзийклмнопрстуфхцыАБВГДЗИЙКЛМHОПРСТУФХЦЫ/
  1075. abvgdzijklmnoprstufhcyABVGDZIJKLMNOPRSTUFHCY/;
  1076.  
  1077.  
  1078.  
  1079. s/[^A-z_0-9-]//g;
  1080. return $_;
  1081.  
  1082. }
  1083.  
  1084. 'Анимеаниме - свободное общение^W каваенье и някание';
  1085. [18:10] +pekahucoa: package Forum;
  1086.  
  1087. use strict;
  1088. use Data::Dumper;
  1089. use utf8;
  1090. use CompiledTemplate;
  1091. use RealplexorApi;
  1092. use POSIX;
  1093. use Tie::IxHash;
  1094. use Image::Size;
  1095. require 'text_tools.pl';
  1096. #use Digest::MD5 qw(md5_hex);
  1097. #use File::Copy;
  1098. #use Image::Size;
  1099. ##############
  1100.  
  1101. sub new {
  1102. my $self=$_[1];
  1103.  
  1104. $self->{rpl}=RealplexorApi->new($self->{rpl});
  1105. $self->{lang}=require 'Forum.lang.pl';
  1106.  
  1107. bless $self;
  1108.  
  1109.  
  1110.  
  1111.  
  1112.  
  1113. $self->{ONLINE_TIME}=20;
  1114. $self->{CACHE_TIME}=100;
  1115.  
  1116. $self->{'sort_time'}=Tie::IxHash->new(sticked => -1, moderated => -1, time => -1);
  1117. $self->{'sort_lasthit'}=Tie::IxHash->new(sticked => -1, moderated => -1, lasthit => -1);
  1118. #$self->{'sort_rating'}=Tie::IxHash->new(sticked => -1, moderated => -1, time => -1, rating => -1);
  1119.  
  1120. $self->{db}{settings}{forum}->save({
  1121.  
  1122. _id => 'nyan',
  1123. tpl => 'nyan',
  1124.  
  1125. SORTING => 'lasthit',
  1126.  
  1127. THREADS_PER_PAGE => 25,
  1128. POSTS_PER_PAGE=> 15,
  1129.  
  1130. PREMODERATION => 0,
  1131. RANDNAMES => 0,
  1132. FILETYPES => {gif => undef ,png => undef ,jpg => undef ,jpeg => undef },
  1133. MAX_FILESIZE=> 1024*1024*10,
  1134.  
  1135.  
  1136.  
  1137. MAX_H => 20000,
  1138. MAX_W => 20000,
  1139. T_H => 200,
  1140. T_W => 200,
  1141.  
  1142. TEXT_LENGTH => 1024*4,
  1143. SUBJECT_LENGTH => 50,
  1144. ANON_POSTS => 1,
  1145. ANON_THREADS => 1,
  1146. FILES => 5,
  1147. TAGS => 5,
  1148.  
  1149. VOTE => 1,
  1150. ANON_VOTE => 1,
  1151.  
  1152. BBCODE => {
  1153. sup => ['<sup>', '</sup>'],
  1154. sub => ['<sub>', '</sub>'],
  1155. big => ['<span style="font-size:36px;">', '</span>'],
  1156. small => ['<span style="font-size:8px;">', '</span>'],
  1157. center => ['<center>', '</div>'],
  1158. right => ['<div style="float:right">', '</center>'],
  1159. b => ['<strong>', '</strong>'],
  1160. unown => ['<h2>', '</h2>'],
  1161. ascii => ['<pre>', '</pre>'],
  1162. i => ['<em>', '</em>'],
  1163. code => ['<code>', '</code>'],
  1164. s => ['<del>', '</del>'],
  1165. hide => ['<span class="hide">', '</span>'],
  1166. u => ['<span class="u">', '</span>'],
  1167. o => ['<span class="o">', '</span>'],
  1168. spoiler => ['<span class="spoiler">', '</span>'],
  1169. redfont => ['<font color="red">', '</font>'],
  1170. }
  1171.  
  1172. });
  1173.  
  1174.  
  1175. $self->{db}{settings}{forum}->save({
  1176.  
  1177. _id => 'test',
  1178. tpl => 'test',
  1179. SORTING => 'lasthit',
  1180.  
  1181. THREADS_PER_PAGE => 25,
  1182. POSTS_PER_PAGE=> 15,
  1183.  
  1184. PREMODERATION => 0,
  1185. RANDNAMES => 0,
  1186. FILETYPES => {gif => undef ,png => undef ,jpg => undef ,jpeg => undef },
  1187. MAX_FILESIZE=> 1024*1024*10,
  1188.  
  1189.  
  1190.  
  1191. MAX_H => 20000,
  1192. MAX_W => 20000,
  1193. T_H => 200,
  1194. T_W => 200,
  1195.  
  1196. TEXT_LENGTH => 1024*4,
  1197. SUBJECT_LENGTH => 50,
  1198. ANON_POSTS => 1,
  1199. ANON_THREADS => 1,
  1200. FILES => 5,
  1201. TAGS => 5,
  1202.  
  1203. VOTE => 1,
  1204. ANON_VOTE => 1,
  1205.  
  1206. BBCODE => {
  1207. sup => ['<sup>', '</sup>'],
  1208. sub => ['<sub>', '</sub>'],
  1209. big => ['<span style="font-size:36px;">', '</span>'],
  1210. small => ['<span style="font-size:8px;">', '</span>'],
  1211. center => ['<center>', '</div>'],
  1212. right => ['<div style="float:right">', '</center>'],
  1213. b => ['<strong>', '</strong>'],
  1214. unown => ['<h2>', '</h2>'],
  1215. ascii => ['<pre>', '</pre>'],
  1216. i => ['<em>', '</em>'],
  1217. code => ['<code>', '</code>'],
  1218. s => ['<del>', '</del>'],
  1219. hide => ['<span class="hide">', '</span>'],
  1220. u => ['<span class="u">', '</span>'],
  1221. o => ['<span class="o">', '</span>'],
  1222. spoiler => ['<span class="spoiler">', '</span>'],
  1223. redfont => ['<font color="red">', '</font>'],
  1224. }
  1225.  
  1226. });
  1227.  
  1228.  
  1229. $self->_load_settings;
  1230. $self->rebuild_cache;
  1231.  
  1232. for(keys %{$self->{SECTIONS}}){
  1233. mkdir('forum/'.$_) unless(-d('forum/'.$_));
  1234. }
  1235.  
  1236.  
  1237.  
  1238.  
  1239.  
  1240. return $self;
  1241. }
  1242. #################
  1243.  
  1244. # Подгружаем все
  1245. use lib '.';
  1246. use forum::Posting;
  1247. use forum::Admin;
  1248. use forum::Cache;
  1249. use forum::Files;
  1250. use forum::Comet;
  1251. use forum::Settings;
  1252.  
  1253. sub section{
  1254. my($self,$SECTION,$data)=@_;
  1255.  
  1256. $data->{SORTING}=$self->{SECTIONS}{$SECTION}{SORTING} unless($data->{SORTING} eq 'time' or $data->{SORTING} eq 'lasthit');
  1257.  
  1258.  
  1259. my $pages=$self->{mem}->get('pcnt'.$SECTION); # количество страниц # кеш
  1260. unless($pages){
  1261. my $count=$self->{db}{forum}{threads}->count({section=>$SECTION});
  1262.  
  1263. $pages= ceil($count/$self->{SECTIONS}{$SECTION}{THREADS_PER_PAGE});
  1264.  
  1265. $self->{mem}->set('pcnt'.$SECTION,$pages,$self->{CACHE_TIME});
  1266. };
  1267.  
  1268.  
  1269.  
  1270. $data->{page}=$pages if($data->{page}>$pages);
  1271. $data->{page}=1 if($data->{page}<1);
  1272. $data->{page}--;
  1273.  
  1274.  
  1275.  
  1276.  
  1277.  
  1278. my @threads=$self->{db}{forum}{threads}->find(
  1279.  
  1280. ($data->{hidden} or !$self->{SECTIONS}{$SECTION}{PREMODERATION} or $self->{cgi}->session->{level}>2) ? {section=>$SECTION} : {section=>$SECTION, moderated=> 1} # если премодерация отключена и включен режим скрытых постов или пользователь - модератор, то выводим все сообщения, иначе только одобренные
  1281.  
  1282. ,{
  1283. sort_by=>$self->{'sort_'.$data->{SORTING}},
  1284. limit => $self->{SECTIONS}{$SECTION}{THREADS_PER_PAGE},
  1285. skip => $data->{page}*$self->{SECTIONS}{$SECTION}{THREADS_PER_PAGE}
  1286. })->all;
  1287.  
  1288. if(1){
  1289. my @oids; push @oids, $_->{_id}->value for(@threads);
  1290. my $online=$self->_get_online(@oids);
  1291.  
  1292. $_->{online}=$online->{$_->{_id}->value} for(@threads);
  1293.  
  1294. @threads=sort {$b->{online} <=> $a->{online}} @threads;
  1295. }
  1296.  
  1297.  
  1298. $self->{cgi}->header;
  1299. print $self->{SECTIONS}{$SECTION}{tpl}->threads({
  1300. threads =>\@threads,
  1301. pages=>$pages,
  1302. });
  1303.  
  1304. }
  1305.  
  1306.  
  1307.  
  1308. ############# Вспомогательные обработчики
  1309.  
  1310. sub _translit
  1311. { ($_)=@_;
  1312.  
  1313. #
  1314. # Fonetic correct translit
  1315. #
  1316.  
  1317. s/Сх/Sh/g; s/сх/sh/g; s/СХ/SH/g;
  1318. s/Ш/Sh/g; s/ш/sh/g;
  1319.  
  1320. s/Сцх/Sch/g; s/сцх/sch/g; s/СЦХ/SCH/g;
  1321. s/Щ/Sch/g; s/щ/sch/g;
  1322.  
  1323. s/Цх/Ch/g; s/цх/ch/g; s/ЦХ/CH/g;
  1324. s/Ч/Ch/g; s/ч/ch/g;
  1325.  
  1326. s/Йа/Ja/g; s/йа/ja/; s/ЙА/JA/g;
  1327. s/Я/Ja/g; s/я/ja/g;
  1328.  
  1329. s/Йо/Jo/g; s/йо/jo/g; s/ЙО/JO/g;
  1330. s/Ё/Jo/g; s/ё/jo/g;
  1331.  
  1332. s/Йу/Ju/g; s/йу/ju/g; s/ЙУ/JU/g;
  1333. s/Ю/Ju/g; s/ю/ju/g;
  1334.  
  1335. s/Э/E/g; s/э/e/g;
  1336. s/Е/E/g; s/е/e/g;
  1337.  
  1338. s/Зх/Zh/g; s/зх/zh/g; s/ЗХ/ZH/g;
  1339. s/Ж/Zh/g; s/ж/zh/g;
  1340.  
  1341. s/[ЪъЬь]//g;
  1342. s/ /-/g;
  1343.  
  1344. tr/
  1345. абвгдзийклмнопрстуфхцыАБВГДЗИЙКЛМHОПРСТУФХЦЫ/
  1346. abvgdzijklmnoprstufhcyABVGDZIJKLMNOPRSTUFHCY/;
  1347.  
  1348.  
  1349.  
  1350. s/[^A-z_0-9-]//g;
  1351. return $_;
  1352.  
  1353. }
  1354.  
  1355. 'Анимеаниме - свободное общение^W каваенье и някание';
  1356. [18:10] +pekahucoa: package Forum;
  1357.  
  1358. use strict;
  1359. use Data::Dumper;
  1360. use utf8;
  1361. use CompiledTemplate;
  1362. use RealplexorApi;
  1363. use POSIX;
  1364. use Tie::IxHash;
  1365. use Image::Size;
  1366. require 'text_tools.pl';
  1367. #use Digest::MD5 qw(md5_hex);
  1368. #use File::Copy;
  1369. #use Image::Size;
  1370. ##############
  1371.  
  1372. sub new {
  1373. my $self=$_[1];
  1374.  
  1375. $self->{rpl}=RealplexorApi->new($self->{rpl});
  1376. $self->{lang}=require 'Forum.lang.pl';
  1377.  
  1378. bless $self;
  1379.  
  1380.  
  1381.  
  1382.  
  1383.  
  1384. $self->{ONLINE_TIME}=20;
  1385. $self->{CACHE_TIME}=100;
  1386.  
  1387. $self->{'sort_time'}=Tie::IxHash->new(sticked => -1, moderated => -1, time => -1);
  1388. $self->{'sort_lasthit'}=Tie::IxHash->new(sticked => -1, moderated => -1, lasthit => -1);
  1389. #$self->{'sort_rating'}=Tie::IxHash->new(sticked => -1, moderated => -1, time => -1, rating => -1);
  1390.  
  1391. $self->{db}{settings}{forum}->save({
  1392.  
  1393. _id => 'nyan',
  1394. tpl => 'nyan',
  1395.  
  1396. SORTING => 'lasthit',
  1397.  
  1398. THREADS_PER_PAGE => 25,
  1399. POSTS_PER_PAGE=> 15,
  1400.  
  1401. PREMODERATION => 0,
  1402. RANDNAMES => 0,
  1403. FILETYPES => {gif => undef ,png => undef ,jpg => undef ,jpeg => undef },
  1404. MAX_FILESIZE=> 1024*1024*10,
  1405.  
  1406.  
  1407.  
  1408. MAX_H => 20000,
  1409. MAX_W => 20000,
  1410. T_H => 200,
  1411. T_W => 200,
  1412.  
  1413. TEXT_LENGTH => 1024*4,
  1414. SUBJECT_LENGTH => 50,
  1415. ANON_POSTS => 1,
  1416. ANON_THREADS => 1,
  1417. FILES => 5,
  1418. TAGS => 5,
  1419.  
  1420. VOTE => 1,
  1421. ANON_VOTE => 1,
  1422.  
  1423. BBCODE => {
  1424. sup => ['<sup>', '</sup>'],
  1425. sub => ['<sub>', '</sub>'],
  1426. big => ['<span style="font-size:36px;">', '</span>'],
  1427. small => ['<span style="font-size:8px;">', '</span>'],
  1428. center => ['<center>', '</div>'],
  1429. right => ['<div style="float:right">', '</center>'],
  1430. b => ['<strong>', '</strong>'],
  1431. unown => ['<h2>', '</h2>'],
  1432. ascii => ['<pre>', '</pre>'],
  1433. i => ['<em>', '</em>'],
  1434. code => ['<code>', '</code>'],
  1435. s => ['<del>', '</del>'],
  1436. hide => ['<span class="hide">', '</span>'],
  1437. u => ['<span class="u">', '</span>'],
  1438. o => ['<span class="o">', '</span>'],
  1439. spoiler => ['<span class="spoiler">', '</span>'],
  1440. redfont => ['<font color="red">', '</font>'],
  1441. }
  1442.  
  1443. });
  1444.  
  1445.  
  1446. $self->{db}{settings}{forum}->save({
  1447.  
  1448. _id => 'test',
  1449. tpl => 'test',
  1450. SORTING => 'lasthit',
  1451.  
  1452. THREADS_PER_PAGE => 25,
  1453. POSTS_PER_PAGE=> 15,
  1454.  
  1455. PREMODERATION => 0,
  1456. RANDNAMES => 0,
  1457. FILETYPES => {gif => undef ,png => undef ,jpg => undef ,jpeg => undef },
  1458. MAX_FILESIZE=> 1024*1024*10,
  1459.  
  1460.  
  1461.  
  1462. MAX_H => 20000,
  1463. MAX_W => 20000,
  1464. T_H => 200,
  1465. T_W => 200,
  1466.  
  1467. TEXT_LENGTH => 1024*4,
  1468. SUBJECT_LENGTH => 50,
  1469. ANON_POSTS => 1,
  1470. ANON_THREADS => 1,
  1471. FILES => 5,
  1472. TAGS => 5,
  1473.  
  1474. VOTE => 1,
  1475. ANON_VOTE => 1,
  1476.  
  1477. BBCODE => {
  1478. sup => ['<sup>', '</sup>'],
  1479. sub => ['<sub>', '</sub>'],
  1480. big => ['<span style="font-size:36px;">', '</span>'],
  1481. small => ['<span style="font-size:8px;">', '</span>'],
  1482. center => ['<center>', '</div>'],
  1483. right => ['<div style="float:right">', '</center>'],
  1484. b => ['<strong>', '</strong>'],
  1485. unown => ['<h2>', '</h2>'],
  1486. ascii => ['<pre>', '</pre>'],
  1487. i => ['<em>', '</em>'],
  1488. code => ['<code>', '</code>'],
  1489. s => ['<del>', '</del>'],
  1490. hide => ['<span class="hide">', '</span>'],
  1491. u => ['<span class="u">', '</span>'],
  1492. o => ['<span class="o">', '</span>'],
  1493. spoiler => ['<span class="spoiler">', '</span>'],
  1494. redfont => ['<font color="red">', '</font>'],
  1495. }
  1496.  
  1497. });
  1498.  
  1499.  
  1500. $self->_load_settings;
  1501. $self->rebuild_cache;
  1502.  
  1503. for(keys %{$self->{SECTIONS}}){
  1504. mkdir('forum/'.$_) unless(-d('forum/'.$_));
  1505. }
  1506.  
  1507.  
  1508.  
  1509.  
  1510.  
  1511. return $self;
  1512. }
  1513. #################
  1514.  
  1515. # Подгружаем все
  1516. use lib '.';
  1517. use forum::Posting;
  1518. use forum::Admin;
  1519. use forum::Cache;
  1520. use forum::Files;
  1521. use forum::Comet;
  1522. use forum::Settings;
  1523.  
  1524. sub section{
  1525. my($self,$SECTION,$data)=@_;
  1526.  
  1527. $data->{SORTING}=$self->{SECTIONS}{$SECTION}{SORTING} unless($data->{SORTING} eq 'time' or $data->{SORTING} eq 'lasthit');
  1528.  
  1529.  
  1530. my $pages=$self->{mem}->get('pcnt'.$SECTION); # количество страниц # кеш
  1531. unless($pages){
  1532. my $count=$self->{db}{forum}{threads}->count({section=>$SECTION});
  1533.  
  1534. $pages= ceil($count/$self->{SECTIONS}{$SECTION}{THREADS_PER_PAGE});
  1535.  
  1536. $self->{mem}->set('pcnt'.$SECTION,$pages,$self->{CACHE_TIME});
  1537. };
  1538.  
  1539.  
  1540.  
  1541. $data->{page}=$pages if($data->{page}>$pages);
  1542. $data->{page}=1 if($data->{page}<1);
  1543. $data->{page}--;
  1544.  
  1545.  
  1546.  
  1547.  
  1548.  
  1549. my @threads=$self->{db}{forum}{threads}->find(
  1550.  
  1551. ($data->{hidden} or !$self->{SECTIONS}{$SECTION}{PREMODERATION} or $self->{cgi}->session->{level}>2) ? {section=>$SECTION} : {section=>$SECTION, moderated=> 1} # если премодерация отключена и включен режим скрытых постов или пользователь - модератор, то выводим все сообщения, иначе только одобренные
  1552.  
  1553. ,{
  1554. sort_by=>$self->{'sort_'.$data->{SORTING}},
  1555. limit => $self->{SECTIONS}{$SECTION}{THREADS_PER_PAGE},
  1556. skip => $data->{page}*$self->{SECTIONS}{$SECTION}{THREADS_PER_PAGE}
  1557. })->all;
  1558.  
  1559. if(1){
  1560. my @oids; push @oids, $_->{_id}->value for(@threads);
  1561. my $online=$self->_get_online(@oids);
  1562.  
  1563. $_->{online}=$online->{$_->{_id}->value} for(@threads);
  1564.  
  1565. @threads=sort {$b->{online} <=> $a->{online}} @threads;
  1566. }
  1567.  
  1568.  
  1569. $self->{cgi}->header;
  1570. print $self->{SECTIONS}{$SECTION}{tpl}->threads({
  1571. threads =>\@threads,
  1572. pages=>$pages,
  1573. });
  1574.  
  1575. }
  1576.  
  1577.  
  1578.  
  1579. ############# Вспомогательные обработчики
  1580.  
  1581. sub _translit
  1582. { ($_)=@_;
  1583.  
  1584. #
  1585. # Fonetic correct translit
  1586. #
  1587.  
  1588. s/Сх/Sh/g; s/сх/sh/g; s/СХ/SH/g;
  1589. s/Ш/Sh/g; s/ш/sh/g;
  1590.  
  1591. s/Сцх/Sch/g; s/сцх/sch/g; s/СЦХ/SCH/g;
  1592. s/Щ/Sch/g; s/щ/sch/g;
  1593.  
  1594. s/Цх/Ch/g; s/цх/ch/g; s/ЦХ/CH/g;
  1595. s/Ч/Ch/g; s/ч/ch/g;
  1596.  
  1597. s/Йа/Ja/g; s/йа/ja/; s/ЙА/JA/g;
  1598. s/Я/Ja/g; s/я/ja/g;
  1599.  
  1600. s/Йо/Jo/g; s/йо/jo/g; s/ЙО/JO/g;
  1601. s/Ё/Jo/g; s/ё/jo/g;
  1602.  
  1603. s/Йу/Ju/g; s/йу/ju/g; s/ЙУ/JU/g;
  1604. s/Ю/Ju/g; s/ю/ju/g;
  1605.  
  1606. s/Э/E/g; s/э/e/g;
  1607. s/Е/E/g; s/е/e/g;
  1608.  
  1609. s/Зх/Zh/g; s/зх/zh/g; s/ЗХ/ZH/g;
  1610. s/Ж/Zh/g; s/ж/zh/g;
  1611.  
  1612. s/[ЪъЬь]//g;
  1613. s/ /-/g;
  1614.  
  1615. tr/
  1616. абвгдзийклмнопрстуфхцыАБВГДЗИЙКЛМHОПРСТУФХЦЫ/
  1617. abvgdzijklmnoprstufhcyABVGDZIJKLMNOPRSTUFHCY/;
  1618.  
  1619.  
  1620.  
  1621. s/[^A-z_0-9-]//g;
  1622. return $_;
  1623.  
  1624. }
  1625.  
  1626. 'Анимеаниме - свободное общение^W каваенье и някание';
  1627. [18:10] +pekahucoa: package Forum;
  1628.  
  1629. use strict;
  1630. use Data::Dumper;
  1631. use utf8;
  1632. use CompiledTemplate;
  1633. use RealplexorApi;
  1634. use POSIX;
  1635. use Tie::IxHash;
  1636. use Image::Size;
  1637. require 'text_tools.pl';
  1638. #use Digest::MD5 qw(md5_hex);
  1639. #use File::Copy;
  1640. #use Image::Size;
  1641. ##############
  1642.  
  1643. sub new {
  1644. my $self=$_[1];
  1645.  
  1646. $self->{rpl}=RealplexorApi->new($self->{rpl});
  1647. $self->{lang}=require 'Forum.lang.pl';
  1648.  
  1649. bless $self;
  1650.  
  1651.  
  1652.  
  1653.  
  1654.  
  1655. $self->{ONLINE_TIME}=20;
  1656. $self->{CACHE_TIME}=100;
  1657.  
  1658. $self->{'sort_time'}=Tie::IxHash->new(sticked => -1, moderated => -1, time => -1);
  1659. $self->{'sort_lasthit'}=Tie::IxHash->new(sticked => -1, moderated => -1, lasthit => -1);
  1660. #$self->{'sort_rating'}=Tie::IxHash->new(sticked => -1, moderated => -1, time => -1, rating => -1);
  1661.  
  1662. $self->{db}{settings}{forum}->save({
  1663.  
  1664. _id => 'nyan',
  1665. tpl => 'nyan',
  1666.  
  1667. SORTING => 'lasthit',
  1668.  
  1669. THREADS_PER_PAGE => 25,
  1670. POSTS_PER_PAGE=> 15,
  1671.  
  1672. PREMODERATION => 0,
  1673. RANDNAMES => 0,
  1674. FILETYPES => {gif => undef ,png => undef ,jpg => undef ,jpeg => undef },
  1675. MAX_FILESIZE=> 1024*1024*10,
  1676.  
  1677.  
  1678.  
  1679. MAX_H => 20000,
  1680. MAX_W => 20000,
  1681. T_H => 200,
  1682. T_W => 200,
  1683.  
  1684. TEXT_LENGTH => 1024*4,
  1685. SUBJECT_LENGTH => 50,
  1686. ANON_POSTS => 1,
  1687. ANON_THREADS => 1,
  1688. FILES => 5,
  1689. TAGS => 5,
  1690.  
  1691. VOTE => 1,
  1692. ANON_VOTE => 1,
  1693.  
  1694. BBCODE => {
  1695. sup => ['<sup>', '</sup>'],
  1696. sub => ['<sub>', '</sub>'],
  1697. big => ['<span style="font-size:36px;">', '</span>'],
  1698. small => ['<span style="font-size:8px;">', '</span>'],
  1699. center => ['<center>', '</div>'],
  1700. right => ['<div style="float:right">', '</center>'],
  1701. b => ['<strong>', '</strong>'],
  1702. unown => ['<h2>', '</h2>'],
  1703. ascii => ['<pre>', '</pre>'],
  1704. i => ['<em>', '</em>'],
  1705. code => ['<code>', '</code>'],
  1706. s => ['<del>', '</del>'],
  1707. hide => ['<span class="hide">', '</span>'],
  1708. u => ['<span class="u">', '</span>'],
  1709. o => ['<span class="o">', '</span>'],
  1710. spoiler => ['<span class="spoiler">', '</span>'],
  1711. redfont => ['<font color="red">', '</font>'],
  1712. }
  1713.  
  1714. });
  1715.  
  1716.  
  1717. $self->{db}{settings}{forum}->save({
  1718.  
  1719. _id => 'test',
  1720. tpl => 'test',
  1721. SORTING => 'lasthit',
  1722.  
  1723. THREADS_PER_PAGE => 25,
  1724. POSTS_PER_PAGE=> 15,
  1725.  
  1726. PREMODERATION => 0,
  1727. RANDNAMES => 0,
  1728. FILETYPES => {gif => undef ,png => undef ,jpg => undef ,jpeg => undef },
  1729. MAX_FILESIZE=> 1024*1024*10,
  1730.  
  1731.  
  1732.  
  1733. MAX_H => 20000,
  1734. MAX_W => 20000,
  1735. T_H => 200,
  1736. T_W => 200,
  1737.  
  1738. TEXT_LENGTH => 1024*4,
  1739. SUBJECT_LENGTH => 50,
  1740. ANON_POSTS => 1,
  1741. ANON_THREADS => 1,
  1742. FILES => 5,
  1743. TAGS => 5,
  1744.  
  1745. VOTE => 1,
  1746. ANON_VOTE => 1,
  1747.  
  1748. BBCODE => {
  1749. sup => ['<sup>', '</sup>'],
  1750. sub => ['<sub>', '</sub>'],
  1751. big => ['<span style="font-size:36px;">', '</span>'],
  1752. small => ['<span style="font-size:8px;">', '</span>'],
  1753. center => ['<center>', '</div>'],
  1754. right => ['<div style="float:right">', '</center>'],
  1755. b => ['<strong>', '</strong>'],
  1756. unown => ['<h2>', '</h2>'],
  1757. ascii => ['<pre>', '</pre>'],
  1758. i => ['<em>', '</em>'],
  1759. code => ['<code>', '</code>'],
  1760. s => ['<del>', '</del>'],
  1761. hide => ['<span class="hide">', '</span>'],
  1762. u => ['<span class="u">', '</span>'],
  1763. o => ['<span class="o">', '</span>'],
  1764. spoiler => ['<span class="spoiler">', '</span>'],
  1765. redfont => ['<font color="red">', '</font>'],
  1766. }
  1767.  
  1768. });
  1769.  
  1770.  
  1771. $self->_load_settings;
  1772. $self->rebuild_cache;
  1773.  
  1774. for(keys %{$self->{SECTIONS}}){
  1775. mkdir('forum/'.$_) unless(-d('forum/'.$_));
  1776. }
  1777.  
  1778.  
  1779.  
  1780.  
  1781.  
  1782. return $self;
  1783. }
  1784. #################
  1785.  
  1786. # Подгружаем все
  1787. use lib '.';
  1788. use forum::Posting;
  1789. use forum::Admin;
  1790. use forum::Cache;
  1791. use forum::Files;
  1792. use forum::Comet;
  1793. use forum::Settings;
  1794.  
  1795. sub section{
  1796. my($self,$SECTION,$data)=@_;
  1797.  
  1798. $data->{SORTING}=$self->{SECTIONS}{$SECTION}{SORTING} unless($data->{SORTING} eq 'time' or $data->{SORTING} eq 'lasthit');
  1799.  
  1800.  
  1801. my $pages=$self->{mem}->get('pcnt'.$SECTION); # количество страниц # кеш
  1802. unless($pages){
  1803. my $count=$self->{db}{forum}{threads}->count({section=>$SECTION});
  1804.  
  1805. $pages= ceil($count/$self->{SECTIONS}{$SECTION}{THREADS_PER_PAGE});
  1806.  
  1807. $self->{mem}->set('pcnt'.$SECTION,$pages,$self->{CACHE_TIME});
  1808. };
  1809.  
  1810.  
  1811.  
  1812. $data->{page}=$pages if($data->{page}>$pages);
  1813. $data->{page}=1 if($data->{page}<1);
  1814. $data->{page}--;
  1815.  
  1816.  
  1817.  
  1818.  
  1819.  
  1820. my @threads=$self->{db}{forum}{threads}->find(
  1821.  
  1822. ($data->{hidden} or !$self->{SECTIONS}{$SECTION}{PREMODERATION} or $self->{cgi}->session->{level}>2) ? {section=>$SECTION} : {section=>$SECTION, moderated=> 1} # если премодерация отключена и включен режим скрытых постов или пользователь - модератор, то выводим все сообщения, иначе только одобренные
  1823.  
  1824. ,{
  1825. sort_by=>$self->{'sort_'.$data->{SORTING}},
  1826. limit => $self->{SECTIONS}{$SECTION}{THREADS_PER_PAGE},
  1827. skip => $data->{page}*$self->{SECTIONS}{$SECTION}{THREADS_PER_PAGE}
  1828. })->all;
  1829.  
  1830. if(1){
  1831. my @oids; push @oids, $_->{_id}->value for(@threads);
  1832. my $online=$self->_get_online(@oids);
  1833.  
  1834. $_->{online}=$online->{$_->{_id}->value} for(@threads);
  1835.  
  1836. @threads=sort {$b->{online} <=> $a->{online}} @threads;
  1837. }
  1838.  
  1839.  
  1840. $self->{cgi}->header;
  1841. print $self->{SECTIONS}{$SECTION}{tpl}->threads({
  1842. threads =>\@threads,
  1843. pages=>$pages,
  1844. });
  1845.  
  1846. }
  1847.  
  1848.  
  1849.  
  1850. ############# Вспомогательные обработчики
  1851.  
  1852. sub _translit
  1853. { ($_)=@_;
  1854.  
  1855. #
  1856. # Fonetic correct translit
  1857. #
  1858.  
  1859. s/Сх/Sh/g; s/сх/sh/g; s/СХ/SH/g;
  1860. s/Ш/Sh/g; s/ш/sh/g;
  1861.  
  1862. s/Сцх/Sch/g; s/сцх/sch/g; s/СЦХ/SCH/g;
  1863. s/Щ/Sch/g; s/щ/sch/g;
  1864.  
  1865. s/Цх/Ch/g; s/цх/ch/g; s/ЦХ/CH/g;
  1866. s/Ч/Ch/g; s/ч/ch/g;
  1867.  
  1868. s/Йа/Ja/g; s/йа/ja/; s/ЙА/JA/g;
  1869. s/Я/Ja/g; s/я/ja/g;
  1870.  
  1871. s/Йо/Jo/g; s/йо/jo/g; s/ЙО/JO/g;
  1872. s/Ё/Jo/g; s/ё/jo/g;
  1873.  
  1874. s/Йу/Ju/g; s/йу/ju/g; s/ЙУ/JU/g;
  1875. s/Ю/Ju/g; s/ю/ju/g;
  1876.  
  1877. s/Э/E/g; s/э/e/g;
  1878. s/Е/E/g; s/е/e/g;
  1879.  
  1880. s/Зх/Zh/g; s/зх/zh/g; s/ЗХ/ZH/g;
  1881. s/Ж/Zh/g; s/ж/zh/g;
  1882.  
  1883. s/[ЪъЬь]//g;
  1884. s/ /-/g;
  1885.  
  1886. tr/
  1887. абвгдзийклмнопрстуфхцыАБВГДЗИЙКЛМHОПРСТУФХЦЫ/
  1888. abvgdzijklmnoprstufhcyABVGDZIJKLMNOPRSTUFHCY/;
  1889.  
  1890.  
  1891.  
  1892. s/[^A-z_0-9-]//g;
  1893. return $_;
  1894.  
  1895. }
  1896.  
  1897. 'Анимеаниме - свободное общение^W каваенье и някание';
  1898. [18:10] +pekahucoa: use utf8;
  1899.  
  1900. sub _process_files{
  1901. my($self,$SECTION,$path,$files)=@_;
  1902. my (@errors,@files);
  1903.  
  1904. for my $file(@{$files}){
  1905. $_=$self->_upload_file($SECTION,$path,$file); # обрабатываем файл
  1906.  
  1907. # проверяем на ошибки
  1908. if($_==1){push @errors,$file->{name}.' - '.$self->{lang}{FILE_TOO_BIG}}
  1909. elsif($_==2){push @errors,$file->{name}.' - '.$self->{lang}{NO_FILE}}
  1910. elsif($_==3){push @errors,$file->{name}.' - '.$self->{lang}{CANT_CREATE_THUMBNAIL}}
  1911. elsif($_==4){push @errors,$file->{name}.' - '.$self->{lang}{UNSUPPORTED_FORMAT}}
  1912. elsif($_==5){push @errors,$file->{name}.' - '.$self->{lang}{TOO_BIG_RES}}
  1913. else{push @files,$_;}
  1914.  
  1915. # если это закоментировать и дописать еще пару строк, то можно отправлять сообщения даже с фейлом в загрузке 1/нескольких файлов
  1916. last if(@errors);
  1917.  
  1918. }
  1919. # и это тоже. BEEDLOWCODE
  1920. $self->{cgi}->error(shift @errors)if(@errors);
  1921.  
  1922. return \@files;
  1923. }
  1924.  
  1925. sub _upload_file{
  1926. my ($self,$SECTION,$path,$file)=@_;
  1927. # Возвращает:
  1928. #1 - слишком большой файл
  1929. #2 - ошибка в процессе загрузки
  1930. #3 - невозможно создать превью
  1931. #4 - формат не поддерживается
  1932. #5 - слишком большие размеры картинки
  1933. # успешно - ссылка на хеш
  1934. #{data=>\$data, size=>$len, name =>$name }
  1935.  
  1936. my $data={}; # данные о файле
  1937. $data->{name}=$file->{name};
  1938.  
  1939. my $name=$data->{name};
  1940.  
  1941. # фильтрация имени
  1942. $name=~s|^.*?([^/\\]{0,32})\.([A-z]*)$|$1|;
  1943. my $ext=lc($2);
  1944. $name=~s/[^A-zА-я0-9._-]//g;
  1945. #$name=_translit($name);
  1946.  
  1947.  
  1948.  
  1949.  
  1950. unless(exists $self->{SECTIONS}{$SECTION}{FILETYPES}{$ext}){
  1951. return 4; # расширение запрещено
  1952. }
  1953. else
  1954. {
  1955. return 1 if($file->{size}>$self->{SECTIONS}{$SECTION}{MAX_FILESIZE}); # слишком толсто
  1956. return 2 unless($file->{size}); # чо чо? Опа нихуя!
  1957.  
  1958. $name.=int(rand(9)) while(-e("forum/$SECTION/$path/$name.$ext")); # уникальное имя
  1959.  
  1960. # инфо о файле
  1961. $data->{path}="forum/$SECTION/$path/$name.$ext";
  1962. $data->{size}=sprintf('%.2f',$file->{size}/1024);
  1963.  
  1964. # сохраняем
  1965. open my $fsave,'>',$data->{path} or return 2;
  1966. binmode($fsave);
  1967. print $fsave ${$file->{data}};
  1968. close $fsave;
  1969.  
  1970. #превьюшка
  1971. if(defined $self->{SECTIONS}{$SECTION}{FILETYPES}{$ext}){ # если для файла есть иконка
  1972. $data->{thumbnail}=$self->{SECTIONS}{$SECTION}{FILETYPES}{$ext}; # сохраняем путь к ней
  1973.  
  1974. }
  1975. else #иначе пробуем ресайзить
  1976. {
  1977. my $format;
  1978.  
  1979. ($data->{width},$data->{height},$format)=imgsize($file->{data}); #получаем размеры
  1980. return 3 unless($data->{width} and $data->{height}); # это не картинка
  1981. return 5 if ($data->{width}>$self->{SECTIONS}{$SECTION}{MAX_W} or $data->{height}>$self->{SECTIONS}{$SECTION}{MAX_H}); # слишком большая картинка
  1982.  
  1983. $format=lc($format);
  1984. ($data->{twidth},$data->{theight})=($data->{width},$data->{height});
  1985.  
  1986. #Считаем размеры
  1987. if($data->{twidth}>$self->{SECTIONS}{$SECTION}{T_W}){
  1988. $data->{twidth}=$self->{SECTIONS}{$SECTION}{T_W};
  1989. $data->{theight}=int(($self->{SECTIONS}{$SECTION}{T_W}*$data->{height})/$data->{width});
  1990. };
  1991. if($data->{theight}>$self->{SECTIONS}{$SECTION}{T_H}){
  1992. $data->{theight}=$self->{SECTIONS}{$SECTION}{T_H};
  1993. $data->{twidth}=int(($self->{SECTIONS}{$SECTION}{T_H}*$data->{width})/$data->{height});
  1994. }
  1995. $data->{twidth}=1 unless($data->{twidth});
  1996. $data->{theight}=1 unless($data->{theight});
  1997. #
  1998.  
  1999. $data->{thumbnail}="forum/$SECTION/$path/t$name.$ext"; # сохраняем в инф. файла путь к превьюшке
  2000.  
  2001. $_=$format=~/gif/i ? '[0]' : '';# первый кадр gif
  2002.  
  2003. `convert -channel RGBA -background none -quality 100 -flatten -size $data->{twidth}x$data->{theight} -geometry $data->{twidth}x$data->{theight} $data->{path}$_ $format:$data->{thumbnail}`;
  2004. if($?){unlink $data->{path}; return 3}; #Словили ошибку? удаляем файл и возвращаем ошибку
  2005.  
  2006. }
  2007. return $data; # возвращаем данные о файле
  2008.  
  2009. };
  2010.  
  2011.  
  2012. }
  2013.  
  2014.  
  2015.  
  2016.  
  2017.  
  2018. 'Хочу няшку ._.
  2019.  
  2020. А есть только этот BEEDLOWCOD';
  2021. [18:10] +pekahucoa: use utf8;
  2022.  
  2023. sub _process_files{
  2024. my($self,$SECTION,$path,$files)=@_;
  2025. my (@errors,@files);
  2026.  
  2027. for my $file(@{$files}){
  2028. $_=$self->_upload_file($SECTION,$path,$file); # обрабатываем файл
  2029.  
  2030. # проверяем на ошибки
  2031. if($_==1){push @errors,$file->{name}.' - '.$self->{lang}{FILE_TOO_BIG}}
  2032. elsif($_==2){push @errors,$file->{name}.' - '.$self->{lang}{NO_FILE}}
  2033. elsif($_==3){push @errors,$file->{name}.' - '.$self->{lang}{CANT_CREATE_THUMBNAIL}}
  2034. elsif($_==4){push @errors,$file->{name}.' - '.$self->{lang}{UNSUPPORTED_FORMAT}}
  2035. elsif($_==5){push @errors,$file->{name}.' - '.$self->{lang}{TOO_BIG_RES}}
  2036. else{push @files,$_;}
  2037.  
  2038. # если это закоментировать и дописать еще пару строк, то можно отправлять сообщения даже с фейлом в загрузке 1/нескольких файлов
  2039. last if(@errors);
  2040.  
  2041. }
  2042. # и это тоже. BEEDLOWCODE
  2043. $self->{cgi}->error(shift @errors)if(@errors);
  2044.  
  2045. return \@files;
  2046. }
  2047.  
  2048. sub _upload_file{
  2049. my ($self,$SECTION,$path,$file)=@_;
  2050. # Возвращает:
  2051. #1 - слишком большой файл
  2052. #2 - ошибка в процессе загрузки
  2053. #3 - невозможно создать превью
  2054. #4 - формат не поддерживается
  2055. #5 - слишком большие размеры картинки
  2056. # успешно - ссылка на хеш
  2057. #{data=>\$data, size=>$len, name =>$name }
  2058.  
  2059. my $data={}; # данные о файле
  2060. $data->{name}=$file->{name};
  2061.  
  2062. my $name=$data->{name};
  2063.  
  2064. # фильтрация имени
  2065. $name=~s|^.*?([^/\\]{0,32})\.([A-z]*)$|$1|;
  2066. my $ext=lc($2);
  2067. $name=~s/[^A-zА-я0-9._-]//g;
  2068. #$name=_translit($name);
  2069.  
  2070.  
  2071.  
  2072.  
  2073. unless(exists $self->{SECTIONS}{$SECTION}{FILETYPES}{$ext}){
  2074. return 4; # расширение запрещено
  2075. }
  2076. else
  2077. {
  2078. return 1 if($file->{size}>$self->{SECTIONS}{$SECTION}{MAX_FILESIZE}); # слишком толсто
  2079. return 2 unless($file->{size}); # чо чо? Опа нихуя!
  2080.  
  2081. $name.=int(rand(9)) while(-e("forum/$SECTION/$path/$name.$ext")); # уникальное имя
  2082.  
  2083. # инфо о файле
  2084. $data->{path}="forum/$SECTION/$path/$name.$ext";
  2085. $data->{size}=sprintf('%.2f',$file->{size}/1024);
  2086.  
  2087. # сохраняем
  2088. open my $fsave,'>',$data->{path} or return 2;
  2089. binmode($fsave);
  2090. print $fsave ${$file->{data}};
  2091. close $fsave;
  2092.  
  2093. #превьюшка
  2094. if(defined $self->{SECTIONS}{$SECTION}{FILETYPES}{$ext}){ # если для файла есть иконка
  2095. $data->{thumbnail}=$self->{SECTIONS}{$SECTION}{FILETYPES}{$ext}; # сохраняем путь к ней
  2096.  
  2097. }
  2098. else #иначе пробуем ресайзить
  2099. {
  2100. my $format;
  2101.  
  2102. ($data->{width},$data->{height},$format)=imgsize($file->{data}); #получаем размеры
  2103. return 3 unless($data->{width} and $data->{height}); # это не картинка
  2104. return 5 if ($data->{width}>$self->{SECTIONS}{$SECTION}{MAX_W} or $data->{height}>$self->{SECTIONS}{$SECTION}{MAX_H}); # слишком большая картинка
  2105.  
  2106. $format=lc($format);
  2107. ($data->{twidth},$data->{theight})=($data->{width},$data->{height});
  2108.  
  2109. #Считаем размеры
  2110. if($data->{twidth}>$self->{SECTIONS}{$SECTION}{T_W}){
  2111. $data->{twidth}=$self->{SECTIONS}{$SECTION}{T_W};
  2112. $data->{theight}=int(($self->{SECTIONS}{$SECTION}{T_W}*$data->{height})/$data->{width});
  2113. };
  2114. if($data->{theight}>$self->{SECTIONS}{$SECTION}{T_H}){
  2115. $data->{theight}=$self->{SECTIONS}{$SECTION}{T_H};
  2116. $data->{twidth}=int(($self->{SECTIONS}{$SECTION}{T_H}*$data->{width})/$data->{height});
  2117. }
  2118. $data->{twidth}=1 unless($data->{twidth});
  2119. $data->{theight}=1 unless($data->{theight});
  2120. #
  2121.  
  2122. $data->{thumbnail}="forum/$SECTION/$path/t$name.$ext"; # сохраняем в инф. файла путь к превьюшке
  2123.  
  2124. $_=$format=~/gif/i ? '[0]' : '';# первый кадр gif
  2125.  
  2126. `convert -channel RGBA -background none -quality 100 -flatten -size $data->{twidth}x$data->{theight} -geometry $data->{twidth}x$data->{theight} $data->{path}$_ $format:$data->{thumbnail}`;
  2127. if($?){unlink $data->{path}; return 3}; #Словили ошибку? удаляем файл и возвращаем ошибку
  2128.  
  2129. }
  2130. return $data; # возвращаем данные о файле
  2131.  
  2132. };
  2133.  
  2134.  
  2135. }
  2136.  
  2137.  
  2138.  
  2139.  
  2140.  
  2141. 'Хочу няшку ._.
  2142.  
  2143. А есть только этот BEEDLOWCOD';
  2144. [18:10] +pekahucoa: use utf8;
  2145. ### Кеширование
  2146. sub rebuild_cache {
  2147. my $self = shift;
  2148.  
  2149. for my $SECTION(keys %{$self->{SECTIONS}}){
  2150. for(qw/post new_thread/){
  2151. open my $file ,'>',"forum/$SECTION/$_.html";
  2152. binmode($file);
  2153. print $file $self->{SECTIONS}{$SECTION}{tpl}->$_( {} , $self->{SECTIONS}{$SECTION} );
  2154. close $file;
  2155. }
  2156. }
  2157. }
  2158.  
  2159. sub rebuild_threads_cache {
  2160. my($self,$SECTION)=@_;
  2161. my($thread,$cnt);
  2162.  
  2163. my $threads=$self->{db}{forum}{threads}->find({section=>$SECTION},{ sort_by=> $self->{'sort_'.$self->{SECTIONS}{$SECTION}{SORTING}} });
  2164.  
  2165. while($thread = $threads->next){
  2166.  
  2167. # удаляем все старые страницы
  2168. unlink glob("forum/$thread->{section}/$thread->{path}/*$thread->{name}.html");
  2169.  
  2170. #создаем папку если нет. Хотя почему ее может не быть? да похуй, пусть эта строчка будет
  2171. mkdir("forum/$thread->{section}/$thread->{path}") unless(-d("forum/$thread->{section}/$thread->{path}"));
  2172.  
  2173. # ребилд страниц
  2174. $self->_build_pages($thread);
  2175.  
  2176. $cnt++;
  2177. }
  2178.  
  2179. return $cnt;
  2180. }
  2181.  
  2182. sub _build_pages {
  2183. my($self,$thread,$all)=@_;
  2184.  
  2185. my $pages= ceil( @{$thread->{posts}}/$self->{SECTIONS}{$thread->{section}}{POSTS_PER_PAGE} );
  2186. my @pages;
  2187.  
  2188.  
  2189. if($all or !-e("forum/$thread->{section}/$thread->{path}/$pages$thread->{name}.html"))
  2190. {@pages=(1..($pages?$pages:1))} # если последней страницы нет - пересобираем все
  2191. else
  2192. {@pages=($pages)}
  2193.  
  2194. foreach my $page(@pages) {
  2195. $page='' if($page<2);
  2196.  
  2197. open my $fhandle,'>',"forum/$thread->{section}/$thread->{path}/$page$thread->{name}.html" or die 'Page building error';
  2198. flock($fhandle,2); # 2 - LOCK_EX
  2199. binmode($fhandle);
  2200.  
  2201.  
  2202. $_=($page?$page-1:$page)*$self->{SECTIONS}{$thread->{section}}{POSTS_PER_PAGE};
  2203.  
  2204. print $fhandle $self->{SECTIONS}{$thread->{section}}{tpl}->thread({
  2205. %{$thread},
  2206. page => $page,
  2207. pages => $pages,
  2208.  
  2209. posts => $self->{db}->getPosts( 'forum','posts',
  2210.  
  2211. [
  2212. @{$thread->{posts}}[ $_..($_+$self->{SECTIONS}{$thread->{section}}{POSTS_PER_PAGE}-1)]
  2213. ] ,
  2214.  
  2215. {sort_by=>{time => 1}} ),
  2216.  
  2217.  
  2218. },{pagination=>"/forum/$thread->{section}/$thread->{path}/$thread->{name}.html", page => $page});
  2219.  
  2220. close $fhandle;
  2221. }
  2222.  
  2223. return $pages[-1];
  2224. }
  2225.  
  2226.  
  2227.  
  2228.  
  2229. 'Рейму - няшка :3 Насколько? Науке это не изестно, но сильно...'
  2230. [18:11] +pekahucoa: use utf8;
  2231. ### Кеширование
  2232. sub rebuild_cache {
  2233. my $self = shift;
  2234.  
  2235. for my $SECTION(keys %{$self->{SECTIONS}}){
  2236. for(qw/post new_thread/){
  2237. open my $file ,'>',"forum/$SECTION/$_.html";
  2238. binmode($file);
  2239. print $file $self->{SECTIONS}{$SECTION}{tpl}->$_( {} , $self->{SECTIONS}{$SECTION} );
  2240. close $file;
  2241. }
  2242. }
  2243. }
  2244.  
  2245. sub rebuild_threads_cache {
  2246. my($self,$SECTION)=@_;
  2247. my($thread,$cnt);
  2248.  
  2249. my $threads=$self->{db}{forum}{threads}->find({section=>$SECTION},{ sort_by=> $self->{'sort_'.$self->{SECTIONS}{$SECTION}{SORTING}} });
  2250.  
  2251. while($thread = $threads->next){
  2252.  
  2253. # удаляем все старые страницы
  2254. unlink glob("forum/$thread->{section}/$thread->{path}/*$thread->{name}.html");
  2255.  
  2256. #создаем папку если нет. Хотя почему ее может не быть? да похуй, пусть эта строчка будет
  2257. mkdir("forum/$thread->{section}/$thread->{path}") unless(-d("forum/$thread->{section}/$thread->{path}"));
  2258.  
  2259. # ребилд страниц
  2260. $self->_build_pages($thread);
  2261.  
  2262. $cnt++;
  2263. }
  2264.  
  2265. return $cnt;
  2266. }
  2267.  
  2268. sub _build_pages {
  2269. my($self,$thread,$all)=@_;
  2270.  
  2271. my $pages= ceil( @{$thread->{posts}}/$self->{SECTIONS}{$thread->{section}}{POSTS_PER_PAGE} );
  2272. my @pages;
  2273.  
  2274.  
  2275. if($all or !-e("forum/$thread->{section}/$thread->{path}/$pages$thread->{name}.html"))
  2276. {@pages=(1..($pages?$pages:1))} # если последней страницы нет - пересобираем все
  2277. else
  2278. {@pages=($pages)}
  2279.  
  2280. foreach my $page(@pages) {
  2281. $page='' if($page<2);
  2282.  
  2283. open my $fhandle,'>',"forum/$thread->{section}/$thread->{path}/$page$thread->{name}.html" or die 'Page building error';
  2284. flock($fhandle,2); # 2 - LOCK_EX
  2285. binmode($fhandle);
  2286.  
  2287.  
  2288. $_=($page?$page-1:$page)*$self->{SECTIONS}{$thread->{section}}{POSTS_PER_PAGE};
  2289.  
  2290. print $fhandle $self->{SECTIONS}{$thread->{section}}{tpl}->thread({
  2291. %{$thread},
  2292. page => $page,
  2293. pages => $pages,
  2294.  
  2295. posts => $self->{db}->getPosts( 'forum','posts',
  2296.  
  2297. [
  2298. @{$thread->{posts}}[ $_..($_+$self->{SECTIONS}{$thread->{section}}{POSTS_PER_PAGE}-1)]
  2299. ] ,
  2300.  
  2301. {sort_by=>{time => 1}} ),
  2302.  
  2303.  
  2304. },{pagination=>"/forum/$thread->{section}/$thread->{path}/$thread->{name}.html", page => $page});
  2305.  
  2306. close $fhandle;
  2307. }
  2308.  
  2309. return $pages[-1];
  2310. }
  2311.  
  2312.  
  2313.  
  2314.  
  2315. 'Рейму - няшка :3 Насколько? Науке это не изестно, но сильно...'
  2316. [18:11] +pekahucoa: use utf8;
  2317. ### Кеширование
  2318. sub rebuild_cache {
  2319. my $self = shift;
  2320.  
  2321. for my $SECTION(keys %{$self->{SECTIONS}}){
  2322. for(qw/post new_thread/){
  2323. open my $file ,'>',"forum/$SECTION/$_.html";
  2324. binmode($file);
  2325. print $file $self->{SECTIONS}{$SECTION}{tpl}->$_( {} , $self->{SECTIONS}{$SECTION} );
  2326. close $file;
  2327. }
  2328. }
  2329. }
  2330.  
  2331. sub rebuild_threads_cache {
  2332. my($self,$SECTION)=@_;
  2333. my($thread,$cnt);
  2334.  
  2335. my $threads=$self->{db}{forum}{threads}->find({section=>$SECTION},{ sort_by=> $self->{'sort_'.$self->{SECTIONS}{$SECTION}{SORTING}} });
  2336.  
  2337. while($thread = $threads->next){
  2338.  
  2339. # удаляем все старые страницы
  2340. unlink glob("forum/$thread->{section}/$thread->{path}/*$thread->{name}.html");
  2341.  
  2342. #создаем папку если нет. Хотя почему ее может не быть? да похуй, пусть эта строчка будет
  2343. mkdir("forum/$thread->{section}/$thread->{path}") unless(-d("forum/$thread->{section}/$thread->{path}"));
  2344.  
  2345. # ребилд страниц
  2346. $self->_build_pages($thread);
  2347.  
  2348. $cnt++;
  2349. }
  2350.  
  2351. return $cnt;
  2352. }
  2353.  
  2354. sub _build_pages {
  2355. my($self,$thread,$all)=@_;
  2356.  
  2357. my $pages= ceil( @{$thread->{posts}}/$self->{SECTIONS}{$thread->{section}}{POSTS_PER_PAGE} );
  2358. my @pages;
  2359.  
  2360.  
  2361. if($all or !-e("forum/$thread->{section}/$thread->{path}/$pages$thread->{name}.html"))
  2362. {@pages=(1..($pages?$pages:1))} # если последней страницы нет - пересобираем все
  2363. else
  2364. {@pages=($pages)}
  2365.  
  2366. foreach my $page(@pages) {
  2367. $page='' if($page<2);
  2368.  
  2369. open my $fhandle,'>',"forum/$thread->{section}/$thread->{path}/$page$thread->{name}.html" or die 'Page building error';
  2370. flock($fhandle,2); # 2 - LOCK_EX
  2371. binmode($fhandle);
  2372.  
  2373.  
  2374. $_=($page?$page-1:$page)*$self->{SECTIONS}{$thread->{section}}{POSTS_PER_PAGE};
  2375.  
  2376. print $fhandle $self->{SECTIONS}{$thread->{section}}{tpl}->thread({
  2377. %{$thread},
  2378. page => $page,
  2379. pages => $pages,
  2380.  
  2381. posts => $self->{db}->getPosts( 'forum','posts',
  2382.  
  2383. [
  2384. @{$thread->{posts}}[ $_..($_+$self->{SECTIONS}{$thread->{section}}{POSTS_PER_PAGE}-1)]
  2385. ] ,
  2386.  
  2387. {sort_by=>{time => 1}} ),
  2388.  
  2389.  
  2390. },{pagination=>"/forum/$thread->{section}/$thread->{path}/$thread->{name}.html", page => $page});
  2391.  
  2392. close $fhandle;
  2393. }
  2394.  
  2395. return $pages[-1];
  2396. }
  2397.  
  2398.  
  2399.  
  2400.  
  2401. 'Рейму - няшка :3 Насколько? Науке это не изестно, но сильно...'
  2402. [18:11] +pekahucoa: use utf8;
  2403. ### Кеширование
  2404. sub rebuild_cache {
  2405. my $self = shift;
  2406.  
  2407. for my $SECTION(keys %{$self->{SECTIONS}}){
  2408. for(qw/post new_thread/){
  2409. open my $file ,'>',"forum/$SECTION/$_.html";
  2410. binmode($file);
  2411. print $file $self->{SECTIONS}{$SECTION}{tpl}->$_( {} , $self->{SECTIONS}{$SECTION} );
  2412. close $file;
  2413. }
  2414. }
  2415. }
  2416.  
  2417. sub rebuild_threads_cache {
  2418. my($self,$SECTION)=@_;
  2419. my($thread,$cnt);
  2420.  
  2421. my $threads=$self->{db}{forum}{threads}->find({section=>$SECTION},{ sort_by=> $self->{'sort_'.$self->{SECTIONS}{$SECTION}{SORTING}} });
  2422.  
  2423. while($thread = $threads->next){
  2424.  
  2425. # удаляем все старые страницы
  2426. unlink glob("forum/$thread->{section}/$thread->{path}/*$thread->{name}.html");
  2427.  
  2428. #создаем папку если нет. Хотя почему ее может не быть? да похуй, пусть эта строчка будет
  2429. mkdir("forum/$thread->{section}/$thread->{path}") unless(-d("forum/$thread->{section}/$thread->{path}"));
  2430.  
  2431. # ребилд страниц
  2432. $self->_build_pages($thread);
  2433.  
  2434. $cnt++;
  2435. }
  2436.  
  2437. return $cnt;
  2438. }
  2439.  
  2440. sub _build_pages {
  2441. my($self,$thread,$all)=@_;
  2442.  
  2443. my $pages= ceil( @{$thread->{posts}}/$self->{SECTIONS}{$thread->{section}}{POSTS_PER_PAGE} );
  2444. my @pages;
  2445.  
  2446.  
  2447. if($all or !-e("forum/$thread->{section}/$thread->{path}/$pages$thread->{name}.html"))
  2448. {@pages=(1..($pages?$pages:1))} # если последней страницы нет - пересобираем все
  2449. else
  2450. {@pages=($pages)}
  2451.  
  2452. foreach my $page(@pages) {
  2453. $page='' if($page<2);
  2454.  
  2455. open my $fhandle,'>',"forum/$thread->{section}/$thread->{path}/$page$thread->{name}.html" or die 'Page building error';
  2456. flock($fhandle,2); # 2 - LOCK_EX
  2457. binmode($fhandle);
  2458.  
  2459.  
  2460. $_=($page?$page-1:$page)*$self->{SECTIONS}{$thread->{section}}{POSTS_PER_PAGE};
  2461.  
  2462. print $fhandle $self->{SECTIONS}{$thread->{section}}{tpl}->thread({
  2463. %{$thread},
  2464. page => $page,
  2465. pages => $pages,
  2466.  
  2467. posts => $self->{db}->getPosts( 'forum','posts',
  2468.  
  2469. [
  2470. @{$thread->{posts}}[ $_..($_+$self->{SECTIONS}{$thread->{section}}{POSTS_PER_PAGE}-1)]
  2471. ] ,
  2472.  
  2473. {sort_by=>{time => 1}} ),
  2474.  
  2475.  
  2476. },{pagination=>"/forum/$thread->{section}/$thread->{path}/$thread->{name}.html", page => $page});
  2477.  
  2478. close $fhandle;
  2479. }
  2480.  
  2481. return $pages[-1];
  2482. }
  2483.  
  2484.  
  2485.  
  2486.  
  2487. 'Рейму - няшка :3 Насколько? Науке это не изестно, но сильно...'
  2488. [18:11] +pekahucoa: use utf8;
  2489. ### Кеширование
  2490. sub rebuild_cache {
  2491. my $self = shift;
  2492.  
  2493. for my $SECTION(keys %{$self->{SECTIONS}}){
  2494. for(qw/post new_thread/){
  2495. open my $file ,'>',"forum/$SECTION/$_.html";
  2496. binmode($file);
  2497. print $file $self->{SECTIONS}{$SECTION}{tpl}->$_( {} , $self->{SECTIONS}{$SECTION} );
  2498. close $file;
  2499. }
  2500. }
  2501. }
  2502.  
  2503. sub rebuild_threads_cache {
  2504. my($self,$SECTION)=@_;
  2505. my($thread,$cnt);
  2506.  
  2507. my $threads=$self->{db}{forum}{threads}->find({section=>$SECTION},{ sort_by=> $self->{'sort_'.$self->{SECTIONS}{$SECTION}{SORTING}} });
  2508.  
  2509. while($thread = $threads->next){
  2510.  
  2511. # удаляем все старые страницы
  2512. unlink glob("forum/$thread->{section}/$thread->{path}/*$thread->{name}.html");
  2513.  
  2514. #создаем папку если нет. Хотя почему ее может не быть? да похуй, пусть эта строчка будет
  2515. mkdir("forum/$thread->{section}/$thread->{path}") unless(-d("forum/$thread->{section}/$thread->{path}"));
  2516.  
  2517. # ребилд страниц
  2518. $self->_build_pages($thread);
  2519.  
  2520. $cnt++;
  2521. }
  2522.  
  2523. return $cnt;
  2524. }
  2525.  
  2526. sub _build_pages {
  2527. my($self,$thread,$all)=@_;
  2528.  
  2529. my $pages= ceil( @{$thread->{posts}}/$self->{SECTIONS}{$thread->{section}}{POSTS_PER_PAGE} );
  2530. my @pages;
  2531.  
  2532.  
  2533. if($all or !-e("forum/$thread->{section}/$thread->{path}/$pages$thread->{name}.html"))
  2534. {@pages=(1..($pages?$pages:1))} # если последней страницы нет - пересобираем все
  2535. else
  2536. {@pages=($pages)}
  2537.  
  2538. foreach my $page(@pages) {
  2539. $page='' if($page<2);
  2540.  
  2541. open my $fhandle,'>',"forum/$thread->{section}/$thread->{path}/$page$thread->{name}.html" or die 'Page building error';
  2542. flock($fhandle,2); # 2 - LOCK_EX
  2543. binmode($fhandle);
  2544.  
  2545.  
  2546. $_=($page?$page-1:$page)*$self->{SECTIONS}{$thread->{section}}{POSTS_PER_PAGE};
  2547.  
  2548. print $fhandle $self->{SECTIONS}{$thread->{section}}{tpl}->thread({
  2549. %{$thread},
  2550. page => $page,
  2551. pages => $pages,
  2552.  
  2553. posts => $self->{db}->getPosts( 'forum','posts',
  2554.  
  2555. [
  2556. @{$thread->{posts}}[ $_..($_+$self->{SECTIONS}{$thread->{section}}{POSTS_PER_PAGE}-1)]
  2557. ] ,
  2558.  
  2559. {sort_by=>{time => 1}} ),
  2560.  
  2561.  
  2562. },{pagination=>"/forum/$thread->{section}/$thread->{path}/$thread->{name}.html", page => $page});
  2563.  
  2564. close $fhandle;
  2565. }
  2566.  
  2567. return $pages[-1];
  2568. }
  2569.  
  2570.  
  2571.  
  2572.  
  2573. 'Рейму - няшка :3 Насколько? Науке это не изестно, но сильно...'
  2574. [18:11] +pekahucoa: use utf8;
  2575. ### Кеширование
  2576. sub rebuild_cache {
  2577. my $self = shift;
  2578.  
  2579. for my $SECTION(keys %{$self->{SECTIONS}}){
  2580. for(qw/post new_thread/){
  2581. open my $file ,'>',"forum/$SECTION/$_.html";
  2582. binmode($file);
  2583. print $file $self->{SECTIONS}{$SECTION}{tpl}->$_( {} , $self->{SECTIONS}{$SECTION} );
  2584. close $file;
  2585. }
  2586. }
  2587. }
  2588.  
  2589. sub rebuild_threads_cache {
  2590. my($self,$SECTION)=@_;
  2591. my($thread,$cnt);
  2592.  
  2593. my $threads=$self->{db}{forum}{threads}->find({section=>$SECTION},{ sort_by=> $self->{'sort_'.$self->{SECTIONS}{$SECTION}{SORTING}} });
  2594.  
  2595. while($thread = $threads->next){
  2596.  
  2597. # удаляем все старые страницы
  2598. unlink glob("forum/$thread->{section}/$thread->{path}/*$thread->{name}.html");
  2599.  
  2600. #создаем папку если нет. Хотя почему ее может не быть? да похуй, пусть эта строчка будет
  2601. mkdir("forum/$thread->{section}/$thread->{path}") unless(-d("forum/$thread->{section}/$thread->{path}"));
  2602.  
  2603. # ребилд страниц
  2604. $self->_build_pages($thread);
  2605.  
  2606. $cnt++;
  2607. }
  2608.  
  2609. return $cnt;
  2610. }
  2611.  
  2612. sub _build_pages {
  2613. my($self,$thread,$all)=@_;
  2614.  
  2615. my $pages= ceil( @{$thread->{posts}}/$self->{SECTIONS}{$thread->{section}}{POSTS_PER_PAGE} );
  2616. my @pages;
  2617.  
  2618.  
  2619. if($all or !-e("forum/$thread->{section}/$thread->{path}/$pages$thread->{name}.html"))
  2620. {@pages=(1..($pages?$pages:1))} # если последней страницы нет - пересобираем все
  2621. else
  2622. {@pages=($pages)}
  2623.  
  2624. foreach my $page(@pages) {
  2625. $page='' if($page<2);
  2626.  
  2627. open my $fhandle,'>',"forum/$thread->{section}/$thread->{path}/$page$thread->{name}.html" or die 'Page building error';
  2628. flock($fhandle,2); # 2 - LOCK_EX
  2629. binmode($fhandle);
  2630.  
  2631.  
  2632. $_=($page?$page-1:$page)*$self->{SECTIONS}{$thread->{section}}{POSTS_PER_PAGE};
  2633.  
  2634. print $fhandle $self->{SECTIONS}{$thread->{section}}{tpl}->thread({
  2635. %{$thread},
  2636. page => $page,
  2637. pages => $pages,
  2638.  
  2639. posts => $self->{db}->getPosts( 'forum','posts',
  2640.  
  2641. [
  2642. @{$thread->{posts}}[ $_..($_+$self->{SECTIONS}{$thread->{section}}{POSTS_PER_PAGE}-1)]
  2643. ] ,
  2644.  
  2645. {sort_by=>{time => 1}} ),
  2646.  
  2647.  
  2648. },{pagination=>"/forum/$thread->{section}/$thread->{path}/$thread->{name}.html", page => $page});
  2649.  
  2650. close $fhandle;
  2651. }
  2652.  
  2653. return $pages[-1];
  2654. }
  2655.  
  2656.  
  2657.  
  2658.  
  2659. 'Рейму - няшка :3 Насколько? Науке это не изестно, но сильно...'
  2660. [18:11] +pekahucoa: use utf8;
  2661. ### Кеширование
  2662. sub rebuild_cache {
  2663. my $self = shift;
  2664.  
  2665. for my $SECTION(keys %{$self->{SECTIONS}}){
  2666. for(qw/post new_thread/){
  2667. open my $file ,'>',"forum/$SECTION/$_.html";
  2668. binmode($file);
  2669. print $file $self->{SECTIONS}{$SECTION}{tpl}->$_( {} , $self->{SECTIONS}{$SECTION} );
  2670. close $file;
  2671. }
  2672. }
  2673. }
  2674.  
  2675. sub rebuild_threads_cache {
  2676. my($self,$SECTION)=@_;
  2677. my($thread,$cnt);
  2678.  
  2679. my $threads=$self->{db}{forum}{threads}->find({section=>$SECTION},{ sort_by=> $self->{'sort_'.$self->{SECTIONS}{$SECTION}{SORTING}} });
  2680.  
  2681. while($thread = $threads->next){
  2682.  
  2683. # удаляем все старые страницы
  2684. unlink glob("forum/$thread->{section}/$thread->{path}/*$thread->{name}.html");
  2685.  
  2686. #создаем папку если нет. Хотя почему ее может не быть? да похуй, пусть эта строчка будет
  2687. mkdir("forum/$thread->{section}/$thread->{path}") unless(-d("forum/$thread->{section}/$thread->{path}"));
  2688.  
  2689. # ребилд страниц
  2690. $self->_build_pages($thread);
  2691.  
  2692. $cnt++;
  2693. }
  2694.  
  2695. return $cnt;
  2696. }
  2697.  
  2698. sub _build_pages {
  2699. my($self,$thread,$all)=@_;
  2700.  
  2701. my $pages= ceil( @{$thread->{posts}}/$self->{SECTIONS}{$thread->{section}}{POSTS_PER_PAGE} );
  2702. my @pages;
  2703.  
  2704.  
  2705. if($all or !-e("forum/$thread->{section}/$thread->{path}/$pages$thread->{name}.html"))
  2706. {@pages=(1..($pages?$pages:1))} # если последней страницы нет - пересобираем все
  2707. else
  2708. {@pages=($pages)}
  2709.  
  2710. foreach my $page(@pages) {
  2711. $page='' if($page<2);
  2712.  
  2713. open my $fhandle,'>',"forum/$thread->{section}/$thread->{path}/$page$thread->{name}.html" or die 'Page building error';
  2714. flock($fhandle,2); # 2 - LOCK_EX
  2715. binmode($fhandle);
  2716.  
  2717.  
  2718. $_=($page?$page-1:$page)*$self->{SECTIONS}{$thread->{section}}{POSTS_PER_PAGE};
  2719.  
  2720. print $fhandle $self->{SECTIONS}{$thread->{section}}{tpl}->thread({
  2721. %{$thread},
  2722. page => $page,
  2723. pages => $pages,
  2724.  
  2725. posts => $self->{db}->getPosts( 'forum','posts',
  2726.  
  2727. [
  2728. @{$thread->{posts}}[ $_..($_+$self->{SECTIONS}{$thread->{section}}{POSTS_PER_PAGE}-1)]
  2729. ] ,
  2730.  
  2731. {sort_by=>{time => 1}} ),
  2732.  
  2733.  
  2734. },{pagination=>"/forum/$thread->{section}/$thread->{path}/$thread->{name}.html", page => $page});
  2735.  
  2736. close $fhandle;
  2737. }
  2738.  
  2739. return $pages[-1];
  2740. }
  2741.  
  2742.  
  2743.  
  2744.  
  2745. 'Рейму - няшка :3 Насколько? Науке это не изестно, но сильно...'
  2746. [18:11] +pekahucoa: use utf8;
  2747. ### Кеширование
  2748. sub rebuild_cache {
  2749. my $self = shift;
  2750.  
  2751. for my $SECTION(keys %{$self->{SECTIONS}}){
  2752. for(qw/post new_thread/){
  2753. open my $file ,'>',"forum/$SECTION/$_.html";
  2754. binmode($file);
  2755. print $file $self->{SECTIONS}{$SECTION}{tpl}->$_( {} , $self->{SECTIONS}{$SECTION} );
  2756. close $file;
  2757. }
  2758. }
  2759. }
  2760.  
  2761. sub rebuild_threads_cache {
  2762. my($self,$SECTION)=@_;
  2763. my($thread,$cnt);
  2764.  
  2765. my $threads=$self->{db}{forum}{threads}->find({section=>$SECTION},{ sort_by=> $self->{'sort_'.$self->{SECTIONS}{$SECTION}{SORTING}} });
  2766.  
  2767. while($thread = $threads->next){
  2768.  
  2769. # удаляем все старые страницы
  2770. unlink glob("forum/$thread->{section}/$thread->{path}/*$thread->{name}.html");
  2771.  
  2772. #создаем папку если нет. Хотя почему ее может не быть? да похуй, пусть эта строчка будет
  2773. mkdir("forum/$thread->{section}/$thread->{path}") unless(-d("forum/$thread->{section}/$thread->{path}"));
  2774.  
  2775. # ребилд страниц
  2776. $self->_build_pages($thread);
  2777.  
  2778. $cnt++;
  2779. }
  2780.  
  2781. return $cnt;
  2782. }
  2783.  
  2784. sub _build_pages {
  2785. my($self,$thread,$all)=@_;
  2786.  
  2787. my $pages= ceil( @{$thread->{posts}}/$self->{SECTIONS}{$thread->{section}}{POSTS_PER_PAGE} );
  2788. my @pages;
  2789.  
  2790.  
  2791. if($all or !-e("forum/$thread->{section}/$thread->{path}/$pages$thread->{name}.html"))
  2792. {@pages=(1..($pages?$pages:1))} # если последней страницы нет - пересобираем все
  2793. else
  2794. {@pages=($pages)}
  2795.  
  2796. foreach my $page(@pages) {
  2797. $page='' if($page<2);
  2798.  
  2799. open my $fhandle,'>',"forum/$thread->{section}/$thread->{path}/$page$thread->{name}.html" or die 'Page building error';
  2800. flock($fhandle,2); # 2 - LOCK_EX
  2801. binmode($fhandle);
  2802.  
  2803.  
  2804. $_=($page?$page-1:$page)*$self->{SECTIONS}{$thread->{section}}{POSTS_PER_PAGE};
  2805.  
  2806. print $fhandle $self->{SECTIONS}{$thread->{section}}{tpl}->thread({
  2807. %{$thread},
  2808. page => $page,
  2809. pages => $pages,
  2810.  
  2811. posts => $self->{db}->getPosts( 'forum','posts',
  2812.  
  2813. [
  2814. @{$thread->{posts}}[ $_..($_+$self->{SECTIONS}{$thread->{section}}{POSTS_PER_PAGE}-1)]
  2815. ] ,
  2816.  
  2817. {sort_by=>{time => 1}} ),
  2818.  
  2819.  
  2820. },{pagination=>"/forum/$thread->{section}/$thread->{path}/$thread->{name}.html", page => $page});
  2821.  
  2822. close $fhandle;
  2823. }
  2824.  
  2825. return $pages[-1];
  2826. }
  2827.  
  2828.  
  2829.  
  2830.  
  2831. 'Рейму - няшка :3 Насколько? Науке это не изестно, но сильно...'
  2832. [18:11] +pekahucoa: use utf8;
  2833. ### Кеширование
  2834. sub rebuild_cache {
  2835. my $self = shift;
  2836.  
  2837. for my $SECTION(keys %{$self->{SECTIONS}}){
  2838. for(qw/post new_thread/){
  2839. open my $file ,'>',"forum/$SECTION/$_.html";
  2840. binmode($file);
  2841. print $file $self->{SECTIONS}{$SECTION}{tpl}->$_( {} , $self->{SECTIONS}{$SECTION} );
  2842. close $file;
  2843. }
  2844. }
  2845. }
  2846.  
  2847. sub rebuild_threads_cache {
  2848. my($self,$SECTION)=@_;
  2849. my($thread,$cnt);
  2850.  
  2851. my $threads=$self->{db}{forum}{threads}->find({section=>$SECTION},{ sort_by=> $self->{'sort_'.$self->{SECTIONS}{$SECTION}{SORTING}} });
  2852.  
  2853. while($thread = $threads->next){
  2854.  
  2855. # удаляем все старые страницы
  2856. unlink glob("forum/$thread->{section}/$thread->{path}/*$thread->{name}.html");
  2857.  
  2858. #создаем папку если нет. Хотя почему ее может не быть? да похуй, пусть эта строчка будет
  2859. mkdir("forum/$thread->{section}/$thread->{path}") unless(-d("forum/$thread->{section}/$thread->{path}"));
  2860.  
  2861. # ребилд страниц
  2862. $self->_build_pages($thread);
  2863.  
  2864. $cnt++;
  2865. }
  2866.  
  2867. return $cnt;
  2868. }
  2869.  
  2870. sub _build_pages {
  2871. my($self,$thread,$all)=@_;
  2872.  
  2873. my $pages= ceil( @{$thread->{posts}}/$self->{SECTIONS}{$thread->{section}}{POSTS_PER_PAGE} );
  2874. my @pages;
  2875.  
  2876.  
  2877. if($all or !-e("forum/$thread->{section}/$thread->{path}/$pages$thread->{name}.html"))
  2878. {@pages=(1..($pages?$pages:1))} # если последней страницы нет - пересобираем все
  2879. else
  2880. {@pages=($pages)}
  2881.  
  2882. foreach my $page(@pages) {
  2883. $page='' if($page<2);
  2884.  
  2885. open my $fhandle,'>',"forum/$thread->{section}/$thread->{path}/$page$thread->{name}.html" or die 'Page building error';
  2886. flock($fhandle,2); # 2 - LOCK_EX
  2887. binmode($fhandle);
  2888.  
  2889.  
  2890. $_=($page?$page-1:$page)*$self->{SECTIONS}{$thread->{section}}{POSTS_PER_PAGE};
  2891.  
  2892. print $fhandle $self->{SECTIONS}{$thread->{section}}{tpl}->thread({
  2893. %{$thread},
  2894. page => $page,
  2895. pages => $pages,
  2896.  
  2897. posts => $self->{db}->getPosts( 'forum','posts',
  2898.  
  2899. [
  2900. @{$thread->{posts}}[ $_..($_+$self->{SECTIONS}{$thread->{section}}{POSTS_PER_PAGE}-1)]
  2901. ] ,
  2902.  
  2903. {sort_by=>{time => 1}} ),
  2904.  
  2905.  
  2906. },{pagination=>"/forum/$thread->{section}/$thread->{path}/$thread->{name}.html", page => $page});
  2907.  
  2908. close $fhandle;
  2909. }
  2910.  
  2911. return $pages[-1];
  2912. }
  2913.  
  2914.  
  2915.  
  2916.  
  2917. 'Рейму - няшка :3 Насколько? Науке это не изестно, но сильно...'
  2918. [18:28] @mdhasik: pekahucoa: ты хуй
  2919. [18:28] %big brother: нет я
  2920. [18:28] Тема 'Добро пожаловать в фанклуб мдхасика!'
  2921. [18:28] +pekahucoa:
  2922. [17:19:00]
  2923. mdhasik: >$page?$page-1:$page
  2924. [17:19:05]
  2925. mdhasik: говнокодер
  2926. [18:59] %PeKa: 77.246.104.149 Any Drop
  2927. Active
RAW Paste Data