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