Passed
Push — master ( 1d252d...bd204f )
by Daimona
01:55
created

run.php (1 issue)

Labels
Severity
1
<?php declare( strict_types=1 );
2
/**
3
 * Entry point for the bot, called by CLI
4
 */
5
6
require __DIR__ . '/vendor/autoload.php';
7
8
use BotRiconferme\Bot;
9
use BotRiconferme\CLI;
10
use BotRiconferme\Config;
11
use BotRiconferme\MessageProvider;
12
13
if ( !CLI::isCLI() ) {
14
	exit( 'CLI only!' );
15
}
16
17
define( 'BOT_VERSION', '2.1' );
18
19
date_default_timezone_set( 'Europe/Rome' );
20
21
$cli = new CLI();
22
23
/* URL (for debugging purpose) */
24
$url = $cli->getURL() ?? 'https://it.wikipedia.org/w/api.php';
25
26
define( 'DEFAULT_URL', $url );
27
define( 'META_URL', 'https://meta.wikimedia.org/w/api.php' );
28
29
/* START */
30
31
$errTitle = $cli->getOpt( 'error-title' );
32
33
$simpleLogger = new \BotRiconferme\Logger\SimpleLogger();
34
// @fixme A bit of dependency hell here
35
$wiki = new \BotRiconferme\Wiki\Wiki( $simpleLogger );
36
37
// FIXME global state. But don't let it depend on config.
38
$globalListTitle = $cli->getOpt( 'list-title' );
39
40
Config::init( $cli->getOpt( 'config-title' ), $wiki );
1 ignored issue
show
It seems like $cli->getOpt('config-title') can also be of type null; however, parameter $configTitle of BotRiconferme\Config::init() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

40
Config::init( /** @scrutinizer ignore-type */ $cli->getOpt( 'config-title' ), $wiki );
Loading history...
41
$mp = new MessageProvider( $wiki, $cli->getOpt( 'msg-title' ) );
42
$loginInfo = new \BotRiconferme\Wiki\LoginInfo(
43
	$cli->getOpt( 'username' ),
44
	$cli->getOpt( 'password' )
45
);
46
$wiki->setLoginInfo( $loginInfo );
47
$wiki->setEditsAsBot( Config::getInstance()->get( 'bot-edits' ) );
48
49
if ( $errTitle !== null ) {
50
	// Use a different Wiki with higher min level.
51
	$wikiLoggerLogger = new \BotRiconferme\Logger\SimpleLogger( \Psr\Log\LogLevel::ERROR );
52
	$wikiLoggerWiki = new \BotRiconferme\Wiki\Wiki( $wikiLoggerLogger );
53
	$wikiLoggerWiki->setLoginInfo( $loginInfo );
54
	$wikiLoggerWiki->setEditsAsBot( Config::getInstance()->get( 'bot-edits' ) );
55
	$errPage = new \BotRiconferme\Wiki\Page\Page( $errTitle, $wikiLoggerWiki );
56
	$wikiLogger = new \BotRiconferme\Logger\WikiLogger(
57
		$errPage,
58
		$mp->getMessage( 'error-page-summary' )->text(),
59
		\Psr\Log\LogLevel::ERROR
60
	);
61
	$mainLogger = new \BotRiconferme\Logger\MultiLogger( $simpleLogger, $wikiLogger );
62
} else {
63
	$mainLogger = $simpleLogger;
64
}
65
66
$errorHandler = function ( $errno, $errstr, $errfile, $errline ) {
67
	throw new \ErrorException( $errstr, 0, $errno, $errfile, $errline );
68
};
69
// @phan-suppress-next-line PhanTypeMismatchArgumentInternal
70
set_error_handler( $errorHandler );
71
72
$bot = new Bot( $mainLogger, $wiki, $mp );
73
$taskOpt = $cli->getTaskOpt();
74
$type = current( array_keys( $taskOpt ) );
75
try {
76
	if ( $type === 'task' ) {
77
		$bot->runTask( $taskOpt['task'] );
78
	} elseif ( $type === 'subtask' ) {
79
		$bot->runSubtask( $taskOpt['subtask'] );
80
	} else {
81
		$bot->runAll();
82
	}
83
} catch ( Throwable $e ) {
84
	$mainLogger->error( "$e" );
85
} finally {
86
	$mainLogger->flush();
87
}
88