$VERSION
=
'1.06'
;
my
%fields
= (
articleid
=> {
type
=> 0,
html
=> 0 },
quickname
=> {
type
=> 1,
html
=> 0 },
title
=> {
type
=> 1,
html
=> 1 },
);
my
(
@mandatory
,
@allfields
);
for
(
keys
%fields
) {
push
@mandatory
,
$_
if
(
$fields
{
$_
}->{type});
push
@allfields
,
$_
;
}
my
$LEVEL
= ADMIN;
my
$SECTIONID
= 6;
my
%cfields
= (
articleid
=> {
type
=> 0,
html
=> 0 },
commentid
=> {
type
=> 0,
html
=> 0 },
subject
=> {
type
=> 0,
html
=> 1 },
body
=> {
type
=> 1,
html
=> 3 },
author
=> {
type
=> 1,
html
=> 1 },
href
=> {
type
=> 0,
html
=> 1 },
publish
=> {
type
=> 0,
html
=> 0 },
);
my
(
@cmandatory
,
@callfields
);
for
(
keys
%cfields
) {
push
@cmandatory
,
$_
if
(
$cfields
{
$_
}->{type});
push
@callfields
,
$_
;
}
my
(
$BLOCK
,
$ALLOW
) = (1,2);
sub
Archive {
my
$oldid
=
$cgiparams
{sectionid};
$cgiparams
{sectionid} =
$SECTIONID
;
$cgiparams
{section} =
'diary'
;
shift
->SUPER::Archive();
$tvars
{articles} =
undef
;
$cgiparams
{sectionid} =
$oldid
;
}
sub
Page {
return
List()
if
(
$cgiparams
{volume});
$cgiparams
{sectionid} =
$SECTIONID
;
$settings
{data}{article_pageset} =
$settings
{diary_pageset};
shift
->SUPER::Page();
_count_comments();
}
sub
List {
$cgiparams
{sectionid} =
$SECTIONID
;
$settings
{data}{article_limit} =
$settings
{diary_limit};
$settings
{data}{article_stop} =
$settings
{diary_stop};
if
(
$cgiparams
{volume}) {
$settings
{where} =
'createdate > '
. _vol2date(
$cgiparams
{volume}) .
' AND createdate < '
. _vol2date(
$cgiparams
{volume} + 1);
}
shift
->SUPER::List();
_count_comments();
my
$this
= 0;
if
(
$cgiparams
{volume}) {
for
my
$vol
(@{
$tvars
{archive}{diary}}) {
if
(
$cgiparams
{volume} ==
$vol
->{volumeid}) {
$this
= 1;
}
else
{
$tvars
{archive}{volumes}{prev} =
$vol
if
(!
$this
);
$tvars
{archive}{volumes}{
next
} ||=
$vol
if
(
$this
);
}
}
}
}
sub
Meta {
return
unless
(
$cgiparams
{data});
my
$oldid
=
$cgiparams
{sectionid};
$cgiparams
{sectionid} =
$SECTIONID
;
$settings
{data}{article_limit} =
$settings
{diary_limit};
$settings
{data}{article_stop} =
$settings
{diary_stop};
shift
->SUPER::Meta();
_count_comments();
$cgiparams
{sectionid} =
$oldid
;
}
sub
Cloud {
my
$oldid
=
$cgiparams
{sectionid};
$cgiparams
{sectionid} =
$SECTIONID
;
$cgiparams
{actcode} =
'diary-meta'
;
shift
->SUPER::Cloud();
$cgiparams
{sectionid} =
$oldid
;
}
sub
Search {
return
unless
(
$cgiparams
{data});
my
$oldid
=
$cgiparams
{sectionid};
$cgiparams
{sectionid} =
$SECTIONID
;
$settings
{data}{article_limit} =
$settings
{diary_limit};
$settings
{data}{article_stop} =
$settings
{diary_stop};
shift
->SUPER::Search();
_count_comments();
$cgiparams
{sectionid} =
$oldid
;
}
sub
Item {
my
$oldid
=
$cgiparams
{sectionid};
$cgiparams
{sectionid} =
$SECTIONID
;
shift
->SUPER::Item();
$tvars
{diary} =
$tvars
{article};
my
@rows
=
$dbi
->GetQuery(
'hash'
,
'GetDiaryComments'
,
$tvars
{diary}->{data}->{articleid});
for
(
@rows
) {
$_
->{postdate} = formatDate(6,
$_
->{createdate});
}
$tvars
{comments} = \
@rows
;
$cgiparams
{sectionid} =
$oldid
;
}
sub
Comment {
my
$check
= CheckIP();
if
(
$check
==
$BLOCK
||
$cgiparams
{typekey}
|| !
$cgiparams
{loopback}
||
$cgiparams
{loopback} ne
$settings
{ipaddr}) {
$tvars
{thanks} = 3;
return
;
}
$cgiparams
{publish} =
$check
==
$ALLOW
? 3 : 2;
for
(
keys
%cfields
) {
next
unless
(
$cfields
{
$_
});
if
(
$cfields
{
$_
}->{html} == 1) {
$cgiparams
{
$_
} = CleanHTML(
$cgiparams
{
$_
}) }
elsif
(
$cfields
{
$_
}->{html} == 2) {
$cgiparams
{
$_
} = CleanTags(
$cgiparams
{
$_
}) }
elsif
(
$cfields
{
$_
}->{html} == 3) {
$cgiparams
{
$_
} = CleanTags(
$cgiparams
{
$_
}) }
}
return
if
FieldCheck(\
@callfields
,\
@cmandatory
);
if
(
$tvars
{data}->{subject} eq
'ARRAY(0x84fb748)'
) {
$tvars
{thanks} = 3;
return
;
}
my
@fields
= (
$tvars
{data}->{articleid},
$tvars
{data}->{subject},
formatDate(),
$tvars
{data}->{body},
$tvars
{data}->{author},
$tvars
{data}->{href},
$tvars
{data}->{publish},
$settings
{ipaddr}
);
$dbi
->IDQuery(
'AddComment'
,
@fields
);
$tvars
{thanks} =
$check
==
$ALLOW
? 2 : 1;
}
sub
LatestComments {
my
@rows
=
$dbi
->GetQuery(
'hash'
,
'GetCommentsLatest'
);
$tvars
{latest}->{comments} = \
@rows
;
}
sub
Posted {
return
unless
(
$cgiparams
{
'userid'
});
my
@rows
=
$dbi
->GetQuery(
'array'
,
'CountPosts'
,
$cgiparams
{
'userid'
});
$tvars
{data}{posts} =
@rows
?
$rows
[0]->[0] : 0;
}
sub
Access { Authorised(
$LEVEL
) }
sub
Admin {
return
unless
AccessUser(
$LEVEL
);
$cgiparams
{sectionid} =
$SECTIONID
;
shift
->SUPER::Admin();
for
my
$article
(@{
$tvars
{data} }) {
my
@rows
=
$dbi
->GetQuery(
'array'
,
'CountDiaryComments'
,{
ids
=>
$article
->{articleid}});
$article
->{comments} =
@rows
?
$rows
[0]->[1] :
''
;
}
}
sub
Add {
return
unless
AccessUser(
$LEVEL
);
$cgiparams
{sectionid} =
$SECTIONID
;
my
$self
=
shift
;
$self
->SUPER::Add();
$self
->SUPER::Tags();
}
sub
Edit {
return
unless
AccessUser(
$LEVEL
);
$cgiparams
{sectionid} =
$SECTIONID
;
my
$self
=
shift
;
$self
->SUPER::Edit();
$self
->SUPER::Tags();
my
@rows
=
$dbi
->GetQuery(
'hash'
,
'GetDiaryComments'
,
$tvars
{article}->{data}->{articleid});
for
(
@rows
) {
$_
->{postdate} = formatDate(6,
$_
->{createdate});
}
$tvars
{articles}->{
$tvars
{primary}}->{data}{comments} =
scalar
(
@rows
);
$tvars
{comments} = \
@rows
if
(
@rows
);
}
sub
Save {
return
unless
AccessUser(
$LEVEL
);
$cgiparams
{sectionid} =
$SECTIONID
;
$cgiparams
{quickname} = formatDate(0);
shift
->SUPER::Save();
}
sub
Delete {
return
unless
AccessUser(
$LEVEL
);
$cgiparams
{sectionid} =
$SECTIONID
;
shift
->SUPER::Delete();
}
sub
ListComment {
return
unless
AccessUser(
$LEVEL
);
my
(
@rows
);
if
(
$cgiparams
{pattern}) {
@rows
=
$dbi
->GetQuery(
'hash'
,
'GetCommentMatches'
,
'%'
.
$cgiparams
{pattern}.
'%'
);
for
my
$row
(
@rows
) {
BlockIP(
$row
->{author},
$row
->{ipaddr});
$dbi
->DoQuery(
'DeleteComment'
,
$row
->{
'commentid'
});
}
}
@rows
=
$dbi
->GetQuery(
'hash'
,
'GetAdminCommentIDs'
);
my
$start
=
$cgiparams
{start} || 1;
my
$limit
=
$cgiparams
{limit} ||
$settings
{comment_limit} || 100;
my
$last
=
int
(
scalar
(
@rows
) /
$limit
);
my
$max
=
scalar
(
@rows
);
LogDebug(
"start=$start, limit=$limit, last=$last, max=$max"
);
if
(
@rows
) {
my
$count
= (
$start
-1) *
$limit
;
splice
(
@rows
,0,
$count
)
if
(
$count
> 0);
splice
(
@rows
,
$limit
)
if
(
@rows
>
$limit
);
my
$ids
=
join
(
','
,
map
{
$_
->{commentid}}
@rows
);
@rows
=
$dbi
->GetQuery(
'hash'
,
'GetAdminComments'
,{
ids
=>
$ids
});
for
(
@rows
) {
$_
->{postdate} = formatDate(17,
$_
->{createdate});
}
$tvars
{comments} = \
@rows
;
}
my
(
$prev
,
$next
) = (
$start
-1,
$start
+1);
$prev
= 1
if
(
$prev
< 1);
$next
=
$last
if
(
$next
>
$last
);
$tvars
{page}{prev} =
$prev
;
$tvars
{page}{start} =
$start
;
$tvars
{page}{
next
} =
$next
;
$tvars
{page}{
last
} =
$last
;
$tvars
{page}{limit} =
$limit
;
$tvars
{page}{comments} =
$max
;
my
@offenders
=
$dbi
->GetQuery(
'hash'
,
'WorstOffenders'
);
$tvars
{offenders} = \
@offenders
if
(
@offenders
);
}
sub
EditComment {
return
unless
AccessUser(
$LEVEL
);
return
unless
AuthorCheck(
'GetCommentByID'
,
'commentid'
,
$LEVEL
);
$tvars
{comment} =
$tvars
{data};
$tvars
{comment}->{postdate} = formatDate(17,
$tvars
{comment}->{createdate});
$tvars
{comment}->{ddpublish} = PublishSelect(
$tvars
{comment}->{publish});
}
sub
SaveComment {
return
unless
AccessUser(
$LEVEL
);
return
unless
AuthorCheck(
'GetCommentByID'
,
'commentid'
,
$LEVEL
);
for
(
keys
%cfields
) {
next
unless
(
$cfields
{
$_
});
if
(
$cfields
{
$_
}->{html} == 1) {
$cgiparams
{
$_
} = CleanHTML(
$cgiparams
{
$_
}) }
elsif
(
$cfields
{
$_
}->{html} == 2) {
$cgiparams
{
$_
} = CleanTags(
$cgiparams
{
$_
}) }
elsif
(
$cfields
{
$_
}->{html} == 3) {
$cgiparams
{
$_
} = CleanTags(
$cgiparams
{
$_
}) }
}
return
if
FieldCheck(\
@callfields
,\
@cmandatory
);
$tvars
{data}->{publish} ||= 1;
my
@fields
= (
$tvars
{data}->{subject},
$tvars
{data}->{body},
$tvars
{data}->{author},
$tvars
{data}->{href},
$tvars
{data}->{publish},
$tvars
{data}->{commentid}
);
$dbi
->IDQuery(
'SaveComment'
,
@fields
);
}
sub
PromoteComment {
return
unless
AccessUser(
$LEVEL
);
return
unless
AuthorCheck(
'GetCommentByID'
,
'commentid'
,
$LEVEL
);
$dbi
->DoQuery(
'PromoteComment'
,
$tvars
{data}->{publish}+1,
$cgiparams
{
'commentid'
});
}
sub
DeleteComment {
return
unless
AccessUser(
$LEVEL
);
return
unless
AuthorCheck(
'GetCommentByID'
,
'commentid'
,
$LEVEL
);
$dbi
->DoQuery(
'DeleteComment'
,
$cgiparams
{
'commentid'
});
}
sub
MarkIP {
return
unless
AccessUser(
$LEVEL
);
return
unless
AuthorCheck(
'GetCommentByID'
,
'commentid'
,
$LEVEL
);
return
unless
$cgiparams
{mark};
my
$mark
=
$cgiparams
{mark} eq
'allow'
? 2 : 1;
if
(
$mark
== 2) { AllowIP(
$tvars
{data}->{author},
$tvars
{data}->{ipaddr}) }
else
{ BlockIP(
$tvars
{data}->{author},
$tvars
{data}->{ipaddr}) }
my
@rows
=
$dbi
->GetQuery(
'hash'
,
'GetAdminCommentByIP'
,
$tvars
{data}->{ipaddr});
for
my
$row
(
@rows
) {
next
unless
(
$row
->{ipaddr} eq
$tvars
{data}->{ipaddr});
if
(
$mark
== 2) {
$dbi
->DoQuery(
'PromoteComment'
,
$tvars
{data}->{publish}+1,
$row
->{
'commentid'
});
}
else
{
$dbi
->DoQuery(
'DeleteComment'
,
$row
->{
'commentid'
});
}
}
}
sub
_count_comments {
my
$type
=
shift
||
'mainarts'
;
return
unless
(
$tvars
{
$type
} &&
scalar
(@{
$tvars
{
$type
}}));
my
$ids
=
join
(
','
,
map
{
$_
->{data}{articleid}} @{
$tvars
{
$type
}});
my
@rows
=
$dbi
->GetQuery(
'array'
,
'CountDiaryComments'
,{
ids
=>
$ids
});
my
%rows
=
map
{
$_
->[0] =>
$_
->[1]}
@rows
;
for
my
$item
(@{
$tvars
{
$type
}}) {
$item
->{comments} =
$rows
{
$item
->{data}{articleid}} || 0;
}
}
sub
_vol2date {
my
(
$year
,
$mon
) =
$_
[0] =~ /^(\d{4})(\d{2})/;
if
(
$mon
== 13) {
$year
++;
$mon
=1; }
return
timegm(0,0,0,1,
$mon
-1,
$year
);
}
1;