diff options
author | Yorhel <git@yorhel.nl> | 2013-01-03 11:16:51 +0100 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2013-01-03 11:16:51 +0100 |
commit | 633ae14c50509237f0b3d3999c890b9abc6747b4 (patch) | |
tree | 668f48e61024047ffcd72806f86d092c272b3e3d /lib/Multi | |
parent | 7ee6f2230c5ed21e74d7d10b2f464de8b3ab414e (diff) |
Multi::API: Added 'get votelist'
Diffstat (limited to 'lib/Multi')
-rw-r--r-- | lib/Multi/API.pm | 51 |
1 files changed, 47 insertions, 4 deletions
diff --git a/lib/Multi/API.pm b/lib/Multi/API.pm index de8ebead..84ac6062 100644 --- a/lib/Multi/API.pm +++ b/lib/Multi/API.pm @@ -41,7 +41,7 @@ sub spawn { $p => [qw| _start shutdown log server_error client_connect client_error client_input login login_res get_results get_vn get_vn_res get_release get_release_res - get_producer get_producer_res admin + get_producer get_producer_res get_votelist get_votelist_res admin |], ], heap => { @@ -365,7 +365,8 @@ sub client_input { filters => $arg->[2], opt => $opt, ); - return cerr $c, 'gettype', "Unknown get type: '$arg->[0]'" if $arg->[0] !~ /^(?:vn|release|producer)$/; + return cerr $c, 'gettype', "Unknown get type: '$arg->[0]'" if $arg->[0] !~ /^(?:vn|release|producer|votelist)$/; + return cerr $c, needlogin => 'Not logged in as a user' if $arg->[0] =~ /^list$/ && !$c->{uid}; return $_[KERNEL]->yield("get_$arg->[0]", \%obj); } @@ -395,7 +396,7 @@ sub login { if(exists $arg->{username}) { # fetch user info - $_[KERNEL]->post(pg => query => "SELECT salt, encode(passwd, 'hex') as passwd FROM users WHERE username = ?", + $_[KERNEL]->post(pg => query => "SELECT id, salt, encode(passwd, 'hex') as passwd FROM users WHERE username = ?", [ $arg->{username} ], 'login_res', [ $c, $arg ]); } else { $c->{client} = $arg->{client}; @@ -415,13 +416,14 @@ sub login_res { # num, res, [ c, arg ] my $encrypted = sha256_hex($VNDB::S{global_salt}.encode_utf8($arg->{password}).encode_utf8($res->[0]{salt})); return cerr $c, auth => "Wrong password for user '$arg->{username}'" if lc($encrypted) ne lc($res->[0]{passwd}); + $c->{uid} = $res->[0]{id}; $c->{username} = $arg->{username}; $c->{client} = $arg->{client}; $c->{clientver} = $arg->{clientver}; $c->{wheel}->put(['ok']); $_[KERNEL]->yield(log => $c, - 'Successful login by %s using client "%s" ver. %s', $arg->{username}, $arg->{client}, $arg->{clientver}); + 'Successful login by %s (%s) using client "%s" ver. %s', $arg->{username}, $c->{uid}, $arg->{client}, $arg->{clientver}); } @@ -834,6 +836,47 @@ sub get_producer_res { } +sub get_votelist { + my $get = $_[ARG0]; + + return cerr $get->{c}, getinfo => "Unknown info flag '$_'", flag => $_ + for (grep !/^(basic)$/, @{$get->{info}}); + + my $select = "vid AS vn, vote, extract('epoch' from date) AS added"; + + my @placeholders; + my $where = encode_filters $get->{filters}, \&filtertosql, $get->{c}, \@placeholders, [ + [ 'uid', + [ 'int' => 'uid :op: :value:', {qw|= =|}, process => sub { $_[0] eq '0' ? $get->{c}{uid} : \'uid filter must be 0' } ], + ] + ]; + my $last = sqllast $get, 'vn', { vn => 'vid %s' }; + return if !$where || !$last; + + $_[KERNEL]->post(pg => query => + qq|SELECT $select FROM votes WHERE $where $last|, + \@placeholders, 'get_votelist_res', $get); +} + + +sub get_votelist_res { + my($num, $res, $get, $time) = (@_[ARG0..$#_]); + + $get->{time} += $time; + $get->{queries}++; + + for (@$res) { + $_->{vn}*=1; + $_->{vote}*=1; + $_->{added} = int $_->{added}; + } + $get->{more} = pop(@$res)&&1 if @$res > $get->{opt}{results}; + $get->{list} = $res; + + $_[KERNEL]->yield(get_results => { %$get, type => 'votelist' }); +} + + # can be call()'ed from other sessions (specifically written for IRC) sub admin { my($func, @arg) = @_[ARG0..$#_]; |