2020-07-29 16:16:43 +03:00
|
|
|
<?php
|
|
|
|
/*
|
|
|
|
A set of utilities for tracking text-based game releases
|
|
|
|
Copyright (C) 2017-2018 Alexander Yakovlev
|
|
|
|
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
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)) {
|
|
|
|
$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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$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== Ссылки ==";
|
|
|
|
}
|
2020-10-05 10:46:39 +03:00
|
|
|
$this->txtadd('url_discussion', '* {{ссылка|на='.$this->game->url_discussion.'|Обсуждение игры}}');
|
|
|
|
$this->txtadd('url', '* {{ссылка|на='.$this->game->url.'|Страница игры}}');
|
2020-07-29 16:16:43 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|