. */ namespace App; use Mediawiki\Api\MediawikiApi; use Mediawiki\Api\ApiUser; use Mediawiki\Api\MediawikiFactory; use Mediawiki\DataModel\Content; use Mediawiki\DataModel\Title; use Mediawiki\DataModel\PageIdentifier; use Mediawiki\DataModel\Revision; use Illuminate\Support\Str; use App\Models\Language; class Wikipage { protected $game; protected $api; protected $services; protected $content; protected $fileUploader; protected $covername; public function __construct($game) { $this->game = $game; if (!env('DRY_RUN')) { try { // Log in to a wiki $api = new MediawikiApi( env('WIKI') ); $api->login( new ApiUser( env('WIKIUSER'), env('WIKIPASSWORD') ) ); $services = new MediawikiFactory( $api ); $this->api = $api; $this->services = $services; $this->fileUploader = $services->newFileUploader(); } catch (\Exception $e) { echo 'Ошибка соединения.'.PHP_EOL; echo $e->getMessage(); echo $e->getTraceAsString(); return; } } } public function create() { if (!empty($this->game->image_url)) { $filename = preg_replace('/\?.*/', '', basename($this->game->image_url)); $extension = pathinfo($filename, PATHINFO_EXTENSION); $this->covername = Str::slug($this->game->title, '_').'.'.$extension; } $pagetitle = strtr($this->game->title, [ '|' => '-' ]); if (empty($pagetitle)) { echo 'ERROR: Page has no title.'; print_r($this->game); return; } $exists = $this->exists($pagetitle); if (!env('DRY_RUN') && !$exists) { if (!empty($this->game->image_url) && isset($filename)) { if ($this->services->newPageGetter()->getFromTitle($this->covername)) { try { $image = file_get_contents($this->game->image_url); file_put_contents($filename, $image); $extension = mime_content_type($filename); if (strpos($extension, 'image') !== FALSE) { $extension = str_replace('image/', '', $extension); $this->covername = Str::slug($this->game->title, '_').'.'.$extension; $this->fileUploader->upload($this->covername, $filename); } unlink($filename); } catch (\Exception $e) { echo '(Обложка не найдена)'.PHP_EOL; } } } } $this->makeContent(); if (!env('DRY_RUN') && !$exists) { $newContent = new Content( $this->content ); $title = new Title($pagetitle); $identifier = new PageIdentifier($title); $revision = new Revision($newContent, $identifier); $this->services->newRevisionSaver()->save($revision); return true; } else { if ($exists) { echo "Страница игры уже существует. Автосоздание невозможно.\n"; echo $this->content; return false; } if (env('DRY_RUN')) { echo "Черновой режим. Автосоздание невозможно.\n"; } echo $this->content; return true; } } protected function makeContent() { $this->content = '{{game info'; $this->txtadd('title', ' |название='.$this->game->title); $authors = $this->game->authors->all(); if (count($authors) > 0) { $this->content .= PHP_EOL.' |автор='; $i = 0; $l = count($authors); foreach ($authors as $author) { $author_name = $author->name; $this->content .= '[[Автор::'.$author_name.']]'; $i++; if ($i < $l) { $this->content .= '; '; } } } if (!empty($this->game->release_date)) { $date = (new \DateTime($this->game->release_date))->format('d.m.Y'); $this->content .= PHP_EOL.' |вышла='.$date; } $platforms = $this->game->platforms()->pluck('title')->toArray(); if (!empty($platforms)) { $this->txtadd('platform', ' |платформа='.implode(',', $platforms)); } $this->txtadd('image', ' |обложка='.$this->covername); $languages = $this->game->languages()->pluck('title_ru')->toArray(); if (!empty($languages)) { $this->txtadd('language', ' |язык='.implode(',', $languages)); } $ru = Language::findByCode('ru'); $tags = $this->game->tags()->where('language_id', $ru->id)->pluck('title')->toArray(); if (!empty($tags)) { $this->content .= PHP_EOL.' |темы='.implode(',', $tags); } $this->content .= "\n}}\n"; $this->txtadd('description', $this->game->description); if (!empty($this->game->url_download) || !empty($this->game->url_play_online)) { $this->content .= "\n== Версии =="; } $this->txtadd('url_online', PHP_EOL.'* ['.$this->game->url_play_online.' '.$this->game->url_online_description.']'); if (!empty($this->game->url_download)) { if (!empty($this->game->url_download_description)) { $this->content .= PHP_EOL.'* ['.$this->game->url_download.' '.$this->game->url_download_description.']'; } else { $this->content .= PHP_EOL.'* ['.$this->game->url_download.' Скачать игру]'; } } if (!empty($this->game->url_discussion) || !empty($this->game->url)) { $this->content .= "\n== Ссылки =="; } if ($this->game->url_discussion === $this->game->url) { $this->txtadd('url', '* {{ссылка|на='.$this->game->url.'|Страница игры с обсуждением}}'); } else { $this->txtadd('url_discussion', '* {{ссылка|на='.$this->game->url_discussion.'|Обсуждение игры}}'); $this->txtadd('url', '* {{ссылка|на='.$this->game->url.'|Страница игры}}'); } } protected function txtadd($param, $text) { if (!empty($this->game->$param)) { $this->content .= PHP_EOL.rtrim($text); } } /** * Checks if the page exists. * * @param string $pagename * @return boolean */ protected function exists($pagename) { if (env('DRY_RUN')) { return false; } $page = $this->services->newPageGetter()->getFromTitle((string) $pagename); return !($page->getId() === 0); } }