# $File: //depot/libOurNet/BBS/lib/OurNet/BBS/CVIC/Group.pm $ $Author: autrijus $ # $Revision: #4 $ $Change: 4012 $ $DateTime: 2003/01/29 11:06:24 $ package OurNet::BBS::CVIC::Group; use if $OurNet::BBS::Encoding, 'open' => ":encoding($OurNet::BBS::Encoding)"; use strict; no warnings 'deprecated'; use fields qw/bbsroot bbsego brdobj group mtime _ego _hash/; use OurNet::BBS::Base ( 'GroupGroup' => [qw/&_brdobj/], ); sub writeok { 0 }; sub readok { 1 }; # Fetch key: id savemode author date title filemode body sub refresh_meta { my ($self, $key) = @_; return unless $self->{group}; if (!$key or index(' owner title id ', " $key ") > -1) { @{$self->{_hash}}{qw/owner title id/} = @{$self->{brdobj}}{qw/bm title id/}; return 1 if $key; } my $file = "$self->{bbsroot}/group/$self->{group}"; # return if $self->filestamp($file); my $GROUP; open($GROUP, "<$file") or open($GROUP, "+>>$file") or die("Cannot read group file $file: $!"); my %remain = %{$self->{_hash} || {}}; while ($key = <$GROUP>) { $key = $1 if $key =~ m/([\w\-\.]+)/; if (-e "$self->{bbsroot}/group/$key") { $self->{_hash}{$key} = $self->module('Group')->new( @{$self}{qw/bbsroot bbsego/}, $self->_brdobj($key), $key, ); delete $remain{$key}; } elsif (substr($key, 0, 1) eq '+' and -e "$self->{bbsroot}/group/".($key = substr($key, 1))) { %{$self->{_hash}} = ( %{$self->module('Group')->new( @{$self}{qw/bbsroot bbsego/}, $self->_brdobj($key), $key )}, %{$self->{_hash}}, ); } elsif (-e "$self->{bbsroot}/boards/$key/.DIR") { $self->{_hash}{$key} = $self->module('Board')->new( $self->{bbsroot}, $key, ); delete $remain{$key}; } } delete @{$self->{_hash}}{keys(%remain)}; close $GROUP; } sub DELETE { my ($self, $key) = @_; $self = $self->ego; $self->refresh($key); return unless delete($self->{_hash}{$key}); my $file = "$self->{bbsroot}/group/$self->{group}"; open(my $GROUP, "<$file") or die "Cannot read group file $file: $!"; my $content = join ('', grep { not m/\b$key\b/ } <$GROUP>); close $GROUP; open($GROUP, ">$file") or die "Cannot write group file $file: $!"; print $GROUP $content; close $GROUP; } sub STORE { my ($self, $key, $value) = @_; $self = $self->ego; my $file = "$self->{bbsroot}/group/$self->{group}"; return if exists $self->{_hash}{$key}; # doesn't make sense yet die "doesn't exists such group or board $key: panic!" unless (-e "$self->{bbsroot}/group/$key" or -e "$self->{bbsroot}/boards/$key/.DIR"); open(my $GROUP, ">>$file") or die "Cannot append group file $file: $!"; print $GROUP $key, "\n"; close $GROUP; } sub remove { my $self = shift; return unlink(join('/', $self->{bbsroot}, 'group', $self->{group})); } 1;