mirror of
https://codeberg.org/streams/streams.git
synced 2024-09-19 21:55:15 +00:00
more poll issues
This commit is contained in:
parent
92ec813394
commit
253a4b4b2b
2 changed files with 84 additions and 76 deletions
|
@ -2785,130 +2785,134 @@ class Activity
|
|||
return '@{' . $id . '}';
|
||||
}
|
||||
|
||||
public static function update_poll($item, $post)
|
||||
public static function update_poll($pollItem, $response)
|
||||
{
|
||||
|
||||
logger('updating poll');
|
||||
|
||||
$multi = false;
|
||||
$mid = $post['mid'];
|
||||
$content = trim($post['title']);
|
||||
|
||||
if (!$item) {
|
||||
|
||||
if (!$pollItem) {
|
||||
logger('no item');
|
||||
return false;
|
||||
}
|
||||
|
||||
$channel = Channel::from_id($item['uid']);
|
||||
$channel = Channel::from_id($pollItem['uid']);
|
||||
if (!$channel) {
|
||||
logger('no channel');
|
||||
return false;
|
||||
}
|
||||
|
||||
$o = json_decode($item['obj'], true);
|
||||
$o = json_decode($pollItem['obj'], true);
|
||||
if ($o && array_key_exists('anyOf', $o)) {
|
||||
$multi = true;
|
||||
}
|
||||
|
||||
$r = q(
|
||||
"select mid, title from item where parent_mid = '%s' and author_xchan = '%s' and mid != parent_mid ",
|
||||
dbesc($item['mid']),
|
||||
dbesc($post['author_xchan'])
|
||||
);
|
||||
if ($response) {
|
||||
$mid = $response['mid'];
|
||||
$content = trim($response['title']);
|
||||
|
||||
// prevent any duplicate votes by same author for oneOf and duplicate votes with same author and same answer for anyOf
|
||||
|
||||
if ($r) {
|
||||
$r = q(
|
||||
"select mid, title from item where parent_mid = '%s' and author_xchan = '%s' and mid != parent_mid ",
|
||||
dbesc($pollItem['mid']),
|
||||
dbesc($response['author_xchan'])
|
||||
);
|
||||
|
||||
// prevent any duplicate votes by same author for oneOf and duplicate votes with same author and same answer for anyOf
|
||||
|
||||
if ($r) {
|
||||
if ($multi) {
|
||||
foreach ($r as $rv) {
|
||||
if (trim($rv['title']) === $content && $rv['mid'] !== $mid) {
|
||||
logger('already voted multi');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
foreach ($r as $rv) {
|
||||
if ($rv['mid'] !== $mid && $content) {
|
||||
logger('already voted');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$answer_found = false;
|
||||
$foundPrevious = false;
|
||||
if ($multi) {
|
||||
foreach ($r as $rv) {
|
||||
if (trim($rv['title']) === $content && $rv['mid'] !== $mid) {
|
||||
logger('already voted multi');
|
||||
return false;
|
||||
for ($c = 0; $c < count($o['anyOf']); $c++) {
|
||||
if (trim($o['anyOf'][$c]['name']) === $content) {
|
||||
$answer_found = true;
|
||||
if (is_array($o['anyOf'][$c]['replies'])) {
|
||||
foreach ($o['anyOf'][$c]['replies'] as $reply) {
|
||||
if (is_array($reply) && array_key_exists('id', $reply) && $reply['id'] === $mid) {
|
||||
$foundPrevious = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!$foundPrevious) {
|
||||
$o['anyOf'][$c]['replies']['totalItems']++;
|
||||
$o['anyOf'][$c]['replies']['items'][] = ['id' => $mid, 'type' => 'Note'];
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
foreach ($r as $rv) {
|
||||
if ($rv['mid'] !== $mid && $content) {
|
||||
logger('already voted');
|
||||
return false;
|
||||
for ($c = 0; $c < count($o['oneOf']); $c++) {
|
||||
if (trim($o['oneOf'][$c]['name']) === $content) {
|
||||
$answer_found = true;
|
||||
if (is_array($o['oneOf'][$c]['replies'])) {
|
||||
foreach ($o['oneOf'][$c]['replies'] as $reply) {
|
||||
if (is_array($reply) && array_key_exists('id', $reply) && $reply['id'] === $mid) {
|
||||
$foundPrevious = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!$foundPrevious) {
|
||||
$o['oneOf'][$c]['replies']['totalItems']++;
|
||||
$o['oneOf'][$c]['replies']['items'][] = ['id' => $mid, 'type' => 'Note'];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$answer_found = false;
|
||||
$foundPrevious = false;
|
||||
if ($multi) {
|
||||
for ($c = 0; $c < count($o['anyOf']); $c++) {
|
||||
if (trim($o['anyOf'][$c]['name']) === $content) {
|
||||
$answer_found = true;
|
||||
if (is_array($o['anyOf'][$c]['replies'])) {
|
||||
foreach ($o['anyOf'][$c]['replies'] as $reply) {
|
||||
if (is_array($reply) && array_key_exists('id', $reply) && $reply['id'] === $mid) {
|
||||
$foundPrevious = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!$foundPrevious) {
|
||||
$o['anyOf'][$c]['replies']['totalItems']++;
|
||||
$o['anyOf'][$c]['replies']['items'][] = ['id' => $mid, 'type' => 'Note'];
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for ($c = 0; $c < count($o['oneOf']); $c++) {
|
||||
if (trim($o['oneOf'][$c]['name']) === $content) {
|
||||
$answer_found = true;
|
||||
if (is_array($o['oneOf'][$c]['replies'])) {
|
||||
foreach ($o['oneOf'][$c]['replies'] as $reply) {
|
||||
if (is_array($reply) && array_key_exists('id', $reply) && $reply['id'] === $mid) {
|
||||
$foundPrevious = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!$foundPrevious) {
|
||||
$o['oneOf'][$c]['replies']['totalItems']++;
|
||||
$o['oneOf'][$c]['replies']['items'][] = ['id' => $mid, 'type' => 'Note'];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($item['comments_closed'] > NULL_DATE) {
|
||||
if ($item['comments_closed'] > datetime_convert()) {
|
||||
$o['closed'] = datetime_convert('UTC', 'UTC', $item['comments_closed'], ATOM_TIME);
|
||||
if ($pollItem['comments_closed'] > NULL_DATE) {
|
||||
if ($pollItem['comments_closed'] > datetime_convert()) {
|
||||
$o['closed'] = datetime_convert('UTC', 'UTC', $pollItem['comments_closed'], ATOM_TIME);
|
||||
// set this to force an update
|
||||
$answer_found = true;
|
||||
}
|
||||
}
|
||||
|
||||
logger('updated_poll: ' . print_r($o, true), LOGGER_DATA);
|
||||
if ($answer_found && !$foundPrevious) {
|
||||
if ($response && $answer_found && !$foundPrevious) {
|
||||
// undo moderation if it was applied.
|
||||
q(
|
||||
"update item set obj = '%s', edited = '%s', item_blocked = 0 where id = %d",
|
||||
dbesc(json_encode($o)),
|
||||
dbesc(datetime_convert()),
|
||||
intval($item['id'])
|
||||
intval($pollItem['id'])
|
||||
);
|
||||
$i = q("select * from item where id = %d",
|
||||
intval($item['id'])
|
||||
intval($pollItem['id'])
|
||||
);
|
||||
xchan_query($i, true);
|
||||
$items = fetch_post_tags($i);
|
||||
$item = array_shift($items);
|
||||
$item['obj'] = json_decode($item['obj'],true);
|
||||
$item['target'] = json_decode($item['target'], true);
|
||||
$item['attach'] = json_decode($item['attach'], true);
|
||||
$pollItem = array_shift($items);
|
||||
$pollItem['obj'] = json_decode($pollItem['obj'],true);
|
||||
$pollItem['target'] = json_decode($pollItem['target'], true);
|
||||
$pollItem['attach'] = json_decode($pollItem['attach'], true);
|
||||
|
||||
Run::Summon(['Notifier', 'edit_post', $item['id']]);
|
||||
$related = find_related($item);
|
||||
Run::Summon(['Notifier', 'edit_post', $pollItem['id']]);
|
||||
$related = find_related($pollItem);
|
||||
// logger('related: ' . print_r($related,true), LOGGER_DATA);
|
||||
if ($related) {
|
||||
// Update the object in the collection activity and the timestamp
|
||||
$newObj = array_merge(Activity::ap_context(), Activity::encode_activity($item));
|
||||
$newObj = array_merge(Activity::ap_context(), Activity::encode_activity($pollItem));
|
||||
$newObj['proof'] = (new JcsEddsa2022())->sign($newObj, $channel);
|
||||
$r = q("update item set obj = '%s', edited = '%s' where id = %d",
|
||||
dbesc(json_encode($newObj)),
|
||||
|
|
|
@ -1738,7 +1738,7 @@ function item_store($arr, $deliver = true, $addAndSync = true) {
|
|||
if(intval($parent_item['item_uplink']) && (! $parent_item['item_private']))
|
||||
$arr['item_private'] = 0;
|
||||
|
||||
if(in_array($arr['obj_type'], ['Note','Answer']) && $parent_item['obj_type'] === 'Question' && intval($parent_item['item_wall'])) {
|
||||
if(in_array($arr['obj_type'], ['Note','Answer']) && $parent_item['obj_type'] === 'Question') {
|
||||
Activity::update_poll($parent_item, $arr);
|
||||
}
|
||||
}
|
||||
|
@ -2249,6 +2249,10 @@ function item_store_update($arr, $deliver = true, $addAndSync = true) {
|
|||
return $ret;
|
||||
}
|
||||
|
||||
if($arr['obj_type'] === 'Question') {
|
||||
Activity::update_poll($parent_item, NULL);
|
||||
}
|
||||
|
||||
// fetch an unescaped complete copy of the stored item
|
||||
|
||||
$r = q("select * from item where id = %d",
|
||||
|
|
Loading…
Reference in a new issue