Advertisement
3morfg

ninpocho

Jul 25th, 2022 (edited)
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 7.53 KB | None | 0 0
  1. #============================================================================================================
  2. #
  3. #   拡張機能 - 忍法帖プラグイン
  4. #   0ch_ninpocho.pl
  5. #
  6. #============================================================================================================
  7. package ZPL_ninpocho;
  8.  
  9. use CGI::Cookie;
  10. use CGI::Session;
  11.  
  12.  
  13. #------------------------------------------------------------------------------------------------------------
  14. #   拡張機能名称取得
  15. #------------------------------------------------------------------------------------------------------------
  16. sub getName
  17. {
  18.     return '忍法帖プラグイン';
  19. }
  20.  
  21. #------------------------------------------------------------------------------------------------------------
  22. #   拡張機能説明取得
  23. #------------------------------------------------------------------------------------------------------------
  24. sub getExplanation
  25. {
  26.     return '忍法帖プラグイン';
  27. }
  28.  
  29. #------------------------------------------------------------------------------------------------------------
  30. #   拡張機能タイプ取得
  31. #------------------------------------------------------------------------------------------------------------
  32. sub getType
  33. {
  34.     return 16;
  35. }
  36.  
  37. #------------------------------------------------------------------------------------------------------------
  38. #   設定リスト取得 (0ch+ Only)
  39. #------------------------------------------------------------------------------------------------------------
  40. sub getConfig
  41. {
  42.     return {};
  43. }
  44.  
  45. #------------------------------------------------------------------------------------------------------------
  46. #   拡張機能実行インタフェイス
  47. #------------------------------------------------------------------------------------------------------------
  48. sub execute
  49. {
  50.     my $this = shift;
  51.     my ($Sys, $Form, $type) = @_;
  52.    
  53.     # 0ch本家では実行しない
  54.     return 0 if (!$this->{'is0ch+'});
  55.  
  56.     if ($type == 16) {
  57.         # infoディレクトリ
  58.         my $infoDir = $Sys->Get('INFO');
  59.  
  60.         # IPアドレスを取得
  61.         my $ipAddr = "$ENV{'REMOTE_ADDR'}";
  62.  
  63.         # Cookie管理モジュールを用意
  64.         my $Cookie = $Sys->Get('MainCGI')->{'COOKIE'};
  65.  
  66.         # CookieからセッションIDを取得
  67.         my $sid = $Cookie->Get('countsession');
  68.         if ($sid eq '') {
  69.             %cookies = fetch CGI::Cookie;
  70.             if (exists $cookies{'countsession'}) {
  71.                 $sid = $cookies{'countsession'}->value;
  72.                 $sid =~ s/"//g;
  73.             }
  74.         }
  75.  
  76.         # 忍法帖データディレクトリを設定
  77.         my $ninDir = ".$infoDir/.nin/";
  78.         mkdir $ninDir if ! -d $ninDir;
  79.  
  80.         # IPアドレスを記録
  81.         my $ssPath = "${ninDir}cgisess_${sid}";
  82.         $sid = '' if ! -f $ssPath;
  83.         my $ipPath = "${ninDir}ip_${ipAddr}";
  84.         if ($sid ne '' && ! -f $ipPath) {
  85.             open(my $fh, ">", $ipPath);
  86.             print $fh $sid;
  87.             close($fh);
  88.         }
  89.         if (-f $ipPath && open(my $fh, "<", $ipPath)) {
  90.             my $sidData = <$fh>;
  91.             $sid = $sidData if $sidData ne '';
  92.             my $ssPath = "${ninDir}cgisess_${sid}";
  93.             $sid = '' if ! -f $ssPath;
  94.             if ($sid eq '' && -f $ipPath) {
  95.                 open(my $fh, ">", $ipPath);
  96.                 print $fh '';
  97.                 close($fh);
  98.             } else {
  99.                 $total_code .= 'イ' if $sid ne '';
  100.             }
  101.             close($fh);
  102.         }
  103.         if ($sid eq '' && -d $ninDir) {
  104.             my $fsrslt = fsearch($ninDir, $ipAddr);
  105.             if ($fsrslt =~ /cgisess_/) {
  106.                 $sid = $fsrslt;
  107.         $sid =~ s|.+?cgisess_||;
  108.                 $total_code .= 'イ';
  109.             }
  110.         }
  111.  
  112.     # セッションを読み込む
  113.     my $session = CGI::Session->new('driver:file;serializer:default', $sid, { Directory => $ninDir }) || 0;
  114.  
  115.     # セッションから忍法帖Lvを取得
  116.     $ninLv = $session->param('ninLv') || 1;
  117.  
  118.         # セッションから書き込み数を取得
  119.         my $count = $session->param('count') || 0;
  120.  
  121.     # 書き込んだ時間を取得
  122.         my $resTime = time();
  123.     # 書き込んだ時間の23時間後を取得
  124.         my $time23h = time() + 82800;
  125.         # セッションから前回レベルアップしたときの時間を取得
  126.         my $lvUpTime = $session->param('lvuptime') || $time23h;
  127.  
  128.     # 書き込み数をカウント
  129.         $count++;
  130.  
  131.         # レベルの上限
  132.         my $lvLim = 40;
  133.  
  134.     # 前回のレベルアップから23時間以上経過していればレベルアップ
  135.     if ($resTime >= $lvUpTime && $ninLv < $lvLim) {
  136.       $ninLv++;
  137.       $lvUpTime = $time23h;
  138.     }
  139.  
  140.         # セッションに記録
  141.         if ($session) {
  142.             $session->param('count', $count);
  143.             $session->param('ninLv', $ninLv);
  144.             $session->param('lvuptime', $lvUpTime);
  145.         }
  146.  
  147.         # セッションIDをクッキーに出力
  148.         if ($sid eq '') {
  149.             $sid = $session->id();
  150.         }
  151.         $Cookie->Set('countsession', $sid);
  152.  
  153.         # 名前欄取得
  154.         my $name = $Form->Get('FROM');
  155.  
  156.         # 名前欄書き換え
  157.         $name =~ s|!ninja|</b>【忍法帖Lv.$ninLv<b>|g;
  158.         $name =~ s|!total|</b>【総カキコ数:$count<b>|g;
  159.  
  160.         # 名前欄再設定
  161.         $Form->Set('FROM', $name);
  162.   }
  163.  
  164.     return 0;
  165. }
  166.  
  167. #------------------------------------------------------------------------------------------------------------
  168. #   ファイル全文検索
  169. #------------------------------------------------------------------------------------------------------------
  170. sub fsearch {
  171.   my($dir, $word) = @_;
  172.     my $result = '';
  173.  
  174.   opendir(DIR, $dir);
  175.   my @dir = sort { $a cmp $b } readdir(DIR);
  176.   closedir(DIR);
  177.  
  178.   foreach my $file (@dir) {
  179.     if ($file eq '.' or $file eq '..') {
  180.       next;
  181.     }
  182.  
  183.     my $target = "$dir$file";
  184.  
  185.     if (-d $target) {
  186.       &search("$target/", $word);
  187.     } else {
  188.       my $flag = 0;
  189.  
  190.       open(FH, $target);
  191.       while (my $line = <FH>) {
  192.         if (index(lc($line), lc($word)) >= 0) {
  193.           $flag = 1;
  194.         }
  195.       }
  196.       close(FH);
  197.  
  198.       if ($flag) {
  199.         $result = $target;
  200.                 last;
  201.       }
  202.     }
  203.   }
  204.  
  205.   return $result;
  206. }
  207.  
  208. #------------------------------------------------------------------------------------------------------------
  209. #   コンストラクタ
  210. #------------------------------------------------------------------------------------------------------------
  211. sub new
  212. {
  213.     my $class = shift;
  214.     my ($Config) = @_;
  215.    
  216.     my $this = {};
  217.     bless $this, $class;
  218.    
  219.     if (defined $Config) {
  220.         $this->{'PLUGINCONF'} = $Config;
  221.         $this->{'is0ch+'} = 1;
  222.     }
  223.     else {
  224.         $this->{'CONFIG'} = $class->getConfig();
  225.         $this->{'is0ch+'} = 0;
  226.     }
  227.    
  228.     return $this;
  229. }
  230.  
  231. #------------------------------------------------------------------------------------------------------------
  232. #   設定値取得 (0ch+ Only)
  233. #------------------------------------------------------------------------------------------------------------
  234. sub GetConf
  235. {
  236.     my $this = shift;
  237.     my ($key) = @_;
  238.     if ($this->{'is0ch+'}) {
  239.         return $this->{'PLUGINCONF'}->GetConfig($key);
  240.     }
  241.     elsif (defined $this->{'CONFIG'}->{$key}) {
  242.         return $this->{'CONFIG'}->{$key}->{'default'};
  243.     }
  244. }
  245.  
  246. #------------------------------------------------------------------------------------------------------------
  247. #   設定値設定 (0ch+ Only)
  248. #------------------------------------------------------------------------------------------------------------
  249. sub SetConf
  250. {
  251.     my $this = shift;
  252.     my ($key, $val) = @_;
  253.     if ($this->{'is0ch+'}) {
  254.         $this->{'PLUGINCONF'}->SetConfig($key, $val);
  255.     }
  256.     elsif (defined $this->{'CONFIG'}->{$key}) {
  257.         $this->{'CONFIG'}->{$key}->{'default'} = $val;
  258.     }
  259.     else {
  260.         $this->{'CONFIG'}->{$key} = { 'default' => $val };
  261.     }
  262. }
  263.  
  264. #============================================================================================================
  265. #   Module END
  266. #============================================================================================================
  267. 1;
  268.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement