name = plugin_lang_get( 'title' ); $this->description = plugin_lang_get( 'description' ); $this->page = 'config'; $this->version = '1.0'; $this->requires = array( 'MantisCore' => '1.3.0', ); $this->author = 'Wizardry and Steamworks'; $this->contact = 'wizardry.stemworks@outlook.com'; $this->url = 'https://grimore.org'; } function install() { if (version_compare(PHP_VERSION, '5.3.0', '<')) { plugin_error(ERROR_PHP_VERSION, ERROR); return false; } if (!extension_loaded('curl')) { plugin_error(ERROR_NO_CURL, ERROR); return false; } return true; } function config() { return array( 'server' => 'https://matrix.org', 'username' => 'mantis', 'skip_bulk' => true, 'room' => '#general' ); } function hooks() { return array( 'EVENT_REPORT_BUG' => 'bug_report_update', 'EVENT_UPDATE_BUG' => 'bug_report_update', 'EVENT_BUG_DELETED' => 'bug_deleted', 'EVENT_BUG_ACTION' => 'bug_action', 'EVENT_BUGNOTE_ADD' => 'bugnote_add_edit', 'EVENT_BUGNOTE_EDIT' => 'bugnote_add_edit', 'EVENT_BUGNOTE_DELETED' => 'bugnote_deleted', 'EVENT_BUGNOTE_ADD_FORM' => 'bugnote_add_form', ); } function bugnote_add_form($event, $bug_id) { if ($_SERVER['PHP_SELF'] !== '/bug_update_page.php') return; echo ''; echo '' . plugin_lang_get('skip') . ''; echo ''; } function bug_report_update($event, $bug, $bug_id) { $this->skip = $this->skip || gpc_get_bool('matrix_skip'); $project = project_get_name($bug->project_id); $url = string_get_bug_view_url_with_fqdn($bug->id); //$summary = $this->format_summary($bug); $reporter = '@' . user_get_name(auth_get_current_user_id()); $msg = sprintf( plugin_lang_get($event === 'EVENT_REPORT_BUG' ? 'bug_created' : 'bug_updated'), $project, $reporter, $url, $bug->id ); $this->notify($msg); } function bug_action($event, $action, $bug_id) { $this->skip = $this->skip || gpc_get_bool('matrix_skip') || plugin_config_get('skip_bulk'); if ($action !== 'DELETE') { $bug = bug_get($bug_id); $this->bug_report_update('EVENT_UPDATE_BUG', $bug, $bug_id); } } function bug_deleted($event, $bug_id) { $this->skip = $this->skip || gpc_get_bool('matrix_skip'); $bug = bug_get($bug_id); $url = string_get_bug_view_url_with_fqdn($bug->id); $project = project_get_name($bug->project_id); $reporter = '@' . user_get_name(auth_get_current_user_id()); //$summary = $this->format_summary($bug); $msg = sprintf( plugin_lang_get('bug_deleted'), $project, $reporter, $url, $bug->id ); $this->notify($msg); } function bugnote_add_edit($event, $bug_id, $bugnote_id) { $this->skip = $this->skip || gpc_get_bool('matrix_skip'); $bug = bug_get($bug_id); $url = string_get_bugnote_view_url_with_fqdn($bug_id, $bugnote_id); $project = project_get_name($bug->project_id); //$summary = $this->format_summary($bug); $reporter = '@' . user_get_name(auth_get_current_user_id()); //$note = bugnote_get_text($bugnote_id); $msg = sprintf( plugin_lang_get($event === 'EVENT_BUGNOTE_ADD' ? 'bugnote_created' : 'bugnote_updated'), $project, $reporter, $url, $bug_id ); $this->notify($msg); } function bugnote_deleted($event, $bug_id, $bugnote_id) { $this->skip = $this->skip || gpc_get_bool('matrix_skip'); $bug = bug_get($bug_id); $project = project_get_name($bug->project_id); $url = string_get_bug_view_url_with_fqdn($bug->id); //$summary = $this->format_summary($bug); $reporter = '@' . user_get_name(auth_get_current_user_id()); $msg = sprintf( plugin_lang_get('bugnote_deleted'), $project, $reporter, $url, $bug->id ); $this->notify($msg); } function format_summary($bug) { $summary = bug_format_id($bug->id) . ': ' . string_display_line_links($bug->summary); return strip_tags(html_entity_decode($summary)); } function format_text($bug, $text) { $t = string_display_line_links($text); return strip_tags(html_entity_decode($t)); } function format_value($bug, $field_name) { $self = $this; $values = array( 'id' => function($bug) { return sprintf('<%s|%s>', string_get_bug_view_url_with_fqdn($bug->id), $bug->id); }, 'project_id' => function($bug) { return project_get_name($bug->project_id); }, 'reporter_id' => function($bug) { return '@' . user_get_name($bug->reporter_id); }, 'handler_id' => function($bug) { return empty($bug->handler_id) ? plugin_lang_get('no_user') : ('@' . user_get_name($bug->handler_id)); }, 'duplicate_id' => function($bug) { return sprintf('<%s|%s>', string_get_bug_view_url_with_fqdn($bug->duplicate_id), $bug->duplicate_id); }, 'priority' => function($bug) { return get_enum_element( 'priority', $bug->priority ); }, 'severity' => function($bug) { return get_enum_element( 'severity', $bug->severity ); }, 'reproducibility' => function($bug) { return get_enum_element( 'reproducibility', $bug->reproducibility ); }, 'status' => function($bug) { return get_enum_element( 'status', $bug->status ); }, 'resolution' => function($bug) { return get_enum_element( 'resolution', $bug->resolution ); }, 'projection' => function($bug) { return get_enum_element( 'projection', $bug->projection ); }, 'category_id' => function($bug) { return category_full_name( $bug->category_id, false ); }, 'eta' => function($bug) { return get_enum_element( 'eta', $bug->eta ); }, 'view_state' => function($bug) { return $bug->view_state == VS_PRIVATE ? lang_get('private') : lang_get('public'); }, 'sponsorship_total' => function($bug) { return sponsorship_format_amount( $bug->sponsorship_total ); }, 'os' => function($bug) { return $bug->os; }, 'os_build' => function($bug) { return $bug->os_build; }, 'platform' => function($bug) { return $bug->platform; }, 'version' => function($bug) { return $bug->version; }, 'fixed_in_version' => function($bug) { return $bug->fixed_in_version; }, 'target_version' => function($bug) { return $bug->target_version; }, 'build' => function($bug) { return $bug->build; }, 'summary' => function($bug) use($self) { return $self->format_summary($bug); }, 'last_updated' => function($bug) { return date( config_get( 'short_date_format' ), $bug->last_updated ); }, 'date_submitted' => function($bug) { return date( config_get( 'short_date_format' ), $bug->date_submitted ); }, 'due_date' => function($bug) { return date( config_get( 'short_date_format' ), $bug->due_date ); }, 'description' => function($bug) use($self) { return $self->format_text( $bug, $bug->description ); }, 'steps_to_reproduce' => function($bug) use($self) { return $self->format_text( $bug, $bug->steps_to_reproduce ); }, 'additional_information' => function($bug) use($self) { return $self->format_text( $bug, $bug->additional_information ); }, ); // Discover custom fields. $t_related_custom_field_ids = custom_field_get_linked_ids( $bug->project_id ); foreach ( $t_related_custom_field_ids as $t_id ) { $t_def = custom_field_get_definition( $t_id ); $values['custom_' . $t_def['name']] = function($bug) use ($t_id) { return custom_field_get_value( $t_id, $bug->id ); }; } if (isset($values[$field_name])) { $func = $values[$field_name]; return $func($bug); } else { return FALSE; } } function notify($msg) { if ($this->skip) return; $client = new MatrixClient(plugin_config_get('server')); $token = $client->login( plugin_config_get('username'), plugin_config_get('password') ); $room = $client->joinRoom(plugin_config_get('room')); $response = $room->sendHtml($msg); } }