1# $File: //depot/libOurNet/BBS/lib/OurNet/BBS/BBSAgent/ArticleGroup.pm $ $Author: autrijus $ 2# $Revision: #3 $ $Change: 3807 $ $DateTime: 2003/01/24 22:48:36 $ 3 4package OurNet::BBS::BBSAgent::ArticleGroup; 5 6use strict; 7no warnings 'deprecated'; 8use fields qw/bbsroot bbsobj board basepath article_size _ego _hash _array/; 9use OurNet::BBS::Base; 10 11my $lastpost = 0; 12 13sub refresh_meta { 14 my ($self, $key, $flag) = @_; 15 16 die 'hash key not implemented' if $flag == HASH; 17 18 $self->{_ego}->FETCHSIZE; 19 20 if (defined $key) { 21 # out-of-bound check 22 return if $key < 0 or $key >= $self->{article_size}; 23 return if $self->{_array}[$key]; 24 25 $self->{_array}[$key] = $self->module('Article')->new( 26 @{$self}{qw/bbsroot bbsobj board/}, $key + 1, 27 ); 28 29 return 1; 30 } 31 32 return if $self->{article_size}; 33 34 @{$self->{_array}} = map { 35 $self->module('Article')->new( 36 @{$self}{qw/bbsroot bbsobj board/}, $_, 37 ) 38 } (0 .. $self->{article_size} - 1); 39 40 return 1; 41} 42 43sub FETCHSIZE { 44 my $self = shift->ego; 45 46 no warnings 'numeric'; 47 return $self->{article_size} 48 ||= int($self->{bbsobj}->board_list_last($self->{board})); 49} 50 51sub STORE { 52 my ($self, $key, $value) = @_; 53 $self = $self->ego; 54 55 my $body = $value->{body}; 56 57 $body =~ s/\x1b/$self->{bbsobj}{var}{escape}/g 58 if defined $self->{bbsobj}{var}{escape}; 59 60 $body =~ s/(?<!\015)\012/\015\012/g; # crlf: sensible 61 $body = "�@��: $value->{header}{From} ". 62 "�ݪO: $value->{header}{Board}\015\012". 63 "���D: $value->{header}{Subject}\015\012". 64 "�ɶ�: $value->{header}{Date}\015\012\015\012". 65 $body; 66 67 my $author = $1 if $value->{header}{From} =~ m/([^\s@]+)/; 68 69 if ($author ne $self->{bbsobj}{var}{username}) { 70 $author =~ s/\..*//; 71 $author .= '.'; 72 } 73 74 $self->{bbsobj}->article_post_raw( 75 $self->{board}, $value->{header}{Subject}, $body, $author, 76 ); 77 78 sleep 1 if (time - $lastpost) < 2; # avoids same-time posting 79 $lastpost = time; 80 81 return 1; 82} 83 841; 85