stash-2024-04-09

This commit is contained in:
André Menrath 2024-04-09 19:20:53 +02:00
parent 1859970d06
commit 4fef29a6c2
7 changed files with 367 additions and 57 deletions

View file

@ -47,6 +47,15 @@ add_filter(
return new \Events_Manager( $wp_object );
}
/**
* Events manager
* @see https://wordpress.org/plugins/events-manager/
*/
if ( class_exists( 'GatherPress\Core\Event' ) && $wp_object->post_type === 'gp_event' ) {
require_once __DIR__ . '/includes/activitypub/transformer/class-gatherpress.php';
return new \GatherPress( $wp_object );
}
// Return the default transformer.
return $transformer;

View file

@ -1,2 +1,6 @@
<?php
// Handling Event Joins
/**
* Handling Event Joins.
*
* @package activitypub-event-extensions
*/

View file

@ -1,4 +1,5 @@
<?php
/**
* ActivityPub Transformer for the plugin Very Simple Event List.
*
@ -7,7 +8,6 @@
*/
use EM_Event;
use Activitypub\Activity\Extended_Object\Event;
use Activitypub\Activity\Extended_Object\Place;
use Activitypub\Transformer\Post;
@ -26,6 +26,7 @@ if ( ! defined( 'ABSPATH' ) ) {
* @since 1.0.0
*/
class Events_Manager extends Post {
/**
* Holds the EM_Event object.
*
@ -43,6 +44,7 @@ class Events_Manager extends Post {
* @return string Widget name.
*/
public function get_transformer_name() {
return 'activitypub-event-transformers/events-manager';
}
@ -56,6 +58,7 @@ class Events_Manager extends Post {
* @return string Widget title.
*/
public function get_transformer_label() {
return 'Events Manager';
}
@ -69,6 +72,7 @@ class Events_Manager extends Post {
* @return array Widget categories.
*/
public static function get_supported_post_types() {
return array();
}
@ -80,10 +84,12 @@ class Events_Manager extends Post {
* @return string The Event Object-Type.
*/
protected function get_type() {
return 'Event';
}
protected function get_is_online() {
return 'url' === $this->em_event->event_location_type;
}
@ -94,21 +100,22 @@ class Events_Manager extends Post {
* @return array The Place.
*/
public function get_location() {
if ( 'url' === $this->em_event->event_location_type ) {
return null;
}
$location = new Place();
$location = new Place();
$em_location = $this->em_event->get_location();
$location->set_name( $em_location->location_name );
$address = array(
'type' => 'PostalAddress',
'addressCountry' => $em_location->location_country,
'type' => 'PostalAddress',
'addressCountry' => $em_location->location_country,
'addressLocality' => $em_location->location_town,
'streetAddress' => $em_location->location_address,
'name' => $em_location->location_name,
'streetAddress' => $em_location->location_address,
'name' => $em_location->location_name,
);
if ( $em_location->location_state ) {
$address['addressRegion'] = $em_location->location_state;
@ -121,11 +128,11 @@ class Events_Manager extends Post {
return $location;
}
/**
* Get the end time from the events metadata.
*/
protected function get_end_time() {
return null;
}
@ -133,8 +140,9 @@ class Events_Manager extends Post {
* Get the end time from the events metadata.
*/
protected function get_start_time() {
$date_string = $this->em_event->event_start_date;
$time_string = $this->em_event->event_start_time;
$date_string = $this->em_event->event_start_date;
$time_string = $this->em_event->event_start_time;
$timezone_string = $this->em_event->event_timezone;
// Create a DateTime object with the given date, time, and timezone
@ -149,6 +157,7 @@ class Events_Manager extends Post {
}
protected function get_maximum_attendee_capacity() {
return $this->em_event->event_spaces;
}
@ -156,46 +165,51 @@ class Events_Manager extends Post {
* @todo decide whether to include pending bookings or not!
*/
protected function get_remaining_attendee_capacity() {
$em_bookings = $this->em_event->get_bookings()->get_bookings();
$em_bookings = $this->em_event->get_bookings()->get_bookings();
$remaining_attendee_capacity = $this->em_event->event_spaces - count( $em_bookings->bookings );
return $remaining_attendee_capacity;
}
protected function get_participant_count() {
$em_bookings = $this->em_event->get_bookings()->get_bookings();
return count( $em_bookings->bookings );
}
protected function get_content() {
return $this->wp_object->post_content;
}
protected function get_summary() {
if ( $this->em_event->post_excerpt ) {
$excerpt = $this->em_event->post_excerpt;
} else {
$excerpt = $this->get_content();
}
$address = $this->em_event->get_location()->location_name;
$start_time = strtotime( $this->get_start_time() );
$datetime_format = get_option( 'date_format' ) . ' ' . get_option( 'time_format' );
$address = $this->em_event->get_location()->location_name;
$start_time = strtotime( $this->get_start_time() );
$datetime_format = get_option( 'date_format' ) . ' ' . get_option( 'time_format' );
$start_time_string = wp_date( $datetime_format, $start_time );
$summary = "📍 {$address}\n📅 {$start_time_string}\n\n{$excerpt}";
$summary = "📍 {$address}\n📅 {$start_time_string}\n\n{$excerpt}";
return $summary;
}
// protected function get_join_mode() {
// return 'free';
// return 'free';
// }
private function get_event_link_attachment() {
$event_link_url = $this->em_event->event_location->data['url'];
$event_link_url = $this->em_event->event_location->data['url'];
$event_link_text = $this->em_event->event_location->data['text'];
return array(
'type' => 'Link',
'name' => 'Website',
'type' => 'Link',
'name' => 'Website',
// 'name' => $event_link_text,
'href' => \esc_url( $event_link_url ),
'href' => \esc_url( $event_link_url ),
'mediaType' => 'text/html',
);
}
@ -216,7 +230,8 @@ class Events_Manager extends Post {
if ( 'url' === $this->em_event->event_location_type ) {
$attachments[] = $this->get_event_link_attachment();
}
return $attachments; }
return $attachments;
}
/**
* This function tries to map VS-Event categories to Mobilizon event categories.
@ -224,6 +239,7 @@ class Events_Manager extends Post {
* @return string $category
*/
protected function get_category() {
$categories = $this->em_event->get_categories()->terms;
if ( empty( $categories ) ) {
@ -245,7 +261,7 @@ class Events_Manager extends Post {
// Initialize variables to track the best match.
$best_mobilizon_category_match = '';
$best_match_length = 0;
$best_match_length = 0;
// Check for the best match.
foreach ( $mobilizon_categories as $mobilizon_category ) {
@ -256,7 +272,7 @@ class Events_Manager extends Post {
$current_match_legnth = strlen( $mobilizon_category_slice );
if ( $current_match_legnth > $best_match_length ) {
$best_mobilizon_category_match = $mobilizon_category;
$best_match_length = $current_match_legnth;
$best_match_length = $current_match_legnth;
}
}
}
@ -274,7 +290,7 @@ class Events_Manager extends Post {
if ( $post_tags ) {
foreach ( $post_tags as $post_tag ) {
$tag = array(
$tag = array(
'type' => 'Hashtag',
'href' => \esc_url( \get_tag_link( $post_tag->term_id ) ),
'name' => esc_hashtag( $post_tag->name ),
@ -286,6 +302,7 @@ class Events_Manager extends Post {
}
protected function get_name() {
return $this->em_event->event_name;
}
@ -295,7 +312,8 @@ class Events_Manager extends Post {
* @return Activitypub\Activity\Event
*/
public function to_object() {
$this->em_event = new EM_Event( $this->wp_object->ID, 'post_id' );
$this->em_event = new EM_Event( $this->wp_object->ID, 'post_id' );
$activitypub_object = new Event();
$activitypub_object = $this->transform_object_properties( $activitypub_object );

View file

@ -0,0 +1,251 @@
<?php
/**
* ActivityPub Transformer for the plugin Very Simple Event List.
*
* @package activity-event-transformers
* @license AGPL-3.0-or-later
*/
use Activitypub\Transformer\Post;
use Activitypub\Model\Blog_user;
use Activitypub\Activity\Extended_Object\Event;
use Activitypub\Activity\Extended_Object\Place;
use GatherPress\Core\Event as GatherPress_Event;
use function Activitypub\get_rest_url_by_path;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
/**
* ActivityPub Transformer for VS Event
*
* @since 1.0.0
*/
class GatherPress extends Post {
/**
* The target transformet ActivityPub Event object.
*
* @var Event
*/
protected $ap_object;
/**
* The current GatherPress Event object.
*
* @var Event
*/
protected $gp_event;
/**
* The current GatherPress Venue object.
*
* @var Event
*/
protected $gp_venue;
/**
* Get transformer name.
*
* Retrieve the transformers name.
*
* @since 1.0.0
* @access public
* @return string Widget name.
*/
public function get_transformer_name() {
return 'gatherpress/gp-event';
}
/**
* Get transformer title.
*
* Retrieve the transformers label.
*
* @since 1.0.0
* @access public
* @return string Widget title.
*/
public function get_transformer_label() {
return 'GatherPress Event';
}
/**
* Get supported post types.
*
* Retrieve the list of supported WordPress post types this transformer widget can handle.
*
* @since 1.0.0
* @access public
* @return array Widget categories.
*/
public static function get_supported_post_types() {
return array( GatherPress_Event::POST_TYPE );
}
/**
* Returns the ActivityStreams 2.0 Object-Type for an Event.
*
* @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-event
* @since 1.0.0
* @return string The Event Object-Type.
*/
protected function get_type() {
return 'Event';
}
/**
* Get the event location.
*
* @return array The Place.
*/
public function get_location() {
$address = $this->gp_venue['full_address'];
$place = new Place();
$place->set_type( 'Place' );
$place->set_name( $address );
$place->set_address( $address );
return $place;
}
/**
* Get the end time from the event object.
*/
protected function get_end_time() {
return $this->gp_event->get_datetime_end( 'Y-m-d\TH:i:s\Z' );
}
/**
* Get the end time from the event object.
*/
protected function get_start_time() {
return $this->gp_event->get_datetime_start( 'Y-m-d\TH:i:s\Z' );
}
/**
* Get the event link from the events metadata.
*/
private function get_event_link() {
$event_link = get_post_meta( $this->wp_object->ID, 'event-link', true );
if ( $event_link ) {
return array(
'type' => 'Link',
'name' => 'Website',
'href' => \esc_url( $event_link ),
'mediaType' => 'text/html',
);
}
}
/**
* Overrides/extends the get_attachments function to also add the event Link.
*/
protected function get_attachment() {
$attachments = parent::get_attachment();
if ( count( $attachments ) ) {
$attachments[0]['type'] = 'Document';
$attachments[0]['name'] = 'Banner';
}
$event_link = $this->get_event_link();
if ( $event_link ) {
$attachments[] = $this->get_event_link();
}
return $attachments;
}
/**
* TODO:
*
* @return string $category
*/
protected function get_category() {
return 'MEETING';
}
/**
* Returns the User-URL of the Author of the Post.
*
* If `single_user` mode is enabled, the URL of the Blog-User is returned.
*
* @return string The User-URL.
*/
protected function get_attributed_to() {
$user = new Blog_User();
return $user->get_url();
}
/**
* Create a custom summary.
*
* It contains also the most important meta-information. The summary is often used when the
* ActivityPub object type 'Event' is not supported, e.g. in Mastodon.
*
* @return string $summary The custom event summary.
*/
public function get_summary() {
if ( $this->wp_object->excerpt ) {
$excerpt = $this->wp_object->post_excerpt;
} elseif ( get_post_meta( $this->wp_object->ID, 'event-summary', true ) ) {
$excerpt = get_post_meta( $this->wp_object->ID, 'event-summary', true );
} else {
$excerpt = $this->get_content();
}
$address = get_post_meta( $this->wp_object->ID, 'event-location', true );
$start_time = get_post_meta( $this->wp_object->ID, 'event-start-date', true );
$datetime_format = get_option( 'date_format' ) . ' ' . get_option( 'time_format' );
$start_time_string = wp_date( $datetime_format, $start_time );
$summary = "📍 {$address}\n📅 {$start_time_string}\n\n{$excerpt}";
return $summary;
}
/**
* Transform the WordPress Object into an ActivityPub Object.
*
* @return Activitypub\Activity\Event
*/
public function to_object() {
$this->ap_object = new Event();
$this->gp_event = new GatherPress_Event( $this->wp_object->ID );
$this->gp_venue = $this->gp_event->get_venue_information();
$this->ap_object = parent::to_object();
$this->ap_object->set_comments_enabled( 'open' === $this->wp_object->comment_status ? true : false );
$this->ap_object->set_external_participation_url( $this->get_url() );
$online_event_link = $this->gp_event->maybe_get_online_event_link();
if ( $online_event_link ) {
$this->ap_object->set_is_online( true );
} else {
$this->ap_object->set_is_online( false );
}
$this->ap_object->set_status( 'CONFIRMED' );
$this->ap_object->set_name( get_the_title( $this->wp_object->ID ) );
$this->ap_object->set_actor( get_rest_url_by_path( 'application' ) );
$this->ap_object->set_to( array( 'https://www.w3.org/ns/activitystreams#Public' ) );
$this->ap_object->set_location();
return $this->ap_object;
}
}

View file

@ -1,4 +1,5 @@
<?php
/**
* ActivityPub Tribe Transformer
*
@ -20,6 +21,7 @@ use Activitypub\Activity\Extended_Object\Place;
* @since 1.0.0
*/
class Tribe extends Post {
/**
* The Tribe Event object.
*
@ -28,14 +30,14 @@ class Tribe extends Post {
protected $tribe_event;
// /**
// * resolve the tribe metadata in the setter of wp_post.
// *
// * @param WP_Post $wp_post The WP_Post object.
// * @return void
// */
// * resolve the tribe metadata in the setter of wp_post.
// *
// * @param WP_Post $wp_post The WP_Post object.
// * @return void
// */
// public function set_wp_post( WP_Post $wp_post ) {
// parent::set_wp_post( $wp_post );
// $this->tribe_event = tribe_get_event( $wp_post->ID );
// parent::set_wp_post( $wp_post );
// $this->tribe_event = tribe_get_event( $wp_post->ID );
// }
/**
@ -48,6 +50,7 @@ class Tribe extends Post {
* @return string Widget name.
*/
public function get_name() {
return 'activitypub-event-transformers/tribe';
}
@ -61,6 +64,7 @@ class Tribe extends Post {
* @return string Widget title.
*/
public function get_label() {
return 'The Events Calendar';
}
@ -72,6 +76,7 @@ class Tribe extends Post {
* @return string The Event Object-Type.
*/
protected function get_object_type() {
return 'Event';
}
@ -85,6 +90,7 @@ class Tribe extends Post {
* @return array Widget categories.
*/
public static function get_supported_post_types() {
return array( 'tribe_events' );
}
@ -112,6 +118,7 @@ class Tribe extends Post {
* @return string status of the event
*/
public function get_tribe_status() {
if ( 'canceled' === $this->tribe_event->event_status ) {
return 'CANCELLED';
}
@ -133,6 +140,7 @@ class Tribe extends Post {
* @return string The content.
*/
protected function get_content() {
$content = parent::get_content();
// todo remove link at the end of the content

View file

@ -1,4 +1,5 @@
<?php
/**
* ActivityPub Transformer for the plugin Very Simple Event List.
*
@ -23,8 +24,10 @@ if ( ! defined( 'ABSPATH' ) ) {
* @since 1.0.0
*/
class VS_Event extends Post {
/**
* The target transformet ActivityPub Event object.
*
* @var Event
*/
protected $ap_object;
@ -39,6 +42,7 @@ class VS_Event extends Post {
* @return string Widget name.
*/
public function get_transformer_name() {
return 'activitypub-event-transformers/vs-event';
}
@ -52,6 +56,7 @@ class VS_Event extends Post {
* @return string Widget title.
*/
public function get_transformer_label() {
return 'VS Event';
}
@ -65,6 +70,7 @@ class VS_Event extends Post {
* @return array Widget categories.
*/
public static function get_supported_post_types() {
return array( 'event' );
}
@ -76,6 +82,7 @@ class VS_Event extends Post {
* @return string The Event Object-Type.
*/
protected function get_type() {
return 'Event';
}
@ -86,8 +93,9 @@ class VS_Event extends Post {
* @return array The Place.
*/
public function get_location() {
$address = get_post_meta( $this->wp_object->ID, 'event-location', true );
$place = new Place();
$place = new Place();
$place->set_type( 'Place' );
$place->set_name( $address );
$place->set_address( $address );
@ -98,6 +106,7 @@ class VS_Event extends Post {
* Get the end time from the events metadata.
*/
protected function get_end_time() {
$end_time = get_post_meta( $this->wp_object->ID, 'event-date', true );
return \gmdate( 'Y-m-d\TH:i:s\Z', $end_time );
}
@ -106,6 +115,7 @@ class VS_Event extends Post {
* Get the end time from the events metadata.
*/
protected function get_start_time() {
$start_time = get_post_meta( $this->wp_object->ID, 'event-start-date', true );
return \gmdate( 'Y-m-d\TH:i:s\Z', $start_time );
}
@ -114,12 +124,13 @@ class VS_Event extends Post {
* Get the event link from the events metadata.
*/
private function get_event_link() {
$event_link = get_post_meta( $this->wp_object->ID, 'event-link', true );
if ( $event_link ) {
return array(
'type' => 'Link',
'name' => 'Website',
'href' => \esc_url( $event_link ),
'type' => 'Link',
'name' => 'Website',
'href' => \esc_url( $event_link ),
'mediaType' => 'text/html',
);
}
@ -129,6 +140,7 @@ class VS_Event extends Post {
* Overrides/extends the get_attachments function to also add the event Link.
*/
protected function get_attachment() {
$attachments = parent::get_attachment();
if ( count( $attachments ) ) {
$attachments[0]['type'] = 'Document';
@ -147,6 +159,7 @@ class VS_Event extends Post {
* @return string $category
*/
protected function get_category() {
$post_categories = wp_get_post_terms( $this->wp_object->ID, 'event_cat' );
if ( empty( $post_categories ) ) {
@ -168,7 +181,7 @@ class VS_Event extends Post {
// Initialize variables to track the best match.
$best_mobilizon_category_match = '';
$best_match_length = 0;
$best_match_length = 0;
// Check for the best match.
foreach ( $mobilizon_categories as $mobilizon_category ) {
@ -179,7 +192,7 @@ class VS_Event extends Post {
$current_match_legnth = strlen( $mobilizon_category_slice );
if ( $current_match_legnth > $best_match_length ) {
$best_mobilizon_category_match = $mobilizon_category;
$best_match_length = $current_match_legnth;
$best_match_length = $current_match_legnth;
}
}
}
@ -191,12 +204,13 @@ class VS_Event extends Post {
/**
* Returns the User-URL of the Author of the Post.
*
* If `single_user` mode is enabled, the URL of the Blog-User is returned.
*
* If `single_user` mode is enabled, the URL of the Blog-User is returned.
*
* @return string The User-URL.
*/
protected function get_attributed_to() {
$user = new Blog_User();
return $user->get_url();
}
@ -210,6 +224,7 @@ class VS_Event extends Post {
* @return string $summary The custom event summary.
*/
public function get_summary() {
if ( $this->wp_object->excerpt ) {
$excerpt = $this->wp_object->post_excerpt;
} elseif ( get_post_meta( $this->wp_object->ID, 'event-summary', true ) ) {
@ -218,15 +233,14 @@ class VS_Event extends Post {
$excerpt = $this->get_content();
}
$address = get_post_meta( $this->wp_object->ID, 'event-location', true );
$start_time = get_post_meta( $this->wp_object->ID, 'event-start-date', true );
$datetime_format = get_option( 'date_format' ) . ' ' . get_option( 'time_format' );
$address = get_post_meta( $this->wp_object->ID, 'event-location', true );
$start_time = get_post_meta( $this->wp_object->ID, 'event-start-date', true );
$datetime_format = get_option( 'date_format' ) . ' ' . get_option( 'time_format' );
$start_time_string = wp_date( $datetime_format, $start_time );
$summary = "📍 {$address}\n📅 {$start_time_string}\n\n{$excerpt}";
$summary = "📍 {$address}\n📅 {$start_time_string}\n\n{$excerpt}";
return $summary;
}
/**
* Generic setter.
*
@ -236,6 +250,7 @@ class VS_Event extends Post {
* @return mixed The value.
*/
public function set( $key, $value ) {
if ( ! $this->ap_object->has( $key ) ) {
return new WP_Error( 'invalid_key', __( 'Invalid key', 'activitypub' ), array( 'status' => 404 ) );
}
@ -243,7 +258,7 @@ class VS_Event extends Post {
$setter_function = 'set_' . $key;
$getter_function = 'get_' . $key;
if ( in_array( $getter_function, get_class_methods( $this ) ) ) {
if ( in_array( $getter_function, get_class_methods( $this ) ) ) {
$this->ap_object->$setter_function( $this->$getter_function() );
} else {
$this->ap_object->$setter_function( $value );
@ -261,6 +276,7 @@ class VS_Event extends Post {
* @return void
*/
public function __call( $method, $params ) {
$var = \strtolower( \substr( $method, 4 ) );
if ( \strncasecmp( $method, 'set', 3 ) === 0 ) {
@ -278,10 +294,11 @@ class VS_Event extends Post {
* @return Activitypub\Activity\Event
*/
public function to_object() {
$this->ap_object = new Event();
$this
->set_content()
->set_content()
->set_content_map()
->set_attributed_to()
->set_published()
@ -289,10 +306,10 @@ class VS_Event extends Post {
->set_end_time()
->set_type()
->set_category()
->set_attachment()
->set_comments_enabled( true )
->set_attachment()
->set_comments_enabled( true )
->set_external_participation_url( $this->get_url() )
->set_status( 'CONFIRMED' )
->set_status( 'CONFIRMED' )
->set_name( get_the_title( $this->wp_object->ID ) )
->set_is_online( false )
->set_in_language( $this->get_locale() )

View file

@ -1,4 +1,5 @@
<?php
/**
* Mapping of WordPress Terms(Tags) to known Event Categories
*
@ -18,10 +19,12 @@ use Activitypub\Activity\Extended_Object\Event;
* @since 1.0.0
*/
class Category_Mapper {
/**
* Static function to do the Mapping
**/
public static function map( $post_categories ) {
* Static function to do the Mapping
**/
public static function map( $post_categories ) {
if ( empty( $post_categories ) ) {
return 'MEETING';
}
@ -41,7 +44,7 @@ class Category_Mapper {
// Initialize variables to track the best match.
$best_mobilizon_category_match = '';
$best_match_length = 0;
$best_match_length = 0;
// Check for the best match.
foreach ( $mobilizon_categories as $mobilizon_category ) {
@ -52,7 +55,7 @@ class Category_Mapper {
$current_match_legnth = strlen( $mobilizon_category_slice );
if ( $current_match_legnth > $best_match_length ) {
$best_mobilizon_category_match = $mobilizon_category;
$best_match_length = $current_match_legnth;
$best_match_length = $current_match_legnth;
}
}
}
@ -60,5 +63,5 @@ class Category_Mapper {
}
return ( '' != $best_mobilizon_category_match ) ? strtoupper( $best_mobilizon_category_match ) : 'MEETING';
}
}
}