Vote command actually works now.
This commit is contained in:
+122
-10
@@ -4851,19 +4851,47 @@ sub vote_on_poll {
|
|||||||
my $choices = shift;
|
my $choices = shift;
|
||||||
|
|
||||||
# Find the post by its menu code
|
# Find the post by its menu code
|
||||||
my $post_ref = &findtarget($post_code);
|
my $post_ref = &get_post($post_code);
|
||||||
unless ($post_ref) {
|
unless ($post_ref) {
|
||||||
print $stdout "-- no such post: $post_code\n";
|
print $stdout "-- no such post: $post_code\n";
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
# Check if post has a poll
|
# Check if post has a poll - handle boost-aware poll detection
|
||||||
unless (exists($post_ref->{'poll'}) && $post_ref->{'poll'}) {
|
my $poll = undef;
|
||||||
print $stdout "-- post $post_code does not have a poll\n";
|
if (exists($post_ref->{'reblog'}) && exists($post_ref->{'reblog'}->{'poll'})) {
|
||||||
return 0;
|
# Poll is in the boosted post
|
||||||
|
$poll = $post_ref->{'reblog'}->{'poll'};
|
||||||
|
} elsif (exists($post_ref->{'poll'})) {
|
||||||
|
# Poll is in the main post
|
||||||
|
$poll = $post_ref->{'poll'};
|
||||||
}
|
}
|
||||||
|
|
||||||
my $poll = $post_ref->{'poll'};
|
# If no poll found in cached data, this post may not have a poll
|
||||||
|
# or poll data was stripped by IPC. Try to proceed with voting anyway
|
||||||
|
# by making the API call directly with the post ID we have.
|
||||||
|
unless ($poll) {
|
||||||
|
print $stdout "-- no poll data in cache, attempting direct vote\n" if ($verbose);
|
||||||
|
|
||||||
|
# We'll try to vote anyway using the post structure we have
|
||||||
|
# First, we need to get the correct post/poll ID for the API call
|
||||||
|
my $target_post_id;
|
||||||
|
if (exists($post_ref->{'reblog'}) && $post_ref->{'reblog'}->{'id_str'}) {
|
||||||
|
# This is a boost, get the reblogged post ID
|
||||||
|
$target_post_id = $post_ref->{'reblog'}->{'id_str'};
|
||||||
|
} else {
|
||||||
|
# Regular post
|
||||||
|
$target_post_id = $post_ref->{'id_str'} || $post_ref->{'id'};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$target_post_id) {
|
||||||
|
print $stdout "-- post $post_code does not have a poll\n";
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Try to vote directly without poll validation
|
||||||
|
return &attempt_direct_poll_vote($target_post_id, $choices);
|
||||||
|
}
|
||||||
|
|
||||||
# Check if poll is expired or already voted
|
# Check if poll is expired or already voted
|
||||||
if ($poll->{'expired'}) {
|
if ($poll->{'expired'}) {
|
||||||
@@ -4901,8 +4929,15 @@ sub vote_on_poll {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
# Submit the vote
|
# Submit the vote - get correct post ID for boosted posts
|
||||||
my $post_id = $post_ref->{'id_str'} || $post_ref->{'id'};
|
my $post_id;
|
||||||
|
if (exists($post_ref->{'reblog'}) && exists($post_ref->{'reblog'}->{'poll'})) {
|
||||||
|
# Use the reblog's ID for boosted posts with polls
|
||||||
|
$post_id = $post_ref->{'reblog'}->{'id_str'} || $post_ref->{'reblog'}->{'id'};
|
||||||
|
} else {
|
||||||
|
# Use the main post ID
|
||||||
|
$post_id = $post_ref->{'id_str'} || $post_ref->{'id'};
|
||||||
|
}
|
||||||
my $vote_url = "$apibase/polls/$poll->{'id'}/votes";
|
my $vote_url = "$apibase/polls/$poll->{'id'}/votes";
|
||||||
|
|
||||||
# Build POST data with choices
|
# Build POST data with choices
|
||||||
@@ -4916,7 +4951,7 @@ sub vote_on_poll {
|
|||||||
|
|
||||||
my $result = &backticks($useragent, '/dev/null', undef, $vote_url, $post_data, 1, @agentopts);
|
my $result = &backticks($useragent, '/dev/null', undef, $vote_url, $post_data, 1, @agentopts);
|
||||||
|
|
||||||
if ($result) {
|
if ($? == 0) {
|
||||||
print $stdout "-- vote submitted successfully\n";
|
print $stdout "-- vote submitted successfully\n";
|
||||||
|
|
||||||
# Show which options were selected
|
# Show which options were selected
|
||||||
@@ -4934,13 +4969,90 @@ sub vote_on_poll {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# attempt to vote on a poll directly without full validation
|
||||||
|
# used when poll data is not available due to IPC limitations
|
||||||
|
sub attempt_direct_poll_vote {
|
||||||
|
my $post_id = shift;
|
||||||
|
my $choices = shift;
|
||||||
|
|
||||||
|
print $stdout "-- attempting direct poll vote on post $post_id\n" if ($verbose);
|
||||||
|
|
||||||
|
# First, try to get the poll ID by fetching the post
|
||||||
|
my $api_url = $idurl;
|
||||||
|
$api_url =~ s/%I/$post_id/g;
|
||||||
|
my $full_post = &grabjson($api_url, 0, 0, 0, undef, 1);
|
||||||
|
|
||||||
|
unless ($full_post) {
|
||||||
|
print $stdout "-- could not fetch post data for voting\n";
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get poll data from the fetched post (boost-aware)
|
||||||
|
my $poll = undef;
|
||||||
|
if (exists($full_post->{'reblog'}) && exists($full_post->{'reblog'}->{'poll'})) {
|
||||||
|
$poll = $full_post->{'reblog'}->{'poll'};
|
||||||
|
} elsif (exists($full_post->{'poll'})) {
|
||||||
|
$poll = $full_post->{'poll'};
|
||||||
|
}
|
||||||
|
|
||||||
|
unless ($poll && $poll->{'id'}) {
|
||||||
|
print $stdout "-- post does not have a poll\n";
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
print $stdout "-- DEBUG: Found poll ID: " . $poll->{'id'} . "\n" if ($verbose);
|
||||||
|
|
||||||
|
# Simple choice validation - just ensure choices are numbers
|
||||||
|
my @valid_choices = ();
|
||||||
|
foreach my $choice (split(/,/, $choices)) {
|
||||||
|
$choice =~ s/^\s+|\s+$//g; # trim whitespace
|
||||||
|
if ($choice =~ /^\d+$/ && $choice > 0) {
|
||||||
|
push @valid_choices, $choice - 1; # Convert to 0-based indexing
|
||||||
|
} else {
|
||||||
|
print $stdout "-- invalid choice: $choice\n";
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unless (@valid_choices) {
|
||||||
|
print $stdout "-- no valid choices specified\n";
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
print $stdout "-- DEBUG: Valid choices: " . join(',', @valid_choices) . "\n" if ($verbose);
|
||||||
|
|
||||||
|
# Submit the vote directly
|
||||||
|
my $vote_url = "$apibase/polls/$poll->{'id'}/votes";
|
||||||
|
my $post_data = '';
|
||||||
|
foreach my $choice_idx (@valid_choices) {
|
||||||
|
$post_data .= "&choices[]=$choice_idx";
|
||||||
|
}
|
||||||
|
$post_data =~ s/^&//; # remove leading &
|
||||||
|
|
||||||
|
print $stdout "-- DEBUG: Vote URL: $vote_url\n" if ($verbose);
|
||||||
|
print $stdout "-- DEBUG: Post data: $post_data\n" if ($verbose);
|
||||||
|
print $stdout "-- submitting direct vote on poll...\n";
|
||||||
|
|
||||||
|
my $result = &postjson($vote_url, $post_data);
|
||||||
|
|
||||||
|
print $stdout "-- DEBUG: Vote result: " . (defined($result) ? "'$result'" : "undefined") . "\n" if ($verbose);
|
||||||
|
|
||||||
|
if (defined($result)) {
|
||||||
|
print $stdout "-- vote submitted successfully\n";
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
print $stdout "-- failed to submit vote\n";
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# reply to all users mentioned in a post
|
# reply to all users mentioned in a post
|
||||||
sub reply_to_all {
|
sub reply_to_all {
|
||||||
my $post_code = shift;
|
my $post_code = shift;
|
||||||
my $reply_text = shift;
|
my $reply_text = shift;
|
||||||
|
|
||||||
# Find the post by its menu code
|
# Find the post by its menu code
|
||||||
my $post_ref = &findtarget($post_code);
|
my $post_ref = &get_post($post_code);
|
||||||
unless ($post_ref) {
|
unless ($post_ref) {
|
||||||
print $stdout "-- no such post: $post_code\n";
|
print $stdout "-- no such post: $post_code\n";
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user