169 lines
4.6 KiB
PHP
169 lines
4.6 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
use Drupal\node\Entity\Node;
|
||
|
|
use Drupal\Core\Entity\EntityInterface;
|
||
|
|
use Drupal\views\ViewExecutable;
|
||
|
|
use Drupal\Core\Render\Markup;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Implements hook_theme().
|
||
|
|
*
|
||
|
|
* Register a module or theme's theme implementations.
|
||
|
|
* The implementations declared by this hook specify how a particular render array is to be rendered as HTML.
|
||
|
|
*
|
||
|
|
* See: https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21theme.api.php/function/hook_theme/8.2.x
|
||
|
|
*
|
||
|
|
* If you change this method, clear theme registry and routing table 'drush cc theme-registry' and 'drush cc router'.
|
||
|
|
*/
|
||
|
|
function ufc_theme($existing, $type, $theme, $path) {
|
||
|
|
return [
|
||
|
|
// Name of the theme hook.
|
||
|
|
'ufc_fight' => [
|
||
|
|
'render element' => 'children',
|
||
|
|
// If no template name is defined here, it defaults to the name of the theme hook, ie. module-name-theme-hook.html.twig
|
||
|
|
'template' => 'ufc-fight',
|
||
|
|
// Optionally define path to Twig template files. Defaults to the module's ./templates/ directory.
|
||
|
|
'path' => $path . '/templates',
|
||
|
|
// Optionally define variables that will be passed to the Twig template and set default values for them.
|
||
|
|
'variables' => [
|
||
|
|
'fighter_1' => [],
|
||
|
|
'fighter_2' => [],
|
||
|
|
],
|
||
|
|
],
|
||
|
|
];
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Implements hook_entity_presave().
|
||
|
|
*/
|
||
|
|
function ufc_entity_presave(Drupal\Core\Entity\EntityInterface $entity) {
|
||
|
|
|
||
|
|
return;
|
||
|
|
$bundle = $entity->bundle();
|
||
|
|
|
||
|
|
if ($bundle === 'fight') {
|
||
|
|
// Get fighter ids, pass to predictor.
|
||
|
|
$f1_id = $entity->get('field_fighter_one')->getValue()[0]['target_id'];
|
||
|
|
$f2_id = $entity->get('field_fighter_two')->getValue()[0]['target_id'];
|
||
|
|
updatePrediction($f1_id, $f2_id, $entity);
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Implements hook_cron().
|
||
|
|
*/
|
||
|
|
function ufc_cron() {
|
||
|
|
// Reset the file.
|
||
|
|
// file_put_contents("./modules/custom/ufc/fights_output.txt", "");
|
||
|
|
// Run through predictions.
|
||
|
|
// \Drupal::service("ufc.predictor")->updatePredictions();
|
||
|
|
|
||
|
|
// // Check for lines in file to see incorrect fights.
|
||
|
|
// $file_check = file("./modules/custom/ufc/fights_output.txt");
|
||
|
|
|
||
|
|
// echo '<pre>';
|
||
|
|
// print_r($file_check);
|
||
|
|
// echo '</pre>';
|
||
|
|
// exit();
|
||
|
|
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Updates the prediction field on save.
|
||
|
|
*
|
||
|
|
* @param int $f1
|
||
|
|
* @param int $f2
|
||
|
|
* @return void
|
||
|
|
*/
|
||
|
|
function updatePrediction($f1, $f2, EntityInterface $entity) {
|
||
|
|
|
||
|
|
return;
|
||
|
|
|
||
|
|
if (!$f1 || !$f2) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
$fighter_one = Node::load($f1);
|
||
|
|
$fighter_two = Node::load($f2);
|
||
|
|
$predictor = \Drupal::service('ufc.predictor');
|
||
|
|
$results = $predictor->calculate($fighter_one, $fighter_two);
|
||
|
|
$prediction = '';
|
||
|
|
$fight_points = [
|
||
|
|
$results['fighter_one']['points'],
|
||
|
|
$results['fighter_two']['points'],
|
||
|
|
];
|
||
|
|
|
||
|
|
rsort($fight_points);
|
||
|
|
$score = ' (' . $fight_points[0] . '-' . $fight_points[1] . ')';
|
||
|
|
|
||
|
|
if ($results['fighter_one']['points'] > $results['fighter_two']['points']) {
|
||
|
|
$prediction .= $results['fighter_one']['name'];
|
||
|
|
$prediction_name = $results['fighter_one']['name'];
|
||
|
|
}
|
||
|
|
elseif ($results['fighter_one']['points'] < $results['fighter_two']['points']) {
|
||
|
|
$prediction .= $results['fighter_two']['name'];
|
||
|
|
$prediction_name = $results['fighter_two']['name'];
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
$prediction .= 'TIE:';
|
||
|
|
}
|
||
|
|
|
||
|
|
$prediction .= $score;
|
||
|
|
$entity->set('field_prediction', $prediction);
|
||
|
|
|
||
|
|
// If there is a result, compare it to the prediction.
|
||
|
|
$result = $entity->get('field_result')->getValue();
|
||
|
|
if (empty($result)) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
$result_name = getFighterNameById(reset($result[0]));
|
||
|
|
|
||
|
|
/*
|
||
|
|
* The code below will attempt to update fight
|
||
|
|
* predictions until they are correct
|
||
|
|
*
|
||
|
|
* (EXPERIMENTAL)
|
||
|
|
*/
|
||
|
|
if ($result_name !== $prediction_name) {
|
||
|
|
\Drupal::logger('ufc')->notice($entity->label() . " incorrect. Adjusting.");
|
||
|
|
|
||
|
|
// Isolate advantages.
|
||
|
|
foreach ($results as $fighter) {
|
||
|
|
if ($fighter['name'] === $result_name) {
|
||
|
|
$advantages = $fighter['advantages'];
|
||
|
|
}
|
||
|
|
|
||
|
|
if ($fighter['name'] === $prediction_name) {
|
||
|
|
$disadvantages = $fighter['disadvantages'];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
$predictor->adjustWeights($advantages, $disadvantages);
|
||
|
|
// updatePrediction($f1, $f2, $entity);
|
||
|
|
}
|
||
|
|
|
||
|
|
// Calculate Confidence.
|
||
|
|
$skips = $results['skips'];
|
||
|
|
$confidence_raw = (1 - ($skips / 17)) * 100;
|
||
|
|
$percentage = round($confidence_raw, 2);
|
||
|
|
$entity->set('field_accuracy', (float) $percentage);
|
||
|
|
}
|
||
|
|
|
||
|
|
function getFighterNameById($nid) {
|
||
|
|
$node = \Drupal::entityTypeManager()->getStorage('node')->load($nid);
|
||
|
|
$name = $node->label();
|
||
|
|
return $name;
|
||
|
|
}
|
||
|
|
|
||
|
|
function ufc_views_pre_render(ViewExecutable $view) {
|
||
|
|
foreach ($view->result as $row) {
|
||
|
|
$html = "<h1>This is some markup</h1>";
|
||
|
|
$markup = Markup::create($html);
|
||
|
|
$row->_entity->set('field_plaintext_field', $markup);
|
||
|
|
}
|
||
|
|
}
|