Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

phpstan support #250

Merged
merged 13 commits into from
Feb 18, 2024
47 changes: 47 additions & 0 deletions .github/workflows/phpstan.yml
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Loading