Skip to content

Commit

Permalink
phpstan support (#250)
Browse files Browse the repository at this point in the history
* phpstan v1 + workflow

* Fix intend

* More fixes

* Update phpstan.neon

* phpstan level 2

* Move errors ignoring into phpstan.neon

* phpstan level 3

* Don't ignore templates folder

* Something from level 4

* Update phpstan.neon
  • Loading branch information
slawkens committed Feb 18, 2024
1 parent e23a749 commit fe7ad61
Show file tree
Hide file tree
Showing 21 changed files with 157 additions and 22 deletions.
47 changes: 47 additions & 0 deletions .github/workflows/phpstan.yml
@@ -0,0 +1,47 @@
name: "PHPStan"

on:
pull_request:
branches: [develop]
push:
branches: [develop]

jobs:
tests:
name: PhpStan on PHP ${{ matrix.php-versions }}
runs-on: ubuntu-latest

strategy:
fail-fast: false
matrix:
php-versions: [ '8.1', '8.2', '8.3' ]
steps:
- name: "Checkout"
uses: "actions/checkout@v4"

- name: "Install PHP"
uses: "shivammathur/setup-php@v2"
with:
coverage: "none"
extensions: "intl, zip"
ini-values: "memory_limit=-1"
php-version: "${{ matrix.php-version }}"

- name: Get composer cache directory
id: composer-cache
run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT

- name: Cache composer dependencies
uses: actions/cache@v4
with:
path: ${{ steps.composer-cache.outputs.dir }}
# Use composer.json for key, if composer.lock is not committed.
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
#key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}

- name: "Install composer dependencies"
run: "composer install"

- name: "Run PHPStan"
run: "/usr/bin/php vendor/bin/phpstan analyse"
2 changes: 1 addition & 1 deletion admin/pages/notepad.php
Expand Up @@ -16,7 +16,7 @@
csrfProtect();

/**
* @var $account_logged OTS_Account
* @var OTS_Account $account_logged
*/
$_content = '';
$notepad = ModelsNotepad::where('account_id', $account_logged->getId())->first();
Expand Down
3 changes: 2 additions & 1 deletion composer.json
Expand Up @@ -19,7 +19,8 @@
},
"require-dev": {
"filp/whoops": "^2.15",
"maximebf/debugbar": "dev-master"
"maximebf/debugbar": "dev-master",
"phpstan/phpstan": "^1.10"
},
"autoload": {
"psr-4": {
Expand Down
6 changes: 3 additions & 3 deletions install/includes/functions.php
Expand Up @@ -11,13 +11,13 @@ function query($query)
error($error_);
$error = true;
}

return !$error;
}

// define php version id if its not already
if(!defined('PHP_VERSION_ID')) {
$version = explode('.', PHP_VERSION);
$version = array_map('intval', explode('.', PHP_VERSION));

define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));
}
Expand Down Expand Up @@ -97,4 +97,4 @@ function win_is_writable($path) {
unlink($path);

return true;
}
}
13 changes: 13 additions & 0 deletions phpstan-bootstrap.php
@@ -0,0 +1,13 @@
<?php

require __DIR__ . '/system/libs/pot/OTS.php';
$ots = POT::getInstance();

require __DIR__ . '/system/libs/pot/InvitesDriver.php';
require __DIR__ . '/system/libs/rfc6238.php';
require __DIR__ . '/common.php';

const ACTION = '';
const PAGE = '';
const URI = '';
define('SELF_NAME', basename(__FILE__));
38 changes: 38 additions & 0 deletions phpstan.neon
@@ -0,0 +1,38 @@
parameters:
level: 3
paths:
- .
- templates/tibiacom
- templates/kathrine
excludePaths:
- system/cache/*
- vendor/*
- plugins/*
- system/libs
- tools/signature/mango.php
- tools/signature/gd.class.php
bootstrapFiles:
- phpstan-bootstrap.php
ignoreErrors:
- '#Variable \$db might not be defined#'
- '#Variable \$twig might not be defined#'
- '#Variable \$hooks might not be defined#'
- '#Variable \$account_logged might not be defined#'
- '#Variable \$logged might not be defined#'
- '#Variable \$config might not be defined#'
- '#Variable \$action might not be defined#'
- '#Variable \$errors might not be defined#'
- '#Variable \$cache might not be defined#'
- '#Variable \$status might not be defined#'
- '#Variable \$player might not be defined#'
- '#Variable \$guild might not be defined#'
- '#Variable \$[a-zA-Z0-9\\_]+ might not be defined#'
# Eloquent models
- '#Call to an undefined static method [a-zA-Z0-9\\_]+::[a-zA-Z0-9\\_]+()#'
# system/pages/highscores.php
- '#Call to an undefined method Illuminate\\Database\\Query\\Builder::withOnlineStatus\(\)#'
- '#Access to an undefined property Illuminate\\Database\\Eloquent\\Model::\$online_status#'
- '#Access to an undefined property Illuminate\\Database\\Eloquent\\Model::\$vocation_name#'
-
message: '#Variable \$tmp in empty\(\) always exists and is always falsy#'
path: templates\kathrine\javascript.php
10 changes: 5 additions & 5 deletions system/functions.php
Expand Up @@ -418,7 +418,10 @@ function delete_guild($id)
if(count($rank_list) > 0) {
$rank_list->orderBy('level');

global $db, $ots;
global $db;
/**
* @var OTS_GuildRank $rank_in_guild
*/
foreach($rank_list as $rank_in_guild) {
if($db->hasTable('guild_members'))
$players_with_rank = $db->query('SELECT `players`.`id` as `id`, `guild_members`.`rank_id` as `rank_id` FROM `players`, `guild_members` WHERE `guild_members`.`rank_id` = ' . $rank_in_guild->getId() . ' AND `players`.`id` = `guild_members`.`player_id` ORDER BY `name`;');
Expand Down Expand Up @@ -710,11 +713,8 @@ function getSkillName($skillId, $suffix = true)
/**
* Performs flag check on the current logged in user.
* Table in database: accounts, field: website_flags
*
* @param int @flag Flag to be verified.
* @return bool If user got flag.
*/
function hasFlag($flag) {
function hasFlag(int $flag): bool {
global $logged, $logged_flags;
return ($logged && ($logged_flags & $flag) == $flag);
}
Expand Down
4 changes: 2 additions & 2 deletions system/pages/account/lost.php
Expand Up @@ -55,7 +55,7 @@
</TD></TR></FORM></TABLE></TABLE>';
else
{
$insec = $account->getCustomField('email_next') - time();
$insec = (int)$account->getCustomField('email_next') - time();
$minutesleft = floor($insec / 60);
$secondsleft = $insec - ($minutesleft * 60);
$timeleft = $minutesleft.' minutes '.$secondsleft.' seconds';
Expand Down Expand Up @@ -118,7 +118,7 @@
}
else
{
$insec = $account->getCustomField('email_next') - time();
$insec = (int)$account->getCustomField('email_next') - time();
$minutesleft = floor($insec / 60);
$secondsleft = $insec - ($minutesleft * 60);
$timeleft = $minutesleft.' minutes '.$secondsleft.' seconds';
Expand Down
6 changes: 6 additions & 0 deletions system/pages/guilds/cleanup_guilds.php
Expand Up @@ -23,9 +23,15 @@
$guilds_list->init();
if(count($guilds_list) > 0)
{
/**
* @var OTS_Guild $guild
*/
foreach($guilds_list as $guild)
{
$error = 0;
/**
* @var OTS_Player $leader
*/
$leader = $guild->getOwner();
if($leader->isLoaded())
{
Expand Down
3 changes: 3 additions & 0 deletions system/pages/guilds/create.php
Expand Up @@ -117,6 +117,9 @@
$ranks = $new_guild->getGuildRanksList();
$ranks->orderBy('level', POT::ORDER_DESC);
foreach($ranks as $rank) {
/**
* @var OTS_GuildRank $rank
*/
if($rank->getLevel() == 3) {
$player->setRank($rank);
}
Expand Down
3 changes: 3 additions & 0 deletions system/pages/guilds/list.php
Expand Up @@ -19,6 +19,9 @@
$guilds = array();
if(count($guilds_list) > 0)
{
/**
* @var OTS_Guild $guild
*/
foreach ($guilds_list as $guild) {
$guild_logo = $guild->getCustomField('logo_name');
if (empty($guild_logo) || !file_exists(GUILD_IMAGES_DIR . $guild_logo))
Expand Down
8 changes: 4 additions & 4 deletions system/pages/last-kills.php
Expand Up @@ -39,13 +39,13 @@
if($i == 1) {
if($count <= 4)
$killers_string .= 'killed';
else if($count > 4 and $count < 10)
else if($count < 10)
$killers_string .= 'slain';
else if($count > 9 and $count < 15)
else if($count < 15)
$killers_string .= 'crushed';
else if($count > 14 and $count < 20)
else if($count < 20)
$killers_string .= 'eliminated';
else if($count > 19)
else
$killers_string .= 'annihilated';
$killers_string .= ' at level <b>' . $death['level'] . '</b> ';
} else if($i == $count)
Expand Down
2 changes: 1 addition & 1 deletion system/router.php
Expand Up @@ -236,7 +236,7 @@
// parse for define PAGE
$tmp = BASE_DIR;
$uri = $_SERVER['REQUEST_URI'];
if (!empty($tmp)) {
if (strlen($tmp) > 0) {
$uri = str_replace(BASE_DIR . '/', '', $uri);
}

Expand Down
2 changes: 1 addition & 1 deletion system/src/CsrfToken.php
Expand Up @@ -25,7 +25,7 @@ public static function generate(): void
*
* @access public
* @static true
* @return void
* @return string
**/
public static function create(bool $return = false): string {
$input = '<input type="hidden" name="csrf_token" value="' . self::get() . '" />';
Expand Down
8 changes: 8 additions & 0 deletions system/src/Models/Changelog.php
Expand Up @@ -4,6 +4,14 @@

use Illuminate\Database\Eloquent\Model;

/**
* @property int $id
* @property int $type
* @property int $where
* @property string $body
* @property int $player_id
* @property int $date
*/
class Changelog extends Model {

protected $table = TABLE_PREFIX . 'changelog';
Expand Down
7 changes: 7 additions & 0 deletions system/src/Models/Pages.php
Expand Up @@ -3,6 +3,13 @@
namespace MyAAC\Models;
use Illuminate\Database\Eloquent\Model;

/**
* @property int $id
* @property string $name
* @property string $title
* @property int $php
* @property int $hide
*/
class Pages extends Model {

protected $table = TABLE_PREFIX . 'pages';
Expand Down
5 changes: 5 additions & 0 deletions system/src/Models/Settings.php
Expand Up @@ -3,6 +3,11 @@
namespace MyAAC\Models;
use Illuminate\Database\Eloquent\Model;

/**
* @property string $name
* @property string $key
* @property string $value
*/
class Settings extends Model {

protected $table = TABLE_PREFIX . 'settings';
Expand Down
4 changes: 2 additions & 2 deletions system/src/Validator.php
Expand Up @@ -141,8 +141,8 @@ public static function email($email) {
* Validate account password
* Name lenght must be 3-32 chars
*
* @param string $name Account name to check
* @return bool Is account name valid?
* @param string $password Password to check
* @return bool Is password valid?
*/
public static function password($password)
{
Expand Down
3 changes: 3 additions & 0 deletions system/status.php
Expand Up @@ -102,6 +102,9 @@
$status_timeout = $status_interval;
}

/**
* @var int $status_timeout
*/
if($status['lastCheck'] + $status_timeout < time()) {
updateStatus();
}
Expand Down
2 changes: 0 additions & 2 deletions system/template.php
Expand Up @@ -171,8 +171,6 @@ function get_template_menus() {
$new_menus = array();
/**
* @var array $configMenuCategories
* @var int $id
* @var array $options
*/
$configMenuCategories = config('menu_categories');
if($configMenuCategories === null) {
Expand Down
3 changes: 3 additions & 0 deletions tools/news_preview.php
Expand Up @@ -67,6 +67,9 @@
);

foreach($tickers as &$ticker) {
/**
* @var array $ticker
*/
$ticker['icon'] = $categories[$ticker['category']]['icon_id'];
$ticker['body_short'] = short_text(strip_tags($ticker['body']), 100);
$ticker['hidden'] = $ticker['hide'];
Expand Down

0 comments on commit fe7ad61

Please sign in to comment.