daily pastebin goal
33%
SHARE
TWEET

Untitled

a guest Jun 9th, 2011 1,171 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
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top