ljr/livejournal/cgi-bin/conmoodtheme.pl

183 lines
6.0 KiB
Perl
Executable File

#!/usr/bin/perl
#
package LJ::Con;
$cmd{'moodtheme_create'}->{'handler'} = \&moodtheme_create;
$cmd{'moodtheme_public'}->{'handler'} = \&moodtheme_public;
$cmd{'moodtheme_setpic'}->{'handler'} = \&moodtheme_setpic;
$cmd{'moodtheme_list'}->{'handler'} = \&moodtheme_list;
sub moodtheme_list
{
my ($dbh, $remote, $args, $out) = @_;
if (scalar(@$args) > 2) {
push @$out, [ "error", "This command takes only 1 optional argument. Consult the reference." ];
return 0;
}
my ($id) = ($args->[1]+0);
my $sth;
if ($id) {
$sth = $dbh->prepare("SELECT m.mood, md.moodid, md.picurl, md.width, md.height FROM moodthemedata md, moods m WHERE md.moodid=m.moodid AND md.moodthemeid=$id ORDER BY m.mood");
$sth->execute;
while (my ($mood, $moodid, $picurl, $w, $h) = $sth->fetchrow_array) {
push @$out, [ "", sprintf("%-20s %2dx%2d %s", "$mood ($moodid)", $w, $h, $picurl) ];
}
return 1;
}
push @$out, [ "", sprintf("%3s %4s %-15s %-25s %s", "pub", "id# ", "owner", "theme name", "des") ];
push @$out, [ "", "-"x80 ];
my $passes = 1;
if ($remote) { $passes=2; }
for (my $pass=1; $pass<=$passes ; $pass++) {
if ($pass==1) {
push @$out, [ "info", "Public themes:" ];
$sth = $dbh->prepare("SELECT mt.moodthemeid, u.user, mt.is_public, mt.name, mt.des FROM moodthemes mt, user u WHERE mt.ownerid=u.userid AND mt.is_public='Y' ORDER BY mt.moodthemeid");
} else {
push @$out, [ "info", "Your themes:" ];
$sth = $dbh->prepare("SELECT mt.moodthemeid, u.user, mt.is_public, mt.name, mt.des FROM moodthemes mt, user u WHERE mt.ownerid=u.userid AND mt.ownerid=$remote->{'userid'} ORDER BY mt.moodthemeid");
}
$sth->execute;
if ($dbh->err) { push @$out, [ "error", $dbh->errstr ]; };
while (my ($id, $user, $pub, $name, $des) = $sth->fetchrow_array) {
push @$out, [ "", sprintf("%3s %4s %-15s %-25s %s", $pub ? " X " : "", $id, $user, $name, $des) ];
}
}
return 1;
}
sub moodtheme_create
{
my ($dbh, $remote, $args, $out) = @_;
unless (scalar(@$args) == 3) {
push @$out, [ "error", "This command takes exactly 2 arguments. Consult the reference." ];
return 0;
}
unless ($remote) {
push @$out, [ "error", "You have to be logged in to use this command." ];
return 0;
}
my $u = LJ::load_userid($remote->{'userid'});
unless (LJ::get_cap($u, "moodthemecreate")) {
push @$out, [ "error", "Sorry, your account type doesn't let you create new mood themes." ];
return 0;
}
my ($name, $des) = ($args->[1], $args->[2]);
my $qname = $dbh->quote($name);
my $qdes = $dbh->quote($des);
$sth = $dbh->prepare("INSERT INTO moodthemes (ownerid, name, des, is_public) VALUES ($remote->{'userid'}, $qname, $qdes, 'N')");
$sth->execute;
my $mtid = $dbh->{'mysql_insertid'};
push @$out, [ "info", "Success. Your new moodthemeid = $mtid" ];
}
sub moodtheme_public
{
my ($dbh, $remote, $args, $out) = @_;
unless ($remote->{'priv'}->{'moodthememanager'}) {
push @$out, [ "error", "$remote->{'user'}, you are not authorized to use this command." ];
return 0;
}
unless (scalar(@$args) == 3) {
push @$out, [ "error", "This command takes exactly 2 arguments. Consult the reference." ];
return 0;
}
my ($themeid, $setting) = ($args->[1], $args->[2]);
unless ($setting eq 'Y' || $setting eq 'N') {
push @$out, [ "error", "Setting must be either 'Y' or 'N'." ];
return 0;
}
$themeid += 0;
my $sth;
$sth = $dbh->prepare("SELECT is_public FROM moodthemes WHERE moodthemeid=$themeid");
$sth->execute;
my ($old_value) = $sth->fetchrow_array;
unless ($old_value) {
push @$out, [ "error", "This theme doesn't seem to exist." ];
return 0;
}
if ($old_value eq $setting) {
push @$out, [ "info", "Public setting not changed (already set to '$setting')" ];
return 1;
}
my $qsetting = $dbh->quote($setting);
$dbh->do("UPDATE moodthemes SET is_public=$qsetting WHERE moodthemeid=$themeid");
push @$out, [ "info", "Public setting changed." ];
}
sub moodtheme_setpic
{
my ($dbh, $remote, $args, $out) = @_;
unless (scalar(@$args) == 6) {
push @$out, [ "error", "This command takes exactly 5 arguments. Consult the reference." ];
return 0;
}
unless ($remote) {
push @$out, [ "error", "You have to be logged in to use this command." ];
return 0;
}
my $u = LJ::load_userid($remote->{'userid'});
unless (LJ::get_cap($u, "moodthemecreate")) {
push @$out, [ "error", "Sorry, your account type doesn't let you modify mood themes." ];
return 0;
}
my ($themeid, $moodid, $picurl, $width, $height) =
($args->[1], $args->[2], $args->[3], $args->[4], $args->[5]);
$themeid += 0;
my $sth;
$sth = $dbh->prepare("SELECT ownerid FROM moodthemes WHERE moodthemeid=$themeid");
$sth->execute;
my ($owner) = $sth->fetchrow_array;
if ($owner != $remote->{'userid'}) {
push @$out, [ "error", "You do not own this theme." ];
return 0;
}
$width += 0;
$height += 0;
$moodid += 0;
if (!$picurl || $width==0 || $height==0) {
$dbh->do("DELETE FROM moodthemedata WHERE moodthemeid=$themeid AND moodid=$moodid");
LJ::MemCache::delete([$themeid, "moodthemedata:$themeid"]);
push @$out, [ "info", "Data deleted for theme=$themeid, moodid=$moodid." ];
return 1;
}
my $qpicurl = $dbh->quote($picurl);
$dbh->do("REPLACE INTO moodthemedata (moodthemeid, moodid, picurl, width, height) VALUES ($themeid, $moodid, $qpicurl, $width, $height)");
LJ::MemCache::delete([$themeid, "moodthemedata:$themeid"]);
if ($dbh->err) { push @$out, [ "error", $dbh->errstr ]; }
push @$out, [ "", "Data inserted for theme=$themeid, moodid=$moodid." ];
return 1;
}