DB/Dependency

* remove unmaintained DbSimple
 * add package db/dibi as substitute db abstraction
This commit is contained in:
Sarjuuk 2026-01-05 18:34:19 +01:00
parent 8a404b32aa
commit 69df50619a
254 changed files with 3234 additions and 5566 deletions

View file

@ -52,7 +52,7 @@ audio processing may require [lame](https://sourceforge.net/projects/lame/files/
#### 2. Prepare the database #### 2. Prepare the database
Ensure that the account you are going to use has **full** access on the database AoWoW is going to occupy and ideally only **read** access on the world database you are going to reference. Ensure that the account you are going to use has **full** access on the database AoWoW is going to occupy and ideally only **read** access on the world database you are going to reference.
Import files 01 - 03 from `setup/sql/` in order into the AoWoW database `mysql -p {your-db-here} < setup/sql/01-db_structure.sql`, etc. Import files 01 - 03 from `setup/sql/` in order into the AoWoW database `mysql --default-character-set=utf8 -p {your-db-here} < setup/sql/01-db_structure.sql`, etc.
**Optional**: If you are using MySQL ≥ 8.4.0 and want to support fulltext search for locale zhCN, additionally import `setup/sql/04-db_optional_mysql_only.sql`. Enables this in settings after AoWoW has been set up. **Optional**: If you are using MySQL ≥ 8.4.0 and want to support fulltext search for locale zhCN, additionally import `setup/sql/04-db_optional_mysql_only.sql`. Enables this in settings after AoWoW has been set up.

View file

@ -14,6 +14,7 @@
"vendor-dir": "includes/libs" "vendor-dir": "includes/libs"
}, },
"require": { "require": {
"dibi/dibi": "^5.1",
"php": "8.2 - 8.4", "php": "8.2 - 8.4",
"ext-mbstring": "*", "ext-mbstring": "*",
"ext-simplexml": "*", "ext-simplexml": "*",
@ -23,7 +24,6 @@
"ext-intl": "*" "ext-intl": "*"
}, },
"require-dev": { "require-dev": {
"dibi/dibi": "^5.1",
"jfcherng/php-diff": "6.16", "jfcherng/php-diff": "6.16",
"triggerhappy/mpq": "dev-master" "triggerhappy/mpq": "dev-master"
} }

139
composer.lock generated
View file

@ -4,75 +4,8 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "8b4b9c139ad31fc7b659f11676582cb2", "content-hash": "25b289a987a7600746f0fd1f2491864b",
"packages": [], "packages": [
"packages-dev": [
{
"name": "chdemko/sorted-collections",
"version": "1.0.10",
"source": {
"type": "git",
"url": "https://github.com/chdemko/php-sorted-collections.git",
"reference": "d9cf7021e6fda1eb68b9f35caf99215327f6db76"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/chdemko/php-sorted-collections/zipball/d9cf7021e6fda1eb68b9f35caf99215327f6db76",
"reference": "d9cf7021e6fda1eb68b9f35caf99215327f6db76",
"shasum": ""
},
"require": {
"php": ">=8.2"
},
"require-dev": {
"php-coveralls/php-coveralls": "^2.7",
"phpbench/phpbench": "^1.3",
"phpunit/phpunit": "^11.3",
"squizlabs/php_codesniffer": "^3.10"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.0.x-dev"
}
},
"autoload": {
"psr-4": {
"chdemko\\SortedCollection\\": "src/SortedCollection"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Christophe Demko",
"email": "chdemko@gmail.com",
"homepage": "https://chdemko.pagelab.univ-lr.fr/",
"role": "Developer"
}
],
"description": "Sorted Collections for PHP >= 8.1",
"homepage": "https://php-sorted-collections.readthedocs.io/en/latest/?badge=latest",
"keywords": [
"avl",
"collection",
"iterator",
"map",
"ordered",
"set",
"sorted",
"tree",
"treemap",
"treeset"
],
"support": {
"issues": "https://github.com/chdemko/php-sorted-collections/issues",
"source": "https://github.com/chdemko/php-sorted-collections/tree/1.0.10"
},
"time": "2024-08-04T14:31:40+00:00"
},
{ {
"name": "dibi/dibi", "name": "dibi/dibi",
"version": "v5.1.0", "version": "v5.1.0",
@ -146,6 +79,74 @@
"source": "https://github.com/dg/dibi/tree/v5.1.0" "source": "https://github.com/dg/dibi/tree/v5.1.0"
}, },
"time": "2025-08-06T22:26:19+00:00" "time": "2025-08-06T22:26:19+00:00"
}
],
"packages-dev": [
{
"name": "chdemko/sorted-collections",
"version": "1.0.10",
"source": {
"type": "git",
"url": "https://github.com/chdemko/php-sorted-collections.git",
"reference": "d9cf7021e6fda1eb68b9f35caf99215327f6db76"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/chdemko/php-sorted-collections/zipball/d9cf7021e6fda1eb68b9f35caf99215327f6db76",
"reference": "d9cf7021e6fda1eb68b9f35caf99215327f6db76",
"shasum": ""
},
"require": {
"php": ">=8.2"
},
"require-dev": {
"php-coveralls/php-coveralls": "^2.7",
"phpbench/phpbench": "^1.3",
"phpunit/phpunit": "^11.3",
"squizlabs/php_codesniffer": "^3.10"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.0.x-dev"
}
},
"autoload": {
"psr-4": {
"chdemko\\SortedCollection\\": "src/SortedCollection"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Christophe Demko",
"email": "chdemko@gmail.com",
"homepage": "https://chdemko.pagelab.univ-lr.fr/",
"role": "Developer"
}
],
"description": "Sorted Collections for PHP >= 8.1",
"homepage": "https://php-sorted-collections.readthedocs.io/en/latest/?badge=latest",
"keywords": [
"avl",
"collection",
"iterator",
"map",
"ordered",
"set",
"sorted",
"tree",
"treemap",
"treeset"
],
"support": {
"issues": "https://github.com/chdemko/php-sorted-collections/issues",
"source": "https://github.com/chdemko/php-sorted-collections/tree/1.0.10"
},
"time": "2024-08-04T14:31:40+00:00"
}, },
{ {
"name": "jfcherng/php-color-output", "name": "jfcherng/php-color-output",

View file

@ -54,7 +54,7 @@ class AccountBaseResponse extends TemplateResponse
{ {
array_unshift($this->title, Lang::account('settings')); array_unshift($this->title, Lang::account('settings'));
$user = DB::Aowow()->selectRow('SELECT `debug`, `email`, `description`, `avatar`, `wowicon`, `renameCooldown` FROM ?_account WHERE `id` = ?d', User::$id); $user = DB::Aowow()->selectRow('SELECT `debug`, `email`, `description`, `avatar`, `wowicon`, `renameCooldown` FROM ::account WHERE `id` = %i', User::$id);
Lang::sort('game', 'ra'); Lang::sort('game', 'ra');
@ -65,11 +65,11 @@ class AccountBaseResponse extends TemplateResponse
/* Ban Popup */ /* Ban Popup */
/*************/ /*************/
$b = DB::Aowow()->select( $b = DB::Aowow()->selectAssoc(
'SELECT ab.`end` AS "0", ab.`reason` AS "1", a.`username` AS "2" 'SELECT ab.`end` AS "0", ab.`reason` AS "1", a.`username` AS "2"
FROM ?_account_banned ab FROM ::account_banned ab
LEFT JOIN ?_account a ON a.`id` = ab.`staffId` LEFT JOIN ::account a ON a.`id` = ab.`staffId`
WHERE ab.`userId` = ?d AND ab.`typeMask` & ?d AND (ab.`end` = 0 OR ab.`end` > UNIX_TIMESTAMP())', WHERE ab.`userId` = %i AND ab.`typeMask` & %i AND (ab.`end` = 0 OR ab.`end` > UNIX_TIMESTAMP())',
User::$id, ACC_BAN_TEMP | ACC_BAN_PERM User::$id, ACC_BAN_TEMP | ACC_BAN_PERM
); );
@ -99,7 +99,7 @@ class AccountBaseResponse extends TemplateResponse
/* GENERAL */ /* GENERAL */
// Modelviewer // Modelviewer
if ($_ = DB::Aowow()->selectCell('SELECT `data` FROM ?_account_cookies WHERE `name` = ? AND `userId` = ?d', 'default_3dmodel', User::$id)) if ($_ = DB::Aowow()->selectCell('SELECT `data` FROM ::account_cookies WHERE `name` = %s AND `userId` = %i', 'default_3dmodel', User::$id))
[$this->modelrace, $this->modelgender] = explode(',', $_); [$this->modelrace, $this->modelgender] = explode(',', $_);
// Lists // Lists
@ -115,7 +115,7 @@ class AccountBaseResponse extends TemplateResponse
$this->renameCD = DateTime::formatTimeElapsedFloat(Cfg::get('ACC_RENAME_DECAY') * 1000); $this->renameCD = DateTime::formatTimeElapsedFloat(Cfg::get('ACC_RENAME_DECAY') * 1000);
if ($user['renameCooldown'] > time()) if ($user['renameCooldown'] > time())
{ {
$locCode = implode('_', str_split(Lang::getLocale()->json(), 2)); // ._. $locCode = substr_replace(Lang::getLocale()->json(), '_', 2, 0); // ._.
$this->activeCD = (new \IntlDateFormatter($locCode, pattern: Lang::main('dateFmtIntl')))->format($user['renameCooldown']); $this->activeCD = (new \IntlDateFormatter($locCode, pattern: Lang::main('dateFmtIntl')))->format($user['renameCooldown']);
} }
@ -145,7 +145,7 @@ class AccountBaseResponse extends TemplateResponse
// * 'when': uploaded timestamp expected as msec for some reason // * 'when': uploaded timestamp expected as msec for some reason
// * 'caption': only used for getVisibleText, duplicates name? // * 'caption': only used for getVisibleText, duplicates name?
// * 'type': always 1 ?, Dialog-popup doesn't work without it // * 'type': always 1 ?, Dialog-popup doesn't work without it
if ($cuAvatars = DB::Aowow()->select('SELECT `id` AS ARRAY_KEY, `id`, `name`, `name` AS "caption", `current`, `size`, `status`, `when` * 1000 AS "when", 1 AS "type" FROM ?_account_avatars WHERE `userId` = ?d', User::$id)) if ($cuAvatars = DB::Aowow()->selectAssoc('SELECT `id` AS ARRAY_KEY, `id`, `name`, `name` AS "caption", `current`, `size`, `status`, `when` * 1000 AS "when", 1 AS "type" FROM ::account_avatars WHERE `userId` = %i', User::$id))
{ {
foreach ($cuAvatars as $id => $a) foreach ($cuAvatars as $id => $a)
if ($a['status'] != AvatarMgr::STATUS_REJECTED) if ($a['status'] != AvatarMgr::STATUS_REJECTED)

View file

@ -52,13 +52,13 @@ class AccountActivateResponse extends TemplateResponse
if (!$this->assertGET('key')) if (!$this->assertGET('key'))
return Lang::main('intError'); return Lang::main('intError');
if (DB::Aowow()->selectCell('SELECT `id` FROM ?_account WHERE `status` IN (?a) AND `token` = ?', [ACC_STATUS_NONE, ACC_STATUS_NEW], $this->_get['key'])) if (DB::Aowow()->selectCell('SELECT `id` FROM ::account WHERE `status` IN %in AND `token` = %s', [ACC_STATUS_NONE, ACC_STATUS_NEW], $this->_get['key']))
{ {
// don't remove the token yet. It's needed on signin page. // don't remove the token yet. It's needed on signin page.
DB::Aowow()->query('UPDATE ?_account SET `status` = ?d, `statusTimer` = 0, `userGroups` = ?d WHERE `token` = ?', ACC_STATUS_NONE, U_GROUP_NONE, $this->_get['key']); DB::Aowow()->qry('UPDATE ::account SET `status` = %i, `statusTimer` = 0, `userGroups` = %i WHERE `token` = %s', ACC_STATUS_NONE, U_GROUP_NONE, $this->_get['key']);
// fully apply block for further registration attempts from this ip // fully apply block for further registration attempts from this ip
DB::Aowow()->query('REPLACE INTO ?_account_bannedips (`ip`, `type`, `count`, `unbanDate`) VALUES (?, ?d, ?d + 1, UNIX_TIMESTAMP() + ?d)', DB::Aowow()->qry('REPLACE INTO ::account_bannedips (`ip`, `type`, `count`, `unbanDate`) VALUES (%s, %i, %i + 1, UNIX_TIMESTAMP() + %i)',
User::$ip, IP_BAN_TYPE_REGISTRATION_ATTEMPT, Cfg::get('ACC_FAILED_AUTH_COUNT'), Cfg::get('ACC_FAILED_AUTH_BLOCK')); User::$ip, IP_BAN_TYPE_REGISTRATION_ATTEMPT, Cfg::get('ACC_FAILED_AUTH_COUNT'), Cfg::get('ACC_FAILED_AUTH_BLOCK'));
$this->success = true; $this->success = true;

View file

@ -54,14 +54,14 @@ class AccountConfirmdeleteResponse extends TemplateResponse
$msg = Lang::account('inputbox', 'error', 'purgeTokenUsed'); $msg = Lang::account('inputbox', 'error', 'purgeTokenUsed');
// display default confirm template // display default confirm template
if ($this->assertGET('key') && DB::Aowow()->selectCell('SELECT 1 FROM ?_account WHERE `status` = ?d AND `statusTimer` > UNIX_TIMESTAMP() AND `token` = ?', ACC_STATUS_PURGING, $this->_get['key'])) if ($this->assertGET('key') && DB::Aowow()->selectCell('SELECT 1 FROM ::account WHERE `status` = %i AND `statusTimer` > UNIX_TIMESTAMP() AND `token` = %s', ACC_STATUS_PURGING, $this->_get['key']))
{ {
$this->key = $this->_get['key']; $this->key = $this->_get['key'];
return; return;
} }
// perform action and display status // perform action and display status
if ($this->assertPOST('key') && ($userId = DB::Aowow()->selectCell('SELECT `id` FROM ?_account WHERE `status` = ?d AND `statusTimer` > UNIX_TIMESTAMP() AND `token` = ?', ACC_STATUS_PURGING, $this->_post['key']))) if ($this->assertPOST('key') && ($userId = DB::Aowow()->selectCell('SELECT `id` FROM ::account WHERE `status` = %i AND `statusTimer` > UNIX_TIMESTAMP() AND `token` = %s', ACC_STATUS_PURGING, $this->_post['key'])))
{ {
if ($this->_post['cancel']) if ($this->_post['cancel'])
$msg = $this->cancel($userId); $msg = $this->cancel($userId);
@ -79,7 +79,7 @@ class AccountConfirmdeleteResponse extends TemplateResponse
private function cancel(int $userId) : string private function cancel(int $userId) : string
{ {
if (DB::Aowow()->query('UPDATE ?_account SET `status` = ?d, `statusTimer` = 0, `token` = "" WHERE `id` = ?d', ACC_STATUS_NONE, $userId)) if (DB::Aowow()->qry('UPDATE ::account SET `status` = %i, `statusTimer` = 0, `token` = "" WHERE `id` = %i', ACC_STATUS_NONE, $userId))
{ {
$this->success = true; $this->success = true;
return Lang::account('inputbox', 'message', 'deleteCancel'); return Lang::account('inputbox', 'message', 'deleteCancel');
@ -91,32 +91,32 @@ class AccountConfirmdeleteResponse extends TemplateResponse
private function purge(int $userId) : string private function purge(int $userId) : string
{ {
// empty all user settings and cookies // empty all user settings and cookies
DB::Aowow()->query('DELETE FROM ?_account_cookies WHERE `userId` = ?d', $userId); DB::Aowow()->qry('DELETE FROM ::account_cookies WHERE `userId` = %i', $userId);
DB::Aowow()->query('DELETE FROM ?_account_avatars WHERE `userId` = ?d', $userId); DB::Aowow()->qry('DELETE FROM ::account_avatars WHERE `userId` = %i', $userId);
DB::Aowow()->query('DELETE FROM ?_account_excludes WHERE `userId` = ?d', $userId); DB::Aowow()->qry('DELETE FROM ::account_excludes WHERE `userId` = %i', $userId);
DB::Aowow()->query('DELETE FROM ?_account_favorites WHERE `userId` = ?d', $userId); DB::Aowow()->qry('DELETE FROM ::account_favorites WHERE `userId` = %i', $userId);
DB::Aowow()->query('DELETE FROM ?_account_reputation WHERE `userId` = ?d', $userId); DB::Aowow()->qry('DELETE FROM ::account_reputation WHERE `userId` = %i', $userId);
DB::Aowow()->query('DELETE FROM ?_account_weightscales WHERE `userId` = ?d', $userId); // cascades to aowow_account_weightscale_data DB::Aowow()->qry('DELETE FROM ::account_weightscales WHERE `userId` = %i', $userId); // cascades to aowow_account_weightscale_data
// delete profiles, unlink chars // delete profiles, unlink chars
DB::Aowow()->query('DELETE pp FROM ?_profiler_profiles pp JOIN ?_account_profiles ap ON ap.`profileId` = pp.`id` WHERE ap.`accountId` = ?d', $userId); DB::Aowow()->qry('DELETE pp FROM ::profiler_profiles pp JOIN ::account_profiles ap ON ap.`profileId` = pp.`id` WHERE ap.`accountId` = %i', $userId);
// DB::Aowow()->query('DELETE FROM ?_account_profiles WHERE `accountId` = ?d', $userId); // already deleted via FK? // DB::Aowow()->qry('DELETE FROM ::account_profiles WHERE `accountId` = %i', $userId); // already deleted via FK?
// delete all sessions and bans // delete all sessions and bans
DB::Aowow()->query('DELETE FROM ?_account_banned WHERE `userId` = ?d', $userId); DB::Aowow()->qry('DELETE FROM ::account_banned WHERE `userId` = %i', $userId);
DB::Aowow()->query('DELETE FROM ?_account_sessions WHERE `userId` = ?d', $userId); DB::Aowow()->qry('DELETE FROM ::account_sessions WHERE `userId` = %i', $userId);
// delete forum posts (msg: This post was from a user who has deleted their account. (no translations at src); comments/replies are unaffected) // delete forum posts (msg: This post was from a user who has deleted their account. (no translations at src); comments/replies are unaffected)
// ... // ...
// replace username with userId and empty fields // replace username with userId and empty fields
DB::Aowow()->query( DB::Aowow()->qry(
'UPDATE ?_account SET 'UPDATE ::account SET
`login` = "", `passHash` = "", `username` = `id`, `email` = NULL, `userGroups` = 0, `userPerms` = 0, `login` = "", `passHash` = "", `username` = `id`, `email` = NULL, `userGroups` = 0, `userPerms` = 0,
`curIp` = "", `prevIp` = "", `curLogin` = 0, `prevLogin` = 0, `curIp` = "", `prevIp` = "", `curLogin` = 0, `prevLogin` = 0,
`locale` = 0, `debug` = 0, `avatar` = 0, `wowicon` = "", `title` = "", `description` = "", `excludeGroups` = 0, `locale` = 0, `debug` = 0, `avatar` = 0, `wowicon` = "", `title` = "", `description` = "", `excludeGroups` = 0,
`status` = ?d, `statusTimer` = 0, `token` = "", `updateValue` = "", `renameCooldown` = 0 `status` = %i, `statusTimer` = 0, `token` = "", `updateValue` = "", `renameCooldown` = 0
WHERE `id` = ?d', WHERE `id` = %i',
ACC_STATUS_DELETED, $userId ACC_STATUS_DELETED, $userId
); );

View file

@ -46,12 +46,12 @@ class AccountConfirmemailaddressResponse extends TemplateResponse
if (!$this->assertGET('key')) if (!$this->assertGET('key'))
return Lang::main('intError'); return Lang::main('intError');
$acc = DB::Aowow()->selectRow('SELECT `updateValue`, `status`, `statusTimer` FROM ?_account WHERE `token` = ?', $this->_get['key']); $acc = DB::Aowow()->selectRow('SELECT `updateValue`, `status`, `statusTimer` FROM ::account WHERE `token` = %s', $this->_get['key']);
if (!$acc || $acc['status'] != ACC_STATUS_CHANGE_EMAIL || $acc['statusTimer'] < time()) if (!$acc || $acc['status'] != ACC_STATUS_CHANGE_EMAIL || $acc['statusTimer'] < time())
return Lang::account('inputbox', 'error', 'mailTokenUsed'); return Lang::account('inputbox', 'error', 'mailTokenUsed');
// 0 changes == error // 0 changes == error
if (!DB::Aowow()->query('UPDATE ?_account SET `email` = `updateValue`, `status` = ?d, `statusTimer` = 0, `token` = "", `updateValue` = "" WHERE `token` = ?', ACC_STATUS_NONE, $this->_get['key'])) if (!DB::Aowow()->qry('UPDATE ::account SET `email` = `updateValue`, `status` = %i, `statusTimer` = 0, `token` = "", `updateValue` = "" WHERE `token` = %s', ACC_STATUS_NONE, $this->_get['key']))
return Lang::main('intError'); return Lang::main('intError');
$this->success = true; $this->success = true;

View file

@ -44,12 +44,12 @@ class AccountConfirmpasswordResponse extends TemplateResponse
if (!$this->assertGET('key')) if (!$this->assertGET('key'))
return Lang::main('intError'); return Lang::main('intError');
$acc = DB::Aowow()->selectRow('SELECT `updateValue`, `status`, `statusTimer` FROM ?_account WHERE `token` = ?', $this->_get['key']); $acc = DB::Aowow()->selectRow('SELECT `updateValue`, `status`, `statusTimer` FROM ::account WHERE `token` = %s', $this->_get['key']);
if (!$acc || $acc['status'] != ACC_STATUS_CHANGE_PASS || $acc['statusTimer'] < time()) if (!$acc || $acc['status'] != ACC_STATUS_CHANGE_PASS || $acc['statusTimer'] < time())
return Lang::account('inputbox', 'error', 'passTokenUsed'); return Lang::account('inputbox', 'error', 'passTokenUsed');
// 0 changes == error // 0 changes == error
if (!DB::Aowow()->query('UPDATE ?_account SET `passHash` = `updateValue`, `status` = ?d, `statusTimer` = 0, `token` = "", `updateValue` = "" WHERE `token` = ?', ACC_STATUS_NONE, $this->_get['key'])) if (!DB::Aowow()->qry('UPDATE ::account SET `passHash` = `updateValue`, `status` = %i, `statusTimer` = 0, `token` = "", `updateValue` = "" WHERE `token` = %s', ACC_STATUS_NONE, $this->_get['key']))
return Lang::main('intError'); return Lang::main('intError');
$this->success = true; $this->success = true;

View file

@ -28,15 +28,15 @@ class AccountDeleteiconResponse extends TextResponse
return; return;
// non-int > error // non-int > error
$selected = DB::Aowow()->selectCell('SELECT `current` FROM ?_account_avatars WHERE `id` = ?d AND `userId` = ?d', $this->_post['id'], User::$id); $selected = DB::Aowow()->selectCell('SELECT `current` FROM ::account_avatars WHERE `id` = %i AND `userId` = %i', $this->_post['id'], User::$id);
if ($selected === null || $selected === false) if ($selected === null || $selected === false)
return; return;
DB::Aowow()->query('DELETE FROM ?_account_avatars WHERE `id` = ?d AND `userId` = ?d', $this->_post['id'], User::$id); DB::Aowow()->qry('DELETE FROM ::account_avatars WHERE `id` = %i AND `userId` = %i', $this->_post['id'], User::$id);
// if deleted avatar is also currently selected, unset // if deleted avatar is also currently selected, unset
if ($selected) if ($selected)
DB::Aowow()->query('UPDATE ?_account SET `avatar` = 0 WHERE `id` = ?d', User::$id); DB::Aowow()->qry('UPDATE ::account SET `avatar` = 0 WHERE `id` = %i', User::$id);
$path = sprintf('static/uploads/avatars/%d.jpg', $this->_post['id']); $path = sprintf('static/uploads/avatars/%d.jpg', $this->_post['id']);
if (!unlink($path)) if (!unlink($path))

View file

@ -47,11 +47,11 @@ class AccountDeleteResponse extends TemplateResponse
if ($this->_post['proceed']) if ($this->_post['proceed'])
{ {
$error = false; $error = false;
if (!DB::Aowow()->selectCell('SELECT 1 FROM ?_account WHERE `status` NOT IN (?a) AND `statusTimer` > UNIX_TIMESTAMP() AND `id` = ?d', [ACC_STATUS_NEW, ACC_STATUS_NONE, ACC_STATUS_PURGING], User::$id)) if (!DB::Aowow()->selectCell('SELECT 1 FROM ::account WHERE `status` NOT IN %in AND `statusTimer` > UNIX_TIMESTAMP() AND `id` = %i', [ACC_STATUS_NEW, ACC_STATUS_NONE, ACC_STATUS_PURGING], User::$id))
{ {
$token = Util::createHash(40); $token = Util::createHash(40);
DB::Aowow()->query('UPDATE ?_account SET `status` = ?d, `statusTimer` = UNIX_TIMESTAMP() + ?d, `token` = ? WHERE `id` = ?d', DB::Aowow()->qry('UPDATE ::account SET `status` = %i, `statusTimer` = UNIX_TIMESTAMP() + %i, `token` = %s WHERE `id` = %i',
ACC_STATUS_PURGING, Cfg::get('ACC_RECOVERY_DECAY'), $token, User::$id); ACC_STATUS_PURGING, Cfg::get('ACC_RECOVERY_DECAY'), $token, User::$id);
Util::sendMail(User::$email, 'delete-account', [$token, User::$email, User::$username]); Util::sendMail(User::$email, 'delete-account', [$token, User::$email, User::$username]);

View file

@ -49,12 +49,17 @@ class AccountExcludeResponse extends TextResponse
// we don't get signaled whether an id should be added to or removed from either includes or excludes // we don't get signaled whether an id should be added to or removed from either includes or excludes
// so we throw everything into one table and toggle the mode if its already in here // so we throw everything into one table and toggle the mode if its already in here
$includes = DB::Aowow()->selectCol('SELECT `typeId` FROM ?_profiler_excludes WHERE `type` = ?d AND `typeId` IN (?a)', $this->_post['type'], $validIds); $includes = DB::Aowow()->selectCol('SELECT `typeId` FROM ::profiler_excludes WHERE `type` = %i AND `typeId` IN %in', $this->_post['type'], $validIds);
$insert = [];
foreach ($validIds as $typeId) foreach ($validIds as $typeId)
DB::Aowow()->query('INSERT INTO ?_account_excludes (`userId`, `type`, `typeId`, `mode`) VALUES (?a) ON DUPLICATE KEY UPDATE `mode` = (`mode` ^ 0x3)', {
[User::$id, $this->_post['type'], $typeId, in_array($typeId, $includes) ? 2 : 1] $insert['userId'][] = User::$id;
); $insert['type'][] = $this->_post['type'];
$insert['typeId'][] = $typeId;
$insert['mode'][] = in_array($typeId, $includes) ? Profiler::COMPLETION_INCLUDE : Profiler::COMPLETION_EXCLUDE;
};
DB::Aowow()->qry('INSERT INTO ::account_excludes %m ON DUPLICATE KEY UPDATE `mode` = (`mode` ^ 0x3)', $insert);
} }
else else
trigger_error('AccountExcludeResponse::excludeById - validation failed [type: '.$this->_post['type'].', typeId: '.implode(',', $this->_post['id']).']', E_USER_NOTICE); trigger_error('AccountExcludeResponse::excludeById - validation failed [type: '.$this->_post['type'].', typeId: '.implode(',', $this->_post['id']).']', E_USER_NOTICE);
@ -62,14 +67,14 @@ class AccountExcludeResponse extends TextResponse
private function resetExcludes() : void private function resetExcludes() : void
{ {
DB::Aowow()->query('DELETE FROM ?_account_excludes WHERE `userId` = ?d', User::$id); DB::Aowow()->qry('DELETE FROM ::account_excludes WHERE `userId` = %i', User::$id);
DB::Aowow()->query('UPDATE ?_account SET `excludeGroups` = ?d WHERE `id` = ?d', PR_EXCLUDE_GROUP_UNAVAILABLE, User::$id); DB::Aowow()->qry('UPDATE ::account SET `excludeGroups` = %i WHERE `id` = %i', PR_EXCLUDE_GROUP_UNAVAILABLE, User::$id);
} }
private function updateGroups() : void private function updateGroups() : void
{ {
if ($this->assertPOST('groups')) // clamp to real groups if ($this->assertPOST('groups')) // clamp to real groups
DB::Aowow()->query('UPDATE ?_account SET `excludeGroups` = ?d WHERE `id` = ?d', $this->_post['groups'] & PR_EXCLUDE_GROUP_ANY, User::$id); DB::Aowow()->qry('UPDATE ::account SET `excludeGroups` = %i WHERE `id` = %i', $this->_post['groups'] & PR_EXCLUDE_GROUP_ANY, User::$id);
} }
} }

View file

@ -37,13 +37,13 @@ class AccountFavoritesResponse extends TextResponse
private function removeFavorite() : void private function removeFavorite() : void
{ {
if ($this->assertPOST('id', 'remove')) if ($this->assertPOST('id', 'remove'))
DB::Aowow()->query('DELETE FROM ?_account_favorites WHERE `userId` = ?d AND `type` = ?d AND `typeId` = ?d', User::$id, $this->_post['remove'], $this->_post['id']); DB::Aowow()->qry('DELETE FROM ::account_favorites WHERE `userId` = %i AND `type` = %i AND `typeId` = %i', User::$id, $this->_post['remove'], $this->_post['id']);
} }
private function addFavorite() : void private function addFavorite() : void
{ {
if ($this->assertPOST('id', 'add') && Type::validateIds($this->_post['add'], $this->_post['id'])) if ($this->assertPOST('id', 'add') && Type::validateIds($this->_post['add'], $this->_post['id']))
DB::Aowow()->query('INSERT INTO ?_account_favorites (`userId`, `type`, `typeId`) VALUES (?d, ?d, ?d)', User::$id, $this->_post['add'], $this->_post['id']); DB::Aowow()->qry('INSERT INTO ::account_favorites (`userId`, `type`, `typeId`) VALUES (%i, %i, %i)', User::$id, $this->_post['add'], $this->_post['id']);
else else
trigger_error('AccountFavoritesResponse::addFavorite() - failed to add [userId: '.User::$id.', type: '.$this->_post['add'].', typeId: '.$this->_post['id'], E_USER_NOTICE); trigger_error('AccountFavoritesResponse::addFavorite() - failed to add [userId: '.User::$id.', type: '.$this->_post['add'].', typeId: '.$this->_post['id'], E_USER_NOTICE);
} }

View file

@ -72,14 +72,14 @@ class AccountforgotpasswordResponse extends TemplateResponse
if (!$this->_post['email']) if (!$this->_post['email'])
return Lang::account('emailInvalid'); return Lang::account('emailInvalid');
$timeout = DB::Aowow()->selectCell('SELECT `unbanDate` FROM ?_account_bannedips WHERE `ip` = ? AND `type` = ?d AND `count` > ?d AND `unbanDate` > UNIX_TIMESTAMP()', User::$ip, IP_BAN_TYPE_PASSWORD_RECOVERY, Cfg::get('ACC_FAILED_AUTH_COUNT')); $timeout = DB::Aowow()->selectCell('SELECT `unbanDate` FROM ::account_bannedips WHERE `ip` = %s AND `type` = %i AND `count` > %i AND `unbanDate` > UNIX_TIMESTAMP()', User::$ip, IP_BAN_TYPE_PASSWORD_RECOVERY, Cfg::get('ACC_FAILED_AUTH_COUNT'));
// on cooldown pretend we dont know the email address // on cooldown pretend we dont know the email address
if ($timeout && $timeout > time()) if ($timeout && $timeout > time())
return Cfg::get('DEBUG') ? 'resend on cooldown: '.DateTime::formatTimeElapsed($timeout * 1000).' remaining' : Lang::account('inputbox', 'error', 'emailNotFound'); return Cfg::get('DEBUG') ? 'resend on cooldown: '.DateTime::formatTimeElapsed($timeout * 1000).' remaining' : Lang::account('inputbox', 'error', 'emailNotFound');
// pretend recovery started // pretend recovery started
if (!DB::Aowow()->selectCell('SELECT 1 FROM ?_account WHERE `email` = ?', $this->_post['email'])) if (!DB::Aowow()->selectCell('SELECT 1 FROM ::account WHERE `email` = %s', $this->_post['email']))
{ {
// do not confirm or deny existence of email // do not confirm or deny existence of email
$this->success = !Cfg::get('DEBUG'); $this->success = !Cfg::get('DEBUG');
@ -90,7 +90,7 @@ class AccountforgotpasswordResponse extends TemplateResponse
if ($err = $this->startRecovery(ACC_STATUS_RECOVER_PASS, 'reset-password', $this->_post['email'])) if ($err = $this->startRecovery(ACC_STATUS_RECOVER_PASS, 'reset-password', $this->_post['email']))
return $err; return $err;
DB::Aowow()->query('INSERT INTO ?_account_bannedips (`ip`, `type`, `count`, `unbanDate`) VALUES (?, ?d, ?d, UNIX_TIMESTAMP() + ?d) ON DUPLICATE KEY UPDATE `count` = `count` + ?d, `unbanDate` = UNIX_TIMESTAMP() + ?d', DB::Aowow()->qry('INSERT INTO ::account_bannedips (`ip`, `type`, `count`, `unbanDate`) VALUES (%s, %i, %i, UNIX_TIMESTAMP() + %i) ON DUPLICATE KEY UPDATE `count` = `count` + %i, `unbanDate` = UNIX_TIMESTAMP() + %i',
User::$ip, IP_BAN_TYPE_PASSWORD_RECOVERY, Cfg::get('ACC_FAILED_AUTH_COUNT') + 1, Cfg::get('ACC_FAILED_AUTH_COUNT'), Cfg::get('ACC_FAILED_AUTH_BLOCK'), Cfg::get('ACC_FAILED_AUTH_BLOCK')); User::$ip, IP_BAN_TYPE_PASSWORD_RECOVERY, Cfg::get('ACC_FAILED_AUTH_COUNT') + 1, Cfg::get('ACC_FAILED_AUTH_COUNT'), Cfg::get('ACC_FAILED_AUTH_BLOCK'), Cfg::get('ACC_FAILED_AUTH_BLOCK'));
$this->success = true; $this->success = true;

View file

@ -71,14 +71,14 @@ class AccountforgotusernameResponse extends TemplateResponse
if (!$this->_post['email']) if (!$this->_post['email'])
return Lang::account('emailInvalid'); return Lang::account('emailInvalid');
$timeout = DB::Aowow()->selectCell('SELECT `unbanDate` FROM ?_account_bannedips WHERE `ip` = ? AND `type` = ?d AND `count` > ?d AND `unbanDate` > UNIX_TIMESTAMP()', User::$ip, IP_BAN_TYPE_USERNAME_RECOVERY, Cfg::get('ACC_FAILED_AUTH_COUNT')); $timeout = DB::Aowow()->selectCell('SELECT `unbanDate` FROM ::account_bannedips WHERE `ip` = %s AND `type` = %i AND `count` > %i AND `unbanDate` > UNIX_TIMESTAMP()', User::$ip, IP_BAN_TYPE_USERNAME_RECOVERY, Cfg::get('ACC_FAILED_AUTH_COUNT'));
// on cooldown pretend we dont know the email address // on cooldown pretend we dont know the email address
if ($timeout && $timeout > time()) if ($timeout && $timeout > time())
return Cfg::get('DEBUG') ? 'resend on cooldown: '.DateTime::formatTimeElapsed($timeout * 1000).' remaining' : Lang::account('inputbox', 'error', 'emailNotFound'); return Cfg::get('DEBUG') ? 'resend on cooldown: '.DateTime::formatTimeElapsed($timeout * 1000).' remaining' : Lang::account('inputbox', 'error', 'emailNotFound');
// pretend recovery started // pretend recovery started
if (!DB::Aowow()->selectCell('SELECT 1 FROM ?_account WHERE `email` = ?', $this->_post['email'])) if (!DB::Aowow()->selectCell('SELECT 1 FROM ::account WHERE `email` = %s', $this->_post['email']))
{ {
// do not confirm or deny existence of email // do not confirm or deny existence of email
$this->success = !Cfg::get('DEBUG'); $this->success = !Cfg::get('DEBUG');
@ -89,7 +89,7 @@ class AccountforgotusernameResponse extends TemplateResponse
if ($err = $this->startRecovery(ACC_STATUS_RECOVER_USER, 'recover-user', $this->_post['email'])) if ($err = $this->startRecovery(ACC_STATUS_RECOVER_USER, 'recover-user', $this->_post['email']))
return $err; return $err;
DB::Aowow()->query('INSERT INTO ?_account_bannedips (`ip`, `type`, `count`, `unbanDate`) VALUES (?, ?d, ?d, UNIX_TIMESTAMP() + ?d) ON DUPLICATE KEY UPDATE `count` = `count` + ?d, `unbanDate` = UNIX_TIMESTAMP() + ?d', DB::Aowow()->qry('INSERT INTO ::account_bannedips (`ip`, `type`, `count`, `unbanDate`) VALUES (%s, %i, %i, UNIX_TIMESTAMP() + %i) ON DUPLICATE KEY UPDATE `count` = `count` + %i, `unbanDate` = UNIX_TIMESTAMP() + %i',
User::$ip, IP_BAN_TYPE_USERNAME_RECOVERY, Cfg::get('ACC_FAILED_AUTH_COUNT') + 1, Cfg::get('ACC_FAILED_AUTH_COUNT'), Cfg::get('ACC_FAILED_AUTH_BLOCK'), Cfg::get('ACC_FAILED_AUTH_BLOCK')); User::$ip, IP_BAN_TYPE_USERNAME_RECOVERY, Cfg::get('ACC_FAILED_AUTH_COUNT') + 1, Cfg::get('ACC_FAILED_AUTH_COUNT'), Cfg::get('ACC_FAILED_AUTH_BLOCK'), Cfg::get('ACC_FAILED_AUTH_BLOCK'));
$this->success = true; $this->success = true;

View file

@ -48,7 +48,7 @@ class AccountForumavatarResponse extends TextResponse
private function unset() : string private function unset() : string
{ {
$x = DB::Aowow()->query('UPDATE ?_account SET `avatar` = 0 WHERE `id` = ?d', User::$id); $x = DB::Aowow()->qry('UPDATE ::account SET `avatar` = 0 WHERE `id` = %i', User::$id);
if ($x === null || $x === false) if ($x === null || $x === false)
return Lang::main('genericError'); return Lang::main('genericError');
@ -64,17 +64,17 @@ class AccountForumavatarResponse extends TextResponse
$icon = strtolower(trim($this->_post['wowicon'])); $icon = strtolower(trim($this->_post['wowicon']));
if (!DB::Aowow()->selectCell('SELECT 1 FROM ?_icons WHERE `name` = ?', $icon)) if (!DB::Aowow()->selectCell('SELECT 1 FROM ::icons WHERE `name` = %s', $icon))
return Lang::account('updateMessage', 'avNotFound'); return Lang::account('updateMessage', 'avNotFound');
$x = DB::Aowow()->query('UPDATE ?_account SET `avatar` = 1, `wowicon` = ? WHERE `id` = ?d', strtolower($icon), User::$id); $x = DB::Aowow()->qry('UPDATE ::account SET `avatar` = 1, `wowicon` = %s WHERE `id` = %i', $icon, User::$id);
if ($x === null || $x === false) if (is_null($x))
return Lang::main('genericError'); return Lang::main('genericError');
$this->success = true; $this->success = true;
$msg = Lang::account('updateMessage', $x === 0 ? 'avNoChange' : 'avSuccess'); $msg = Lang::account('updateMessage', $x === 0 ? 'avNoChange' : 'avSuccess');
if (($qty = DB::Aowow()->selectCell('SELECT COUNT(1) FROM ?_account WHERE `wowicon` = ?', $icon)) > 1) if (($qty = DB::Aowow()->selectCell('SELECT COUNT(1) FROM ::account WHERE `wowicon` = %s', $icon)) > 1)
$msg .= ' '.Lang::account('updateMessage', 'avNthUser', [$qty]); $msg .= ' '.Lang::account('updateMessage', 'avNthUser', [$qty]);
else else
$msg .= ' '.Lang::account('updateMessage', 'av1stUser'); $msg .= ' '.Lang::account('updateMessage', 'av1stUser');
@ -92,11 +92,11 @@ class AccountForumavatarResponse extends TextResponse
$customIcon = $this->_post['customicon'] ?? $this->_get['customicon']; $customIcon = $this->_post['customicon'] ?? $this->_get['customicon'];
$x = DB::Aowow()->query('UPDATE ?_account_avatars SET `current` = IF(`id` = ?d, 1, 0) WHERE `userId` = ?d AND `status` <> ?d', $customIcon, User::$id, AvatarMgr::STATUS_REJECTED); $x = DB::Aowow()->qry('UPDATE ::account_avatars SET `current` = IF(`id` = %i, 1, 0) WHERE `userId` = %i AND `status` <> %i', $customIcon, User::$id, AvatarMgr::STATUS_REJECTED);
if (!is_int($x)) if (!is_int($x))
return Lang::main('genericError'); return Lang::main('genericError');
if (!is_int(DB::Aowow()->query('UPDATE ?_account SET `avatar` = 2 WHERE `id` = ?d', User::$id))) if (!is_int(DB::Aowow()->qry('UPDATE ::account SET `avatar` = 2 WHERE `id` = %i', User::$id)))
return Lang::main('intError'); return Lang::main('intError');
$this->success = true; $this->success = true;

View file

@ -28,8 +28,8 @@ class AccountPremiumborderResponse extends TextResponse
if (!$this->assertPOST('avatarborder')) if (!$this->assertPOST('avatarborder'))
return; return;
$x = DB::Aowow()->query('UPDATE ?_account SET `avatarborder` = ?d WHERE `id` = ?d', $this->_post['avatarborder'], User::$id); $x = DB::Aowow()->qry('UPDATE ::account SET `avatarborder` = %i WHERE `id` = %i', $this->_post['avatarborder'], User::$id);
if (!is_int($x)) if (is_null($x))
$_SESSION['msg'] = ['premiumborder', false, Lang::main('genericError')]; $_SESSION['msg'] = ['premiumborder', false, Lang::main('genericError')];
else if (!$x) else if (!$x)
$_SESSION['msg'] = ['premiumborder', true, Lang::account('updateMessage', 'avNoChange')]; $_SESSION['msg'] = ['premiumborder', true, Lang::account('updateMessage', 'avNoChange')];

View file

@ -29,7 +29,7 @@ class AccountRenameiconResponse extends TextResponse
return; return;
// regexp same as in account.js // regexp same as in account.js
DB::Aowow()->query('UPDATE ?_account_avatars SET `name` = ? WHERE `id` = ?d AND `userId` = ?d', trim($this->_post['name']), $this->_post['id'], User::$id); DB::Aowow()->qry('UPDATE ::account_avatars SET `name` = %s WHERE `id` = %i AND `userId` = %i', trim($this->_post['name']), $this->_post['id'], User::$id);
} }
} }

View file

@ -69,19 +69,19 @@ class AccountResendResponse extends TemplateResponse
if (!$this->_post['email']) if (!$this->_post['email'])
return Lang::account('emailInvalid'); return Lang::account('emailInvalid');
$timeout = DB::Aowow()->selectCell('SELECT `unbanDate` FROM ?_account_bannedips WHERE `ip` = ? AND `type` = ?d AND `count` > ?d AND `unbanDate` > UNIX_TIMESTAMP()', User::$ip, IP_BAN_TYPE_REGISTRATION_ATTEMPT, Cfg::get('ACC_FAILED_AUTH_COUNT')); $timeout = DB::Aowow()->selectCell('SELECT `unbanDate` FROM ::account_bannedips WHERE `ip` = %s AND `type` = %i AND `count` > %i AND `unbanDate` > UNIX_TIMESTAMP()', User::$ip, IP_BAN_TYPE_REGISTRATION_ATTEMPT, Cfg::get('ACC_FAILED_AUTH_COUNT'));
// on cooldown pretend we dont know the email address // on cooldown pretend we dont know the email address
if ($timeout && $timeout > time()) if ($timeout && $timeout > time())
return Cfg::get('DEBUG') ? 'resend on cooldown: '.DateTime::formatTimeElapsed($timeout * 1000).' remaining' : Lang::account('inputbox', 'error', 'emailNotFound'); return Cfg::get('DEBUG') ? 'resend on cooldown: '.DateTime::formatTimeElapsed($timeout * 1000).' remaining' : Lang::account('inputbox', 'error', 'emailNotFound');
// check email and account status // check email and account status
if ($token = DB::Aowow()->selectCell('SELECT `token` FROM ?_account WHERE `email` = ? AND `status` = ?d', $this->_post['email'], ACC_STATUS_NEW)) if ($token = DB::Aowow()->selectCell('SELECT `token` FROM ::account WHERE `email` = %s AND `status` = %i', $this->_post['email'], ACC_STATUS_NEW))
{ {
if (!Util::sendMail($this->_post['email'], 'activate-account', [$token])) if (!Util::sendMail($this->_post['email'], 'activate-account', [$token]))
return Lang::main('intError'); return Lang::main('intError');
DB::Aowow()->query('INSERT INTO ?_account_bannedips (`ip`, `type`, `count`, `unbanDate`) VALUES (?, ?d, ?d, UNIX_TIMESTAMP() + ?d) ON DUPLICATE KEY UPDATE `count` = `count` + ?d, `unbanDate` = UNIX_TIMESTAMP() + ?d', DB::Aowow()->qry('INSERT INTO ::account_bannedips (`ip`, `type`, `count`, `unbanDate`) VALUES (%s, %i, %i, UNIX_TIMESTAMP() + %i) ON DUPLICATE KEY UPDATE `count` = `count` + %i, `unbanDate` = UNIX_TIMESTAMP() + %i',
User::$ip, IP_BAN_TYPE_REGISTRATION_ATTEMPT, Cfg::get('ACC_FAILED_AUTH_COUNT') + 1, Cfg::get('ACC_FAILED_AUTH_COUNT'), Cfg::get('ACC_FAILED_AUTH_BLOCK'), Cfg::get('ACC_FAILED_AUTH_BLOCK')); User::$ip, IP_BAN_TYPE_REGISTRATION_ATTEMPT, Cfg::get('ACC_FAILED_AUTH_COUNT') + 1, Cfg::get('ACC_FAILED_AUTH_COUNT'), Cfg::get('ACC_FAILED_AUTH_BLOCK'), Cfg::get('ACC_FAILED_AUTH_BLOCK'));
$this->success = true; $this->success = true;

View file

@ -59,7 +59,7 @@ class AccountresetpasswordResponse extends TemplateResponse
$errMsg = ''; $errMsg = '';
if (!$this->assertGET('key') && !$this->assertPOST('key')) if (!$this->assertGET('key') && !$this->assertPOST('key'))
$errMsg = Lang::account('inputbox', 'error', 'passTokenLost'); $errMsg = Lang::account('inputbox', 'error', 'passTokenLost');
else if ($this->_get['key'] && !DB::Aowow()->selectCell('SELECT 1 FROM ?_account WHERE `token` = ? AND `status` = ?d AND `statusTimer` > UNIX_TIMESTAMP()', $this->_get['key'], ACC_STATUS_RECOVER_PASS)) else if ($this->_get['key'] && !DB::Aowow()->selectCell('SELECT 1 FROM ::account WHERE `token` = %s AND `status` = %i AND `statusTimer` > UNIX_TIMESTAMP()', $this->_get['key'], ACC_STATUS_RECOVER_PASS))
$errMsg = Lang::account('inputbox', 'error', 'passTokenUsed'); $errMsg = Lang::account('inputbox', 'error', 'passTokenUsed');
if ($errMsg) if ($errMsg)
@ -99,7 +99,7 @@ class AccountresetpasswordResponse extends TemplateResponse
if ($this->_post['password'] != $this->_post['c_password']) if ($this->_post['password'] != $this->_post['c_password'])
return Lang::account('passCheckFail'); return Lang::account('passCheckFail');
$userData = DB::Aowow()->selectRow('SELECT `id`, `passHash` FROM ?_account WHERE `token` = ? AND `email` = ? AND `status` = ?d AND `statusTimer` > UNIX_TIMESTAMP()', $userData = DB::Aowow()->selectRow('SELECT `id`, `passHash` FROM ::account WHERE `token` = %s AND `email` = %s AND `status` = %i AND `statusTimer` > UNIX_TIMESTAMP()',
$this->_post['key'], $this->_post['key'],
$this->_post['email'], $this->_post['email'],
ACC_STATUS_RECOVER_PASS ACC_STATUS_RECOVER_PASS
@ -110,7 +110,7 @@ class AccountresetpasswordResponse extends TemplateResponse
if (!User::verifyCrypt($this->_post['c_password'], $userData['passHash'])) if (!User::verifyCrypt($this->_post['c_password'], $userData['passHash']))
return Lang::account('newPassDiff'); return Lang::account('newPassDiff');
if (!DB::Aowow()->query('UPDATE ?_account SET `passHash` = ?, `status` = ?d WHERE `id` = ?d', User::hashCrypt($this->_post['c_password']), ACC_STATUS_NONE, $userData['id'])) if (!DB::Aowow()->qry('UPDATE ::account SET `passHash` = %s, `status` = %i WHERE `id` = %i', User::hashCrypt($this->_post['c_password']), ACC_STATUS_NONE, $userData['id']))
return Lang::main('intError'); return Lang::main('intError');
$this->success = true; $this->success = true;

View file

@ -46,12 +46,12 @@ class AccountRevertemailaddressResponse extends TemplateResponse
if (!$this->assertGET('key')) if (!$this->assertGET('key'))
return Lang::main('intError'); return Lang::main('intError');
$acc = DB::Aowow()->selectRow('SELECT `updateValue`, `status`, `statusTimer` FROM ?_account WHERE `token` = ?', $this->_get['key']); $acc = DB::Aowow()->selectRow('SELECT `updateValue`, `status`, `statusTimer` FROM ::account WHERE `token` = %s', $this->_get['key']);
if (!$acc || $acc['status'] != ACC_STATUS_CHANGE_EMAIL || $acc['statusTimer'] < time()) if (!$acc || $acc['status'] != ACC_STATUS_CHANGE_EMAIL || $acc['statusTimer'] < time())
return Lang::account('inputbox', 'error', 'mailTokenUsed'); return Lang::account('inputbox', 'error', 'mailTokenUsed');
// 0 changes == error // 0 changes == error
if (!DB::Aowow()->query('UPDATE ?_account SET `status` = ?d, `statusTimer` = 0, `token` = "", `updateValue` = "" WHERE `token` = ?', ACC_STATUS_NONE, $this->_get['key'])) if (!DB::Aowow()->qry('UPDATE ::account SET `status` = %i, `statusTimer` = 0, `token` = "", `updateValue` = "" WHERE `token` = %s', ACC_STATUS_NONE, $this->_get['key']))
return Lang::main('intError'); return Lang::main('intError');
$this->success = true; $this->success = true;

View file

@ -53,7 +53,7 @@ class AccountSigninResponse extends TemplateResponse
// coming from user recovery or creation, prefill username // coming from user recovery or creation, prefill username
if ($this->_get['key']) if ($this->_get['key'])
{ {
if ($userData = DB::Aowow()->selectRow('SELECT a.`login` AS "0", IF(s.`expires`, 0, 1) AS "1" FROM ?_account a LEFT JOIN ?_account_sessions s ON a.`id` = s.`userId` AND a.`token` = s.`sessionId` WHERE a.`status` IN (?a) AND a.`token` = ?', if ($userData = DB::Aowow()->selectRow('SELECT a.`login` AS "0", IF(s.`expires`, 0, 1) AS "1" FROM ::account a LEFT JOIN ::account_sessions s ON a.`id` = s.`userId` AND a.`token` = s.`sessionId` WHERE a.`status` IN %in AND a.`token` = %s',
[ACC_STATUS_RECOVER_USER, ACC_STATUS_NONE], $this->_get['key'])) [ACC_STATUS_RECOVER_USER, ACC_STATUS_NONE], $this->_get['key']))
[$username, $rememberMe] = $userData; [$username, $rememberMe] = $userData;
} }
@ -116,7 +116,7 @@ class AccountSigninResponse extends TemplateResponse
} }
// reset account status, update expiration // reset account status, update expiration
$ok = DB::Aowow()->query('UPDATE ?_account SET `prevIP` = IF(`curIp` = ?, `prevIP`, `curIP`), `curIP` = IF(`curIp` = ?, `curIP`, ?), `status` = IF(`status` = ?d, `status`, 0), `statusTimer` = IF(`status` = ?d, `statusTimer`, 0), `token` = IF(`status` = ?d, `token`, "") WHERE `id` = ?d', $ok = DB::Aowow()->qry('UPDATE ::account SET `prevIP` = IF(`curIp` = %s, `prevIP`, `curIP`), `curIP` = IF(`curIp` = %s, `curIP`, %s), `status` = IF(`status` = %i, `status`, 0), `statusTimer` = IF(`status` = %i, `statusTimer`, 0), `token` = IF(`status` = %i, `token`, "") WHERE `id` = %i',
User::$ip, User::$ip, User::$ip, User::$ip, User::$ip, User::$ip,
ACC_STATUS_NEW, ACC_STATUS_NEW, ACC_STATUS_NEW, ACC_STATUS_NEW, ACC_STATUS_NEW, ACC_STATUS_NEW,
User::$id // available after successful User:authenticate User::$id // available after successful User:authenticate
@ -130,12 +130,12 @@ class AccountSigninResponse extends TemplateResponse
// DELETE temp session // DELETE temp session
if ($this->_get['key']) if ($this->_get['key'])
DB::Aowow()->query('DELETE FROM ?_account_sessions WHERE `sessionId` = ?', $this->_get['key']); DB::Aowow()->qry('DELETE FROM ::account_sessions WHERE `sessionId` = %s', $this->_get['key']);
session_regenerate_id(true); // user status changed => regenerate id session_regenerate_id(true); // user status changed => regenerate id
// create new session entry // create new session entry
DB::Aowow()->query('INSERT INTO ?_account_sessions (`userId`, `sessionId`, `created`, `expires`, `touched`, `deviceInfo`, `ip`, `status`) VALUES (?d, ?, ?d, ?d, ?d, ?, ?, ?d)', DB::Aowow()->qry('INSERT INTO ::account_sessions (`userId`, `sessionId`, `created`, `expires`, `touched`, `deviceInfo`, `ip`, `status`) VALUES (%i, %s, %i, %i, %i, %s, %s, %i)',
User::$id, session_id(), time(), $this->_post['remember_me'] ? 0 : time() + Cfg::get('SESSION_TIMEOUT_DELAY'), time(), User::$agent, User::$ip, SESSION_ACTIVE); User::$id, session_id(), time(), $this->_post['remember_me'] ? 0 : time() + Cfg::get('SESSION_TIMEOUT_DELAY'), time(), User::$agent, User::$ip, SESSION_ACTIVE);
if (User::init()) // reinitialize the user if (User::init()) // reinitialize the user

View file

@ -27,9 +27,9 @@ class AccountSignoutResponse extends TextResponse
protected function generate() : void protected function generate() : void
{ {
if ($this->_get['global']) if ($this->_get['global'])
DB::Aowow()->query('UPDATE ?_account_sessions SET `touched` = ?d, `status` = ?d WHERE `userId` = ?d', time(), SESSION_FORCED_LOGOUT, User::$id); DB::Aowow()->qry('UPDATE ::account_sessions SET `touched` = %i, `status` = %i WHERE `userId` = %i', time(), SESSION_FORCED_LOGOUT, User::$id);
else else
DB::Aowow()->query('UPDATE ?_account_sessions SET `touched` = ?d, `status` = ?d WHERE `sessionId` = ?', time(), SESSION_LOGOUT, session_id()); DB::Aowow()->qry('UPDATE ::account_sessions SET `touched` = %i, `status` = %i WHERE `sessionId` = %s', time(), SESSION_LOGOUT, session_id());
User::destroy(); User::destroy();

View file

@ -109,24 +109,24 @@ class AccountSignupResponse extends TemplateResponse
return Lang::main('intError'); return Lang::main('intError');
// limit account creation // limit account creation
if (DB::Aowow()->selectRow('SELECT 1 FROM ?_account_bannedips WHERE `type` = ?d AND `ip` = ? AND `count` >= ?d AND `unbanDate` >= UNIX_TIMESTAMP()', IP_BAN_TYPE_REGISTRATION_ATTEMPT, User::$ip, Cfg::get('ACC_FAILED_AUTH_COUNT'))) if (DB::Aowow()->selectRow('SELECT 1 FROM ::account_bannedips WHERE `type` = %i AND `ip` = %s AND `count` >= %i AND `unbanDate` >= UNIX_TIMESTAMP()', IP_BAN_TYPE_REGISTRATION_ATTEMPT, User::$ip, Cfg::get('ACC_FAILED_AUTH_COUNT')))
{ {
DB::Aowow()->query('UPDATE ?_account_bannedips SET `count` = `count` + 1, `unbanDate` = UNIX_TIMESTAMP() + ?d WHERE `ip` = ? AND `type` = ?d', Cfg::get('ACC_FAILED_AUTH_BLOCK'), User::$ip, IP_BAN_TYPE_REGISTRATION_ATTEMPT); DB::Aowow()->qry('UPDATE ::account_bannedips SET `count` = `count` + 1, `unbanDate` = UNIX_TIMESTAMP() + %i WHERE `ip` = %s AND `type` = %i', Cfg::get('ACC_FAILED_AUTH_BLOCK'), User::$ip, IP_BAN_TYPE_REGISTRATION_ATTEMPT);
return Lang::account('inputbox', 'error', 'signupExceeded', [DateTime::formatTimeElapsedFloat(Cfg::get('ACC_FAILED_AUTH_BLOCK') * 1000)]); return Lang::account('inputbox', 'error', 'signupExceeded', [DateTime::formatTimeElapsedFloat(Cfg::get('ACC_FAILED_AUTH_BLOCK') * 1000)]);
} }
// username / email taken // username / email taken
if ($inUseData = DB::Aowow()->SelectRow('SELECT `id`, `username`, `status` = ?d AND `statusTimer` < UNIX_TIMESTAMP() AS "expired" FROM ?_account WHERE (LOWER(`username`) = LOWER(?) OR LOWER(`email`) = LOWER(?))', ACC_STATUS_NEW, $this->_post['username'], $this->_post['email'])) if ($inUseData = DB::Aowow()->SelectRow('SELECT `id`, `username`, `status` = %i AND `statusTimer` < UNIX_TIMESTAMP() AS "expired" FROM ::account WHERE (LOWER(`username`) = LOWER(%s) OR LOWER(`email`) = LOWER(%s))', ACC_STATUS_NEW, $this->_post['username'], $this->_post['email']))
{ {
if ($inUseData['expired']) if ($inUseData['expired'])
DB::Aowow()->query('DELETE FROM ?_account WHERE `id` = ?d', $inUseData['id']); DB::Aowow()->qry('DELETE FROM ::account WHERE `id` = %i', $inUseData['id']);
else else
return Util::lower($inUseData['username']) == Util::lower($this->_post['username']) ? Lang::account('nameInUse') : Lang::account('mailInUse'); return Util::lower($inUseData['username']) == Util::lower($this->_post['username']) ? Lang::account('nameInUse') : Lang::account('mailInUse');
} }
// create.. // create..
$token = Util::createHash(); $token = Util::createHash();
$userId = DB::Aowow()->query('INSERT INTO ?_account (`login`, `passHash`, `username`, `email`, `joindate`, `curIP`, `locale`, `userGroups`, `status`, `statusTimer`, `token`) VALUES (?, ?, ?, ?, UNIX_TIMESTAMP(), ?, ?d, ?d, ?d, UNIX_TIMESTAMP() + ?d, ?)', $userId = DB::Aowow()->qry('INSERT INTO ::account (`login`, `passHash`, `username`, `email`, `joindate`, `curIP`, `locale`, `userGroups`, `status`, `statusTimer`, `token`) VALUES (%s, %s, %s, %s, UNIX_TIMESTAMP(), %s, %i, %i, %i, UNIX_TIMESTAMP() + %i, %s)',
$this->_post['username'], $this->_post['username'],
User::hashCrypt($this->_post['password']), User::hashCrypt($this->_post['password']),
$this->_post['username'], $this->_post['username'],
@ -143,14 +143,14 @@ class AccountSignupResponse extends TemplateResponse
return Lang::main('intError'); return Lang::main('intError');
// create session tied to the token to store remember_me status // create session tied to the token to store remember_me status
DB::Aowow()->query('INSERT INTO ?_account_sessions (`userId`, `sessionId`, `created`, `expires`, `touched`, `deviceInfo`, `ip`, `status`) VALUES (?d, ?, ?d, ?d, ?d, ?, ?, ?d)', DB::Aowow()->qry('INSERT INTO ::account_sessions (`userId`, `sessionId`, `created`, `expires`, `touched`, `deviceInfo`, `ip`, `status`) VALUES (%i, %s, %i, %i, %i, %s, %s, %i)',
$userId, $token, time(), $this->_post['remember_me'] ? 0 : time() + Cfg::get('SESSION_TIMEOUT_DELAY'), time(), User::$agent, User::$ip, SESSION_ACTIVE); $userId, $token, time(), $this->_post['remember_me'] ? 0 : time() + Cfg::get('SESSION_TIMEOUT_DELAY'), time(), User::$agent, User::$ip, SESSION_ACTIVE);
if (!Util::sendMail($this->_post['email'], 'activate-account', [$token], Cfg::get('ACC_CREATE_SAVE_DECAY'))) if (!Util::sendMail($this->_post['email'], 'activate-account', [$token], Cfg::get('ACC_CREATE_SAVE_DECAY')))
return Lang::main('intError2', ['send mail']); return Lang::main('intError2', ['send mail']);
// success: update ip-bans // success: update ip-bans
DB::Aowow()->query('INSERT INTO ?_account_bannedips (`ip`, `type`, `count`, `unbanDate`) VALUES (?, ?d, 1, UNIX_TIMESTAMP() + ?d) ON DUPLICATE KEY UPDATE `count` = `count` + 1, `unbanDate` = UNIX_TIMESTAMP() + ?d', DB::Aowow()->qry('INSERT INTO ::account_bannedips (`ip`, `type`, `count`, `unbanDate`) VALUES (%s, %i, 1, UNIX_TIMESTAMP() + %i) ON DUPLICATE KEY UPDATE `count` = `count` + 1, `unbanDate` = UNIX_TIMESTAMP() + %i',
User::$ip, IP_BAN_TYPE_REGISTRATION_ATTEMPT, Cfg::get('ACC_FAILED_AUTH_BLOCK'), Cfg::get('ACC_FAILED_AUTH_BLOCK')); User::$ip, IP_BAN_TYPE_REGISTRATION_ATTEMPT, Cfg::get('ACC_FAILED_AUTH_BLOCK'), Cfg::get('ACC_FAILED_AUTH_BLOCK'));
Util::gainSiteReputation($userId, SITEREP_ACTION_REGISTER); Util::gainSiteReputation($userId, SITEREP_ACTION_REGISTER);

View file

@ -37,7 +37,7 @@ class AccountUpdatecommunitysettingsResponse extends TextResponse
return Lang::main('genericError'); return Lang::main('genericError');
// description - 0 modified rows is still success // description - 0 modified rows is still success
if (!is_int(DB::Aowow()->query('UPDATE ?_account SET `description` = ? WHERE `id` = ?d', $this->_post['desc'], User::$id))) if (!is_int(DB::Aowow()->qry('UPDATE ::account SET `description` = %s WHERE `id` = %i', $this->_post['desc'], User::$id)))
return Lang::main('genericError'); return Lang::main('genericError');
$this->success = true; $this->success = true;

View file

@ -48,21 +48,21 @@ class AccountUpdateemailResponse extends TextResponse
if (!$this->_post['newemail']) if (!$this->_post['newemail'])
return Lang::account('emailInvalid'); return Lang::account('emailInvalid');
if (DB::Aowow()->selectCell('SELECT 1 FROM ?_account WHERE `email` = ? AND `id` <> ?d', $this->_post['newemail'], User::$id)) if (DB::Aowow()->selectCell('SELECT 1 FROM ::account WHERE `email` = %s AND `id` <> %i', $this->_post['newemail'], User::$id))
return Lang::account('mailInUse'); return Lang::account('mailInUse');
$status = DB::Aowow()->selectCell('SELECT `status` FROM ?_account WHERE `statusTimer` > UNIX_TIMESTAMP() AND `id` = ?d', User::$id); $status = DB::Aowow()->selectCell('SELECT `status` FROM ::account WHERE `statusTimer` > UNIX_TIMESTAMP() AND `id` = %i', User::$id);
if ($status != ACC_STATUS_NONE && $status != ACC_STATUS_CHANGE_EMAIL) if ($status != ACC_STATUS_NONE && $status != ACC_STATUS_CHANGE_EMAIL)
return Lang::account('inputbox', 'error', 'isRecovering', [DateTime::formatTimeElapsedFloat(Cfg::get('ACC_RECOVERY_DECAY') * 1000)]); return Lang::account('inputbox', 'error', 'isRecovering', [DateTime::formatTimeElapsedFloat(Cfg::get('ACC_RECOVERY_DECAY') * 1000)]);
$oldEmail = DB::Aowow()->selectCell('SELECT `email` FROM ?_account WHERE `id` = ?d', User::$id); $oldEmail = DB::Aowow()->selectCell('SELECT `email` FROM ::account WHERE `id` = %i', User::$id);
if ($this->_post['newemail'] == $oldEmail) if ($this->_post['newemail'] == $oldEmail)
return Lang::account('newMailDiff'); return Lang::account('newMailDiff');
$token = Util::createHash(); $token = Util::createHash();
// store new mail in updateValue field, exchange when confirmation mail gets confirmed // store new mail in updateValue field, exchange when confirmation mail gets confirmed
if (!DB::Aowow()->query('UPDATE ?_account SET `updateValue` = ?, `status` = ?d, `statusTimer` = UNIX_TIMESTAMP() + ?d, `token` = ? WHERE `id` = ?d', if (!DB::Aowow()->qry('UPDATE ::account SET `updateValue` = %s, `status` = %i, `statusTimer` = UNIX_TIMESTAMP() + %i, `token` = %s WHERE `id` = %i',
$this->_post['newemail'], ACC_STATUS_CHANGE_EMAIL, Cfg::get('ACC_RECOVERY_DECAY'), $token, User::$id)) $this->_post['newemail'], ACC_STATUS_CHANGE_EMAIL, Cfg::get('ACC_RECOVERY_DECAY'), $token, User::$id))
return Lang::main('intError'); return Lang::main('intError');

View file

@ -41,15 +41,15 @@ class AccountUpdategeneralsettingsResponse extends TextResponse
if ($this->_post['modelrace'] && !ChrRace::tryFrom($this->_post['modelrace'])) if ($this->_post['modelrace'] && !ChrRace::tryFrom($this->_post['modelrace']))
return Lang::main('genericError'); return Lang::main('genericError');
// js handles this as cookie, so saved as cookie; Q - also save in ?_account table? // js handles this as cookie, so saved as cookie; Q - also save in ::account table?
if (!DB::Aowow()->query('REPLACE INTO ?_account_cookies (`userId`, `name`, `data`) VALUES (?d, ?, ?)', User::$id, 'default_3dmodel', $this->_post['modelrace']. ',' . $this->_post['modelgender'])) if (!DB::Aowow()->qry('REPLACE INTO ::account_cookies (`userId`, `name`, `data`) VALUES (%i, %s, %s)', User::$id, 'default_3dmodel', $this->_post['modelrace']. ',' . $this->_post['modelgender']))
return Lang::main('genericError'); return Lang::main('genericError');
if (!setcookie('default_3dmodel', $this->_post['modelrace']. ',' . $this->_post['modelgender'], 0, '/')) if (!setcookie('default_3dmodel', $this->_post['modelrace']. ',' . $this->_post['modelgender'], 0, '/'))
return Lang::main('intError'); return Lang::main('intError');
// int > number of edited rows > no changes is still success // int > number of edited rows > no changes is still success
if (!is_int(DB::Aowow()->query('UPDATE ?_account SET `debug` = ?d WHERE `id` = ?d', $this->_post['idsInLists'] ? 1 : 0, User::$id))) if (!is_int(DB::Aowow()->qry('UPDATE ::account SET `debug` = %i WHERE `id` = %i', $this->_post['idsInLists'] ? 1 : 0, User::$id)))
return Lang::main('intError'); return Lang::main('intError');
$this->success = true; $this->success = true;

View file

@ -53,7 +53,7 @@ class AccountUpdatepasswordResponse extends TextResponse
if ($this->_post['newPassword'] !== $this->_post['confirmPassword']) if ($this->_post['newPassword'] !== $this->_post['confirmPassword'])
return Lang::account('passMismatch'); return Lang::account('passMismatch');
$userData = DB::Aowow()->selectRow('SELECT `status`, `passHash`, `statusTimer` FROM ?_account WHERE `id` = ?d', User::$id); $userData = DB::Aowow()->selectRow('SELECT `status`, `passHash`, `statusTimer` FROM ::account WHERE `id` = %i', User::$id);
if ($userData['status'] != ACC_STATUS_NONE && $userData['status'] != ACC_STATUS_CHANGE_PASS && $userData['statusTimer'] > time()) if ($userData['status'] != ACC_STATUS_NONE && $userData['status'] != ACC_STATUS_CHANGE_PASS && $userData['statusTimer'] > time())
return Lang::account('inputbox', 'error', 'isRecovering', [DateTime::formatTimeElapsedFloat(Cfg::get('ACC_RECOVERY_DECAY') * 1000)]); return Lang::account('inputbox', 'error', 'isRecovering', [DateTime::formatTimeElapsedFloat(Cfg::get('ACC_RECOVERY_DECAY') * 1000)]);
@ -66,17 +66,17 @@ class AccountUpdatepasswordResponse extends TextResponse
$token = Util::createHash(); $token = Util::createHash();
// store new hash in updateValue field, exchange when confirmation mail gets confirmed // store new hash in updateValue field, exchange when confirmation mail gets confirmed
if (!DB::Aowow()->query('UPDATE ?_account SET `updateValue` = ?, `status` = ?d, `statusTimer` = UNIX_TIMESTAMP() + ?d, `token` = ? WHERE `id` = ?d', if (!DB::Aowow()->qry('UPDATE ::account SET `updateValue` = %s, `status` = %i, `statusTimer` = UNIX_TIMESTAMP() + %i, `token` = %s WHERE `id` = %i',
User::hashCrypt($this->_post['newPassword']), ACC_STATUS_CHANGE_PASS, Cfg::get('ACC_RECOVERY_DECAY'), $token, User::$id)) User::hashCrypt($this->_post['newPassword']), ACC_STATUS_CHANGE_PASS, Cfg::get('ACC_RECOVERY_DECAY'), $token, User::$id))
return Lang::main('intError'); return Lang::main('intError');
$email = DB::Aowow()->selectCell('SELECT `email` FROM ?_account WHERE `id` = ?d', User::$id); $email = DB::Aowow()->selectCell('SELECT `email` FROM ::account WHERE `id` = %i', User::$id);
if (!Util::sendMail($email, 'update-password', [$token, $email], Cfg::get('ACC_RECOVERY_DECAY'))) if (!Util::sendMail($email, 'update-password', [$token, $email], Cfg::get('ACC_RECOVERY_DECAY')))
return Lang::main('intError2', ['send mail']); return Lang::main('intError2', ['send mail']);
// logout all other active sessions // logout all other active sessions
if ($this->_post['globalLogout']) if ($this->_post['globalLogout'])
DB::Aowow()->query('UPDATE ?_account_sessions SET `status` = ?d, `touched` = ?d WHERE `userId` = ?d AND `sessionId` <> ? AND `status` = ?d', SESSION_FORCED_LOGOUT, time(), User::$id, session_id(), SESSION_ACTIVE); DB::Aowow()->qry('UPDATE ::account_sessions SET `status` = %i, `touched` = %i WHERE `userId` = %i AND `sessionId` <> ? AND `status` = %i', SESSION_FORCED_LOGOUT, time(), User::$id, session_id(), SESSION_ACTIVE);
$this->success = true; $this->success = true;
return Lang::account('updateMessage', 'personal', [User::$email]); return Lang::account('updateMessage', 'personal', [User::$email]);

View file

@ -44,14 +44,14 @@ class AccountUpdateusernameResponse extends TextResponse
if (!$this->assertPOST('newUsername')) if (!$this->assertPOST('newUsername'))
return Lang::main('intError'); return Lang::main('intError');
if (DB::Aowow()->selectCell('SELECT `renameCooldown` FROM ?_account WHERE `id` = ?d', User::$id) > time()) if (DB::Aowow()->selectCell('SELECT `renameCooldown` FROM ::account WHERE `id` = %i', User::$id) > time())
return Lang::main('intError'); // should have grabbed the error response.. return Lang::main('intError'); // should have grabbed the error response..
// yes, including your current name. you don't want to change into your current name, right? // yes, including your current name. you don't want to change into your current name, right?
if (DB::Aowow()->selectCell('SELECT 1 FROM ?_account WHERE LOWER(`username`) = LOWER(?)', $this->_post['newUsername'])) if (DB::Aowow()->selectCell('SELECT 1 FROM ::account WHERE LOWER(`username`) = LOWER(%s)', $this->_post['newUsername']))
return Lang::account('nameInUse'); return Lang::account('nameInUse');
DB::Aowow()->query('UPDATE ?_account SET `username` = ?, `renameCooldown` = ?d WHERE `id` = ?d', $this->_post['newUsername'], time() + Cfg::get('acc_rename_decay'), User::$id); DB::Aowow()->qry('UPDATE ::account SET `username` = %s, `renameCooldown` = %i WHERE `id` = %i', $this->_post['newUsername'], time() + Cfg::get('acc_rename_decay'), User::$id);
$this->success = true; $this->success = true;
return Lang::account('updateMessage', 'username', [User::$username, $this->_post['newUsername']]); return Lang::account('updateMessage', 'username', [User::$username, $this->_post['newUsername']]);

View file

@ -46,11 +46,11 @@ class AccountWeightscalesResponse extends TextResponse
if (!$this->assertPOST('name', 'scale')) if (!$this->assertPOST('name', 'scale'))
return; return;
$nScales = DB::Aowow()->selectCell('SELECT COUNT(`id`) FROM ?_account_weightscales WHERE `userId` = ?d', User::$id); $nScales = DB::Aowow()->selectCell('SELECT COUNT(`id`) FROM ::account_weightscales WHERE `userId` = %i', User::$id);
if ($nScales >= self::MAX_SCALES) if ($nScales >= self::MAX_SCALES)
return; return;
if ($id = DB::Aowow()->query('INSERT INTO ?_account_weightscales (`userId`, `name`) VALUES (?d, ?)', User::$id, $this->_post['name'])) if ($id = DB::Aowow()->qry('INSERT INTO ::account_weightscales (`userId`, `name`) VALUES (%i, %s)', User::$id, $this->_post['name']))
if ($this->storeScaleData($id)) if ($this->storeScaleData($id))
$this->result = $id; $this->result = $id;
} }
@ -61,13 +61,13 @@ class AccountWeightscalesResponse extends TextResponse
return; return;
// not in DB or not owned by user // not in DB or not owned by user
if (!DB::Aowow()->selectCell('SELECT 1 FROM ?_account_weightscales WHERE `userId` = ?d AND `id` = ?d', User::$id, $this->_post['id'])) if (!DB::Aowow()->selectCell('SELECT 1 FROM ::account_weightscales WHERE `userId` = %i AND `id` = %i', User::$id, $this->_post['id']))
{ {
trigger_error('AccountWeightscalesResponse::updateWeights - scale #'.$this->_post['id'].' not in db or not owned by user #'.User::$id, E_USER_ERROR); trigger_error('AccountWeightscalesResponse::updateWeights - scale #'.$this->_post['id'].' not in db or not owned by user #'.User::$id, E_USER_ERROR);
return; return;
} }
DB::Aowow()->query('UPDATE ?_account_weightscales SET `name` = ? WHERE `id` = ?d', $this->_post['name'], $this->_post['id']); DB::Aowow()->qry('UPDATE ::account_weightscales SET `name` = %s WHERE `id` = %i', $this->_post['name'], $this->_post['id']);
$this->storeScaleData($this->_post['id']); $this->storeScaleData($this->_post['id']);
// return edited id on success // return edited id on success
@ -77,20 +77,24 @@ class AccountWeightscalesResponse extends TextResponse
private function deleteWeights() : void private function deleteWeights() : void
{ {
if ($this->assertPOST('id')) if ($this->assertPOST('id'))
DB::Aowow()->query('DELETE FROM ?_account_weightscales WHERE `id` = ?d AND `userId` = ?d', $this->_post['id'], User::$id); DB::Aowow()->qry('DELETE FROM ::account_weightscales WHERE `id` = %i AND `userId` = %i', $this->_post['id'], User::$id);
$this->result = ''; $this->result = '';
} }
private function storeScaleData(int $scaleId) : bool private function storeScaleData(int $scaleId) : bool
{ {
if (!is_int(DB::Aowow()->query('DELETE FROM ?_account_weightscale_data WHERE `id` = ?d', $scaleId))) if (!is_int(DB::Aowow()->qry('DELETE FROM ::account_weightscale_data WHERE `id` = %i', $scaleId)))
return false; return false;
foreach ($this->_post['scale'] as [$k, $v]) // $x['val'] is known to be a positive int due to regex check
if (Stat::getWeightJson($k)) // $v is known to be a positive int due to regex check $scaleData = array_filter($this->_post['scale'], fn($x) => Stat::getWeightJson($x['field']) && $x['val'] > 0);
if (!is_int(DB::Aowow()->query('INSERT INTO ?_account_weightscale_data VALUES (?d, ?, ?d)', $scaleId, $k, $v)))
return false; array_walk($scaleData, fn(&$x) => $x['id'] = $scaleId);
foreach ($scaleData as $sd)
if (is_null(DB::Aowow()->qry('INSERT INTO ::account_weightscale_data %v', $sd)))
return false;
return true; return true;
} }
@ -103,7 +107,7 @@ class AccountWeightscalesResponse extends TextResponse
protected static function checkScale(string $val) : array protected static function checkScale(string $val) : array
{ {
if (preg_match('/^((\w+:\d+)(,\w+:\d+)*)$/', $val)) if (preg_match('/^((\w+:\d+)(,\w+:\d+)*)$/', $val))
return array_map(fn($x) => explode(':', $x), explode(',', $val)); return array_map(fn($x) => array_combine(['field', 'val'], explode(':', $x)), explode(',', $val));
return []; return [];
} }

View file

@ -73,7 +73,7 @@ class AchievementBaseResponse extends TemplateResponse implements ICache
while ($curCat > 0) while ($curCat > 0)
{ {
$catPath[] = $curCat; $catPath[] = $curCat;
$curCat = DB::Aowow()->SelectCell('SELECT `parentCat` FROM ?_achievementcategory WHERE `id` = ?d', $curCat); $curCat = DB::Aowow()->SelectCell('SELECT `parentCat` FROM ::achievementcategory WHERE `id` = %i', $curCat);
} }
$this->breadcrumb = array_merge($this->breadcrumb, array_reverse($catPath)); $this->breadcrumb = array_merge($this->breadcrumb, array_reverse($catPath));
@ -120,8 +120,8 @@ class AchievementBaseResponse extends TemplateResponse implements ICache
// profiler relateed (note that this is part of the cache. I don't think this is important enough to calc for every view) // profiler relateed (note that this is part of the cache. I don't think this is important enough to calc for every view)
if (Cfg::get('PROFILER_ENABLE') && !($this->subject->getField('flags') & ACHIEVEMENT_FLAG_COUNTER)) if (Cfg::get('PROFILER_ENABLE') && !($this->subject->getField('flags') & ACHIEVEMENT_FLAG_COUNTER))
{ {
$x = DB::Aowow()->selectCell('SELECT COUNT(1) FROM ?_profiler_completion_achievements WHERE `achievementId` = ?d', $this->typeId); $x = DB::Aowow()->selectCell('SELECT COUNT(1) FROM ::profiler_completion_achievements WHERE `achievementId` = %i', $this->typeId);
$y = DB::Aowow()->selectCell('SELECT COUNT(1) FROM ?_profiler_profiles WHERE `custom` = 0 AND `stub` = 0'); $y = DB::Aowow()->selectCell('SELECT COUNT(1) FROM ::profiler_profiles WHERE `custom` = 0 AND `stub` = 0');
$infobox[] = Lang::profiler('attainedBy', [round(($x ?: 0) * 100 / ($y ?: 1))]); $infobox[] = Lang::profiler('attainedBy', [round(($x ?: 0) * 100 / ($y ?: 1))]);
// completion row added by InfoboxMarkup // completion row added by InfoboxMarkup
@ -207,7 +207,7 @@ class AchievementBaseResponse extends TemplateResponse implements ICache
$this->rewards = [$rewItems, $rewTitles, $text]; $this->rewards = [$rewItems, $rewTitles, $text];
// factionchange-equivalent // factionchange-equivalent
if ($pendant = DB::World()->selectCell('SELECT IF(`horde_id` = ?d, `alliance_id`, -`horde_id`) FROM player_factionchange_achievement WHERE `alliance_id` = ?d OR `horde_id` = ?d', $this->typeId, $this->typeId, $this->typeId)) if ($pendant = DB::World()->selectCell('SELECT IF(`horde_id` = %i, `alliance_id`, -`horde_id`) FROM player_factionchange_achievement WHERE `alliance_id` = %i OR `horde_id` = %i', $this->typeId, $this->typeId, $this->typeId))
{ {
$altAcv = new AchievementList(array(['id', abs($pendant)])); $altAcv = new AchievementList(array(['id', abs($pendant)]));
if (!$altAcv->error) if (!$altAcv->error)
@ -230,7 +230,7 @@ class AchievementBaseResponse extends TemplateResponse implements ICache
// serverside extra-Data (not sure why ACHIEVEMENT_CRITERIA_DATA_TYPE_NONE is set, let a lone a couple hundred times) // serverside extra-Data (not sure why ACHIEVEMENT_CRITERIA_DATA_TYPE_NONE is set, let a lone a couple hundred times)
if ($crtIds = array_column($this->subject->getCriteria(), 'id')) if ($crtIds = array_column($this->subject->getCriteria(), 'id'))
$crtExtraData = DB::World()->select('SELECT `criteria_id` AS ARRAY_KEY, `type` AS ARRAY_KEY2, `value1`, `value2`, `ScriptName` FROM achievement_criteria_data WHERE `type` <> ?d AND `criteria_id` IN (?a)', ACHIEVEMENT_CRITERIA_DATA_TYPE_NONE, $crtIds); $crtExtraData = DB::World()->selectAssoc('SELECT `criteria_id` AS ARRAY_KEY, `type` AS ARRAY_KEY2, `value1`, `value2`, `ScriptName` FROM achievement_criteria_data WHERE `type` <> %i AND `criteria_id` IN %in', ACHIEVEMENT_CRITERIA_DATA_TYPE_NONE, $crtIds);
else else
$crtExtraData = []; $crtExtraData = [];
@ -261,7 +261,7 @@ class AchievementBaseResponse extends TemplateResponse implements ICache
case ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA: case ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA:
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND: case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND:
case ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP: case ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP:
$zoneId = DB::Aowow()->selectCell('SELECT `id` FROM ?_zones WHERE `mapId` = ?', $obj); $zoneId = DB::Aowow()->selectCell('SELECT `id` FROM ::zones WHERE `mapId` = %s', $obj);
$crtIcon = new IconElement(Type::ZONE, $zoneId ?: 0, $crtName ?: ZoneList::getName($zoneId), size: IconElement::SIZE_SMALL, element: 'iconlist-icon'); $crtIcon = new IconElement(Type::ZONE, $zoneId ?: 0, $crtName ?: ZoneList::getName($zoneId), size: IconElement::SIZE_SMALL, element: 'iconlist-icon');
break; break;
// link to area // link to area
@ -423,7 +423,7 @@ class AchievementBaseResponse extends TemplateResponse implements ICache
} }
// tab: criteria of // tab: criteria of
$refs = DB::Aowow()->SelectCol('SELECT `refAchievementId` FROM ?_achievementcriteria WHERE `type` = ?d AND `value1` = ?d', $refs = DB::Aowow()->SelectCol('SELECT `refAchievementId` FROM ::achievementcriteria WHERE `type` = %i AND `value1` = %i',
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT,
$this->typeId $this->typeId
); );
@ -463,7 +463,7 @@ class AchievementBaseResponse extends TemplateResponse implements ICache
{ {
if ($_ = $this->subject->getField('mailTemplate')) if ($_ = $this->subject->getField('mailTemplate'))
{ {
$letter = DB::Aowow()->selectRow('SELECT * FROM ?_mails WHERE `id` = ?d', $_); $letter = DB::Aowow()->selectRow('SELECT * FROM ::mails WHERE `id` = %i', $_);
if (!$letter) if (!$letter)
return false; return false;
@ -502,7 +502,7 @@ class AchievementBaseResponse extends TemplateResponse implements ICache
$avlb = []; $avlb = [];
foreach (Profiler::getRealms() AS $rId => $rData) foreach (Profiler::getRealms() AS $rId => $rData)
if (!DB::Characters($rId)->selectCell('SELECT 1 FROM character_achievement WHERE `achievement` = ?d', $pt->typeId)) if (!DB::Characters($rId)->selectCell('SELECT 1 FROM character_achievement WHERE `achievement` = %i', $pt->typeId))
$avlb[] = Util::ucWords($rData['name']); $avlb[] = Util::ucWords($rData['name']);
if (!$avlb) if (!$avlb)

View file

@ -123,7 +123,7 @@ class AchievementsBaseResponse extends TemplateResponse implements ICache
$conditions = [Listview::DEFAULT_SIZE]; $conditions = [Listview::DEFAULT_SIZE];
if ($fiCnd) if ($fiCnd)
$conditions[] = $fiCnd; $conditions[] = $fiCnd;
if ($catList = DB::Aowow()->SelectCol('SELECT `id` FROM ?_achievementcategory WHERE `parentCat` IN (?a) OR `parentCat2` IN (?a) ', $this->category, $this->category)) if ($catList = DB::Aowow()->SelectCol('SELECT `id` FROM ::achievementcategory WHERE `parentCat` IN %in OR `parentCat2` IN %in ', $this->category, $this->category))
$conditions[] = ['category', $catList]; $conditions[] = ['category', $catList];
$acvList = new AchievementList($conditions, ['calcTotal' => true]); $acvList = new AchievementList($conditions, ['calcTotal' => true]);

View file

@ -44,13 +44,13 @@ class AdminAnnouncementsResponse extends TemplateResponse
return; return;
} }
if (!DB::Aowow()->selectCell('SELECT 1 FROM ?_announcements WHERE `id` = ?d', $this->_get['id'])) if (!DB::Aowow()->selectCell('SELECT 1 FROM ::announcements WHERE `id` = %i', $this->_get['id']))
{ {
trigger_error('AdminAnnouncementsResponse::updateStatus - announcement does not exist'); trigger_error('AdminAnnouncementsResponse::updateStatus - announcement does not exist');
return; return;
} }
DB::Aowow()->query('UPDATE ?_announcements SET `status` = ?d WHERE `id` = ?d', $this->_get['status'], $this->_get['id']); DB::Aowow()->qry('UPDATE ::announcements SET `status` = %i WHERE `id` = %i', $this->_get['status'], $this->_get['id']);
} }
private function displayEditor() : void private function displayEditor() : void

View file

@ -33,13 +33,13 @@ class AdminCommentResponse extends TextResponse
$ok = false; $ok = false;
if ($this->_post['status']) // outdated, mark as deleted and clear other flags (sticky + outdated) if ($this->_post['status']) // outdated, mark as deleted and clear other flags (sticky + outdated)
{ {
if ($ok = DB::Aowow()->query('UPDATE ?_comments SET `flags` = ?d, `deleteUserId` = ?d, `deleteDate` = ?d WHERE `id` = ?d', CC_FLAG_DELETED, User::$id, time(), $this->_post['id'])) if ($ok = DB::Aowow()->qry('UPDATE ::comments SET `flags` = %i, `deleteUserId` = %i, `deleteDate` = %i WHERE `id` = %i', CC_FLAG_DELETED, User::$id, time(), $this->_post['id']))
if ($rep = new Report(Report::MODE_COMMENT, Report::CO_OUT_OF_DATE, $this->_post['id'])) if ($rep = new Report(Report::MODE_COMMENT, Report::CO_OUT_OF_DATE, $this->_post['id']))
$rep->close(Report::STATUS_CLOSED_SOLVED); $rep->close(Report::STATUS_CLOSED_SOLVED);
} }
else // up to date else // up to date
{ {
if ($ok = DB::Aowow()->query('UPDATE ?_comments SET `flags` = `flags` & ~?d WHERE `id` = ?d', CC_FLAG_OUTDATED, $this->_post['id'])) if ($ok = DB::Aowow()->qry('UPDATE ::comments SET `flags` = `flags` & ~%i WHERE `id` = %i', CC_FLAG_OUTDATED, $this->_post['id']))
if ($rep = new Report(Report::MODE_COMMENT, Report::CO_OUT_OF_DATE, $this->_post['id'])) if ($rep = new Report(Report::MODE_COMMENT, Report::CO_OUT_OF_DATE, $this->_post['id']))
$rep->close(Report::STATUS_CLOSED_WONTFIX); $rep->close(Report::STATUS_CLOSED_WONTFIX);
} }

View file

@ -31,7 +31,7 @@ class AdminGuideResponse extends TextResponse
return; return;
} }
$guide = DB::Aowow()->selectRow('SELECT `userId`, `status` FROM ?_guides WHERE `id` = ?d', $this->_post['id']); $guide = DB::Aowow()->selectRow('SELECT `userId`, `status` FROM ::guides WHERE `id` = %i', $this->_post['id']);
if (!$guide) if (!$guide)
{ {
trigger_error('AdminGuideResponse - guide #'.$this->_post['id'].' not found', E_USER_ERROR); trigger_error('AdminGuideResponse - guide #'.$this->_post['id'].' not found', E_USER_ERROR);
@ -63,16 +63,16 @@ class AdminGuideResponse extends TextResponse
private function update(int $id, int $status, ?string $msg = null) : bool private function update(int $id, int $status, ?string $msg = null) : bool
{ {
if ($status == GuideMgr::STATUS_APPROVED) // set display rev to latest if ($status == GuideMgr::STATUS_APPROVED) // set display rev to latest
$ok = DB::Aowow()->query('UPDATE ?_guides SET `status` = ?d, `rev` = (SELECT `rev` FROM ?_articles WHERE `type` = ?d AND `typeId` = ?d ORDER BY `rev` DESC LIMIT 1), `approveUserId` = ?d, `approveDate` = ?d WHERE `id` = ?d', $status, Type::GUIDE, $id, User::$id, time(), $id); $ok = DB::Aowow()->qry('UPDATE ::guides SET `status` = %i, `rev` = (SELECT `rev` FROM ::articles WHERE `type` = %i AND `typeId` = %i ORDER BY `rev` DESC LIMIT 1), `approveUserId` = %i, `approveDate` = %i WHERE `id` = %i', $status, Type::GUIDE, $id, User::$id, time(), $id);
else else
$ok = DB::Aowow()->query('UPDATE ?_guides SET `status` = ?d WHERE `id` = ?d', $status, $id); $ok = DB::Aowow()->qry('UPDATE ::guides SET `status` = %i WHERE `id` = %i', $status, $id);
if (!$ok) if (!$ok)
return false; return false;
DB::Aowow()->query('INSERT INTO ?_guides_changelog (`id`, `date`, `userId`, `status`) VALUES (?d, ?d, ?d, ?d)', $id, time(), User::$id, $status); DB::Aowow()->qry('INSERT INTO ::guides_changelog (`id`, `date`, `userId`, `status`) VALUES (%i, %i, %i, %i)', $id, time(), User::$id, $status);
if ($msg) if ($msg)
DB::Aowow()->query('INSERT INTO ?_guides_changelog (`id`, `date`, `userId`, `msg`) VALUES (?d, ?d, ?d, ?)', $id, time(), User::$id, $msg); DB::Aowow()->qry('INSERT INTO ::guides_changelog (`id`, `date`, `userId`, `msg`) VALUES (%i, %i, %i, %s)', $id, time(), User::$id, $msg);
return true; return true;
} }

View file

@ -30,7 +30,7 @@ class AdminGuidesResponse extends TemplateResponse
else else
{ {
$data = $pending->getListviewData(); $data = $pending->getListviewData();
$latest = DB::Aowow()->selectCol('SELECT `typeId` AS ARRAY_KEY, MAX(`rev`) FROM ?_articles WHERE `type` = ?d AND `typeId` IN (?a) GROUP BY `rev`', Type::GUIDE, $pending->getFoundIDs()); $latest = DB::Aowow()->selectCol('SELECT `typeId` AS ARRAY_KEY, MAX(`rev`) FROM ::articles WHERE `type` = %i AND `typeId` IN %in GROUP BY `rev`', Type::GUIDE, $pending->getFoundIDs());
foreach ($latest as $id => $rev) foreach ($latest as $id => $rev)
$data[$id]['rev'] = $rev; $data[$id]['rev'] = $rev;
} }

View file

@ -52,7 +52,7 @@ class AdminScreenshotsResponse extends TemplateResponse
else if ($this->_get['user']) else if ($this->_get['user'])
{ {
if (mb_strlen($this->_get['user']) >= 3) if (mb_strlen($this->_get['user']) >= 3)
if ($uId = DB::Aowow()->selectCell('SELECT `id` FROM ?_account WHERE LOWER(`username`) = LOWER(?)', $this->_get['user'])) if ($uId = DB::Aowow()->selectCell('SELECT `id` FROM ::account WHERE LOWER(`username`) = LOWER(%s)', $this->_get['user']))
$ssData = ScreenshotMgr::getScreenshots(userId: $uId, nFound: $nMatches); $ssData = ScreenshotMgr::getScreenshots(userId: $uId, nFound: $nMatches);
} }
else else

View file

@ -25,7 +25,7 @@ class AdminScreenshotsActionApproveResponse extends TextResponse
ScreenshotMgr::init(); ScreenshotMgr::init();
// create resized and thumb version of screenshot // create resized and thumb version of screenshot
$ssEntries = DB::Aowow()->select('SELECT `id` AS ARRAY_KEY, `userIdOwner`, `date`, `type`, `typeId` FROM ?_screenshots WHERE (`status` & ?d) = 0 AND `id` IN (?a)', CC_FLAG_APPROVED, $this->_get['id']); $ssEntries = DB::Aowow()->selectAssoc('SELECT `id` AS ARRAY_KEY, `userIdOwner`, `date`, `type`, `typeId` FROM ::screenshots WHERE (`status` & %i) = 0 AND `id` IN %in', CC_FLAG_APPROVED, $this->_get['id']);
foreach ($ssEntries as $id => $ssData) foreach ($ssEntries as $id => $ssData)
{ {
if (!ScreenshotMgr::loadFile(ScreenshotMgr::PATH_PENDING, $id)) if (!ScreenshotMgr::loadFile(ScreenshotMgr::PATH_PENDING, $id))
@ -42,14 +42,14 @@ class AdminScreenshotsActionApproveResponse extends TextResponse
continue; continue;
// set as approved in DB // set as approved in DB
DB::Aowow()->query('UPDATE ?_screenshots SET `status` = ?d, `userIdApprove` = ?d WHERE `id` = ?d', CC_FLAG_APPROVED, User::$id, $id); DB::Aowow()->qry('UPDATE ::screenshots SET `status` = %i, `userIdApprove` = %i WHERE `id` = %i', CC_FLAG_APPROVED, User::$id, $id);
// gain siterep // gain siterep
Util::gainSiteReputation($ssData['userIdOwner'], SITEREP_ACTION_SUBMIT_SCREENSHOT, ['id' => $id, 'what' => 1, 'date' => $ssData['date']]); Util::gainSiteReputation($ssData['userIdOwner'], SITEREP_ACTION_SUBMIT_SCREENSHOT, ['id' => $id, 'what' => 1, 'date' => $ssData['date']]);
// flag DB entry as having screenshots // flag DB entry as having screenshots
if ($tbl = Type::getClassAttrib($ssData['type'], 'dataTable')) if ($tbl = Type::getClassAttrib($ssData['type'], 'dataTable'))
DB::Aowow()->query('UPDATE ?# SET `cuFlags` = `cuFlags` | ?d WHERE `id` = ?d', $tbl, CUSTOM_HAS_SCREENSHOT, $ssData['typeId']); DB::Aowow()->qry('UPDATE %n SET `cuFlags` = `cuFlags` | %i WHERE `id` = %i', $tbl, CUSTOM_HAS_SCREENSHOT, $ssData['typeId']);
unset($ssEntries[$id]); unset($ssEntries[$id]);
} }

View file

@ -26,9 +26,9 @@ class AdminScreenshotsActionDeleteResponse extends TextResponse
foreach ($this->_get['id'] as $id) foreach ($this->_get['id'] as $id)
{ {
// irrevocably purge files already flagged as deleted (should only exist as pending) // irrevocably purge files already flagged as deleted (should only exist as pending)
if (User::isInGroup(U_GROUP_ADMIN) && DB::Aowow()->selectCell('SELECT 1 FROM ?_screenshots WHERE `status` & ?d AND `id` = ?d', CC_FLAG_DELETED, $id)) if (User::isInGroup(U_GROUP_ADMIN) && DB::Aowow()->selectCell('SELECT 1 FROM ::screenshots WHERE `status` & %i AND `id` = %i', CC_FLAG_DELETED, $id))
{ {
DB::Aowow()->query('DELETE FROM ?_screenshots WHERE `id` = ?d', $id); DB::Aowow()->qry('DELETE FROM ::screenshots WHERE `id` = %i', $id);
if (file_exists(sprintf(ScreenshotMgr::PATH_PENDING, $id))) if (file_exists(sprintf(ScreenshotMgr::PATH_PENDING, $id)))
unlink(sprintf(ScreenshotMgr::PATH_PENDING, $id)); unlink(sprintf(ScreenshotMgr::PATH_PENDING, $id));
@ -47,16 +47,16 @@ class AdminScreenshotsActionDeleteResponse extends TextResponse
} }
// flag as deleted if not aready // flag as deleted if not aready
$oldEntries = DB::Aowow()->selectCol('SELECT `type` AS ARRAY_KEY, GROUP_CONCAT(`typeId`) FROM ?_screenshots WHERE `id` IN (?a) GROUP BY `type`', $this->_get['id']); $oldEntries = DB::Aowow()->selectCol('SELECT `type` AS ARRAY_KEY, GROUP_CONCAT(`typeId`) FROM ::screenshots WHERE `id` IN %in GROUP BY `type`', $this->_get['id']);
DB::Aowow()->query('UPDATE ?_screenshots SET `status` = ?d, `userIdDelete` = ?d WHERE `id` IN (?a)', CC_FLAG_DELETED, User::$id, $this->_get['id']); DB::Aowow()->qry('UPDATE ::screenshots SET `status` = %i, `userIdDelete` = %i WHERE `id` IN %in', CC_FLAG_DELETED, User::$id, $this->_get['id']);
// deflag db entry as having screenshots // deflag db entry as having screenshots
foreach ($oldEntries as $type => $typeIds) foreach ($oldEntries as $type => $typeIds)
{ {
$typeIds = explode(',', $typeIds); $typeIds = explode(',', $typeIds);
$toUnflag = DB::Aowow()->selectCol('SELECT `typeId` AS ARRAY_KEY, IF(BIT_OR(`status`) & ?d, 1, 0) AS "hasMore" FROM ?_screenshots WHERE `type` = ?d AND `typeId` IN (?a) GROUP BY `typeId` HAVING `hasMore` = 0', CC_FLAG_APPROVED, $type, $typeIds); $toUnflag = DB::Aowow()->selectCol('SELECT `typeId` AS ARRAY_KEY, IF(BIT_OR(`status`) & %i, 1, 0) AS "hasMore" FROM ::screenshots WHERE `type` = %i AND `typeId` IN %in GROUP BY `typeId` HAVING `hasMore` = 0', CC_FLAG_APPROVED, $type, $typeIds);
if ($toUnflag && ($tbl = Type::getClassAttrib($type, 'dataTable'))) if ($toUnflag && ($tbl = Type::getClassAttrib($type, 'dataTable')))
DB::Aowow()->query('UPDATE ?# SET cuFlags = cuFlags & ~?d WHERE id IN (?a)', $tbl, CUSTOM_HAS_SCREENSHOT, array_keys($toUnflag)); DB::Aowow()->qry('UPDATE %n SET cuFlags = cuFlags & ~%i WHERE id IN %in', $tbl, CUSTOM_HAS_SCREENSHOT, array_keys($toUnflag));
} }
} }
} }

View file

@ -24,7 +24,7 @@ class AdminScreenshotsActionEditaltResponse extends TextResponse
if (!$this->assertGET('id')) if (!$this->assertGET('id'))
return; return;
DB::Aowow()->query('UPDATE ?_screenshots SET `caption` = ? WHERE `id` = ?d', DB::Aowow()->qry('UPDATE ::screenshots SET `caption` = %s WHERE `id` = %i',
$this->handleCaption($this->_post['alt']), $this->handleCaption($this->_post['alt']),
$this->_get['id'] $this->_get['id']
); );

View file

@ -23,7 +23,7 @@ class AdminScreenshotsActionManageResponse extends TextResponse
if ($this->_get['type'] && $this->_get['typeid']) if ($this->_get['type'] && $this->_get['typeid'])
$res = ScreenshotMgr::getScreenshots($this->_get['type'], $this->_get['typeid']); $res = ScreenshotMgr::getScreenshots($this->_get['type'], $this->_get['typeid']);
else if ($this->_get['user']) else if ($this->_get['user'])
if ($uId = DB::Aowow()->selectCell('SELECT `id` FROM ?_account WHERE LOWER(`username`) = LOWER(?)', $this->_get['user'])) if ($uId = DB::Aowow()->selectCell('SELECT `id` FROM ::account WHERE LOWER(`username`) = LOWER(%s)', $this->_get['user']))
$res = ScreenshotMgr::getScreenshots(userId: $uId); $res = ScreenshotMgr::getScreenshots(userId: $uId);
$this->result = 'ssm_screenshotData = '.Util::toJSON($res); $this->result = 'ssm_screenshotData = '.Util::toJSON($res);

View file

@ -24,7 +24,7 @@ class AdminScreenshotsActionRelocateResponse extends TextResponse
return; return;
} }
[$type, $oldTypeId] = array_values(DB::Aowow()->selectRow('SELECT `type`, `typeId` FROM ?_screenshots WHERE `id` = ?d', $this->_get['id'])); [$type, $oldTypeId] = array_values(DB::Aowow()->selectRow('SELECT `type`, `typeId` FROM ::screenshots WHERE `id` = %i', $this->_get['id']));
$typeId = $this->_get['typeid']; $typeId = $this->_get['typeid'];
if (Type::validateIds($type, $typeId)) if (Type::validateIds($type, $typeId))
@ -32,15 +32,15 @@ class AdminScreenshotsActionRelocateResponse extends TextResponse
$tbl = Type::getClassAttrib($type, 'dataTable'); $tbl = Type::getClassAttrib($type, 'dataTable');
// move screenshot // move screenshot
DB::Aowow()->query('UPDATE ?_screenshots SET `typeId` = ?d WHERE `id` = ?d', $typeId, $this->_get['id']); DB::Aowow()->qry('UPDATE ::screenshots SET `typeId` = %i WHERE `id` = %i', $typeId, $this->_get['id']);
// flag target as having screenshot // flag target as having screenshot
DB::Aowow()->query('UPDATE ?# SET `cuFlags` = `cuFlags` | ?d WHERE `id` = ?d', $tbl, CUSTOM_HAS_SCREENSHOT, $typeId); DB::Aowow()->qry('UPDATE %n SET `cuFlags` = `cuFlags` | %i WHERE `id` = %i', $tbl, CUSTOM_HAS_SCREENSHOT, $typeId);
// deflag source for having had screenshots (maybe) // deflag source for having had screenshots (maybe)
$ssInfo = DB::Aowow()->selectRow('SELECT IF(BIT_OR(~`status`) & ?d, 1, 0) AS "hasMore" FROM ?_screenshots WHERE `status`& ?d AND `type` = ?d AND `typeId` = ?d', CC_FLAG_DELETED, CC_FLAG_APPROVED, $type, $oldTypeId); $ssInfo = DB::Aowow()->selectRow('SELECT IF(BIT_OR(~`status`) & %i, 1, 0) AS "hasMore" FROM ::screenshots WHERE `status`& %i AND `type` = %i AND `typeId` = %i', CC_FLAG_DELETED, CC_FLAG_APPROVED, $type, $oldTypeId);
if ($ssInfo || !$ssInfo['hasMore']) if ($ssInfo || !$ssInfo['hasMore'])
DB::Aowow()->query('UPDATE ?# SET `cuFlags` = `cuFlags` & ~?d WHERE `id` = ?d', $tbl, CUSTOM_HAS_SCREENSHOT, $oldTypeId); DB::Aowow()->qry('UPDATE %n SET `cuFlags` = `cuFlags` & ~%i WHERE `id` = %i', $tbl, CUSTOM_HAS_SCREENSHOT, $oldTypeId);
} }
else else
trigger_error('AdminScreenshotsActionRelocateResponse - invalid typeId #'.$typeId.' for type #'.$type, E_USER_ERROR); trigger_error('AdminScreenshotsActionRelocateResponse - invalid typeId #'.$typeId.' for type #'.$type, E_USER_ERROR);

View file

@ -25,7 +25,7 @@ class AdminScreenshotsActionStickyResponse extends TextResponse
// this one is a bit strange: as far as i've seen, the only thing a 'sticky' screenshot does is show up in the infobox // this one is a bit strange: as far as i've seen, the only thing a 'sticky' screenshot does is show up in the infobox
// this also means, that only one screenshot per page should be sticky // this also means, that only one screenshot per page should be sticky
// so, handle it one by one and the last one affecting one particular type/typId-key gets the cake // so, handle it one by one and the last one affecting one particular type/typId-key gets the cake
$ssEntries = DB::Aowow()->select('SELECT `id` AS ARRAY_KEY, `userIdOwner`, `date`, `type`, `typeId`, `status` FROM ?_screenshots WHERE (`status` & ?d) = 0 AND `id` IN (?a)', CC_FLAG_DELETED, $this->_get['id']); $ssEntries = DB::Aowow()->selectAssoc('SELECT `id` AS ARRAY_KEY, `userIdOwner`, `date`, `type`, `typeId`, `status` FROM ::screenshots WHERE (`status` & %i) = 0 AND `id` IN %in', CC_FLAG_DELETED, $this->_get['id']);
foreach ($ssEntries as $id => $ssData) foreach ($ssEntries as $id => $ssData)
{ {
// approve yet unapproved screenshots // approve yet unapproved screenshots
@ -47,21 +47,21 @@ class AdminScreenshotsActionStickyResponse extends TextResponse
continue; continue;
// set as approved in DB // set as approved in DB
DB::Aowow()->query('UPDATE ?_screenshots SET `status` = ?d, `userIdApprove` = ?d WHERE `id` = ?d', CC_FLAG_APPROVED, User::$id, $id); DB::Aowow()->qry('UPDATE ::screenshots SET `status` = %i, `userIdApprove` = %i WHERE `id` = %i', CC_FLAG_APPROVED, User::$id, $id);
// gain siterep // gain siterep
Util::gainSiteReputation($ssData['userIdOwner'], SITEREP_ACTION_SUBMIT_SCREENSHOT, ['id' => $id, 'what' => 1, 'date' => $ssData['date']]); Util::gainSiteReputation($ssData['userIdOwner'], SITEREP_ACTION_SUBMIT_SCREENSHOT, ['id' => $id, 'what' => 1, 'date' => $ssData['date']]);
// flag DB entry as having screenshots // flag DB entry as having screenshots
if ($tbl = Type::getClassAttrib($ssData['type'], 'dataTable')) if ($tbl = Type::getClassAttrib($ssData['type'], 'dataTable'))
DB::Aowow()->query('UPDATE ?# SET `cuFlags` = `cuFlags` | ?d WHERE `id` = ?d', $tbl, CUSTOM_HAS_SCREENSHOT, $ssData['typeId']); DB::Aowow()->qry('UPDATE %n SET `cuFlags` = `cuFlags` | %i WHERE `id` = %i', $tbl, CUSTOM_HAS_SCREENSHOT, $ssData['typeId']);
} }
// reset all others // reset all others
DB::Aowow()->query('UPDATE ?_screenshots a, ?_screenshots b SET a.`status` = a.`status` & ~?d WHERE a.`type` = b.`type` AND a.`typeId` = b.`typeId` AND a.`id` <> b.`id` AND b.`id` = ?d', CC_FLAG_STICKY, $id); DB::Aowow()->qry('UPDATE ::screenshots a, ::screenshots b SET a.`status` = a.`status` & ~%i WHERE a.`type` = b.`type` AND a.`typeId` = b.`typeId` AND a.`id` <> b.`id` AND b.`id` = %i', CC_FLAG_STICKY, $id);
// toggle sticky status // toggle sticky status
DB::Aowow()->query('UPDATE ?_screenshots SET `status` = IF(`status` & ?d, `status` & ~?d, `status` | ?d) WHERE `id` = ?d AND `status` & ?d', CC_FLAG_STICKY, CC_FLAG_STICKY, CC_FLAG_STICKY, $id, CC_FLAG_APPROVED); DB::Aowow()->qry('UPDATE ::screenshots SET `status` = IF(`status` & %i, `status` & ~%i, `status` | %i) WHERE `id` = %i AND `status` & %i', CC_FLAG_STICKY, CC_FLAG_STICKY, CC_FLAG_STICKY, $id, CC_FLAG_APPROVED);
unset($ssEntries[$id]); unset($ssEntries[$id]);
} }

View file

@ -45,7 +45,7 @@ class AdminSpawnoverrideResponse extends TextResponse
return; return;
} }
DB::Aowow()->query('REPLACE INTO ?_spawns_override (`type`, `typeGuid`, `areaId`, `floor`, `revision`) VALUES (?d, ?d, ?d, ?d, ?d)', $type, $guid, $area, $floor, AOWOW_REVISION); DB::Aowow()->qry('REPLACE INTO ::spawns_override (`type`, `typeGuid`, `areaId`, `floor`, `revision`) VALUES (%i, %i, %i, %i, %i)', $type, $guid, $area, $floor, AOWOW_REVISION);
$wPos = WorldPosition::getForGUID($type, $guid); $wPos = WorldPosition::getForGUID($type, $guid);
if (!$wPos) if (!$wPos)
@ -72,7 +72,7 @@ class AdminSpawnoverrideResponse extends TextResponse
// if creature try for waypoints // if creature try for waypoints
if ($type == Type::NPC) if ($type == Type::NPC)
{ {
if ($swp = DB::World()->select('SELECT -w.`id` AS "entry", w.`point` AS "pointId", w.`position_x` AS "posX", w.`position_y` AS "posY" FROM creature_addon ca JOIN waypoint_data w ON w.`id` = ca.`path_id` WHERE ca.`guid` = ?d AND ca.`path_id` <> 0', $guid)) if ($swp = DB::World()->selectAssoc('SELECT -w.`id` AS "entry", w.`point` AS "pointId", w.`position_x` AS "posX", w.`position_y` AS "posY" FROM creature_addon ca JOIN waypoint_data w ON w.`id` = ca.`path_id` WHERE ca.`guid` = %i AND ca.`path_id` <> 0', $guid))
{ {
foreach ($swp as $w) foreach ($swp as $w)
{ {
@ -85,17 +85,17 @@ class AdminSpawnoverrideResponse extends TextResponse
'floor' => $point[0]['floor'] 'floor' => $point[0]['floor']
); );
DB::Aowow()->query('UPDATE ?_creature_waypoints SET ?a WHERE `creatureOrPath` = ?d AND `point` = ?d', $p, $w['entry'], $w['pointId']); DB::Aowow()->qry('UPDATE ::creature_waypoints SET %a WHERE `creatureOrPath` = %i AND `point` = %i', $p, $w['entry'], $w['pointId']);
} }
} }
} }
// also move linked vehicle accessories (on the very same position) // also move linked vehicle accessories (on the very same position)
$updGUIDs = array_merge($updGUIDs, DB::Aowow()->selectCol('SELECT s2.`guid` FROM ?_spawns s1 JOIN ?_spawns s2 ON s1.`posX` = s2.`posX` AND s1.`posY` = s2.`posY` AND $updGUIDs = array_merge($updGUIDs, DB::Aowow()->selectCol('SELECT s2.`guid` FROM ::spawns s1 JOIN ::spawns s2 ON s1.`posX` = s2.`posX` AND s1.`posY` = s2.`posY` AND
s1.`areaId` = s2.`areaId` AND s1.`floor` = s2.`floor` AND s2.`guid` < 0 WHERE s1.`guid` = ?d', $guid)); s1.`areaId` = s2.`areaId` AND s1.`floor` = s2.`floor` AND s2.`guid` < 0 WHERE s1.`guid` = %i', $guid));
} }
if (DB::Aowow()->query('UPDATE ?_spawns SET ?a WHERE `type` = ?d AND `guid` IN (?a)', $newPos, $type, $updGUIDs)) if (DB::Aowow()->qry('UPDATE ::spawns SET %a WHERE `type` = %i AND `guid` IN %in', $newPos, $type, $updGUIDs))
$this->result = self::ERR_NONE; $this->result = self::ERR_NONE;
else else
$this->result = self::ERR_WRITE_DB; $this->result = self::ERR_WRITE_DB;

View file

@ -52,7 +52,7 @@ class AdminVideosResponse extends TemplateResponse
else if ($this->_get['user']) else if ($this->_get['user'])
{ {
if (mb_strlen($this->_get['user']) >= 3) if (mb_strlen($this->_get['user']) >= 3)
if ($uId = DB::Aowow()->selectCell('SELECT `id` FROM ?_account WHERE LOWER(`username`) = LOWER(?)', $this->_get['user'])) if ($uId = DB::Aowow()->selectCell('SELECT `id` FROM ::account WHERE LOWER(`username`) = LOWER(%s)', $this->_get['user']))
$viData = VideoMgr::getVideos(userId: $uId, nFound: $nMatches); $viData = VideoMgr::getVideos(userId: $uId, nFound: $nMatches);
} }
else else

View file

@ -22,18 +22,18 @@ class AdminVideosActionApproveResponse extends TextResponse
return; return;
} }
$viEntries = DB::Aowow()->select('SELECT `id` AS ARRAY_KEY, `userIdOwner`, `date`, `type`, `typeId` FROM ?_videos WHERE (`status` & ?d) = 0 AND `id` IN (?a)', CC_FLAG_APPROVED, $this->_get['id']); $viEntries = DB::Aowow()->selectAssoc('SELECT `id` AS ARRAY_KEY, `userIdOwner`, `date`, `type`, `typeId` FROM ::videos WHERE (`status` & %i) = 0 AND `id` IN %in', CC_FLAG_APPROVED, $this->_get['id']);
foreach ($viEntries as $id => $viData) foreach ($viEntries as $id => $viData)
{ {
// set as approved in DB // set as approved in DB
DB::Aowow()->query('UPDATE ?_videos SET `status` = ?d, `userIdApprove` = ?d WHERE `id` = ?d', CC_FLAG_APPROVED, User::$id, $id); DB::Aowow()->qry('UPDATE ::videos SET `status` = %i, `userIdApprove` = %i WHERE `id` = %i', CC_FLAG_APPROVED, User::$id, $id);
// gain siterep // gain siterep
Util::gainSiteReputation($viData['userIdOwner'], SITEREP_ACTION_SUGGEST_VIDEO, ['id' => $id, 'what' => 1, 'date' => $viData['date']]); Util::gainSiteReputation($viData['userIdOwner'], SITEREP_ACTION_SUGGEST_VIDEO, ['id' => $id, 'what' => 1, 'date' => $viData['date']]);
// flag DB entry as having videos // flag DB entry as having videos
if ($tbl = Type::getClassAttrib($viData['type'], 'dataTable')) if ($tbl = Type::getClassAttrib($viData['type'], 'dataTable'))
DB::Aowow()->query('UPDATE ?# SET `cuFlags` = `cuFlags` | ?d WHERE `id` = ?d', $tbl, CUSTOM_HAS_VIDEO, $viData['typeId']); DB::Aowow()->qry('UPDATE %n SET `cuFlags` = `cuFlags` | %i WHERE `id` = %i', $tbl, CUSTOM_HAS_VIDEO, $viData['typeId']);
unset($viEntries[$id]); unset($viEntries[$id]);
} }

View file

@ -25,19 +25,19 @@ class AdminVideosActionDeleteResponse extends TextResponse
// irrevocably purge files already flagged as deleted (should only exist as pending) // irrevocably purge files already flagged as deleted (should only exist as pending)
if (User::isInGroup(U_GROUP_ADMIN)) if (User::isInGroup(U_GROUP_ADMIN))
DB::Aowow()->selectCell('SELECT 1 FROM ?_videos WHERE `status` & ?d AND `id` IN (?a)', CC_FLAG_DELETED, $this->_get['id']); DB::Aowow()->selectCell('SELECT 1 FROM ::videos WHERE `status` & %i AND `id` IN %in', CC_FLAG_DELETED, $this->_get['id']);
// flag as deleted if not aready // flag as deleted if not aready
$oldEntries = DB::Aowow()->selectCol('SELECT `type` AS ARRAY_KEY, GROUP_CONCAT(`typeId`) FROM ?_videos WHERE `id` IN (?a) GROUP BY `type`', $this->_get['id']); $oldEntries = DB::Aowow()->selectCol('SELECT `type` AS ARRAY_KEY, GROUP_CONCAT(`typeId`) FROM ::videos WHERE `id` IN %in GROUP BY `type`', $this->_get['id']);
DB::Aowow()->query('UPDATE ?_videos SET `status` = ?d, `userIdDelete` = ?d WHERE (`status` & ?d) = 0 AND `id` IN (?a)', CC_FLAG_DELETED, User::$id, CC_FLAG_DELETED, $this->_get['id']); DB::Aowow()->qry('UPDATE ::videos SET `status` = %i, `userIdDelete` = %i WHERE (`status` & %i) = 0 AND `id` IN %in', CC_FLAG_DELETED, User::$id, CC_FLAG_DELETED, $this->_get['id']);
// deflag db entry as having videos // deflag db entry as having videos
foreach ($oldEntries as $type => $typeIds) foreach ($oldEntries as $type => $typeIds)
{ {
$typeIds = explode(',', $typeIds); $typeIds = explode(',', $typeIds);
$toUnflag = DB::Aowow()->selectCol('SELECT `typeId` AS ARRAY_KEY, IF(BIT_OR(`status`) & ?d, 1, 0) AS "hasMore" FROM ?_videos WHERE `type` = ?d AND `typeId` IN (?a) GROUP BY `typeId` HAVING `hasMore` = 0', CC_FLAG_APPROVED, $type, $typeIds); $toUnflag = DB::Aowow()->selectCol('SELECT `typeId` AS ARRAY_KEY, IF(BIT_OR(`status`) & %i, 1, 0) AS "hasMore" FROM ::videos WHERE `type` = %i AND `typeId` IN %in GROUP BY `typeId` HAVING `hasMore` = 0', CC_FLAG_APPROVED, $type, $typeIds);
if ($toUnflag && ($tbl = Type::getClassAttrib($type, 'dataTable'))) if ($toUnflag && ($tbl = Type::getClassAttrib($type, 'dataTable')))
DB::Aowow()->query('UPDATE ?# SET cuFlags = cuFlags & ~?d WHERE id IN (?a)', $tbl, CUSTOM_HAS_VIDEO, array_keys($toUnflag)); DB::Aowow()->qry('UPDATE %n SET cuFlags = cuFlags & ~%i WHERE id IN %in', $tbl, CUSTOM_HAS_VIDEO, array_keys($toUnflag));
} }
} }
} }

View file

@ -26,6 +26,6 @@ class AdminVideosActionEdittitleResponse extends TextResponse
$caption = $this->handleCaption($this->_post['title']); $caption = $this->handleCaption($this->_post['title']);
DB::Aowow()->query('UPDATE ?_videos SET `caption` = ? WHERE `id` = ?d', $caption, $this->_get['id'][0]); DB::Aowow()->qry('UPDATE ::videos SET `caption` = %s WHERE `id` = %i', $caption, $this->_get['id'][0]);
} }
} }

View file

@ -23,7 +23,7 @@ class AdminVideosActionManageResponse extends TextResponse
if ($this->_get['type'] && $this->_get['typeid']) if ($this->_get['type'] && $this->_get['typeid'])
$res = VideoMgr::getVideos($this->_get['type'], $this->_get['typeid']); $res = VideoMgr::getVideos($this->_get['type'], $this->_get['typeid']);
else if ($this->_get['user']) else if ($this->_get['user'])
if ($uId = DB::Aowow()->selectCell('SELECT `id` FROM ?_account WHERE LOWER(`username`) = LOWER(?)', $this->_get['user'])) if ($uId = DB::Aowow()->selectCell('SELECT `id` FROM ::account WHERE LOWER(`username`) = LOWER(%s)', $this->_get['user']))
$res = VideoMgr::getVideos(userId: $uId); $res = VideoMgr::getVideos(userId: $uId);
$this->result = 'vim_videoData = '.Util::toJSON($res); $this->result = 'vim_videoData = '.Util::toJSON($res);

View file

@ -25,7 +25,7 @@ class AdminVideosActionOrderResponse extends TextResponse
$id = $this->_get['id'][0]; $id = $this->_get['id'][0];
$videos = DB::Aowow()->selectCol('SELECT a.`id` AS ARRAY_KEY, a.`pos` FROM ?_videos a, ?_videos b WHERE a.`type` = b.`type` AND a.`typeId` = b.`typeId` AND (a.`status` & ?d) = 0 AND b.`id` = ?d ORDER BY a.`pos` ASC', CC_FLAG_DELETED, $id); $videos = DB::Aowow()->selectCol('SELECT a.`id` AS ARRAY_KEY, a.`pos` FROM ::videos a, ::videos b WHERE a.`type` = b.`type` AND a.`typeId` = b.`typeId` AND (a.`status` & %i) = 0 AND b.`id` = %i ORDER BY a.`pos` ASC', CC_FLAG_DELETED, $id);
if (!$videos || count($videos) == 1) if (!$videos || count($videos) == 1)
{ {
trigger_error('AdminVideosActionOrderResponse - not enough videos to sort', E_USER_WARNING); trigger_error('AdminVideosActionOrderResponse - not enough videos to sort', E_USER_WARNING);
@ -52,6 +52,6 @@ class AdminVideosActionOrderResponse extends TextResponse
$videos[$id] += $dir; $videos[$id] += $dir;
foreach ($videos as $id => $pos) foreach ($videos as $id => $pos)
DB::Aowow()->query('UPDATE ?_videos SET `pos` = ?d WHERE `id` = ?d', $pos, $id); DB::Aowow()->qry('UPDATE ::videos SET `pos` = %i WHERE `id` = %i', $pos, $id);
} }
} }

View file

@ -25,7 +25,7 @@ class AdminVideosActionRelocateResponse extends TextResponse
} }
$id = $this->_get['id'][0]; $id = $this->_get['id'][0];
[$type, $oldTypeId] = array_values(DB::Aowow()->selectRow('SELECT `type`, `typeId` FROM ?_videos WHERE `id` = ?d', $id)); [$type, $oldTypeId] = array_values(DB::Aowow()->selectRow('SELECT `type`, `typeId` FROM ::videos WHERE `id` = %i', $id));
$typeId = $this->_get['typeid']; $typeId = $this->_get['typeid'];
if (Type::validateIds($type, $typeId)) if (Type::validateIds($type, $typeId))
@ -33,15 +33,15 @@ class AdminVideosActionRelocateResponse extends TextResponse
$tbl = Type::getClassAttrib($type, 'dataTable'); $tbl = Type::getClassAttrib($type, 'dataTable');
// move video // move video
DB::Aowow()->query('UPDATE ?_videos SET `typeId` = ?d WHERE `id` = ?d', $typeId, $id); DB::Aowow()->qry('UPDATE ::videos SET `typeId` = %i WHERE `id` = %i', $typeId, $id);
// flag target as having video // flag target as having video
DB::Aowow()->query('UPDATE ?# SET `cuFlags` = `cuFlags` | ?d WHERE `id` = ?d', $tbl, CUSTOM_HAS_VIDEO, $typeId); DB::Aowow()->qry('UPDATE %n SET `cuFlags` = `cuFlags` | %i WHERE `id` = %i', $tbl, CUSTOM_HAS_VIDEO, $typeId);
// deflag source for having had videos (maybe) // deflag source for having had videos (maybe)
$viInfo = DB::Aowow()->selectRow('SELECT IF(BIT_OR(~`status`) & ?d, 1, 0) AS "hasMore" FROM ?_videos WHERE `status`& ?d AND `type` = ?d AND `typeId` = ?d', CC_FLAG_DELETED, CC_FLAG_APPROVED, $type, $oldTypeId); $viInfo = DB::Aowow()->selectRow('SELECT IF(BIT_OR(~`status`) & %i, 1, 0) AS "hasMore" FROM ::videos WHERE `status`& %i AND `type` = %i AND `typeId` = %i', CC_FLAG_DELETED, CC_FLAG_APPROVED, $type, $oldTypeId);
if ($viInfo || !$viInfo['hasMore']) if ($viInfo || !$viInfo['hasMore'])
DB::Aowow()->query('UPDATE ?# SET `cuFlags` = `cuFlags` & ~?d WHERE `id` = ?d', $tbl, CUSTOM_HAS_VIDEO, $oldTypeId); DB::Aowow()->qry('UPDATE %n SET `cuFlags` = `cuFlags` & ~%i WHERE `id` = %i', $tbl, CUSTOM_HAS_VIDEO, $oldTypeId);
} }
else else
trigger_error('AdminVideosActionRelocateResponse - invalid typeId #'.$typeId.' for type #'.$type, E_USER_ERROR); trigger_error('AdminVideosActionRelocateResponse - invalid typeId #'.$typeId.' for type #'.$type, E_USER_ERROR);

View file

@ -24,28 +24,28 @@ class AdminVideosActionStickyResponse extends TextResponse
// this one is a bit strange: as far as i've seen, the only thing a 'sticky' video does is show up in the infobox // this one is a bit strange: as far as i've seen, the only thing a 'sticky' video does is show up in the infobox
// this also means, that only one video per page should be sticky // this also means, that only one video per page should be sticky
// so, handle it one by one and the last one affecting one particular type/typId-key gets the cake // so, handle it one by one and the last one affecting one particular type/typId-key gets the cake
$viEntries = DB::Aowow()->select('SELECT `id` AS ARRAY_KEY, `userIdOwner`, `date`, `type`, `typeId`, `status` FROM ?_videos WHERE (`status` & ?d) = 0 AND `id` IN (?a)', CC_FLAG_DELETED, $this->_get['id']); $viEntries = DB::Aowow()->selectAssoc('SELECT `id` AS ARRAY_KEY, `userIdOwner`, `date`, `type`, `typeId`, `status` FROM ::videos WHERE (`status` & %i) = 0 AND `id` IN %in', CC_FLAG_DELETED, $this->_get['id']);
foreach ($viEntries as $id => $viData) foreach ($viEntries as $id => $viData)
{ {
// approve yet unapproved videos // approve yet unapproved videos
if (!($viData['status'] & CC_FLAG_APPROVED)) if (!($viData['status'] & CC_FLAG_APPROVED))
{ {
// set as approved in DB // set as approved in DB
DB::Aowow()->query('UPDATE ?_videos SET `status` = ?d, `userIdApprove` = ?d WHERE `id` = ?d', CC_FLAG_APPROVED, User::$id, $id); DB::Aowow()->qry('UPDATE ::videos SET `status` = %i, `userIdApprove` = %i WHERE `id` = %i', CC_FLAG_APPROVED, User::$id, $id);
// gain siterep // gain siterep
Util::gainSiteReputation($viData['userIdOwner'], SITEREP_ACTION_SUGGEST_VIDEO, ['id' => $id, 'what' => 1, 'date' => $viData['date']]); Util::gainSiteReputation($viData['userIdOwner'], SITEREP_ACTION_SUGGEST_VIDEO, ['id' => $id, 'what' => 1, 'date' => $viData['date']]);
// flag DB entry as having videos // flag DB entry as having videos
if ($tbl = Type::getClassAttrib($viData['type'], 'dataTable')) if ($tbl = Type::getClassAttrib($viData['type'], 'dataTable'))
DB::Aowow()->query('UPDATE ?# SET `cuFlags` = `cuFlags` | ?d WHERE `id` = ?d', $tbl, CUSTOM_HAS_VIDEO, $viData['typeId']); DB::Aowow()->qry('UPDATE %n SET `cuFlags` = `cuFlags` | %i WHERE `id` = %i', $tbl, CUSTOM_HAS_VIDEO, $viData['typeId']);
} }
// reset all others // reset all others
DB::Aowow()->query('UPDATE ?_videos a, ?_videos b SET a.`status` = a.`status` & ~?d WHERE a.`type` = b.`type` AND a.`typeId` = b.`typeId` AND a.`id` <> b.`id` AND b.`id` = ?d', CC_FLAG_STICKY, $id); DB::Aowow()->qry('UPDATE ::videos a, ::videos b SET a.`status` = a.`status` & ~%i WHERE a.`type` = b.`type` AND a.`typeId` = b.`typeId` AND a.`id` <> b.`id` AND b.`id` = %i', CC_FLAG_STICKY, $id);
// toggle sticky status // toggle sticky status
DB::Aowow()->query('UPDATE ?_videos SET `status` = IF(`status` & ?d, `status` & ~?d, `status` | ?d) WHERE `id` = ?d AND `status` & ?d', CC_FLAG_STICKY, CC_FLAG_STICKY, CC_FLAG_STICKY, $id, CC_FLAG_APPROVED); DB::Aowow()->qry('UPDATE ::videos SET `status` = IF(`status` & %i, `status` & ~%i, `status` | %i) WHERE `id` = %i AND `status` & %i', CC_FLAG_STICKY, CC_FLAG_STICKY, CC_FLAG_STICKY, $id, CC_FLAG_APPROVED);
unset($viEntries[$id]); unset($viEntries[$id]);
} }

View file

@ -27,8 +27,8 @@ class AdminWeightpresetsResponse extends TemplateResponse
$head = $body = ''; $head = $body = '';
$scales = DB::Aowow()->select('SELECT `class` AS ARRAY_KEY, `id` AS ARRAY_KEY2, `name`, `icon` FROM ?_account_weightscales WHERE `userId` = 0'); $scales = DB::Aowow()->selectAssoc('SELECT `class` AS ARRAY_KEY, `id` AS ARRAY_KEY2, `name`, `icon` FROM ::account_weightscales WHERE `userId` = 0');
$weights = DB::Aowow()->selectCol('SELECT awd.`id` AS ARRAY_KEY, awd.`field` AS ARRAY_KEY2, awd.`val` FROM ?_account_weightscale_data awd JOIN ?_account_weightscales ad ON awd.`id` = ad.`id` WHERE ad.`userId` = 0'); $weights = DB::Aowow()->selectCol('SELECT awd.`id` AS ARRAY_KEY, awd.`field` AS ARRAY_KEY2, awd.`val` FROM ::account_weightscale_data awd JOIN ::account_weightscales ad ON awd.`id` = ad.`id` WHERE ad.`userId` = 0');
foreach ($scales as $cl => $data) foreach ($scales as $cl => $data)
{ {
$ul = ''; $ul = '';

View file

@ -30,8 +30,8 @@ class AdminWeightpresetsActionSaveResponse extends TextResponse
} }
// save to db // save to db
DB::Aowow()->query('DELETE FROM ?_account_weightscale_data WHERE `id` = ?d', $this->_post['id']); DB::Aowow()->qry('DELETE FROM ::account_weightscale_data WHERE `id` = %i', $this->_post['id']);
DB::Aowow()->query('UPDATE ?_account_weightscales SET `icon`= ? WHERE `id` = ?d', $this->_post['__icon'], $this->_post['id']); DB::Aowow()->qry('UPDATE ::account_weightscales SET `icon`= %s WHERE `id` = %i', $this->_post['__icon'], $this->_post['id']);
foreach (explode(',', $this->_post['scale']) as $s) foreach (explode(',', $this->_post['scale']) as $s)
{ {
@ -40,7 +40,7 @@ class AdminWeightpresetsActionSaveResponse extends TextResponse
if (!Stat::getWeightJson($k) || $v < 1) if (!Stat::getWeightJson($k) || $v < 1)
continue; continue;
if (DB::Aowow()->query('INSERT INTO ?_account_weightscale_data VALUES (?d, ?, ?d)', $this->_post['id'], $k, $v) === null) if (DB::Aowow()->qry('INSERT INTO ::account_weightscale_data VALUES (%i, %s, %i)', $this->_post['id'], $k, $v) === null)
{ {
trigger_error('AdminWeightpresetsActionSaveResponse - failed to write to database', E_USER_ERROR); trigger_error('AdminWeightpresetsActionSaveResponse - failed to write to database', E_USER_ERROR);
$this->result = self::ERR_WRITE_DB; $this->result = self::ERR_WRITE_DB;

View file

@ -46,7 +46,7 @@ class ArenateamBaseResponse extends TemplateResponse
// 3 possibilities // 3 possibilities
// 1) already synced to aowow // 1) already synced to aowow
if ($subject = DB::Aowow()->selectRow('SELECT `id`, `realmGUID`, `stub` FROM ?_profiler_arena_team WHERE `realm` = ?d AND `nameUrl` = ?', $this->realmId, Profiler::urlize($this->subjectName))) if ($subject = DB::Aowow()->selectRow('SELECT `id`, `realmGUID`, `stub` FROM ::profiler_arena_team WHERE `realm` = %i AND `nameUrl` = %s', $this->realmId, Profiler::urlize($this->subjectName)))
{ {
$this->typeId = $subject['id']; $this->typeId = $subject['id'];
@ -57,16 +57,15 @@ class ArenateamBaseResponse extends TemplateResponse
} }
// 2) not yet synced but exists on realm (wont work if we get passed an urlized name, but there is nothing we can do about it) // 2) not yet synced but exists on realm (wont work if we get passed an urlized name, but there is nothing we can do about it)
$subjects = DB::Characters($this->realmId)->select('SELECT at.`arenaTeamId` AS "realmGUID", at.`name`, at.`type` FROM arena_team at WHERE at.`name` = ?', $this->subjectName); $subjects = DB::Characters($this->realmId)->selectAssoc('SELECT at.`arenaTeamId` AS "realmGUID", at.`name`, at.`type` FROM arena_team at WHERE at.`name` = %s', $this->subjectName);
if ($subject = array_filter($subjects ?: [], fn($x) => Util::lower($x['name']) === Util::lower($this->subjectName))) if ($subject = array_find($subjects ?: [], fn($x) => Util::lower($x['name']) === Util::lower($this->subjectName)))
{ {
$subject = array_pop($subject);
$subject['realm'] = $this->realmId; $subject['realm'] = $this->realmId;
$subject['stub'] = 1; $subject['stub'] = 1;
$subject['nameUrl'] = Profiler::urlize($subject['name']); $subject['nameUrl'] = Profiler::urlize($subject['name']);
// create entry from realm with basic info // create entry from realm with basic info
DB::Aowow()->query('INSERT IGNORE INTO ?_profiler_arena_team (?#) VALUES (?a)', array_keys($subject), array_values($subject)); DB::Aowow()->qry('INSERT IGNORE INTO ::profiler_arena_team %v', $subject);
$this->handleIncompleteData(Type::ARENA_TEAM, $subject['realmGUID']); $this->handleIncompleteData(Type::ARENA_TEAM, $subject['realmGUID']);
return; return;

View file

@ -32,12 +32,12 @@ class ArenaTeamResyncResponse extends TextResponse
if (!$this->assertGET('id')) if (!$this->assertGET('id'))
return; return;
if ($teams = DB::Aowow()->select('SELECT `realm`, `realmGUID` FROM ?_profiler_arena_team WHERE `id` IN (?a)', $this->_get['id'])) if ($teams = DB::Aowow()->selectAssoc('SELECT `realm`, `realmGUID` FROM ::profiler_arena_team WHERE `id` IN %in', $this->_get['id']))
foreach ($teams as $t) foreach ($teams as $t)
Profiler::scheduleResync(Type::ARENA_TEAM, $t['realm'], $t['realmGUID']); Profiler::scheduleResync(Type::ARENA_TEAM, $t['realm'], $t['realmGUID']);
if ($this->_get['profile']) if ($this->_get['profile'])
if ($chars = DB::Aowow()->select('SELECT `realm`, `realmGUID` FROM ?_profiler_profiles p JOIN ?_profiler_arena_team_member atm ON atm.`profileId` = p.`id` WHERE atm.`arenaTeamId` IN (?a)', $this->_get['id'])) if ($chars = DB::Aowow()->selectAssoc('SELECT `realm`, `realmGUID` FROM ::profiler_profiles p JOIN ::profiler_arena_team_member atm ON atm.`profileId` = p.`id` WHERE atm.`arenaTeamId` IN %in', $this->_get['id']))
foreach ($chars as $c) foreach ($chars as $c)
Profiler::scheduleResync(Type::PROFILE, $c['realm'], $c['realmGUID']); Profiler::scheduleResync(Type::PROFILE, $c['realm'], $c['realmGUID']);

View file

@ -153,15 +153,15 @@ class ClassBaseResponse extends TemplateResponse implements ICache
['s.typeCat', [-13, -11, -2, 7]], ['s.typeCat', [-13, -11, -2, 7]],
[['s.cuFlags', (SPELL_CU_TRIGGERED | CUSTOM_EXCLUDE_FOR_LISTVIEW), '&'], 0], [['s.cuFlags', (SPELL_CU_TRIGGERED | CUSTOM_EXCLUDE_FOR_LISTVIEW), '&'], 0],
[ [
'OR', DB::OR,
// Glyphs, Proficiencies // Glyphs, Proficiencies
['s.reqClassMask', $cl->toMask(), '&'], ['s.reqClassMask', $cl->toMask(), '&'],
// Abilities / Talents // Abilities / Talents
['s.skillLine1', $this->subject->getField('skills')], ['s.skillLine1', $this->subject->getField('skills')],
['AND', ['s.skillLine1', 0, '>'], ['s.skillLine2OrMask', $this->subject->getField('skills')]] [DB::AND, ['s.skillLine1', 0, '>'], ['s.skillLine2OrMask', $this->subject->getField('skills')]]
], ],
[ // last rank or unranked [ // last rank or unranked
'OR', DB::OR,
['s.cuFlags', SPELL_CU_LAST_RANK, '&'], ['s.cuFlags', SPELL_CU_LAST_RANK, '&'],
['s.rankNo', 0] ['s.rankNo', 0]
] ]
@ -268,13 +268,13 @@ class ClassBaseResponse extends TemplateResponse implements ICache
// tab: criteria-of // tab: criteria-of
$conditions = array( $conditions = array(
'AND', DB::AND,
['ac.type', ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS], ['ac.type', ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS],
['ac.value1', $this->typeId] ['ac.value1', $this->typeId]
); );
if ($extraCrt = DB::World()->selectCol('SELECT `criteria_id` FROM achievement_criteria_data WHERE `type` IN (?a) AND `value1` = ?d', [ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE, ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE], $this->typeId)) if ($extraCrt = DB::World()->selectCol('SELECT `criteria_id` FROM achievement_criteria_data WHERE `type` IN %in AND `value1` = %i', [ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE, ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE], $this->typeId))
$conditions = ['OR', $conditions, ['ac.id', $extraCrt]]; $conditions = [DB::OR, $conditions, ['ac.id', $extraCrt]];
$crtOf = new AchievementList($conditions); $crtOf = new AchievementList($conditions);
if (!$crtOf->error) if (!$crtOf->error)

View file

@ -29,7 +29,7 @@ class CommentAddreplyResponse extends TextResponse
if (!User::canReply()) if (!User::canReply())
$this->generate404(Lang::main('cannotComment')); $this->generate404(Lang::main('cannotComment'));
if (!$this->_post['commentId'] || !DB::Aowow()->selectCell('SELECT 1 FROM ?_comments WHERE `id` = ?d', $this->_post['commentId'])) if (!$this->_post['commentId'] || !DB::Aowow()->selectCell('SELECT 1 FROM ::comments WHERE `id` = %i', $this->_post['commentId']))
{ {
trigger_error('CommentAddreplyResponse - parent comment #'.$this->_post['commentId'].' does not exist', E_USER_ERROR); trigger_error('CommentAddreplyResponse - parent comment #'.$this->_post['commentId'].' does not exist', E_USER_ERROR);
$this->generate404(Lang::main('intError')); $this->generate404(Lang::main('intError'));
@ -38,7 +38,7 @@ class CommentAddreplyResponse extends TextResponse
if (mb_strlen($this->_post['body']) < CommunityContent::REPLY_LENGTH_MIN || mb_strlen($this->_post['body']) > CommunityContent::REPLY_LENGTH_MAX) if (mb_strlen($this->_post['body']) < CommunityContent::REPLY_LENGTH_MIN || mb_strlen($this->_post['body']) > CommunityContent::REPLY_LENGTH_MAX)
$this->generate404(Lang::main('textLength', [mb_strlen($this->_post['body']), CommunityContent::REPLY_LENGTH_MIN, CommunityContent::REPLY_LENGTH_MAX])); $this->generate404(Lang::main('textLength', [mb_strlen($this->_post['body']), CommunityContent::REPLY_LENGTH_MIN, CommunityContent::REPLY_LENGTH_MAX]));
if (!DB::Aowow()->query('INSERT INTO ?_comments (`userId`, `roles`, `body`, `date`, `replyTo`) VALUES (?d, ?d, ?, UNIX_TIMESTAMP(), ?d)', User::$id, User::$groups, $this->_post['body'], $this->_post['commentId'])) if (!DB::Aowow()->qry('INSERT INTO ::comments (`userId`, `roles`, `body`, `date`, `replyTo`) VALUES (%i, %i, %s, UNIX_TIMESTAMP(), %i)', User::$id, User::$groups, $this->_post['body'], $this->_post['commentId']))
{ {
trigger_error('CommentAddreplyResponse - write to db failed', E_USER_ERROR); trigger_error('CommentAddreplyResponse - write to db failed', E_USER_ERROR);
$this->generate404(Lang::main('intError')); $this->generate404(Lang::main('intError'));

View file

@ -30,7 +30,7 @@ class CommentAddResponse extends TextResponse
// we now have a valid return target // we now have a valid return target
$idOrUrl = $this->_get['typeid']; $idOrUrl = $this->_get['typeid'];
if ($this->_get['type'] == Type::GUIDE) if ($this->_get['type'] == Type::GUIDE)
if ($_ = DB::Aowow()->selectCell('SELECT `url` FROM ?_guides WHERE `id` = ?d', $this->_get['typeid'])) if ($_ = DB::Aowow()->selectCell('SELECT `url` FROM ::guides WHERE `id` = %i', $this->_get['typeid']))
$idOrUrl = $_; $idOrUrl = $_;
$this->redirectTo = '?'.Type::getFileString($this->_get['type']).'='.$idOrUrl.'#comments'; $this->redirectTo = '?'.Type::getFileString($this->_get['type']).'='.$idOrUrl.'#comments';
@ -57,16 +57,16 @@ class CommentAddResponse extends TextResponse
return; return;
} }
if ($postId = DB::Aowow()->query('INSERT INTO ?_comments (`type`, `typeId`, `userId`, `roles`, `body`, `date`) VALUES (?d, ?d, ?d, ?d, ?, UNIX_TIMESTAMP())', $this->_get['type'], $this->_get['typeid'], User::$id, User::$groups, $this->_post['commentbody'])) if ($postId = DB::Aowow()->qry('INSERT INTO ::comments (`type`, `typeId`, `userId`, `roles`, `body`, `date`) VALUES (%i, %i, %i, %i, %s, UNIX_TIMESTAMP())', $this->_get['type'], $this->_get['typeid'], User::$id, User::$groups, $this->_post['commentbody']))
{ {
Util::gainSiteReputation(User::$id, SITEREP_ACTION_COMMENT, ['id' => $postId]); Util::gainSiteReputation(User::$id, SITEREP_ACTION_COMMENT, ['id' => $postId]);
// every comment starts with a rating of +1 and i guess the simplest thing to do is create a db-entry with the system as owner // every comment starts with a rating of +1 and i guess the simplest thing to do is create a db-entry with the system as owner
DB::Aowow()->query('INSERT INTO ?_user_ratings (`type`, `entry`, `userId`, `value`) VALUES (?d, ?d, 0, 1)', RATING_COMMENT, $postId); DB::Aowow()->qry('INSERT INTO ::user_ratings (`type`, `entry`, `userId`, `value`) VALUES (%i, %i, 0, 1)', RATING_COMMENT, $postId);
// flag target with hasComment // flag target with hasComment
if ($tbl = Type::getClassAttrib($this->_get['type'], 'dataTable')) if ($tbl = Type::getClassAttrib($this->_get['type'], 'dataTable'))
DB::Aowow()->query('UPDATE ?# SET `cuFlags` = `cuFlags` | ?d WHERE `id` = ?d', $tbl, CUSTOM_HAS_COMMENT, $this->_get['typeid']); DB::Aowow()->qry('UPDATE %n SET `cuFlags` = `cuFlags` | %i WHERE `id` = %i', $tbl, CUSTOM_HAS_COMMENT, $this->_get['typeid']);
return; return;
} }

View file

@ -23,16 +23,13 @@ class CommentDeletereplyResponse extends TextResponse
$this->generate404(User::isInGroup(U_GROUP_STAFF) ? 'request malformed' : ''); $this->generate404(User::isInGroup(U_GROUP_STAFF) ? 'request malformed' : '');
} }
// flag as deleted (unset sticky (can a reply even be sticky?) $where = [['`id` = %i', $this->_post['id']]];
$ok = DB::Aowow()->query('UPDATE ?_comments SET `flags` = `flags` & ~?d | ?d, `deleteUserId` = ?d, `deleteDate` = UNIX_TIMESTAMP() WHERE `id` = ?d { AND `userId` = ?d }', if (!User::isInGroup(U_GROUP_MODERATOR))
CC_FLAG_STICKY, CC_FLAG_DELETED, $where[] = ['`userId` = %i', User::$id];
User::$id,
$this->_post['id'],
User::isInGroup(U_GROUP_MODERATOR) ? DBSIMPLE_SKIP : User::$id
);
if ($ok) // flag as deleted
DB::Aowow()->query('DELETE FROM ?_user_ratings WHERE `type` = ?d AND `entry` = ?d', RATING_COMMENT, $this->_post['id']); if (DB::Aowow()->qry('UPDATE ::comments SET `flags` = `flags` | %i, `deleteUserId` = %i, `deleteDate` = UNIX_TIMESTAMP() WHERE %and', CC_FLAG_DELETED, User::$id, $where))
DB::Aowow()->qry('DELETE FROM ::user_ratings WHERE `type` = %i AND `entry` = %i', RATING_COMMENT, $this->_post['id']);
else else
{ {
trigger_error('CommentDeletereplyResponse - deleting reply #'.$this->_post['id'].' by user #'.User::$id.' from db failed', E_USER_ERROR); trigger_error('CommentDeletereplyResponse - deleting reply #'.$this->_post['id'].' by user #'.User::$id.' from db failed', E_USER_ERROR);

View file

@ -24,24 +24,21 @@ class CommentDeleteResponse extends TextResponse
} }
// in theory, there is a username passed alongside if executed from userpage... lets just use the current user (see user.js) // in theory, there is a username passed alongside if executed from userpage... lets just use the current user (see user.js)
$ok = DB::Aowow()->query('UPDATE ?_comments SET `flags` = `flags` | ?d, `deleteUserId` = ?d, `deleteDate` = UNIX_TIMESTAMP() WHERE `id` IN (?a) { AND `userId` = ?d }', $where = [['`id` IN %in', $this->_post['id']]];
CC_FLAG_DELETED, if (!User::isInGroup(U_GROUP_MODERATOR))
User::$id, $where[] = ['`userId` = %i', User::$id];
$this->_post['id'],
User::isInGroup(U_GROUP_MODERATOR) ? DBSIMPLE_SKIP : User::$id
);
// unflag subject: hasComment // flag as deleted; unflag subject: hasComment
if ($ok) if (DB::Aowow()->qry('UPDATE ::comments SET `flags` = `flags` | %i, `deleteUserId` = %i, `deleteDate` = UNIX_TIMESTAMP() WHERE %and', CC_FLAG_DELETED, User::$id, $where))
{ {
$coInfo = DB::Aowow()->select( $coInfo = DB::Aowow()->selectAssoc(
'SELECT IF(BIT_OR(~b.`flags`) & ?d, 1, 0) AS "0", b.`type` AS "1", b.`typeId` AS "2" FROM ?_comments a JOIN ?_comments b ON a.`type` = b.`type` AND a.`typeId` = b.`typeId` WHERE a.`id` IN (?a) GROUP BY b.`type`, b.`typeId`', 'SELECT IF(BIT_OR(~b.`flags`) & %i, 1, 0) AS "0", b.`type` AS "1", b.`typeId` AS "2" FROM ::comments a JOIN ::comments b ON a.`type` = b.`type` AND a.`typeId` = b.`typeId` WHERE a.`id` IN %in GROUP BY b.`type`, b.`typeId`',
CC_FLAG_DELETED, $this->_post['id'] CC_FLAG_DELETED, $this->_post['id']
); );
foreach ($coInfo as [$hasMore, $type, $typeId]) foreach ($coInfo as [$hasMore, $type, $typeId])
if (!$hasMore && ($tbl = Type::getClassAttrib($type, 'dataTable'))) if (!$hasMore && ($tbl = Type::getClassAttrib($type, 'dataTable')))
DB::Aowow()->query('UPDATE ?# SET `cuFlags` = `cuFlags` & ~?d WHERE `id` = ?d', $tbl, CUSTOM_HAS_COMMENT, $typeId); DB::Aowow()->qry('UPDATE %n SET `cuFlags` = `cuFlags` & ~%i WHERE `id` = %i', $tbl, CUSTOM_HAS_COMMENT, $typeId);
return; return;
} }

View file

@ -23,7 +23,7 @@ class CommentDetachreplyResponse extends TextResponse
$this->generate404(User::isInGroup(U_GROUP_STAFF) ? 'request malformed' : ''); $this->generate404(User::isInGroup(U_GROUP_STAFF) ? 'request malformed' : '');
} }
DB::Aowow()->query('UPDATE ?_comments c1, ?_comments c2 SET c1.`replyTo` = 0, c1.`type` = c2.`type`, c1.`typeId` = c2.`typeId` WHERE c1.`replyTo` = c2.`id` AND c1.`id` = ?d', $this->_post['id']); DB::Aowow()->qry('UPDATE ::comments c1, ::comments c2 SET c1.`replyTo` = 0, c1.`type` = c2.`type`, c1.`typeId` = c2.`typeId` WHERE c1.`replyTo` = c2.`id` AND c1.`id` = %i', $this->_post['id']);
} }
} }

View file

@ -26,7 +26,7 @@ class CommentDownvotereplyResponse extends TextResponse
if (!User::canDownvote()) if (!User::canDownvote())
$this->generate404(User::isInGroup(U_GROUP_STAFF) ? 'cannot downvote' : ''); $this->generate404(User::isInGroup(U_GROUP_STAFF) ? 'cannot downvote' : '');
$comment = DB::Aowow()->selectRow('SELECT `userId`, IF(`flags` & ?d, 1, 0) AS "deleted" FROM ?_comments WHERE `id` = ?d', CC_FLAG_DELETED, $this->_post['id']); $comment = DB::Aowow()->selectRow('SELECT `userId`, IF(`flags` & %i, 1, 0) AS "deleted" FROM ::comments WHERE `id` = %i', CC_FLAG_DELETED, $this->_post['id']);
if (!$comment) if (!$comment)
{ {
trigger_error('CommentDownvotereplyResponse - comment #'.$this->_post['id'].' not found in db', E_USER_ERROR); trigger_error('CommentDownvotereplyResponse - comment #'.$this->_post['id'].' not found in db', E_USER_ERROR);
@ -39,15 +39,9 @@ class CommentDownvotereplyResponse extends TextResponse
if ($comment['deleted']) if ($comment['deleted'])
$this->generate404('LANG.votedeleted_tip'); $this->generate404('LANG.votedeleted_tip');
$ok = DB::Aowow()->query( if (is_null(DB::Aowow()->qry('INSERT INTO ::user_ratings (`type`, `entry`, `userId`, `value`) VALUES (%i, %i, %i, %i)',
'INSERT INTO ?_user_ratings (`type`, `entry`, `userId`, `value`) VALUES (?d, ?d, ?d, ?d)', RATING_COMMENT, $this->_post['id'], User::$id, User::canSupervote() ? -2 : -1
RATING_COMMENT, )))
$this->_post['id'],
User::$id,
User::canSupervote() ? -2 : -1
);
if (!is_int($ok))
{ {
trigger_error('CommentDownvotereplyResponse - write to db failed', E_USER_ERROR); trigger_error('CommentDownvotereplyResponse - write to db failed', E_USER_ERROR);
$this->generate404(User::isInGroup(U_GROUP_STAFF) ? 'write to db failed' : ''); $this->generate404(User::isInGroup(U_GROUP_STAFF) ? 'write to db failed' : '');

View file

@ -26,7 +26,7 @@ class CommentEditreplyResponse extends TextResponse
$this->generate404(User::isInGroup(U_GROUP_STAFF) ? 'request malformed' : ''); $this->generate404(User::isInGroup(U_GROUP_STAFF) ? 'request malformed' : '');
} }
$ownerId = DB::Aowow()->selectCell('SELECT `userId` FROM ?_comments WHERE `id` = ?d AND `replyTo` = ?d', $this->_post['replyId'], $this->_post['commentId']); $ownerId = DB::Aowow()->selectCell('SELECT `userId` FROM ::comments WHERE `id` = %i AND `replyTo` = %i', $this->_post['replyId'], $this->_post['commentId']);
if (!User::canReply() || (User::$id != $ownerId && !User::isInGroup(U_GROUP_MODERATOR))) if (!User::canReply() || (User::$id != $ownerId && !User::isInGroup(U_GROUP_MODERATOR)))
$this->generate404(Lang::main('cannotComment')); $this->generate404(Lang::main('cannotComment'));
@ -48,8 +48,11 @@ class CommentEditreplyResponse extends TextResponse
if (User::$id == $ownerId) if (User::$id == $ownerId)
$update['roles'] = User::$groups; $update['roles'] = User::$groups;
if (!DB::Aowow()->query('UPDATE ?_comments SET `editCount` = `editCount` + 1, ?a WHERE `id` = ?d AND `replyTo` = ?d { AND `userId` = ?d }', $where = [['`id` = %i', $this->_post['replyId']], ['`replyTo` = %i', $this->_post['commentId']]];
$update, $this->_post['replyId'], $this->_post['commentId'], User::isInGroup(U_GROUP_MODERATOR) ? DBSIMPLE_SKIP : User::$id)) if (!User::isInGroup(U_GROUP_MODERATOR))
$where[] = ['`userId` = %i', User::$id];
if (!DB::Aowow()->qry('UPDATE ::comments SET `editCount` = `editCount` + 1, %a WHERE %and', $update, $where))
{ {
trigger_error('CommentEditreplyResponse - write to db failed', E_USER_ERROR); trigger_error('CommentEditreplyResponse - write to db failed', E_USER_ERROR);
$this->generate404(Lang::main('intError')); $this->generate404(Lang::main('intError'));

View file

@ -26,7 +26,7 @@ class CommentEditResponse extends TextResponse
return; return;
} }
$ownerId = DB::Aowow()->selectCell('SELECT `userId` FROM ?_comments WHERE `id` = ?d', $this->_get['id']); $ownerId = DB::Aowow()->selectCell('SELECT `userId` FROM ::comments WHERE `id` = %i', $this->_get['id']);
if (!User::canComment() || (User::$id != $ownerId && !User::isInGroup(U_GROUP_MODERATOR))) if (!User::canComment() || (User::$id != $ownerId && !User::isInGroup(U_GROUP_MODERATOR)))
{ {
@ -56,7 +56,7 @@ class CommentEditResponse extends TextResponse
$update['responseRoles'] = User::$groups; $update['responseRoles'] = User::$groups;
} }
DB::Aowow()->query('UPDATE ?_comments SET `editCount` = `editCount` + 1, ?a WHERE `id` = ?d', $update, $this->_get['id']); DB::Aowow()->qry('UPDATE ::comments SET `editCount` = `editCount` + 1, %a WHERE `id` = %i', $update, $this->_get['id']);
} }
} }

View file

@ -23,7 +23,7 @@ class CommentFlagreplyResponse extends TextResponse
$this->generate404(User::isInGroup(U_GROUP_STAFF) ? 'request malformed' : ''); $this->generate404(User::isInGroup(U_GROUP_STAFF) ? 'request malformed' : '');
} }
$replyOwner = DB::Aowow()->selectCell('SELECT `userId` FROM ?_commments WHERE `id` = ?d', $this->_post['id']); $replyOwner = DB::Aowow()->selectCell('SELECT `userId` FROM ::commments WHERE `id` = %i', $this->_post['id']);
if (!$replyOwner) if (!$replyOwner)
{ {
trigger_error('CommentFlagreplyResponse - reply not found', E_USER_ERROR); trigger_error('CommentFlagreplyResponse - reply not found', E_USER_ERROR);
@ -38,7 +38,7 @@ class CommentFlagreplyResponse extends TextResponse
if (!$report->create('Report Reply Button Click')) if (!$report->create('Report Reply Button Click'))
$this->generate404('LANG.ct_resp_error'.$report->getError()); $this->generate404('LANG.ct_resp_error'.$report->getError());
else if (count($report->getSimilar()) >= CommunityContent::REPORT_THRESHOLD_AUTO_DELETE) else if (count($report->getSimilar()) >= CommunityContent::REPORT_THRESHOLD_AUTO_DELETE)
DB::Aowow()->query('UPDATE ?_comments SET `flags` = `flags` | ?d WHERE `id` = ?d', CC_FLAG_DELETED, $this->_post['id']); DB::Aowow()->qry('UPDATE ::comments SET `flags` = `flags` | %i WHERE `id` = %i', CC_FLAG_DELETED, $this->_post['id']);
} }
} }

View file

@ -30,9 +30,9 @@ class CommentOutofdateResponse extends TextResponse
if (User::isInGroup(U_GROUP_MODERATOR)) // directly mark as outdated if (User::isInGroup(U_GROUP_MODERATOR)) // directly mark as outdated
{ {
if (!$this->_post['remove']) if (!$this->_post['remove'])
$ok = DB::Aowow()->query('UPDATE ?_comments SET `flags` = `flags` | ?d WHERE `id` = ?d', CC_FLAG_OUTDATED, $this->_post['id']); $ok = DB::Aowow()->qry('UPDATE ::comments SET `flags` = `flags` | %i WHERE `id` = %i', CC_FLAG_OUTDATED, $this->_post['id']);
else else
$ok = DB::Aowow()->query('UPDATE ?_comments SET `flags` = `flags` & ~?d WHERE `id` = ?d', CC_FLAG_OUTDATED, $this->_post['id']); $ok = DB::Aowow()->qry('UPDATE ::comments SET `flags` = `flags` & ~%i WHERE `id` = %i', CC_FLAG_OUTDATED, $this->_post['id']);
} }
else // try to report as outdated else // try to report as outdated
{ {
@ -41,7 +41,7 @@ class CommentOutofdateResponse extends TextResponse
$this->result = Lang::main('intError'); $this->result = Lang::main('intError');
if (count($report->getSimilar()) >= CommunityContent::REPORT_THRESHOLD_AUTO_OUT_OF_DATE) if (count($report->getSimilar()) >= CommunityContent::REPORT_THRESHOLD_AUTO_OUT_OF_DATE)
$ok = DB::Aowow()->query('UPDATE ?_comments SET `flags` = `flags` | ?d WHERE `id` = ?d', CC_FLAG_OUTDATED, $this->_post['id']); $ok = DB::Aowow()->qry('UPDATE ::comments SET `flags` = `flags` | %i WHERE `id` = %i', CC_FLAG_OUTDATED, $this->_post['id']);
} }
if (!$ok) if (!$ok)

View file

@ -21,7 +21,7 @@ class CommentRatingResponse extends TextResponse
return; return;
} }
if ($votes = DB::Aowow()->selectRow('SELECT 1 AS "success", SUM(IF(`value` > 0, `value`, 0)) AS "up", SUM(IF(`value` < 0, -`value`, 0)) AS "down" FROM ?_user_ratings WHERE `type` = ?d AND `entry` = ?d AND `userId` <> 0 GROUP BY `entry`', RATING_COMMENT, $this->_get['id'])) if ($votes = DB::Aowow()->selectRow('SELECT 1 AS "success", SUM(IF(`value` > 0, `value`, 0)) AS "up", SUM(IF(`value` < 0, -`value`, 0)) AS "down" FROM ::user_ratings WHERE `type` = %i AND `entry` = %i AND `userId` <> 0 GROUP BY `entry`', RATING_COMMENT, $this->_get['id']))
$this->result = Util::toJSON($votes); $this->result = Util::toJSON($votes);
else else
$this->result = Util::toJSON(['success' => 1, 'up' => 0, 'down' => 0]); $this->result = Util::toJSON(['success' => 1, 'up' => 0, 'down' => 0]);

View file

@ -25,9 +25,9 @@ class CommentStickyResponse extends TextResponse
} }
if ($this->_post['sticky']) if ($this->_post['sticky'])
DB::Aowow()->query('UPDATE ?_comments SET `flags` = `flags` | ?d WHERE `id` = ?d', CC_FLAG_STICKY, $this->_post['id']); DB::Aowow()->qry('UPDATE ::comments SET `flags` = `flags` | %i WHERE `id` = %i', CC_FLAG_STICKY, $this->_post['id']);
else else
DB::Aowow()->query('UPDATE ?_comments SET `flags` = `flags` & ~?d WHERE `id` = ?d', CC_FLAG_STICKY, $this->_post['id']); DB::Aowow()->qry('UPDATE ::comments SET `flags` = `flags` & ~%i WHERE `id` = %i', CC_FLAG_STICKY, $this->_post['id']);
} }
} }

View file

@ -24,19 +24,20 @@ class CommentUndeleteResponse extends TextResponse
} }
// in theory, there is a username passed alongside if executed from userpage... lets just use the current user (see user.js) // in theory, there is a username passed alongside if executed from userpage... lets just use the current user (see user.js)
$ok = DB::Aowow()->query('UPDATE ?_comments SET `flags` = `flags` & ~?d WHERE `id` IN (?a) { AND `userId` = `deleteUserId` AND `deleteUserId` = ?d }', $where = [['`id` IN %in', $this->_post['id']]];
CC_FLAG_DELETED, if (!User::isInGroup(U_GROUP_MODERATOR))
$this->_post['id'], {
User::isInGroup(U_GROUP_MODERATOR) ? DBSIMPLE_SKIP : User::$id $where[] = ['`deleteUserId` = `userId'];
); $where[] = ['`deleteUserId` = %i', User::$id];
}
// unflag subject: hasComment // unflag subject: hasComment
if ($ok) if (DB::Aowow()->qry('UPDATE ::comments SET `flags` = `flags` & ~%i WHERE %and', CC_FLAG_DELETED, $where))
{ {
$coInfo = DB::Aowow()->select('SELECT `type` AS "0", `typeId` AS "1" FROM ?_comments WHERE `id` IN (?a) GROUP BY `type`, `typeId`', $this->_post['id']); $coInfo = DB::Aowow()->selectAssoc('SELECT `type` AS "0", `typeId` AS "1" FROM ::comments WHERE `id` IN %in GROUP BY `type`, `typeId`', $this->_post['id']);
foreach ($coInfo as [$type, $typeId]) foreach ($coInfo as [$type, $typeId])
if ($tbl = Type::getClassAttrib($type, 'dataTable')) if ($tbl = Type::getClassAttrib($type, 'dataTable'))
DB::Aowow()->query('UPDATE ?# SET `cuFlags` = `cuFlags` | ?d WHERE `id` = ?d', $tbl, CUSTOM_HAS_COMMENT, $typeId); DB::Aowow()->qry('UPDATE %n SET `cuFlags` = `cuFlags` | %i WHERE `id` = %i', $tbl, CUSTOM_HAS_COMMENT, $typeId);
return; return;
} }

View file

@ -26,7 +26,7 @@ class CommentUpvotereplyResponse extends TextResponse
if (!User::canUpvote()) if (!User::canUpvote())
$this->generate404(User::isInGroup(U_GROUP_STAFF) ? 'cannot upvote' : ''); $this->generate404(User::isInGroup(U_GROUP_STAFF) ? 'cannot upvote' : '');
$comment = DB::Aowow()->selectRow('SELECT `userId`, IF(`flags` & ?d, 1, 0) AS "deleted" FROM ?_comments WHERE `id` = ?d', CC_FLAG_DELETED, $this->_post['id']); $comment = DB::Aowow()->selectRow('SELECT `userId`, IF(`flags` & %i, 1, 0) AS "deleted" FROM ::comments WHERE `id` = %i', CC_FLAG_DELETED, $this->_post['id']);
if (!$comment) if (!$comment)
{ {
trigger_error('CommentUpvotereplyResponse - comment #'.$this->_post['id'].' not found in db', E_USER_ERROR); trigger_error('CommentUpvotereplyResponse - comment #'.$this->_post['id'].' not found in db', E_USER_ERROR);
@ -39,15 +39,9 @@ class CommentUpvotereplyResponse extends TextResponse
if ($comment['deleted']) if ($comment['deleted'])
$this->generate404('LANG.votedeleted_tip'); $this->generate404('LANG.votedeleted_tip');
$ok = DB::Aowow()->query( if (is_null(DB::Aowow()->qry('INSERT INTO ::user_ratings (`type`, `entry`, `userId`, `value`) VALUES (%i, %i, %i, %i)',
'INSERT INTO ?_user_ratings (`type`, `entry`, `userId`, `value`) VALUES (?d, ?d, ?d, ?d)', RATING_COMMENT, $this->_post['id'], User::$id, User::canSupervote() ? 2 : 1
RATING_COMMENT, )))
$this->_post['id'],
User::$id,
User::canSupervote() ? 2 : 1
);
if (!is_int($ok))
{ {
trigger_error('CommentUpvotereplyResponse - write to db failed', E_USER_ERROR); trigger_error('CommentUpvotereplyResponse - write to db failed', E_USER_ERROR);
$this->generate404(User::isInGroup(U_GROUP_STAFF) ? 'write to db failed' : ''); $this->generate404(User::isInGroup(U_GROUP_STAFF) ? 'write to db failed' : '');

View file

@ -32,7 +32,7 @@ class CommentVoteResponse extends TextResponse
} }
$target = DB::Aowow()->selectRow( $target = DB::Aowow()->selectRow(
'SELECT c.`userId` AS "owner", ur.`value`, IF(c.`flags` & ?d, 1, 0) AS "deleted" FROM ?_comments c LEFT JOIN ?_user_ratings ur ON ur.`type` = ?d AND ur.`entry` = c.id AND ur.`userId` = ?d WHERE c.id = ?d', 'SELECT c.`userId` AS "owner", ur.`value`, IF(c.`flags` & %i, 1, 0) AS "deleted" FROM ::comments c LEFT JOIN ::user_ratings ur ON ur.`type` = %i AND ur.`entry` = c.id AND ur.`userId` = %i WHERE c.id = %i',
CC_FLAG_DELETED, RATING_COMMENT, User::$id, $this->_get['id'] CC_FLAG_DELETED, RATING_COMMENT, User::$id, $this->_get['id']
); );
if (!$target) if (!$target)
@ -62,9 +62,9 @@ class CommentVoteResponse extends TextResponse
$ok = false; $ok = false;
// old and new have same sign; undo vote (user may have gained/lost access to superVote in the meantime) // old and new have same sign; undo vote (user may have gained/lost access to superVote in the meantime)
if ($target['value'] && ($target['value'] < 0) == ($val < 0)) if ($target['value'] && ($target['value'] < 0) == ($val < 0))
$ok = DB::Aowow()->query('DELETE FROM ?_user_ratings WHERE `type` = ?d AND `entry` = ?d AND `userId` = ?d', RATING_COMMENT, $this->_get['id'], User::$id); $ok = DB::Aowow()->qry('DELETE FROM ::user_ratings WHERE `type` = %i AND `entry` = %i AND `userId` = %i', RATING_COMMENT, $this->_get['id'], User::$id);
else // replace, because we may be overwriting an old, opposing vote else // replace, because we may be overwriting an old, opposing vote
if ($ok = DB::Aowow()->query('REPLACE INTO ?_user_ratings (`type`, `entry`, `userId`, `value`) VALUES (?d, ?d, ?d, ?d)', RATING_COMMENT, $this->_get['id'], User::$id, $val)) if ($ok = DB::Aowow()->qry('REPLACE INTO ::user_ratings (`type`, `entry`, `userId`, `value`) VALUES (%i, %i, %i, %i)', RATING_COMMENT, $this->_get['id'], User::$id, $val))
User::decrementDailyVotes(); // do not refund retracted votes! User::decrementDailyVotes(); // do not refund retracted votes!
if ($ok) if ($ok)

View file

@ -32,7 +32,7 @@ class CookieBaseResponse extends TextResponse
{ {
if (!$this->param && $this->_get['purge']) if (!$this->param && $this->_get['purge'])
{ {
if (User::$id && DB::Aowow()->query('UPDATE ?_account_cookies SET `data` = "purged" WHERE `userId` = ?d AND `name` LIKE "announcement-%"', User::$id) !== null) if (User::$id && DB::Aowow()->qry('UPDATE ::account_cookies SET `data` = "purged" WHERE `userId` = %i AND `name` LIKE "announcement-%"', User::$id) !== null)
$this->result = 0; $this->result = 0;
return; return;
@ -44,7 +44,7 @@ class CookieBaseResponse extends TextResponse
return; return;
} }
if (DB::Aowow()->query('REPLACE INTO ?_account_cookies VALUES (?d, ?, ?)', User::$id, $this->param, $this->_get[$this->param])) if (DB::Aowow()->qry('REPLACE INTO ::account_cookies VALUES (%i, %s, %s)', User::$id, $this->param, $this->_get[$this->param]))
$this->result = 0; $this->result = 0;
else else
trigger_error('CookieBaseResponse - write to db failed', E_USER_ERROR); trigger_error('CookieBaseResponse - write to db failed', E_USER_ERROR);

View file

@ -201,7 +201,7 @@ class CurrencyBaseResponse extends TemplateResponse implements ICache
// tab: created by (spell) [for items its handled in LootByItem] // tab: created by (spell) [for items its handled in LootByItem]
if ($this->typeId == CURRENCY_HONOR_POINTS) if ($this->typeId == CURRENCY_HONOR_POINTS)
{ {
$createdBy = new SpellList(array(['effect1Id', SPELL_EFFECT_ADD_HONOR], ['effect2Id', SPELL_EFFECT_ADD_HONOR], ['effect3Id', SPELL_EFFECT_ADD_HONOR], 'OR')); $createdBy = new SpellList(array(['effect1Id', SPELL_EFFECT_ADD_HONOR], ['effect2Id', SPELL_EFFECT_ADD_HONOR], ['effect3Id', SPELL_EFFECT_ADD_HONOR], DB::OR));
if (!$createdBy->error) if (!$createdBy->error)
{ {
$this->extendGlobalData($createdBy->getJSGlobals(GLOBALINFO_SELF | GLOBALINFO_RELATED)); $this->extendGlobalData($createdBy->getJSGlobals(GLOBALINFO_SELF | GLOBALINFO_RELATED));
@ -237,8 +237,8 @@ class CurrencyBaseResponse extends TemplateResponse implements ICache
if (!$n && !is_null(ItemListFilter::getCriteriaIndex(158, $_relItemId))) if (!$n && !is_null(ItemListFilter::getCriteriaIndex(158, $_relItemId)))
$n = '?items&filter=cr=158;crs='.$_relItemId.';crv=0'; $n = '?items&filter=cr=158;crs='.$_relItemId.';crv=0';
$xCosts = DB::Aowow()->selectCol('SELECT `id` FROM ?_itemextendedcost WHERE '.$w); $xCosts = DB::Aowow()->selectCol('SELECT `id` FROM ::itemextendedcost WHERE '.$w);
$boughtBy = $xCosts ? DB::World()->selectCol('SELECT `item` FROM npc_vendor WHERE `extendedCost` IN (?a) UNION SELECT `item` FROM game_event_npc_vendor WHERE `extendedCost` IN (?a)', $xCosts, $xCosts) : []; $boughtBy = $xCosts ? DB::World()->selectCol('SELECT `item` FROM npc_vendor WHERE `extendedCost` IN %in UNION SELECT `item` FROM game_event_npc_vendor WHERE `extendedCost` IN %in', $xCosts, $xCosts) : [];
if ($boughtBy) if ($boughtBy)
{ {
$boughtBy = new ItemList(array(['id', $boughtBy])); $boughtBy = new ItemList(array(['id', $boughtBy]));

View file

@ -109,7 +109,7 @@ class EmoteBaseResponse extends TemplateResponse implements ICache
if ($this->subject->getField('cuFlags') & EMOTE_CU_MISSING_CMD) if ($this->subject->getField('cuFlags') & EMOTE_CU_MISSING_CMD)
$text .= Lang::emote('noCommand').'[br][br]'; $text .= Lang::emote('noCommand').'[br][br]';
else if ($aliasses = DB::Aowow()->selectCol('SELECT `command` FROM ?_emotes_aliasses WHERE `id` = ?d AND `locales` & ?d', $this->typeId, 1 << Lang::getLocale()->value)) else if ($aliasses = DB::Aowow()->selectCol('SELECT `command` FROM ::emotes_aliasses WHERE `id` = %i AND `locales` & %i', $this->typeId, 1 << Lang::getLocale()->value))
{ {
$text .= '[h3]'.Lang::emote('aliases').'[/h3][ul]'; $text .= '[h3]'.Lang::emote('aliases').'[/h3][ul]';
foreach ($aliasses as $a) foreach ($aliasses as $a)
@ -184,13 +184,12 @@ class EmoteBaseResponse extends TemplateResponse implements ICache
} }
// tab: sound // tab: sound
$ems = DB::Aowow()->select( $ems = DB::Aowow()->selectAssoc(
'SELECT `soundId` AS ARRAY_KEY, BIT_OR(1 << (`raceId` - 1)) AS "raceMask", BIT_OR(1 << (`gender` - 1)) AS "gender" 'SELECT `soundId` AS ARRAY_KEY, BIT_OR(1 << (`raceId` - 1)) AS "raceMask", BIT_OR(1 << (`gender` - 1)) AS "gender"
FROM ?_emotes_sounds FROM ::emotes_sounds
WHERE `emoteId` = ?d { OR -`emoteId` = ?d } WHERE %if', $this->typeId < 0, '-`emoteId` = %i OR', $this->subject->getField('parentEmote'), '%end `emoteId` = %i
GROUP BY `soundId`', GROUP BY `soundId`',
$this->typeId, $this->typeId,
$this->typeId < 0 ? $this->subject->getField('parentEmote') : DBSIMPLE_SKIP
); );
if ($ems) if ($ems)

View file

@ -194,10 +194,10 @@ class EnchantmentBaseResponse extends TemplateResponse implements ICache
// used by spell // used by spell
// used by useItem // used by useItem
$cnd = array( $cnd = array(
'OR', DB::OR,
['AND', ['effect1Id', SpellList::EFFECTS_ENCHANTMENT], ['effect1MiscValue', $this->typeId]], [DB::AND, ['effect1Id', SpellList::EFFECTS_ENCHANTMENT], ['effect1MiscValue', $this->typeId]],
['AND', ['effect2Id', SpellList::EFFECTS_ENCHANTMENT], ['effect2MiscValue', $this->typeId]], [DB::AND, ['effect2Id', SpellList::EFFECTS_ENCHANTMENT], ['effect2MiscValue', $this->typeId]],
['AND', ['effect3Id', SpellList::EFFECTS_ENCHANTMENT], ['effect3MiscValue', $this->typeId]], [DB::AND, ['effect3Id', SpellList::EFFECTS_ENCHANTMENT], ['effect3MiscValue', $this->typeId]],
); );
$spellList = new SpellList($cnd); $spellList = new SpellList($cnd);
if (!$spellList->error) if (!$spellList->error)
@ -207,12 +207,12 @@ class EnchantmentBaseResponse extends TemplateResponse implements ICache
$spellIds = $spellList->getFoundIDs(); $spellIds = $spellList->getFoundIDs();
$conditions = array( $conditions = array(
'OR', DB::OR,
['AND', ['spellTrigger1', [SPELL_TRIGGER_USE, SPELL_TRIGGER_USE_NODELAY]], ['spellId1', $spellIds]], [DB::AND, ['spellTrigger1', [SPELL_TRIGGER_USE, SPELL_TRIGGER_USE_NODELAY]], ['spellId1', $spellIds]],
['AND', ['spellTrigger2', [SPELL_TRIGGER_USE, SPELL_TRIGGER_USE_NODELAY]], ['spellId2', $spellIds]], [DB::AND, ['spellTrigger2', [SPELL_TRIGGER_USE, SPELL_TRIGGER_USE_NODELAY]], ['spellId2', $spellIds]],
['AND', ['spellTrigger3', [SPELL_TRIGGER_USE, SPELL_TRIGGER_USE_NODELAY]], ['spellId3', $spellIds]], [DB::AND, ['spellTrigger3', [SPELL_TRIGGER_USE, SPELL_TRIGGER_USE_NODELAY]], ['spellId3', $spellIds]],
['AND', ['spellTrigger4', [SPELL_TRIGGER_USE, SPELL_TRIGGER_USE_NODELAY]], ['spellId4', $spellIds]], [DB::AND, ['spellTrigger4', [SPELL_TRIGGER_USE, SPELL_TRIGGER_USE_NODELAY]], ['spellId4', $spellIds]],
['AND', ['spellTrigger5', [SPELL_TRIGGER_USE, SPELL_TRIGGER_USE_NODELAY]], ['spellId5', $spellIds]] [DB::AND, ['spellTrigger5', [SPELL_TRIGGER_USE, SPELL_TRIGGER_USE_NODELAY]], ['spellId5', $spellIds]]
); );
$ubItems = new ItemList($conditions); $ubItems = new ItemList($conditions);
@ -259,13 +259,13 @@ class EnchantmentBaseResponse extends TemplateResponse implements ICache
} }
// used by randomAttrItem // used by randomAttrItem
$ire = DB::Aowow()->select( $ire = DB::Aowow()->selectAssoc(
'SELECT *, ABS(`id`) AS ARRAY_KEY FROM ?_itemrandomenchant WHERE `enchantId1` = ?d OR `enchantId2` = ?d OR `enchantId3` = ?d OR `enchantId4` = ?d OR `enchantId5` = ?d', 'SELECT *, ABS(`id`) AS ARRAY_KEY FROM ::itemrandomenchant WHERE `enchantId1` = %i OR `enchantId2` = %i OR `enchantId3` = %i OR `enchantId4` = %i OR `enchantId5` = %i',
$this->typeId, $this->typeId, $this->typeId, $this->typeId, $this->typeId $this->typeId, $this->typeId, $this->typeId, $this->typeId, $this->typeId
); );
if ($ire) if ($ire)
{ {
if ($iet = DB::World()->select('SELECT `entry` AS ARRAY_KEY, `ench`, `chance` FROM item_enchantment_template WHERE `ench` IN (?a)', array_keys($ire))) if ($iet = DB::World()->selectAssoc('SELECT `entry` AS ARRAY_KEY, `ench`, `chance` FROM item_enchantment_template WHERE `ench` IN %in', array_keys($ire)))
{ {
$randIds = []; // transform back to signed format $randIds = []; // transform back to signed format
foreach ($iet as $tplId => $data) foreach ($iet as $tplId => $data)

View file

@ -114,7 +114,7 @@ class EventBaseResponse extends TemplateResponse implements ICache
/* Main Content */ /* Main Content */
/****************/ /****************/
// no entry in ?_articles? use default HolidayDescription // no entry in ::articles? use default HolidayDescription
if ($_holidayId && empty($this->article)) if ($_holidayId && empty($this->article))
$this->article = new Markup($this->subject->getField('description', true), ['dbpage' => true]); $this->article = new Markup($this->subject->getField('description', true), ['dbpage' => true]);
@ -137,7 +137,7 @@ class EventBaseResponse extends TemplateResponse implements ICache
$this->lvTabs = new Tabs(['parent' => "\$\$WH.ge('tabs-generic')"], 'tabsRelated', true); $this->lvTabs = new Tabs(['parent' => "\$\$WH.ge('tabs-generic')"], 'tabsRelated', true);
// tab: npcs // tab: npcs
if ($npcIds = DB::World()->selectCol('SELECT `id` AS ARRAY_KEY, IF(ec.`eventEntry` > 0, 1, 0) AS "added" FROM creature c, game_event_creature ec WHERE ec.`guid` = c.`guid` AND ABS(ec.`eventEntry`) = ?d', $this->typeId)) if ($npcIds = DB::World()->selectCol('SELECT `id` AS ARRAY_KEY, IF(ec.`eventEntry` > 0, 1, 0) AS "added" FROM creature c, game_event_creature ec WHERE ec.`guid` = c.`guid` AND ABS(ec.`eventEntry`) = %i', $this->typeId))
{ {
$creatures = new CreatureList(array(['id', array_keys($npcIds)])); $creatures = new CreatureList(array(['id', array_keys($npcIds)]));
if (!$creatures->error) if (!$creatures->error)
@ -157,7 +157,7 @@ class EventBaseResponse extends TemplateResponse implements ICache
} }
// tab: objects // tab: objects
if ($objectIds = DB::World()->selectCol('SELECT `id` AS ARRAY_KEY, IF(eg.`eventEntry` > 0, 1, 0) AS "added" FROM gameobject g, game_event_gameobject eg WHERE eg.`guid` = g.`guid` AND ABS(eg.`eventEntry`) = ?d', $this->typeId)) if ($objectIds = DB::World()->selectCol('SELECT `id` AS ARRAY_KEY, IF(eg.`eventEntry` > 0, 1, 0) AS "added" FROM gameobject g, game_event_gameobject eg WHERE eg.`guid` = g.`guid` AND ABS(eg.`eventEntry`) = %i', $this->typeId))
{ {
$objects = new GameObjectList(array(['id', array_keys($objectIds)])); $objects = new GameObjectList(array(['id', array_keys($objectIds)]));
if (!$objects->error) if (!$objects->error)
@ -205,7 +205,7 @@ class EventBaseResponse extends TemplateResponse implements ICache
if ($_holidayId) if ($_holidayId)
{ {
// tab: criteria-of // tab: criteria-of
if ($extraCrt = DB::World()->selectCol('SELECT `criteria_id` FROM achievement_criteria_data WHERE `type` = ?d AND `value1` = ?d', ACHIEVEMENT_CRITERIA_DATA_TYPE_HOLIDAY, $_holidayId)) if ($extraCrt = DB::World()->selectCol('SELECT `criteria_id` FROM achievement_criteria_data WHERE `type` = %i AND `value1` = %i', ACHIEVEMENT_CRITERIA_DATA_TYPE_HOLIDAY, $_holidayId))
{ {
$condition = array(['ac.id', $extraCrt]); $condition = array(['ac.id', $extraCrt]);
if ($exclAcvs) if ($exclAcvs)
@ -260,9 +260,9 @@ class EventBaseResponse extends TemplateResponse implements ICache
// vendor // vendor
$cIds = $creatures->getFoundIDs(); $cIds = $creatures->getFoundIDs();
if ($sells = DB::World()->selectCol( if ($sells = DB::World()->selectCol(
'SELECT `item` FROM npc_vendor nv WHERE `entry` IN (?a) UNION 'SELECT `item` FROM npc_vendor nv WHERE `entry` IN %in UNION
SELECT nv1.`item` FROM npc_vendor nv1 JOIN npc_vendor nv2 ON -nv1.`entry` = nv2.`item` WHERE nv2.`entry` IN (?a) UNION SELECT nv1.`item` FROM npc_vendor nv1 JOIN npc_vendor nv2 ON -nv1.`entry` = nv2.`item` WHERE nv2.`entry` IN %in UNION
SELECT `item` FROM game_event_npc_vendor genv JOIN creature c ON genv.`guid` = c.`guid` WHERE c.`id` IN (?a)', SELECT `item` FROM game_event_npc_vendor genv JOIN creature c ON genv.`guid` = c.`guid` WHERE c.`id` IN %in',
$cIds, $cIds, $cIds $cIds, $cIds, $cIds
)) ))
$itemCnd[] = ['id', $sells]; $itemCnd[] = ['id', $sells];
@ -272,7 +272,7 @@ class EventBaseResponse extends TemplateResponse implements ICache
// not checking for loot ... cant distinguish between eventLoot and fillerCrapLoot // not checking for loot ... cant distinguish between eventLoot and fillerCrapLoot
if ($itemCnd) if ($itemCnd)
{ {
array_unshift($itemCnd, 'OR'); array_unshift($itemCnd, DB::OR);
$eventItems = new ItemList($itemCnd); $eventItems = new ItemList($itemCnd);
if (!$eventItems->error) if (!$eventItems->error)
{ {
@ -288,7 +288,7 @@ class EventBaseResponse extends TemplateResponse implements ICache
} }
// tab: see also (event conditions) // tab: see also (event conditions)
if ($rel = DB::World()->selectCol('SELECT IF(`eventEntry` = `prerequisite_event`, NULL, IF(`eventEntry` = ?d, `prerequisite_event`, -`eventEntry`)) FROM game_event_prerequisite WHERE `prerequisite_event` = ?d OR `eventEntry` = ?d', $this->typeId, $this->typeId, $this->typeId)) if ($rel = DB::World()->selectCol('SELECT IF(`eventEntry` = `prerequisite_event`, NULL, IF(`eventEntry` = %i, `prerequisite_event`, -`eventEntry`)) FROM game_event_prerequisite WHERE `prerequisite_event` = %i OR `eventEntry` = %i', $this->typeId, $this->typeId, $this->typeId))
{ {
if (array_filter($rel, fn($x) => $x === null)) if (array_filter($rel, fn($x) => $x === null))
trigger_error('game_event_prerequisite: this event has itself as prerequisite', E_USER_WARNING); trigger_error('game_event_prerequisite: this event has itself as prerequisite', E_USER_WARNING);

View file

@ -102,8 +102,8 @@ class FactionBaseResponse extends TemplateResponse implements ICache
// profiler relateed (note that this is part of the cache. I don't think this is important enough to calc for every view) // profiler relateed (note that this is part of the cache. I don't think this is important enough to calc for every view)
if (Cfg::get('PROFILER_ENABLE') && !($this->subject->getField('cuFlags') & CUSTOM_EXCLUDE_FOR_LISTVIEW)) if (Cfg::get('PROFILER_ENABLE') && !($this->subject->getField('cuFlags') & CUSTOM_EXCLUDE_FOR_LISTVIEW))
{ {
$x = DB::Aowow()->selectCell('SELECT COUNT(1) FROM ?_profiler_completion_reputation WHERE `exalted` = 1 AND `factionId` = ?d', $this->typeId); $x = DB::Aowow()->selectCell('SELECT COUNT(1) FROM ::profiler_completion_reputation WHERE `exalted` = 1 AND `factionId` = %i', $this->typeId);
$y = DB::Aowow()->selectCell('SELECT COUNT(1) FROM ?_profiler_profiles WHERE `custom` = 0 AND `stub` = 0'); $y = DB::Aowow()->selectCell('SELECT COUNT(1) FROM ::profiler_profiles WHERE `custom` = 0 AND `stub` = 0');
$infobox[] = Lang::profiler('attainedBy', [round(($x ?: 0) * 100 / ($y ?: 1))]); $infobox[] = Lang::profiler('attainedBy', [round(($x ?: 0) * 100 / ($y ?: 1))]);
// completion row added by InfoboxMarkup // completion row added by InfoboxMarkup
@ -132,7 +132,7 @@ class FactionBaseResponse extends TemplateResponse implements ICache
CONCAT_WS(" ", faction1, faction2, faction3, faction4) AS faction, CONCAT_WS(" ", faction1, faction2, faction3, faction4) AS faction,
CONCAT_WS(" ", rate_1, rate_2, rate_3, rate_4) AS rate, CONCAT_WS(" ", rate_1, rate_2, rate_3, rate_4) AS rate,
CONCAT_WS(" ", rank_1, rank_2, rank_3, rank_4) AS rank CONCAT_WS(" ", rank_1, rank_2, rank_3, rank_4) AS rank
FROM reputation_spillover_template WHERE faction = ?d', $this->typeId); FROM reputation_spillover_template WHERE faction = %i', $this->typeId);
*/ */
@ -142,7 +142,7 @@ class FactionBaseResponse extends TemplateResponse implements ICache
); );
if ($p = $this->subject->getField('parentFactionId')) // linked via parent if ($p = $this->subject->getField('parentFactionId')) // linked via parent
$conditions[] = ['OR', ['id', $p], ['parentFactionId', $p]]; $conditions[] = [DB::OR, ['id', $p], ['parentFactionId', $p]];
else // self as parent else // self as parent
$conditions[] = ['parentFactionId', $this->typeId]; $conditions[] = ['parentFactionId', $this->typeId];
@ -162,7 +162,7 @@ class FactionBaseResponse extends TemplateResponse implements ICache
); );
// reward rates (ultimately this should be calculated into each reward display) // reward rates (ultimately this should be calculated into each reward display)
if ($rates = DB::World()->selectRow('SELECT `quest_rate`, `quest_daily_rate`, `quest_weekly_rate`, `quest_monthly_rate`, `quest_repeatable_rate`, `creature_rate`, `spell_rate` FROM reputation_reward_rate WHERE `faction` = ?d', $this->typeId)) if ($rates = DB::World()->selectRow('SELECT `quest_rate`, `quest_daily_rate`, `quest_weekly_rate`, `quest_monthly_rate`, `quest_repeatable_rate`, `creature_rate`, `spell_rate` FROM reputation_reward_rate WHERE `faction` = %i', $this->typeId))
{ {
$buff = ''; $buff = '';
foreach ($rates as $k => $v) foreach ($rates as $k => $v)
@ -191,7 +191,7 @@ class FactionBaseResponse extends TemplateResponse implements ICache
} }
// factionchange-equivalent // factionchange-equivalent
if ($pendant = DB::World()->selectCell('SELECT IF(`horde_id` = ?d, `alliance_id`, -`horde_id`) FROM player_factionchange_reputations WHERE `alliance_id` = ?d OR `horde_id` = ?d', $this->typeId, $this->typeId, $this->typeId)) if ($pendant = DB::World()->selectCell('SELECT IF(`horde_id` = %i, `alliance_id`, -`horde_id`) FROM player_factionchange_reputations WHERE `alliance_id` = %i OR `horde_id` = %i', $this->typeId, $this->typeId, $this->typeId))
{ {
$altFac = new FactionList(array(['id', abs($pendant)])); $altFac = new FactionList(array(['id', abs($pendant)]));
if (!$altFac->error) if (!$altFac->error)
@ -237,11 +237,11 @@ class FactionBaseResponse extends TemplateResponse implements ICache
{ {
// inherit siblings/children from $spillover // inherit siblings/children from $spillover
$cRep = DB::World()->selectCol('SELECT DISTINCT `creature_id` AS ARRAY_KEY, `qty` FROM ( $cRep = DB::World()->selectCol('SELECT DISTINCT `creature_id` AS ARRAY_KEY, `qty` FROM (
SELECT `creature_id`, `RewOnKillRepValue1` as "qty" FROM creature_onkill_reputation WHERE `RewOnKillRepValue1` > 0 AND (`RewOnKillRepFaction1` = ?d { OR (`RewOnKillRepFaction1` IN (?a) AND `IsTeamAward1` <> 0) } ) UNION SELECT `creature_id`, `RewOnKillRepValue1` as "qty" FROM creature_onkill_reputation WHERE `RewOnKillRepValue1` > 0 AND (`RewOnKillRepFaction1` = %i OR (`RewOnKillRepFaction1` IN %in AND `IsTeamAward1` <> 0) ) UNION
SELECT `creature_id`, `RewOnKillRepValue2` as "qty" FROM creature_onkill_reputation WHERE `RewOnKillRepValue2` > 0 AND (`RewOnKillRepFaction2` = ?d { OR (`RewOnKillRepFaction2` IN (?a) AND `IsTeamAward2` <> 0) } ) SELECT `creature_id`, `RewOnKillRepValue2` as "qty" FROM creature_onkill_reputation WHERE `RewOnKillRepValue2` > 0 AND (`RewOnKillRepFaction2` = %i OR (`RewOnKillRepFaction2` IN %in AND `IsTeamAward2` <> 0) )
) x', ) x',
$this->typeId, $spillover->getFoundIDs() ?: DBSIMPLE_SKIP, $this->typeId, $spillover->getFoundIDs() ?: [0],
$this->typeId, $spillover->getFoundIDs() ?: DBSIMPLE_SKIP $this->typeId, $spillover->getFoundIDs() ?: [0]
); );
if ($cRep) if ($cRep)
@ -303,13 +303,13 @@ class FactionBaseResponse extends TemplateResponse implements ICache
// tab: quests // tab: quests
$conditions = array( $conditions = array(
'OR', DB::OR,
Listview::DEFAULT_SIZE, Listview::DEFAULT_SIZE,
['AND', ['rewardFactionId1', $this->typeId], ['rewardFactionValue1', 0, '>']], [DB::AND, ['rewardFactionId1', $this->typeId], ['rewardFactionValue1', 0, '>']],
['AND', ['rewardFactionId2', $this->typeId], ['rewardFactionValue2', 0, '>']], [DB::AND, ['rewardFactionId2', $this->typeId], ['rewardFactionValue2', 0, '>']],
['AND', ['rewardFactionId3', $this->typeId], ['rewardFactionValue3', 0, '>']], [DB::AND, ['rewardFactionId3', $this->typeId], ['rewardFactionValue3', 0, '>']],
['AND', ['rewardFactionId4', $this->typeId], ['rewardFactionValue4', 0, '>']], [DB::AND, ['rewardFactionId4', $this->typeId], ['rewardFactionValue4', 0, '>']],
['AND', ['rewardFactionId5', $this->typeId], ['rewardFactionValue5', 0, '>']] [DB::AND, ['rewardFactionId5', $this->typeId], ['rewardFactionValue5', 0, '>']]
); );
$quests = new QuestList($conditions, ['calcTotal' => true]); $quests = new QuestList($conditions, ['calcTotal' => true]);
if (!$quests->error) if (!$quests->error)

View file

@ -81,11 +81,11 @@ class FactionsBaseResponse extends TemplateResponse implements ICache
else if (isset($this->category[0])) else if (isset($this->category[0]))
{ {
if ($this->category[0]) if ($this->category[0])
$subs = DB::Aowow()->selectCol('SELECT `id` FROM ?_factions WHERE `parentFactionId` = ?d', $this->category[0]); $subs = DB::Aowow()->selectCol('SELECT `id` FROM ::factions WHERE `parentFactionId` = %i', $this->category[0]);
else else
$subs = [0]; $subs = [0];
$conditions[] = ['OR', ['parentFactionId', $subs], ['id', $subs]]; $conditions[] = [DB::OR, ['parentFactionId', $subs], ['id', $subs]];
} }
$data = []; $data = [];

View file

@ -23,7 +23,7 @@ class GotocommentBaseResponse extends TextResponse
// the reputation-history listview only creates go-to-comment links. So either upvoting replies does not grant reputation, or.... bug.? // the reputation-history listview only creates go-to-comment links. So either upvoting replies does not grant reputation, or.... bug.?
$comment = DB::Aowow()->selectRow('SELECT IFNULL(c2.`id`, c1.`id`) AS "id", IFNULL(c2.`type`, c1.`type`) AS "type", IFNULL(c2.`typeId`, c1.`typeId`) AS "typeId" FROM ?_comments c1 LEFT JOIN ?_comments c2 ON c1.`replyTo` = c2.`id` WHERE c1.`id` = ?d', $this->_get['id']); $comment = DB::Aowow()->selectRow('SELECT IFNULL(c2.`id`, c1.`id`) AS "id", IFNULL(c2.`type`, c1.`type`) AS "type", IFNULL(c2.`typeId`, c1.`typeId`) AS "typeId" FROM ::comments c1 LEFT JOIN ::comments c2 ON c1.`replyTo` = c2.`id` WHERE c1.`id` = %i', $this->_get['id']);
if (!$comment) if (!$comment)
{ {
trigger_error('GotocommentBaseResponse - comment #'.$this->_get['id'].' not found', E_USER_ERROR); trigger_error('GotocommentBaseResponse - comment #'.$this->_get['id'].' not found', E_USER_ERROR);

View file

@ -22,7 +22,7 @@ class GotoreplyBaseResponse extends TextResponse
} }
// type = typeId = 0 AND replyTo <> 0 for replies // type = typeId = 0 AND replyTo <> 0 for replies
$reply = DB::Aowow()->selectRow('SELECT c.`id`, r.`id` AS "reply", c.`type`, c.`typeId` FROM ?_comments r JOIN ?_comments c ON r.`replyTo` = c.`id` WHERE r.`id` = ?d', $this->_get['id']); $reply = DB::Aowow()->selectRow('SELECT c.`id`, r.`id` AS "reply", c.`type`, c.`typeId` FROM ::comments r JOIN ::comments c ON r.`replyTo` = c.`id` WHERE r.`id` = %i', $this->_get['id']);
if (!$reply) if (!$reply)
{ {
trigger_error('GotoreplyBaseResponse - reply #'.$this->_get['id'].' not found', E_USER_ERROR); trigger_error('GotoreplyBaseResponse - reply #'.$this->_get['id'].' not found', E_USER_ERROR);

View file

@ -81,7 +81,7 @@ class GuideChangelogResponse extends TemplateResponse
$inp = fn($rev) => User::isInGroup(U_GROUP_STAFF) && false ? ($rev !== null ? '<input name="a" value="'.$rev.'" type="radio"/><input name="b" value="'.$rev.'" type="radio"/><b>' : '<b style="margin-left:38px;">') : ''; $inp = fn($rev) => User::isInGroup(U_GROUP_STAFF) && false ? ($rev !== null ? '<input name="a" value="'.$rev.'" type="radio"/><input name="b" value="'.$rev.'" type="radio"/><b>' : '<b style="margin-left:38px;">') : '';
$now = new DateTime(); $now = new DateTime();
$logEntries = DB::Aowow()->select('SELECT a.`username` AS `name`, gcl.`date`, gcl.`status`, gcl.`msg`, gcl.`rev` FROM ?_guides_changelog gcl JOIN ?_account a ON a.`id` = gcl.`userId` WHERE gcl.`id` = ?d ORDER BY gcl.`date` DESC', $this->_get['id']); $logEntries = DB::Aowow()->selectAssoc('SELECT a.`username` AS `name`, gcl.`date`, gcl.`status`, gcl.`msg`, gcl.`rev` FROM ::guides_changelog gcl JOIN ::account a ON a.`id` = gcl.`userId` WHERE gcl.`id` = %i ORDER BY gcl.`date` DESC', $this->_get['id']);
foreach ($logEntries as $log) foreach ($logEntries as $log)
{ {
if ($log['status'] != GuideMgr::STATUS_NONE) if ($log['status'] != GuideMgr::STATUS_NONE)

View file

@ -66,7 +66,7 @@ class GuideEditResponse extends TemplateResponse
return; return;
$this->typeId = $this->_get['id']; // just to display sensible not-found msg $this->typeId = $this->_get['id']; // just to display sensible not-found msg
$status = DB::Aowow()->selectCell('SELECT `status` FROM ?_guides WHERE `id` = ?d AND `status` <> ?d { AND `userId` = ?d }', $this->typeId, GuideMgr::STATUS_ARCHIVED, User::isInGroup(U_GROUP_STAFF) ? DBSIMPLE_SKIP : User::$id); $status = DB::Aowow()->selectCell('SELECT `status` FROM ::guides WHERE %if', !User::isInGroup(U_GROUP_STAFF), '`userId` = %i AND', User::$id, '%end `id` = %i AND `status` <> %i', $this->typeId, GuideMgr::STATUS_ARCHIVED);
if (!$status && $this->typeId) if (!$status && $this->typeId)
$this->generateNotFound(Lang::game('guide'), Lang::guide('notFound')); $this->generateNotFound(Lang::game('guide'), Lang::guide('notFound'));
else if (!$this->typeId) else if (!$this->typeId)
@ -75,7 +75,7 @@ class GuideEditResponse extends TemplateResponse
// just so we don't have to access GuideMgr from template // just so we don't have to access GuideMgr from template
$this->isDraft = $status == GuideMgr::STATUS_DRAFT; $this->isDraft = $status == GuideMgr::STATUS_DRAFT;
$this->editStatus = $status; $this->editStatus = $status;
$this->editRev = DB::Aowow()->selectCell('SELECT `rev` FROM ?_articles WHERE `type` = ?d AND `typeId` = ?d ORDER BY `rev` DESC', Type::GUIDE, $this->typeId); $this->editRev = DB::Aowow()->selectCell('SELECT `rev` FROM ::articles WHERE `type` = %i AND `typeId` = %i ORDER BY `rev` DESC', Type::GUIDE, $this->typeId);
} }
protected function generate() : void protected function generate() : void
@ -157,15 +157,15 @@ class GuideEditResponse extends TemplateResponse
if ($this->_get['id'] === 0) if ($this->_get['id'] === 0)
{ {
$guideData += ['userId' => User::$id]; $guideData += ['userId' => User::$id];
if (!($this->typeId = (int)DB::Aowow()->query('INSERT INTO ?_guides (?#) VALUES (?a)', array_keys($guideData), array_values($guideData)))) if (!($this->typeId = (int)DB::Aowow()->qry('INSERT INTO ::guides %v', $guideData)))
{ {
trigger_error('GuideEditResponse::saveGuide - failed to save guide to db', E_USER_ERROR); trigger_error('GuideEditResponse::saveGuide - failed to save guide to db', E_USER_ERROR);
return false; return false;
} }
} }
// existing guide > :shrug: // existing guide > :shrug:
else if (DB::Aowow()->query('UPDATE ?_guides SET ?a WHERE `id` = ?d', $guideData, $this->typeId)) else if (DB::Aowow()->qry('UPDATE ::guides SET %a WHERE `id` = %i', $guideData, $this->typeId))
DB::Aowow()->query('INSERT INTO ?_guides_changelog (`id`, `rev`, `date`, `userId`, `msg`) VALUES (?d, ?d, ?d, ?d, ?)', $this->typeId, $this->editRev, time(), User::$id, $this->_post['changelog']); DB::Aowow()->qry('INSERT INTO ::guides_changelog (`id`, `rev`, `date`, `userId`, `msg`) VALUES (%i, %i, %i, %i, %s)', $this->typeId, $this->editRev, time(), User::$id, $this->_post['changelog']);
else else
{ {
trigger_error('GuideEditResponse::saveGuide - failed to update guide in db', E_USER_ERROR); trigger_error('GuideEditResponse::saveGuide - failed to update guide in db', E_USER_ERROR);
@ -173,8 +173,8 @@ class GuideEditResponse extends TemplateResponse
} }
// insert Article // insert Article
$articleId = DB::Aowow()->query( $articleId = DB::Aowow()->qry(
'INSERT INTO ?_articles (`type`, `typeId`, `locale`, `rev`, `editAccess`, `article`) VALUES (?d, ?d, ?d, ?d, ?d, ?)', 'INSERT INTO ::articles (`type`, `typeId`, `locale`, `rev`, `editAccess`, `article`) VALUES (%i, %i, %i, %i, %i, %s)',
Type::GUIDE, Type::GUIDE,
$this->typeId, $this->typeId,
$this->_post['locale']->value, $this->_post['locale']->value,
@ -186,14 +186,14 @@ class GuideEditResponse extends TemplateResponse
if (!is_int($articleId)) if (!is_int($articleId))
{ {
if ($this->_get['id'] === 0) if ($this->_get['id'] === 0)
DB::Aowow()->query('DELETE FROM ?_guides WHERE `id` = ?d', $this->typeId); DB::Aowow()->qry('DELETE FROM ::guides WHERE `id` = %i', $this->typeId);
trigger_error('GuideEditResponse::saveGuide - failed to save article to db', E_USER_ERROR); trigger_error('GuideEditResponse::saveGuide - failed to save article to db', E_USER_ERROR);
return false; return false;
} }
if ($this->_post['submit'] && $this->editStatus != GuideMgr::STATUS_REVIEW) if ($this->_post['submit'] && $this->editStatus != GuideMgr::STATUS_REVIEW)
DB::Aowow()->query('INSERT INTO ?_guides_changelog (`id`, `date`, `userId`, `status`) VALUES (?d, ?d, ?d, ?d)', $this->typeId, time(), User::$id, GuideMgr::STATUS_REVIEW); DB::Aowow()->qry('INSERT INTO ::guides_changelog (`id`, `date`, `userId`, `status`) VALUES (%i, %i, %i, %i)', $this->typeId, time(), User::$id, GuideMgr::STATUS_REVIEW);
$this->editStatus = $guideData['status']; $this->editStatus = $guideData['status'];

View file

@ -42,7 +42,7 @@ class GuideBaseResponse extends TemplateResponse implements ICache
$this->typeId = $nameOrId; $this->typeId = $nameOrId;
else if (preg_match(GuideMgr::VALID_URL, $nameOrId)) else if (preg_match(GuideMgr::VALID_URL, $nameOrId))
{ {
if ($id = DB::Aowow()->selectCell('SELECT `id` FROM ?_guides WHERE `url` = ?', Util::lower($nameOrId))) if ($id = DB::Aowow()->selectCell('SELECT `id` FROM ::guides WHERE `url` = %s', Util::lower($nameOrId)))
{ {
$this->typeId = intVal($id); $this->typeId = intVal($id);
$this->articleUrl = Util::lower($nameOrId); $this->articleUrl = Util::lower($nameOrId);
@ -215,9 +215,9 @@ class GuideBaseResponse extends TemplateResponse implements ICache
return; return;
// increment and display views // increment and display views
DB::Aowow()->query('UPDATE ?_guides SET `views` = `views` + 1 WHERE `id` = ?d', $pt->typeId); DB::Aowow()->qry('UPDATE ::guides SET `views` = `views` + 1 WHERE `id` = %i', $pt->typeId);
$nViews = DB::Aowow()->selectCell('SELECT `views` FROM ?_guides WHERE `id` = ?d', $pt->typeId); $nViews = DB::Aowow()->selectCell('SELECT `views` FROM ::guides WHERE `id` = %i', $pt->typeId);
$infobox->addItem(Lang::guide('views').'[n5='.$nViews.']'); $infobox->addItem(Lang::guide('views').'[n5='.$nViews.']');

View file

@ -32,7 +32,7 @@ class GuidePowerResponse extends TextResponse implements ICache
if (Util::checkNumeric($idOrName, NUM_CAST_INT)) if (Util::checkNumeric($idOrName, NUM_CAST_INT))
$this->typeId = $idOrName; $this->typeId = $idOrName;
else if ($id = DB::Aowow()->selectCell('SELECT `id` FROM ?_guides WHERE `url` = ?', Util::lower($idOrName))) else if ($id = DB::Aowow()->selectCell('SELECT `id` FROM ::guides WHERE `url` = %s', Util::lower($idOrName)))
{ {
$this->typeId = intVal($id); $this->typeId = intVal($id);
$this->url = Util::lower($idOrName); $this->url = Util::lower($idOrName);

View file

@ -29,18 +29,18 @@ class GuideVoteResponse extends TextResponse
// by id, not own, published // by id, not own, published
$points = $votes = 0; $points = $votes = 0;
if ($g = DB::Aowow()->selectRow('SELECT `userId`, `cuFlags` FROM ?_guides WHERE `id` = ?d AND (`status` = ?d OR `rev` > 0)', $this->_post['id'], GuideMgr::STATUS_APPROVED)) if ($g = DB::Aowow()->selectRow('SELECT `userId`, `cuFlags` FROM ::guides WHERE `id` = %i AND (`status` = %i OR `rev` > 0)', $this->_post['id'], GuideMgr::STATUS_APPROVED))
{ {
// apparently you are allowed to vote on your own guide // apparently you are allowed to vote on your own guide
if ($g['cuFlags'] & GUIDE_CU_NO_RATING) if ($g['cuFlags'] & GUIDE_CU_NO_RATING)
$this->generate403(); $this->generate403();
if (!$this->_post['rating']) if (!$this->_post['rating'])
DB::Aowow()->query('DELETE FROM ?_user_ratings WHERE `type` = ?d AND `entry` = ?d AND `userId` = ?d', RATING_GUIDE, $this->_post['id'], User::$id); DB::Aowow()->qry('DELETE FROM ::user_ratings WHERE `type` = %i AND `entry` = %i AND `userId` = %i', RATING_GUIDE, $this->_post['id'], User::$id);
else else
DB::Aowow()->query('REPLACE INTO ?_user_ratings (`type`, `entry`, `userId`, `value`) VALUES (?d, ?d, ?d, ?d)', RATING_GUIDE, $this->_post['id'], User::$id, $this->_post['rating']); DB::Aowow()->qry('REPLACE INTO ::user_ratings (`type`, `entry`, `userId`, `value`) VALUES (%i, %i, %i, %i)', RATING_GUIDE, $this->_post['id'], User::$id, $this->_post['rating']);
[$points, $votes] = DB::Aowow()->selectRow('SELECT IFNULL(SUM(`value`), 0) AS "0", IFNULL(COUNT(*), 0) AS "1" FROM ?_user_ratings WHERE `type` = ?d AND `entry` = ?d', RATING_GUIDE, $this->_post['id']); [$points, $votes] = DB::Aowow()->selectRow('SELECT IFNULL(SUM(`value`), 0) AS "0", IFNULL(COUNT(*), 0) AS "1" FROM ::user_ratings WHERE `type` = %i AND `entry` = %i', RATING_GUIDE, $this->_post['id']);
} }
$this->result = Util::toJSON($votes ? ['rating' => $points / $votes, 'nvotes' => $votes] : ['rating' => 0, 'nvotes' => 0]); $this->result = Util::toJSON($votes ? ['rating' => $points / $votes, 'nvotes' => $votes] : ['rating' => 0, 'nvotes' => 0]);

View file

@ -45,7 +45,7 @@ class GuidesBaseResponse extends TemplateResponse // implements ICache
['locale', Lang::getLocale()->value], ['locale', Lang::getLocale()->value],
['status', GuideMgr::STATUS_ARCHIVED, '!'], // never archived guides ['status', GuideMgr::STATUS_ARCHIVED, '!'], // never archived guides
[ [
'OR', DB::OR,
['status', GuideMgr::STATUS_APPROVED], // currently approved ['status', GuideMgr::STATUS_APPROVED], // currently approved
['rev', 0, '>'] // has previously approved revision ['rev', 0, '>'] // has previously approved revision
] ]

View file

@ -46,7 +46,7 @@ class GuildBaseResponse extends TemplateResponse
// 3 possibilities // 3 possibilities
// 1) already synced to aowow // 1) already synced to aowow
if ($subject = DB::Aowow()->selectRow('SELECT `id`, `realmGUID`, `stub` FROM ?_profiler_guild WHERE `realm` = ?d AND `nameUrl` = ?', $this->realmId, Profiler::urlize($this->subjectName))) if ($subject = DB::Aowow()->selectRow('SELECT `id`, `realmGUID`, `stub` FROM ::profiler_guild WHERE `realm` = %i AND `nameUrl` = %s', $this->realmId, Profiler::urlize($this->subjectName)))
{ {
$this->typeId = $subject['id']; $this->typeId = $subject['id'];
@ -57,16 +57,15 @@ class GuildBaseResponse extends TemplateResponse
} }
// 2) not yet synced but exists on realm (wont work if we get passed an urlized name, but there is nothing we can do about it) // 2) not yet synced but exists on realm (wont work if we get passed an urlized name, but there is nothing we can do about it)
$subjects = DB::Characters($this->realmId)->select('SELECT `guildid` AS "realmGUID", `name` FROM guild WHERE `name` = ?', $this->subjectName); $subjects = DB::Characters($this->realmId)->selectAssoc('SELECT `guildid` AS "realmGUID", `name` FROM guild WHERE `name` = %s', $this->subjectName);
if ($subject = array_filter($subjects ?: [], fn($x) => Util::lower($x['name']) === Util::lower($this->subjectName))) if ($subject = array_find($subjects ?: [], fn($x) => Util::lower($x['name']) === Util::lower($this->subjectName)))
{ {
$subject = array_pop($subject);
$subject['realm'] = $this->realmId; $subject['realm'] = $this->realmId;
$subject['stub'] = 1; $subject['stub'] = 1;
$subject['nameUrl'] = Profiler::urlize($subject['name']); $subject['nameUrl'] = Profiler::urlize($subject['name']);
// create entry from realm with basic info // create entry from realm with basic info
DB::Aowow()->query('INSERT IGNORE INTO ?_profiler_guild (?#) VALUES (?a)', array_keys($subject), array_values($subject)); DB::Aowow()->qry('INSERT IGNORE INTO ::profiler_guild %v', $subject);
$this->handleIncompleteData(Type::GUILD, $subject['realmGUID']); $this->handleIncompleteData(Type::GUILD, $subject['realmGUID']);
return; return;
@ -122,7 +121,7 @@ class GuildBaseResponse extends TemplateResponse
// statistic calculations here // statistic calculations here
// smuggle the guild ranks into the html // smuggle the guild ranks into the html
if ($ranks = DB::Aowow()->selectCol('SELECT `rank` AS ARRAY_KEY, `name` FROM ?_profiler_guild_rank WHERE `guildId` = ?d', $this->typeId)) if ($ranks = DB::Aowow()->selectCol('SELECT `rank` AS ARRAY_KEY, `name` FROM ::profiler_guild_rank WHERE `guildId` = %i', $this->typeId))
$this->extraHTML = '<script type="text/javascript">var guild_ranks = '.Util::toJSON($ranks).';</script>'; $this->extraHTML = '<script type="text/javascript">var guild_ranks = '.Util::toJSON($ranks).';</script>';

View file

@ -32,12 +32,12 @@ class GuildResyncResponse extends TextResponse
if (!$this->assertGET('id')) if (!$this->assertGET('id'))
return; return;
if ($guilds = DB::Aowow()->select('SELECT `realm`, `realmGUID` FROM ?_profiler_guild WHERE `id` IN (?a)', $this->_get['id'])) if ($guilds = DB::Aowow()->selectAssoc('SELECT `realm`, `realmGUID` FROM ::profiler_guild WHERE `id` IN %in', $this->_get['id']))
foreach ($guilds as $g) foreach ($guilds as $g)
Profiler::scheduleResync(Type::GUILD, $g['realm'], $g['realmGUID']); Profiler::scheduleResync(Type::GUILD, $g['realm'], $g['realmGUID']);
if ($this->_get['profile']) if ($this->_get['profile'])
if ($chars = DB::Aowow()->select('SELECT `realm`, `realmGUID` FROM ?_profiler_profiles WHERE `guild` IN (?a)', $this->_get['id'])) if ($chars = DB::Aowow()->selectAssoc('SELECT `realm`, `realmGUID` FROM ::profiler_profiles WHERE `guild` IN %in', $this->_get['id']))
foreach ($chars as $c) foreach ($chars as $c)
Profiler::scheduleResync(Type::PROFILE, $c['realm'], $c['realmGUID']); Profiler::scheduleResync(Type::PROFILE, $c['realm'], $c['realmGUID']);

View file

@ -25,18 +25,18 @@ class HomeBaseResponse extends TemplateResponse
protected function generate() : void protected function generate() : void
{ {
// set <title> element // set <title> element
if ($_ = DB::Aowow()->selectCell('SELECT `title` FROM ?_home_titles WHERE `active` = 1 AND `locale` = ?d ORDER BY RAND()', Lang::getLocale()->value)) if ($_ = DB::Aowow()->selectCell('SELECT `title` FROM ::home_titles WHERE `active` = 1 AND `locale` = %i ORDER BY RAND()', Lang::getLocale()->value))
$this->homeTitle = Util::jsEscape(Cfg::get('NAME').Lang::main('colon').$_); $this->homeTitle = Util::jsEscape(Cfg::get('NAME').Lang::main('colon').$_);
// load oneliner // load oneliner
if ($_ = DB::Aowow()->selectRow('SELECT * FROM ?_home_oneliner WHERE `active` = 1 ORDER BY RAND() LIMIT 1')) if ($_ = DB::Aowow()->selectRow('SELECT * FROM ::home_oneliner WHERE `active` = 1 ORDER BY RAND() LIMIT 1'))
$this->oneliner = new Markup(new LocString($_, 'text'), [], 'home-oneliner'); $this->oneliner = new Markup(new LocString($_, 'text'), [], 'home-oneliner');
if ($_ = $this->oneliner?->getJsGlobals()) if ($_ = $this->oneliner?->getJsGlobals())
$this->extendGlobalData($_); $this->extendGlobalData($_);
// load featuredBox (user web server time) // load featuredBox (user web server time)
if ($box = DB::Aowow()->selectRow('SELECT * FROM ?_home_featuredbox WHERE ?d BETWEEN `startDate` AND `endDate` ORDER BY `id` DESC', time())) if ($box = DB::Aowow()->selectRow('SELECT * FROM ::home_featuredbox WHERE %i BETWEEN `startDate` AND `endDate` ORDER BY `id` DESC', time()))
{ {
// define text constants for all fields (STATIC_URL, HOST_URL, etc.) // define text constants for all fields (STATIC_URL, HOST_URL, etc.)
$box = Util::defStatic($box); $box = Util::defStatic($box);
@ -55,9 +55,9 @@ class HomeBaseResponse extends TemplateResponse
$this->extendGlobalData($_); $this->extendGlobalData($_);
// load overlay links // load overlay links
foreach (DB::Aowow()->select('SELECT * FROM ?_home_featuredbox_overlay WHERE `featureId` = ?d', $box['id']) as $ovl) foreach (DB::Aowow()->selectAssoc('SELECT * FROM ::home_featuredbox_overlay WHERE `featureId` = %i', $box['id']) as $ovl)
{ {
$ovl = Util::defStatic($ovl); $ovl = Util::defStatic((array)$ovl);
$this->featuredBox['overlays'][] = array( $this->featuredBox['overlays'][] = array(
'url' => $ovl['url'], 'url' => $ovl['url'],

View file

@ -21,7 +21,7 @@ class IconGetidfromnameResponse extends TextResponse
} }
$this->result = 0; $this->result = 0;
if ($id = DB::Aowow()->selectCell('SELECT `id` FROM ?_icons WHERE `name` = ?', $this->_get['name'])) if ($id = DB::Aowow()->selectCell('SELECT `id` FROM ::icons WHERE `name` = %s', $this->_get['name']))
$this->result = $id; $this->result = $id;
} }
} }

View file

@ -144,7 +144,7 @@ class ItemBaseResponse extends TemplateResponse implements ICache
// tool // tool
if ($tId = $this->subject->getField('totemCategory')) if ($tId = $this->subject->getField('totemCategory'))
if ($tName = DB::Aowow()->selectRow('SELECT * FROM ?_totemcategory WHERE `id` = ?d', $tId)) if ($tName = DB::Aowow()->selectRow('SELECT * FROM ::totemcategory WHERE `id` = %i', $tId))
$infobox[] = Lang::item('tool').'[url=?items&filter=cr=91;crs='.$tId.';crv=0]'.Util::localizedString($tName, 'name').'[/url]'; $infobox[] = Lang::item('tool').'[url=?items&filter=cr=91;crs='.$tId.';crv=0]'.Util::localizedString($tName, 'name').'[/url]';
// extendedCost // extendedCost
@ -396,7 +396,7 @@ class ItemBaseResponse extends TemplateResponse implements ICache
} }
// factionchange-equivalent // factionchange-equivalent
if ($pendant = DB::World()->selectCell('SELECT IF(`horde_id` = ?d, `alliance_id`, -`horde_id`) FROM player_factionchange_items WHERE `alliance_id` = ?d OR `horde_id` = ?d', $this->typeId, $this->typeId, $this->typeId)) if ($pendant = DB::World()->selectCell('SELECT IF(`horde_id` = %i, `alliance_id`, -`horde_id`) FROM player_factionchange_items WHERE `alliance_id` = %i OR `horde_id` = %i', $this->typeId, $this->typeId, $this->typeId))
{ {
$altItem = new ItemList(array(['id', abs($pendant)])); $altItem = new ItemList(array(['id', abs($pendant)]));
if (!$altItem->error) if (!$altItem->error)
@ -420,7 +420,7 @@ class ItemBaseResponse extends TemplateResponse implements ICache
$this->lvTabs = new Tabs(['parent' => "\$\$WH.ge('tabs-generic')"], 'tabsRelated', true); $this->lvTabs = new Tabs(['parent' => "\$\$WH.ge('tabs-generic')"], 'tabsRelated', true);
// tab: createdBy (perfect item specific) // tab: createdBy (perfect item specific)
if ($perfItem = DB::World()->select('SELECT *, `spellId` AS ARRAY_KEY FROM skill_perfect_item_template WHERE `perfectItemType` = ?d', $this->typeId)) if ($perfItem = DB::World()->selectAssoc('SELECT *, `spellId` AS ARRAY_KEY FROM skill_perfect_item_template WHERE `perfectItemType` = %i', $this->typeId))
{ {
$perfSpells = new SpellList(array(['id', array_column($perfItem, 'spellId')])); $perfSpells = new SpellList(array(['id', array_column($perfItem, 'spellId')]));
if (!$perfSpells->error) if (!$perfSpells->error)
@ -630,7 +630,7 @@ class ItemBaseResponse extends TemplateResponse implements ICache
// tab: reagent for // tab: reagent for
$conditions = array( $conditions = array(
'OR', DB::OR,
['reagent1', $this->typeId], ['reagent2', $this->typeId], ['reagent3', $this->typeId], ['reagent4', $this->typeId], ['reagent1', $this->typeId], ['reagent2', $this->typeId], ['reagent3', $this->typeId], ['reagent4', $this->typeId],
['reagent5', $this->typeId], ['reagent6', $this->typeId], ['reagent7', $this->typeId], ['reagent8', $this->typeId] ['reagent5', $this->typeId], ['reagent6', $this->typeId], ['reagent7', $this->typeId], ['reagent8', $this->typeId]
); );
@ -650,9 +650,9 @@ class ItemBaseResponse extends TemplateResponse implements ICache
// tab: unlocks (object or item) // tab: unlocks (object or item)
$lockIds = DB::Aowow()->selectCol( $lockIds = DB::Aowow()->selectCol(
'SELECT `id` FROM ?_lock WHERE (`type1` = ?d AND `properties1` = ?d) OR 'SELECT `id` FROM ::lock WHERE (`type1` = %i AND `properties1` = %i) OR
(`type2` = ?d AND `properties2` = ?d) OR (`type3` = ?d AND `properties3` = ?d) OR (`type2` = %i AND `properties2` = %i) OR (`type3` = %i AND `properties3` = %i) OR
(`type4` = ?d AND `properties4` = ?d) OR (`type5` = ?d AND `properties5` = ?d)', (`type4` = %i AND `properties4` = %i) OR (`type5` = %i AND `properties5` = %i)',
LOCK_TYPE_ITEM, $this->typeId, LOCK_TYPE_ITEM, $this->typeId, LOCK_TYPE_ITEM, $this->typeId, LOCK_TYPE_ITEM, $this->typeId,
LOCK_TYPE_ITEM, $this->typeId, LOCK_TYPE_ITEM, $this->typeId, LOCK_TYPE_ITEM, $this->typeId, LOCK_TYPE_ITEM, $this->typeId,
LOCK_TYPE_ITEM, $this->typeId LOCK_TYPE_ITEM, $this->typeId
@ -704,7 +704,7 @@ class ItemBaseResponse extends TemplateResponse implements ICache
// tab: objective of (quest) // tab: objective of (quest)
$conditions = array( $conditions = array(
'OR', DB::OR,
['reqItemId1', $this->typeId], ['reqItemId2', $this->typeId], ['reqItemId3', $this->typeId], ['reqItemId1', $this->typeId], ['reqItemId2', $this->typeId], ['reqItemId3', $this->typeId],
['reqItemId4', $this->typeId], ['reqItemId5', $this->typeId], ['reqItemId6', $this->typeId] ['reqItemId4', $this->typeId], ['reqItemId5', $this->typeId], ['reqItemId6', $this->typeId]
); );
@ -722,7 +722,7 @@ class ItemBaseResponse extends TemplateResponse implements ICache
// tab: provided for (quest) // tab: provided for (quest)
$conditions = array( $conditions = array(
'OR', ['sourceItemId', $this->typeId], DB::OR, ['sourceItemId', $this->typeId],
['reqSourceItemId1', $this->typeId], ['reqSourceItemId2', $this->typeId], ['reqSourceItemId1', $this->typeId], ['reqSourceItemId2', $this->typeId],
['reqSourceItemId3', $this->typeId], ['reqSourceItemId4', $this->typeId] ['reqSourceItemId3', $this->typeId], ['reqSourceItemId4', $this->typeId]
); );
@ -838,8 +838,8 @@ class ItemBaseResponse extends TemplateResponse implements ICache
if (!$n && !is_null(ItemListFilter::getCriteriaIndex(158, $this->typeId))) if (!$n && !is_null(ItemListFilter::getCriteriaIndex(158, $this->typeId)))
$n = '?items&filter=cr=158;crs='.$this->typeId.';crv=0'; $n = '?items&filter=cr=158;crs='.$this->typeId.';crv=0';
$xCosts = DB::Aowow()->selectCol('SELECT `id` FROM ?_itemextendedcost WHERE '.$w); $xCosts = DB::Aowow()->selectCol('SELECT `id` FROM ::itemextendedcost WHERE '.$w);
$boughtBy = $xCosts ? DB::World()->selectCol('SELECT `item` FROM npc_vendor WHERE `extendedCost` IN (?a) UNION SELECT `item` FROM game_event_npc_vendor WHERE `extendedCost` IN (?a)', $xCosts, $xCosts) : null; $boughtBy = $xCosts ? DB::World()->selectCol('SELECT `item` FROM npc_vendor WHERE `extendedCost` IN %in UNION SELECT `item` FROM game_event_npc_vendor WHERE `extendedCost` IN %in', $xCosts, $xCosts) : null;
if ($boughtBy) if ($boughtBy)
{ {
$boughtBy = new ItemList(array(['id', $boughtBy])); $boughtBy = new ItemList(array(['id', $boughtBy]));
@ -910,10 +910,10 @@ class ItemBaseResponse extends TemplateResponse implements ICache
$conditions = array( $conditions = array(
['id', $this->typeId, '!'], ['id', $this->typeId, '!'],
[ [
'OR', DB::OR,
['name_loc'.Lang::getLocale()->value, $this->subject->getField('name', true)], ['name_loc'.Lang::getLocale()->value, $this->subject->getField('name', true)],
[ [
'AND', DB::AND,
['class', $_class], ['class', $_class],
['subClass', $_subClass], ['subClass', $_subClass],
['slot', $_slot], ['slot', $_slot],
@ -926,7 +926,7 @@ class ItemBaseResponse extends TemplateResponse implements ICache
); );
if ($_ = $this->subject->getField('itemset')) if ($_ = $this->subject->getField('itemset'))
$conditions[1][] = ['AND', ['slot', $_slot], ['itemset', $_]]; $conditions[1][] = [DB::AND, ['slot', $_slot], ['itemset', $_]];
$saItems = new ItemList($conditions); $saItems = new ItemList($conditions);
if (!$saItems->error) if (!$saItems->error)
@ -972,7 +972,7 @@ class ItemBaseResponse extends TemplateResponse implements ICache
$useSpells[] = $this->subject->getField('spellId'.$i); $useSpells[] = $this->subject->getField('spellId'.$i);
} }
if ($useSpells) if ($useSpells)
if ($_ = DB::Aowow()->selectCol('SELECT `category` FROM ?_spell WHERE `id` IN (?a) AND `recoveryCategory` > 0', $useSpells)) if ($_ = DB::Aowow()->selectCol('SELECT `category` FROM ::spell WHERE `id` IN %in AND `recoveryCategory` > 0', $useSpells))
$cdCats += $_; $cdCats += $_;
if ($cdCats) if ($cdCats)
@ -980,7 +980,7 @@ class ItemBaseResponse extends TemplateResponse implements ICache
$conditions = array( $conditions = array(
['id', $this->typeId, '!'], ['id', $this->typeId, '!'],
[ [
'OR', DB::OR,
['spellCategory1', $cdCats], ['spellCategory1', $cdCats],
['spellCategory2', $cdCats], ['spellCategory2', $cdCats],
['spellCategory3', $cdCats], ['spellCategory3', $cdCats],
@ -989,7 +989,7 @@ class ItemBaseResponse extends TemplateResponse implements ICache
] ]
); );
if ($spellsByCat = DB::Aowow()->selectCol('SELECT `id` FROM ?_spell WHERE `category` IN (?a)', $cdCats)) if ($spellsByCat = DB::Aowow()->selectCol('SELECT `id` FROM ::spell WHERE `category` IN %in', $cdCats))
for ($i = 1; $i < 6; $i++) for ($i = 1; $i < 6; $i++)
$conditions[1][] = ['spellId'.$i, $spellsByCat]; $conditions[1][] = ['spellId'.$i, $spellsByCat];
@ -1014,7 +1014,7 @@ class ItemBaseResponse extends TemplateResponse implements ICache
if ($this->subject->getField('soundOverrideSubclass') > 0) if ($this->subject->getField('soundOverrideSubclass') > 0)
$scm = (1 << $this->subject->getField('soundOverrideSubclass')); $scm = (1 << $this->subject->getField('soundOverrideSubclass'));
$soundIds = DB::Aowow()->selectCol('SELECT `soundId` FROM ?_items_sounds WHERE `subClassMask` & ?d', $scm); $soundIds = DB::Aowow()->selectCol('SELECT `soundId` FROM ::items_sounds WHERE `subClassMask` & %i', $scm);
} }
$fields = ['pickUpSoundId', 'dropDownSoundId', 'sheatheSoundId', 'unsheatheSoundId']; $fields = ['pickUpSoundId', 'dropDownSoundId', 'sheatheSoundId', 'unsheatheSoundId'];
@ -1024,7 +1024,7 @@ class ItemBaseResponse extends TemplateResponse implements ICache
if ($x = $this->subject->getField('spellVisualId')) if ($x = $this->subject->getField('spellVisualId'))
{ {
if ($spellSounds = DB::Aowow()->selectRow('SELECT * FROM ?_spell_sounds WHERE `id` = ?d', $x)) if ($spellSounds = DB::Aowow()->selectRow('SELECT * FROM ::spell_sounds WHERE `id` = %i', $x))
{ {
array_shift($spellSounds); // bye 'id'-field array_shift($spellSounds); // bye 'id'-field
foreach ($spellSounds as $ss) foreach ($spellSounds as $ss)

View file

@ -148,10 +148,10 @@ class ItemXmlResponse extends TextResponse implements ICache
// reagents // reagents
$cnd = array( $cnd = array(
'OR', DB::OR,
['AND', ['effect1CreateItemId', $this->typeId], ['OR', ['effect1Id', SpellList::EFFECTS_ITEM_CREATE], ['effect1AuraId', SpellList::AURAS_ITEM_CREATE]]], [DB::AND, ['effect1CreateItemId', $this->typeId], [DB::OR, ['effect1Id', SpellList::EFFECTS_ITEM_CREATE], ['effect1AuraId', SpellList::AURAS_ITEM_CREATE]]],
['AND', ['effect2CreateItemId', $this->typeId], ['OR', ['effect2Id', SpellList::EFFECTS_ITEM_CREATE], ['effect2AuraId', SpellList::AURAS_ITEM_CREATE]]], [DB::AND, ['effect2CreateItemId', $this->typeId], [DB::OR, ['effect2Id', SpellList::EFFECTS_ITEM_CREATE], ['effect2AuraId', SpellList::AURAS_ITEM_CREATE]]],
['AND', ['effect3CreateItemId', $this->typeId], ['OR', ['effect3Id', SpellList::EFFECTS_ITEM_CREATE], ['effect3AuraId', SpellList::AURAS_ITEM_CREATE]]], [DB::AND, ['effect3CreateItemId', $this->typeId], [DB::OR, ['effect3Id', SpellList::EFFECTS_ITEM_CREATE], ['effect3AuraId', SpellList::AURAS_ITEM_CREATE]]],
); );
$spellSource = new SpellList($cnd); $spellSource = new SpellList($cnd);

View file

@ -289,7 +289,7 @@ class ItemsBaseResponse extends TemplateResponse implements ICache
case ItemListFilter::GROUP_BY_LEVEL: // itemlevel: first, try to find 10 level steps within range (if given) as tabs case ItemListFilter::GROUP_BY_LEVEL: // itemlevel: first, try to find 10 level steps within range (if given) as tabs
// ohkayy, maybe i need to rethink $this // ohkayy, maybe i need to rethink $this
$this->filterOpts = $this->filter->extraOpts; $this->filterOpts = $this->filter->extraOpts;
$this->filterOpts['is']['o'] = [null]; // remove 'order by' from ?_item_stats $this->filterOpts['is']['o'] = [null]; // remove 'order by' from ::item_stats
$extraOpts = array_merge($this->filterOpts, ['i' => ['g' => ['itemlevel'], 'o' => ['itemlevel DESC']]]); $extraOpts = array_merge($this->filterOpts, ['i' => ['g' => ['itemlevel'], 'o' => ['itemlevel DESC']]]);
$levelRef = new ItemList(array_merge($conditions, [10]), ['extraOpts' => $extraOpts]); $levelRef = new ItemList(array_merge($conditions, [10]), ['extraOpts' => $extraOpts]);

View file

@ -63,13 +63,13 @@ class MailBaseResponse extends TemplateResponse implements ICache
// sender + delay // sender + delay
if ($this->typeId < 0) // def. achievement if ($this->typeId < 0) // def. achievement
{ {
if ($npcId = DB::World()->selectCell('SELECT `Sender` FROM achievement_reward WHERE `ID` = ?d', -$this->typeId)) if ($npcId = DB::World()->selectCell('SELECT `Sender` FROM achievement_reward WHERE `ID` = %i', -$this->typeId))
{ {
$infobox[] = Lang::mail('sender', ['[npc='.$npcId.']']); $infobox[] = Lang::mail('sender', ['[npc='.$npcId.']']);
$this->extendGlobalIds(Type::NPC, $npcId); $this->extendGlobalIds(Type::NPC, $npcId);
} }
} }
else if ($mlr = DB::World()->selectRow('SELECT * FROM mail_level_reward WHERE `mailTemplateId` = ?d', $this->typeId)) // level rewards else if ($mlr = DB::World()->selectRow('SELECT * FROM mail_level_reward WHERE `mailTemplateId` = %i', $this->typeId)) // level rewards
{ {
if ($mlr['level']) if ($mlr['level'])
$infobox[] = Lang::game('level').Lang::main('colon').$mlr['level']; $infobox[] = Lang::game('level').Lang::main('colon').$mlr['level'];
@ -87,14 +87,14 @@ class MailBaseResponse extends TemplateResponse implements ICache
} }
else // achievement or quest else // achievement or quest
{ {
if ($q = DB::Aowow()->selectRow('SELECT `id`, `rewardMailDelay` FROM ?_quests WHERE `rewardMailTemplateId` = ?d', $this->typeId)) if ($q = DB::Aowow()->selectRow('SELECT `id`, `rewardMailDelay` FROM ::quests WHERE `rewardMailTemplateId` = %i', $this->typeId))
{ {
if ($npcId= DB::World()->selectCell('SELECT `RewardMailSenderEntry` FROM quest_mail_sender WHERE `QuestId` = ?d', $q['id'])) if ($npcId= DB::World()->selectCell('SELECT `RewardMailSenderEntry` FROM quest_mail_sender WHERE `QuestId` = %i', $q['id']))
{ {
$infobox[] = Lang::mail('sender', ['[npc='.$npcId.']']); $infobox[] = Lang::mail('sender', ['[npc='.$npcId.']']);
$this->extendGlobalIds(Type::NPC, $npcId); $this->extendGlobalIds(Type::NPC, $npcId);
} }
else if ($npcId = DB::Aowow()->selectCell('SELECT `typeId` FROM ?_quests_startend WHERE `questId` = ?d AND `type` = ?d AND `method` & ?d', $q['id'], Type::NPC, 0x2)) else if ($npcId = DB::Aowow()->selectCell('SELECT `typeId` FROM ::quests_startend WHERE `questId` = %i AND `type` = %i AND `method` & %i', $q['id'], Type::NPC, 0x2))
{ {
$infobox[] = Lang::mail('sender', ['[npc='.$npcId.']']); $infobox[] = Lang::mail('sender', ['[npc='.$npcId.']']);
$this->extendGlobalIds(Type::NPC, $npcId); $this->extendGlobalIds(Type::NPC, $npcId);
@ -103,7 +103,7 @@ class MailBaseResponse extends TemplateResponse implements ICache
if ($q['rewardMailDelay'] > 0) if ($q['rewardMailDelay'] > 0)
$infobox[] = Lang::mail('delay', [DateTime::formatTimeElapsed($q['rewardMailDelay'] * 1000)]); $infobox[] = Lang::mail('delay', [DateTime::formatTimeElapsed($q['rewardMailDelay'] * 1000)]);
} }
else if ($npcId = DB::World()->selectCell('SELECT `Sender` FROM achievement_reward WHERE `MailTemplateId` = ?d', $this->typeId)) else if ($npcId = DB::World()->selectCell('SELECT `Sender` FROM achievement_reward WHERE `MailTemplateId` = %i', $this->typeId))
{ {
$infobox[] = Lang::mail('sender', ['[npc='.$npcId.']']); $infobox[] = Lang::mail('sender', ['[npc='.$npcId.']']);
$this->extendGlobalIds(Type::NPC, $npcId); $this->extendGlobalIds(Type::NPC, $npcId);
@ -151,7 +151,7 @@ class MailBaseResponse extends TemplateResponse implements ICache
} }
if ($this->typeId < 0 || // used by: achievement if ($this->typeId < 0 || // used by: achievement
($acvId = DB::World()->selectCell('SELECT `ID` FROM achievement_reward WHERE `MailTemplateId` = ?d', $this->typeId))) ($acvId = DB::World()->selectCell('SELECT `ID` FROM achievement_reward WHERE `MailTemplateId` = %i', $this->typeId)))
{ {
$ubAchievements = new AchievementList(array(['id', $this->typeId < 0 ? -$this->typeId : $acvId])); $ubAchievements = new AchievementList(array(['id', $this->typeId < 0 ? -$this->typeId : $acvId]));
if (!$ubAchievements->error) if (!$ubAchievements->error)

View file

@ -68,8 +68,8 @@ class MostcommentsBaseResponse extends TemplateResponse
foreach (Type::getClassesFor() as $type => $classStr) foreach (Type::getClassesFor() as $type => $classStr)
{ {
$comments = DB::Aowow()->selectCol( $comments = DB::Aowow()->selectCol(
'SELECT `typeId` AS ARRAY_KEY, COUNT(1) FROM ?_comments 'SELECT `typeId` AS ARRAY_KEY, COUNT(1) FROM ::comments
WHERE `replyTo` = 0 AND (`flags` & ?d) = 0 AND `type`= ?d AND `date` > (UNIX_TIMESTAMP() - ?d) WHERE `replyTo` = 0 AND (`flags` & %i) = 0 AND `type`= %i AND `date` > (UNIX_TIMESTAMP() - %i)
GROUP BY `type`, `typeId` GROUP BY `type`, `typeId`
LIMIT 100', LIMIT 100',
CC_FLAG_DELETED, CC_FLAG_DELETED,

View file

@ -27,8 +27,8 @@ class MostcommentsRssResponse extends TextResponse
foreach (Type::getClassesFor() as $type => $classStr) foreach (Type::getClassesFor() as $type => $classStr)
{ {
$comments = DB::Aowow()->selectCol( $comments = DB::Aowow()->selectCol(
'SELECT `typeId` AS ARRAY_KEY, COUNT(1) FROM ?_comments 'SELECT `typeId` AS ARRAY_KEY, COUNT(1) FROM ::comments
WHERE `replyTo` = 0 AND (`flags` & ?d) = 0 AND `type`= ?d AND `date` > (UNIX_TIMESTAMP() - ?d) WHERE `replyTo` = 0 AND (`flags` & %i) = 0 AND `type`= %i AND `date` > (UNIX_TIMESTAMP() - %i)
GROUP BY `type`, `typeId` GROUP BY `type`, `typeId`
LIMIT 100', LIMIT 100',
CC_FLAG_DELETED, CC_FLAG_DELETED,

View file

@ -90,7 +90,7 @@ class NpcBaseResponse extends TemplateResponse implements ICache
$this->altNPCs = new CreatureList(array(['id', array_keys($_altIds)])); $this->altNPCs = new CreatureList(array(['id', array_keys($_altIds)]));
} }
if ($_ = DB::World()->selectCol('SELECT DISTINCT `entry` FROM vehicle_template_accessory WHERE `accessory_entry` = ?d', $this->typeId)) if ($_ = DB::World()->selectCol('SELECT DISTINCT `entry` FROM vehicle_template_accessory WHERE `accessory_entry` = %i', $this->typeId))
{ {
$vehicles = new CreatureList(array(['id', $_])); $vehicles = new CreatureList(array(['id', $_]));
foreach ($vehicles->iterate() as $id => $__) foreach ($vehicles->iterate() as $id => $__)
@ -103,9 +103,9 @@ class NpcBaseResponse extends TemplateResponse implements ICache
/**********************/ /**********************/
$mapType = 0; $mapType = 0;
if ($maps = DB::Aowow()->selectCell('SELECT IF(COUNT(DISTINCT `areaId`) > 1, 0, `areaId`) FROM ?_spawns WHERE `type` = ?d AND `typeId` = ?d', Type::NPC, $this->typeId)) if ($maps = DB::Aowow()->selectCell('SELECT IF(COUNT(DISTINCT `areaId`) > 1, 0, `areaId`) FROM ::spawns WHERE `type` = %i AND `typeId` = %i', Type::NPC, $this->typeId))
{ {
$mapType = match ((int)DB::Aowow()->selectCell('SELECT `type` FROM ?_zones WHERE `id` = ?d', $maps[0])) $mapType = match (DB::Aowow()->selectCell('SELECT `type` FROM ::zones WHERE `id` = %i', $maps))
{ {
// MAP_TYPE_DUNGEON, // MAP_TYPE_DUNGEON,
MAP_TYPE_DUNGEON_HC => 1, MAP_TYPE_DUNGEON_HC => 1,
@ -116,13 +116,13 @@ class NpcBaseResponse extends TemplateResponse implements ICache
}; };
} }
// npc is difficulty dummy: get max difficulty from parent npc // npc is difficulty dummy: get max difficulty from parent npc
if ($this->placeholder && ($mt = DB::Aowow()->selectCell('SELECT IF(`difficultyEntry1` = ?d, 1, 2) FROM ?_creature WHERE `difficultyEntry1` = ?d OR `difficultyEntry2` = ?d OR `difficultyEntry3` = ?d', $this->typeId, $this->typeId, $this->typeId, $this->typeId))) if ($this->placeholder && ($mt = DB::Aowow()->selectCell('SELECT IF(`difficultyEntry1` = %i, 1, 2) FROM ::creature WHERE `difficultyEntry1` = %i OR `difficultyEntry2` = %i OR `difficultyEntry3` = %i', $this->typeId, $this->typeId, $this->typeId, $this->typeId)))
$mapType = max($mapType, $mt); $mapType = max($mapType, $mt);
// npc has difficulty dummys: 2+ dummies -> definitely raid (10/25 + hc); 1 dummy -> may be heroic (used here), but may also be 10/25-raid // npc has difficulty dummys: 2+ dummies -> definitely raid (10/25 + hc); 1 dummy -> may be heroic (used here), but may also be 10/25-raid
if ($_altIds) if ($_altIds)
$mapType = max($mapType, count($_altIds) > 1 ? 2 : 1); $mapType = max($mapType, count($_altIds) > 1 ? 2 : 1);
// for event encounters a single npc may be reused over multiple difficulties but have different chests assigned // for event encounters a single npc may be reused over multiple difficulties but have different chests assigned
if ($d = DB::Aowow()->selectCell('SELECT MAX(`difficulty`) FROM ?_loot_link WHERE `npcId` IN (?a)', array_merge($_altIds, [$this->typeId]))) if ($d = DB::Aowow()->selectCell('SELECT MAX(`difficulty`) FROM ::loot_link WHERE `npcId` IN %in', array_merge($_altIds, [$this->typeId])))
$mapType = max($mapType, $d > 2 ? 2 : 1); $mapType = max($mapType, $d > 2 ? 2 : 1);
@ -133,7 +133,7 @@ class NpcBaseResponse extends TemplateResponse implements ICache
$infobox = Lang::getInfoBoxForFlags($this->subject->getField('cuFlags')); $infobox = Lang::getInfoBoxForFlags($this->subject->getField('cuFlags'));
// Event (ignore events, where the object only gets removed) // Event (ignore events, where the object only gets removed)
if ($_ = DB::World()->selectCol('SELECT DISTINCT ge.`eventEntry` FROM game_event ge, game_event_creature gec, creature c WHERE ge.`eventEntry` = gec.`eventEntry` AND c.`guid` = gec.`guid` AND c.`id` = ?d', $this->typeId)) if ($_ = DB::World()->selectCol('SELECT DISTINCT ge.`eventEntry` FROM game_event ge, game_event_creature gec, creature c WHERE ge.`eventEntry` = gec.`eventEntry` AND c.`guid` = gec.`guid` AND c.`id` = %i', $this->typeId))
{ {
$this->extendGlobalIds(Type::WORLDEVENT, ...$_); $this->extendGlobalIds(Type::WORLDEVENT, ...$_);
$ev = []; $ev = [];
@ -202,7 +202,7 @@ class NpcBaseResponse extends TemplateResponse implements ICache
if (User::isInGroup(U_GROUP_EMPLOYEE)) if (User::isInGroup(U_GROUP_EMPLOYEE))
{ {
$spawnData = DB::Aowow()->select('SELECT `guid` AS "0", `ScriptName` AS "1", `StringId` AS "2" FROM ?_spawns WHERE `type` = ?d AND `typeId` = ?d AND `ScriptName` IS NOT NULL ORDER BY `guid` ASC', Type::NPC, $this->typeId); $spawnData = DB::Aowow()->selectAssoc('SELECT `guid` AS "0", `ScriptName` AS "1", `StringId` AS "2" FROM ::spawns WHERE `type` = %i AND `typeId` = %i AND `ScriptName` IS NOT NULL ORDER BY `guid` ASC', Type::NPC, $this->typeId);
// AI // AI
$scripts = null; $scripts = null;
@ -318,7 +318,7 @@ class NpcBaseResponse extends TemplateResponse implements ICache
if (!$sai->prepare()) // no smartAI found .. check per guid if (!$sai->prepare()) // no smartAI found .. check per guid
{ {
// at least one of many // at least one of many
$guids = DB::World()->selectCol('SELECT `guid` FROM creature WHERE `id` = ?d', $this->typeId); $guids = DB::World()->selectCol('SELECT `guid` FROM creature WHERE `id` = %i', $this->typeId);
while ($_ = array_pop($guids)) while ($_ = array_pop($guids))
{ {
$sai = new SmartAI(SmartAI::SRC_TYPE_CREATURE, -$_, ['baseEntry' => $this->typeId, 'title' => ' [small](for GUID: '.$_.')[/small]']); $sai = new SmartAI(SmartAI::SRC_TYPE_CREATURE, -$_, ['baseEntry' => $this->typeId, 'title' => ' [small](for GUID: '.$_.')[/small]']);
@ -359,7 +359,7 @@ class NpcBaseResponse extends TemplateResponse implements ICache
$tplSpells = []; $tplSpells = [];
$genSpells = []; $genSpells = [];
$spellClick = []; $spellClick = [];
$conditions = ['OR']; $conditions = [DB::OR];
for ($i = 1; $i < 9; $i++) for ($i = 1; $i < 9; $i++)
if ($_ = $this->subject->getField('spell'.$i)) if ($_ = $this->subject->getField('spell'.$i))
@ -371,7 +371,7 @@ class NpcBaseResponse extends TemplateResponse implements ICache
if ($smartSpells = SmartAI::getSpellCastsForOwner($this->typeId, SmartAI::SRC_TYPE_CREATURE)) if ($smartSpells = SmartAI::getSpellCastsForOwner($this->typeId, SmartAI::SRC_TYPE_CREATURE))
$genSpells = $smartSpells; $genSpells = $smartSpells;
if ($auras = DB::World()->selectCell('SELECT `auras` FROM creature_template_addon WHERE `entry` = ?d', $this->typeId)) if ($auras = DB::World()->selectCell('SELECT `auras` FROM creature_template_addon WHERE `entry` = %i', $this->typeId))
{ {
$auras = preg_replace('/[^\d ]/', ' ', $auras); // remove erroneous chars from string $auras = preg_replace('/[^\d ]/', ' ', $auras); // remove erroneous chars from string
$genSpells = array_merge($genSpells, array_filter(explode(' ', $auras))); $genSpells = array_merge($genSpells, array_filter(explode(' ', $auras)));
@ -380,7 +380,7 @@ class NpcBaseResponse extends TemplateResponse implements ICache
if ($genSpells) if ($genSpells)
$conditions[] = ['id', $genSpells]; $conditions[] = ['id', $genSpells];
if ($spellClick = DB::World()->select('SELECT `spell_id` AS ARRAY_KEY, `cast_flags` AS "0", `user_type` AS "1" FROM npc_spellclick_spells WHERE `npc_entry` = ?d', $this->typeId)) if ($spellClick = DB::World()->selectAssoc('SELECT `spell_id` AS ARRAY_KEY, `cast_flags` AS "0", `user_type` AS "1" FROM npc_spellclick_spells WHERE `npc_entry` = %i', $this->typeId))
{ {
$genSpells = array_merge($genSpells, array_keys($spellClick)); $genSpells = array_merge($genSpells, array_keys($spellClick));
$conditions[] = ['id', array_keys($spellClick)]; $conditions[] = ['id', array_keys($spellClick)];
@ -401,13 +401,13 @@ class NpcBaseResponse extends TemplateResponse implements ICache
break; break;
} }
$conditions[] = [ $conditions[] = [
'AND', DB::AND,
['s.typeCat', -3], ['s.typeCat', -3],
[ [
'OR', DB::OR,
['skillLine1', $skill], ['skillLine1', $skill],
['AND', ['skillLine1', 0, '>'], ['skillLine2OrMask', $skill]], [DB::AND, ['skillLine1', 0, '>'], ['skillLine2OrMask', $skill]],
['AND', ['skillLine1', -1], ['skillLine2OrMask', $mask, '&']] [DB::AND, ['skillLine1', -1], ['skillLine2OrMask', $mask, '&']]
] ]
]; ];
} }
@ -458,10 +458,10 @@ class NpcBaseResponse extends TemplateResponse implements ICache
// tab: summoned by [spell] // tab: summoned by [spell]
$conditions = array( $conditions = array(
'OR', DB::OR,
['AND', ['effect1Id', [SPELL_EFFECT_SUMMON, SPELL_EFFECT_SUMMON_PET, SPELL_EFFECT_SUMMON_DEMON]], ['effect1MiscValue', $this->typeId]], [DB::AND, ['effect1Id', [SPELL_EFFECT_SUMMON, SPELL_EFFECT_SUMMON_PET, SPELL_EFFECT_SUMMON_DEMON]], ['effect1MiscValue', $this->typeId]],
['AND', ['effect2Id', [SPELL_EFFECT_SUMMON, SPELL_EFFECT_SUMMON_PET, SPELL_EFFECT_SUMMON_DEMON]], ['effect2MiscValue', $this->typeId]], [DB::AND, ['effect2Id', [SPELL_EFFECT_SUMMON, SPELL_EFFECT_SUMMON_PET, SPELL_EFFECT_SUMMON_DEMON]], ['effect2MiscValue', $this->typeId]],
['AND', ['effect3Id', [SPELL_EFFECT_SUMMON, SPELL_EFFECT_SUMMON_PET, SPELL_EFFECT_SUMMON_DEMON]], ['effect3MiscValue', $this->typeId]] [DB::AND, ['effect3Id', [SPELL_EFFECT_SUMMON, SPELL_EFFECT_SUMMON_PET, SPELL_EFFECT_SUMMON_DEMON]], ['effect3MiscValue', $this->typeId]]
); );
$sbSpell = new SpellList($conditions); $sbSpell = new SpellList($conditions);
@ -518,9 +518,9 @@ class NpcBaseResponse extends TemplateResponse implements ICache
'SELECT ts.`SpellId` AS ARRAY_KEY, ts.`MoneyCost` AS "cost", ts.`ReqSkillLine` AS "reqSkillId", ts.`ReqSkillRank` AS "reqSkillValue", ts.`ReqLevel` AS "reqLevel", ts.`ReqAbility1` AS "reqSpellId1", ts.`reqAbility2` AS "reqSpellId2" 'SELECT ts.`SpellId` AS ARRAY_KEY, ts.`MoneyCost` AS "cost", ts.`ReqSkillLine` AS "reqSkillId", ts.`ReqSkillRank` AS "reqSkillValue", ts.`ReqLevel` AS "reqLevel", ts.`ReqAbility1` AS "reqSpellId1", ts.`reqAbility2` AS "reqSpellId2"
FROM trainer_spell ts FROM trainer_spell ts
JOIN creature_default_trainer cdt ON cdt.`TrainerId` = ts.`TrainerId` JOIN creature_default_trainer cdt ON cdt.`TrainerId` = ts.`TrainerId`
WHERE cdt.`Creatureid` = ?d'; WHERE cdt.`Creatureid` = %i';
if ($tSpells = DB::World()->select($teachQuery, $this->typeId)) if ($tSpells = DB::World()->selectAssoc($teachQuery, $this->typeId))
{ {
$teaches = new SpellList(array(['id', array_keys($tSpells)])); $teaches = new SpellList(array(['id', array_keys($tSpells)]));
if (!$teaches->error) if (!$teaches->error)
@ -573,9 +573,9 @@ class NpcBaseResponse extends TemplateResponse implements ICache
// tab: sells // tab: sells
if ($sells = DB::World()->selectCol( if ($sells = DB::World()->selectCol(
'SELECT nv.`item` FROM npc_vendor nv WHERE nv.`entry` = ?d UNION 'SELECT nv.`item` FROM npc_vendor nv WHERE nv.`entry` = %i UNION
SELECT nv1.`item` FROM npc_vendor nv1 JOIN npc_vendor nv2 ON -nv1.`entry` = nv2.`item` WHERE nv2.`entry` = ?d UNION SELECT nv1.`item` FROM npc_vendor nv1 JOIN npc_vendor nv2 ON -nv1.`entry` = nv2.`item` WHERE nv2.`entry` = %i UNION
SELECT genv.`item` FROM game_event_npc_vendor genv JOIN creature c ON genv.`guid` = c.`guid` WHERE c.`id` = ?d', SELECT genv.`item` FROM game_event_npc_vendor genv JOIN creature c ON genv.`guid` = c.`guid` WHERE c.`id` = %i',
$this->typeId, $this->typeId, $this->typeId) $this->typeId, $this->typeId, $this->typeId)
) )
{ {
@ -650,7 +650,7 @@ class NpcBaseResponse extends TemplateResponse implements ICache
return 4; // generic case return 4; // generic case
}; };
foreach (DB::Aowow()->select('SELECT l.`difficulty` AS ARRAY_KEY, o.`id`, o.`lootId`, o.`name_loc0`, o.`name_loc2`, o.`name_loc3`, o.`name_loc4`, o.`name_loc6`, o.`name_loc8` FROM ?_loot_link l JOIN ?_objects o ON o.`id` = l.`objectId` WHERE l.`npcId` = ?d ORDER BY `difficulty` ASC', $this->typeId) as $difficulty => $lgo) foreach (DB::Aowow()->selectAssoc('SELECT l.`difficulty` AS ARRAY_KEY, o.`id`, o.`lootId`, o.`name_loc0`, o.`name_loc2`, o.`name_loc3`, o.`name_loc4`, o.`name_loc6`, o.`name_loc8` FROM ::loot_link l JOIN ::objects o ON o.`id` = l.`objectId` WHERE l.`npcId` = %i ORDER BY `difficulty` ASC', $this->typeId) as $difficulty => $lgo)
{ {
$sourceFor[1][1][$getBit($mapType, $difficulty)] = $lgo['lootId']; $sourceFor[1][1][$getBit($mapType, $difficulty)] = $lgo['lootId'];
$sourceFor[1][5] = $sourceFor[1][5] ?: '$$WH.sprintf(LANG.lvnote_npcobjectsource, '.$lgo['id'].', "'.Util::localizedString($lgo, 'name').'")'; $sourceFor[1][5] = $sourceFor[1][5] ?: '$$WH.sprintf(LANG.lvnote_npcobjectsource, '.$lgo['id'].', "'.Util::localizedString($lgo, 'name').'")';
@ -673,7 +673,7 @@ class NpcBaseResponse extends TemplateResponse implements ICache
foreach ($this->altNPCs->iterate() as $id => $__) foreach ($this->altNPCs->iterate() as $id => $__)
{ {
foreach (DB::Aowow()->select('SELECT l.`difficulty` AS ARRAY_KEY, o.`id`, o.`lootId`, o.`name_loc0`, o.`name_loc2`, o.`name_loc3`, o.`name_loc4`, o.`name_loc6`, o.`name_loc8` FROM ?_loot_link l JOIN ?_objects o ON o.`id` = l.`objectId` WHERE l.`npcId` = ?d ORDER BY `difficulty` ASC', $id) as $difficulty => $lgo) foreach (DB::Aowow()->selectAssoc('SELECT l.`difficulty` AS ARRAY_KEY, o.`id`, o.`lootId`, o.`name_loc0`, o.`name_loc2`, o.`name_loc3`, o.`name_loc4`, o.`name_loc6`, o.`name_loc8` FROM ::loot_link l JOIN ::objects o ON o.`id` = l.`objectId` WHERE l.`npcId` = %i ORDER BY `difficulty` ASC', $id) as $difficulty => $lgo)
{ {
$sourceFor[1][1][$getBit($mapType, $difficulty)] = $lgo['lootId']; $sourceFor[1][1][$getBit($mapType, $difficulty)] = $lgo['lootId'];
$sourceFor[1][5] = $sourceFor[1][5] ?: '$$WH.sprintf(LANG.lvnote_npcobjectsource, '.$lgo['id'].', "'.Util::localizedString($lgo, 'name').'")'; $sourceFor[1][5] = $sourceFor[1][5] ?: '$$WH.sprintf(LANG.lvnote_npcobjectsource, '.$lgo['id'].', "'.Util::localizedString($lgo, 'name').'")';
@ -757,11 +757,11 @@ class NpcBaseResponse extends TemplateResponse implements ICache
// tab: objective of quest // tab: objective of quest
$conditions = array( $conditions = array(
'OR', DB::OR,
['AND', ['reqNpcOrGo1', [$this->typeId]], ['reqNpcOrGoCount1', 0, '>']], [DB::AND, ['reqNpcOrGo1', [$this->typeId]], ['reqNpcOrGoCount1', 0, '>']],
['AND', ['reqNpcOrGo2', [$this->typeId]], ['reqNpcOrGoCount2', 0, '>']], [DB::AND, ['reqNpcOrGo2', [$this->typeId]], ['reqNpcOrGoCount2', 0, '>']],
['AND', ['reqNpcOrGo3', [$this->typeId]], ['reqNpcOrGoCount3', 0, '>']], [DB::AND, ['reqNpcOrGo3', [$this->typeId]], ['reqNpcOrGoCount3', 0, '>']],
['AND', ['reqNpcOrGo4', [$this->typeId]], ['reqNpcOrGoCount4', 0, '>']] [DB::AND, ['reqNpcOrGo4', [$this->typeId]], ['reqNpcOrGoCount4', 0, '>']]
); );
foreach ([1, 2] as $i) foreach ([1, 2] as $i)
if (($_ = $this->subject->getField('KillCredit'.$i)) > 0) if (($_ = $this->subject->getField('KillCredit'.$i)) > 0)
@ -782,13 +782,13 @@ class NpcBaseResponse extends TemplateResponse implements ICache
// tab: criteria of [ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE have no data set to check for] // tab: criteria of [ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE have no data set to check for]
$conditions = array( $conditions = array(
'AND', DB::AND,
['ac.type', [ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE]], ['ac.type', [ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE]],
['ac.value1', $this->typeId] ['ac.value1', $this->typeId]
); );
if ($extraCrt = DB::World()->selectCol('SELECT `criteria_id` FROM achievement_criteria_data WHERE `type` = ?d AND `value1` = ?d', ACHIEVEMENT_CRITERIA_DATA_TYPE_T_CREATURE, $this->typeId)) if ($extraCrt = DB::World()->selectCol('SELECT `criteria_id` FROM achievement_criteria_data WHERE `type` = %i AND `value1` = %i', ACHIEVEMENT_CRITERIA_DATA_TYPE_T_CREATURE, $this->typeId))
$conditions = ['OR', $conditions, ['ac.id', $extraCrt]]; $conditions = [DB::OR, $conditions, ['ac.id', $extraCrt]];
$crtOf = new AchievementList($conditions); $crtOf = new AchievementList($conditions);
if (!$crtOf->error) if (!$crtOf->error)
@ -803,7 +803,7 @@ class NpcBaseResponse extends TemplateResponse implements ICache
} }
// tab: passengers // tab: passengers
if ($_ = DB::World()->selectCol('SELECT `accessory_entry` AS ARRAY_KEY, GROUP_CONCAT(`seat_id` SEPARATOR ", ") FROM vehicle_template_accessory WHERE `entry` = ?d GROUP BY `accessory_entry`', $this->typeId)) if ($_ = DB::World()->selectCol('SELECT `accessory_entry` AS ARRAY_KEY, GROUP_CONCAT(`seat_id` SEPARATOR ", ") FROM vehicle_template_accessory WHERE `entry` = %i GROUP BY `accessory_entry`', $this->typeId))
{ {
$passengers = new CreatureList(array(['id', array_keys($_)])); $passengers = new CreatureList(array(['id', array_keys($_)]));
if (!$passengers->error) if (!$passengers->error)
@ -839,7 +839,7 @@ class NpcBaseResponse extends TemplateResponse implements ICache
$this->soundIds = array_merge($this->soundIds, SmartAI::getSoundsPlayedForOwner($this->typeId, SmartAI::SRC_TYPE_CREATURE)); $this->soundIds = array_merge($this->soundIds, SmartAI::getSoundsPlayedForOwner($this->typeId, SmartAI::SRC_TYPE_CREATURE));
// up to 4 possible displayIds .. for the love of things betwixt, just use the first! // up to 4 possible displayIds .. for the love of things betwixt, just use the first!
$activitySounds = DB::Aowow()->selectRow('SELECT * FROM ?_creature_sounds WHERE `id` = ?d', $this->subject->getField('displayId1')); $activitySounds = DB::Aowow()->selectRow('SELECT * FROM ::creature_sounds WHERE `id` = %i', $this->subject->getField('displayId1'));
array_shift($activitySounds); // remove id-column array_shift($activitySounds); // remove id-column
$this->soundIds = array_merge($this->soundIds, array_values($activitySounds)); $this->soundIds = array_merge($this->soundIds, array_values($activitySounds));
@ -878,11 +878,11 @@ class NpcBaseResponse extends TemplateResponse implements ICache
private function getRepForId(array $entries, array &$spillover) : array private function getRepForId(array $entries, array &$spillover) : array
{ {
$rows = DB::World()->select( $rows = DB::World()->selectAssoc(
'SELECT `creature_id` AS "npc", `RewOnKillRepFaction1` AS "faction", `RewOnKillRepValue1` AS "qty", `MaxStanding1` AS "maxRank", `isTeamAward1` AS "spillover" 'SELECT `creature_id` AS "npc", `RewOnKillRepFaction1` AS "faction", `RewOnKillRepValue1` AS "qty", `MaxStanding1` AS "maxRank", `isTeamAward1` AS "spillover"
FROM creature_onkill_reputation WHERE `creature_id` IN (?a) AND `RewOnKillRepFaction1` > 0 UNION FROM creature_onkill_reputation WHERE `creature_id` IN %in AND `RewOnKillRepFaction1` > 0 UNION
SELECT `creature_id` AS "npc", `RewOnKillRepFaction2` AS "faction", `RewOnKillRepValue2` AS "qty", `MaxStanding2` AS "maxRank", `isTeamAward2` AS "spillover" SELECT `creature_id` AS "npc", `RewOnKillRepFaction2` AS "faction", `RewOnKillRepValue2` AS "qty", `MaxStanding2` AS "maxRank", `isTeamAward2` AS "spillover"
FROM creature_onkill_reputation WHERE `creature_id` IN (?a) AND `RewOnKillRepFaction2` > 0', FROM creature_onkill_reputation WHERE `creature_id` IN %in AND `RewOnKillRepFaction2` > 0',
$entries, $entries $entries, $entries
); );
@ -903,7 +903,7 @@ class NpcBaseResponse extends TemplateResponse implements ICache
0 // spilloverCat 0 // spilloverCat
); );
$cuRate = DB::World()->selectCell('SELECT `creature_rate` FROM reputation_reward_rate WHERE `creature_rate` <> 1 AND `faction` = ?d', $row['faction']); $cuRate = DB::World()->selectCell('SELECT `creature_rate` FROM reputation_reward_rate WHERE `creature_rate` <> 1 AND `faction` = %i', $row['faction']);
if ($cuRate && User::isInGroup(U_GROUP_EMPLOYEE)) if ($cuRate && User::isInGroup(U_GROUP_EMPLOYEE))
$set[1][1] = $set[1][0] . sprintf(Util::$dfnString, Lang::faction('customRewRate'), ($set[1][0] > 0 ? '+' : '').($set[1][0] * ($cuRate - 1))); $set[1][1] = $set[1][0] . sprintf(Util::$dfnString, Lang::faction('customRewRate'), ($set[1][0] > 0 ? '+' : '').($set[1][0] * ($cuRate - 1)));
else if ($cuRate) else if ($cuRate)

View file

@ -68,22 +68,22 @@ class ObjectBaseResponse extends TemplateResponse implements ICache
/* Determine Map Type */ /* Determine Map Type */
/**********************/ /**********************/
if ($objectdifficulty = DB::Aowow()->select( // has difficulty versions of itself if ($objectdifficulty = DB::Aowow()->selectAssoc( // has difficulty versions of itself
'SELECT `normal10` AS "0", `normal25` AS "1", 'SELECT `normal10` AS "0", `normal25` AS "1",
`heroic10` AS "2", `heroic25` AS "3", `heroic10` AS "2", `heroic25` AS "3",
`mapType` AS ARRAY_KEY `mapType` AS ARRAY_KEY
FROM ?_objectdifficulty FROM ::objectdifficulty
WHERE `normal10` = ?d OR `normal25` = ?d OR WHERE `normal10` = %i OR `normal25` = %i OR
`heroic10` = ?d OR `heroic25` = ?d', `heroic10` = %i OR `heroic25` = %i',
$this->typeId, $this->typeId, $this->typeId, $this->typeId $this->typeId, $this->typeId, $this->typeId, $this->typeId
)) ))
{ {
$this->mapType = key($objectdifficulty); $this->mapType = key($objectdifficulty);
$this->difficulties = array_pop($objectdifficulty); $this->difficulties = array_pop($objectdifficulty);
} }
else if ($maps = DB::Aowow()->selectCell('SELECT IF(COUNT(DISTINCT `areaId`) > 1, 0, `areaId`) FROM ?_spawns WHERE `type` = ?d AND `typeId` = ?d', Type::OBJECT, $this->typeId)) else if ($maps = DB::Aowow()->selectCell('SELECT IF(COUNT(DISTINCT `areaId`) > 1, 0, `areaId`) FROM ::spawns WHERE `type` = %i AND `typeId` = %i', Type::OBJECT, $this->typeId))
{ {
$this->mapType = match ((int)DB::Aowow()->selectCell('SELECT `type` FROM ?_zones WHERE `id` = ?d', $maps)) $this->mapType = match ((int)DB::Aowow()->selectCell('SELECT `type` FROM ::zones WHERE `id` = %i', $maps))
{ {
// MAP_TYPE_DUNGEON, // MAP_TYPE_DUNGEON,
MAP_TYPE_DUNGEON_HC => 1, MAP_TYPE_DUNGEON_HC => 1,
@ -102,7 +102,7 @@ class ObjectBaseResponse extends TemplateResponse implements ICache
$infobox = Lang::getInfoBoxForFlags($this->subject->getField('cuFlags')); $infobox = Lang::getInfoBoxForFlags($this->subject->getField('cuFlags'));
// Event (ignore events, where the object only gets removed) // Event (ignore events, where the object only gets removed)
if ($_ = DB::World()->selectCol('SELECT DISTINCT ge.`eventEntry` FROM game_event ge, game_event_gameobject geg, gameobject g WHERE ge.`eventEntry` = geg.`eventEntry` AND g.`guid` = geg.`guid` AND g.`id` = ?d', $this->typeId)) if ($_ = DB::World()->selectCol('SELECT DISTINCT ge.`eventEntry` FROM game_event ge, game_event_gameobject geg, gameobject g WHERE ge.`eventEntry` = geg.`eventEntry` AND g.`guid` = geg.`guid` AND g.`id` = %i', $this->typeId))
{ {
$this->extendGlobalIds(Type::WORLDEVENT, ...$_); $this->extendGlobalIds(Type::WORLDEVENT, ...$_);
$ev = []; $ev = [];
@ -113,7 +113,7 @@ class ObjectBaseResponse extends TemplateResponse implements ICache
} }
// Faction // Faction
if ($_ = DB::Aowow()->selectCell('SELECT `factionId` FROM ?_factiontemplate WHERE `id` = ?d', $this->subject->getField('faction'))) if ($_ = DB::Aowow()->selectCell('SELECT `factionId` FROM ::factiontemplate WHERE `id` = %i', $this->subject->getField('faction')))
{ {
$this->extendGlobalIds(Type::FACTION, $_); $this->extendGlobalIds(Type::FACTION, $_);
$infobox[] = Util::ucFirst(Lang::game('faction')).Lang::main('colon').'[faction='.$_.']'; $infobox[] = Util::ucFirst(Lang::game('faction')).Lang::main('colon').'[faction='.$_.']';
@ -176,7 +176,7 @@ class ObjectBaseResponse extends TemplateResponse implements ICache
// SpellFocus // SpellFocus
if ($_ = $this->subject->getField('spellFocusId')) if ($_ = $this->subject->getField('spellFocusId'))
{ {
if ($sfo = DB::Aowow()->selectRow('SELECT * FROM ?_spellfocusobject WHERE `id` = ?d', $_)) if ($sfo = DB::Aowow()->selectRow('SELECT * FROM ::spellfocusobject WHERE `id` = %i', $_))
{ {
$n = Util::localizedString($sfo, 'name'); $n = Util::localizedString($sfo, 'name');
if (!is_null(GameObjectListFilter::getCriteriaIndex(50, $_))) if (!is_null(GameObjectListFilter::getCriteriaIndex(50, $_)))
@ -242,7 +242,7 @@ class ObjectBaseResponse extends TemplateResponse implements ICache
if (User::isInGroup(U_GROUP_EMPLOYEE)) if (User::isInGroup(U_GROUP_EMPLOYEE))
{ {
$spawnData = DB::Aowow()->select('SELECT `guid` AS "0", `ScriptName` AS "1", `StringId` AS "2" FROM ?_spawns WHERE `type` = ?d AND `typeId` = ?d AND `ScriptName` IS NOT NULL ORDER BY `guid` ASC', Type::OBJECT, $this->typeId); $spawnData = DB::Aowow()->selectAssoc('SELECT `guid` AS "0", `ScriptName` AS "1", `StringId` AS "2" FROM ::spawns WHERE `type` = %i AND `typeId` = %i AND `ScriptName` IS NOT NULL ORDER BY `guid` ASC', Type::OBJECT, $this->typeId);
// AI // AI
$scripts = null; $scripts = null;
@ -311,16 +311,16 @@ class ObjectBaseResponse extends TemplateResponse implements ICache
// todo (low): consider pooled spawns // todo (low): consider pooled spawns
if ($ll = DB::Aowow()->selectRow('SELECT * FROM ?_loot_link WHERE `objectId` = ?d ORDER BY `priority` DESC LIMIT 1', $this->typeId)) if ($ll = DB::Aowow()->selectRow('SELECT * FROM ::loot_link WHERE `objectId` = %i ORDER BY `priority` DESC LIMIT 1', $this->typeId))
{ {
// group encounter // group encounter
if ($ll['encounterId']) if ($ll['encounterId'])
$this->relBoss = [$ll['npcId'], Lang::profiler('encounterNames', $ll['encounterId'])]; $this->relBoss = [$ll['npcId'], Lang::profiler('encounterNames', $ll['encounterId'])];
// difficulty dummy // difficulty dummy
else if ($c = DB::Aowow()->selectRow('SELECT `id`, `name_loc0`, `name_loc2`, `name_loc3`, `name_loc4`, `name_loc6`, `name_loc8` FROM ?_creature WHERE `difficultyEntry1` = ?d OR `difficultyEntry2` = ?d OR `difficultyEntry3` = ?d', $ll['npcId'], $ll['npcId'], $ll['npcId'])) else if ($c = DB::Aowow()->selectRow('SELECT `id`, `name_loc0`, `name_loc2`, `name_loc3`, `name_loc4`, `name_loc6`, `name_loc8` FROM ::creature WHERE `difficultyEntry1` = %i OR `difficultyEntry2` = %i OR `difficultyEntry3` = %i', $ll['npcId'], $ll['npcId'], $ll['npcId']))
$this->relBoss = [$c['id'], Util::localizedString($c, 'name')]; $this->relBoss = [$c['id'], Util::localizedString($c, 'name')];
// base creature // base creature
else if ($c = DB::Aowow()->selectRow('SELECT `id`, `name_loc0`, `name_loc2`, `name_loc3`, `name_loc4`, `name_loc6`, `name_loc8` FROM ?_creature WHERE `id` = ?d', $ll['npcId'])) else if ($c = DB::Aowow()->selectRow('SELECT `id`, `name_loc0`, `name_loc2`, `name_loc3`, `name_loc4`, `name_loc6`, `name_loc8` FROM ::creature WHERE `id` = %i', $ll['npcId']))
$this->relBoss = [$c['id'], Util::localizedString($c, 'name')]; $this->relBoss = [$c['id'], Util::localizedString($c, 'name')];
} }
@ -332,7 +332,7 @@ class ObjectBaseResponse extends TemplateResponse implements ICache
if (!$sai->prepare()) // no smartAI found .. check per guid if (!$sai->prepare()) // no smartAI found .. check per guid
{ {
// at least one of many // at least one of many
$guids = DB::World()->selectCol('SELECT `guid` FROM gameobject WHERE `id` = ?d', $this->typeId); $guids = DB::World()->selectCol('SELECT `guid` FROM gameobject WHERE `id` = %i', $this->typeId);
while ($_ = array_pop($guids)) while ($_ = array_pop($guids))
{ {
$sai = new SmartAI(SmartAI::SRC_TYPE_OBJECT, -$_, ['title' => ' [small](for GUID: '.$_.')[/small]']); $sai = new SmartAI(SmartAI::SRC_TYPE_OBJECT, -$_, ['title' => ' [small](for GUID: '.$_.')[/small]']);
@ -373,10 +373,10 @@ class ObjectBaseResponse extends TemplateResponse implements ICache
SPELL_EFFECT_SUMMON_OBJECT_SLOT4 SPELL_EFFECT_SUMMON_OBJECT_SLOT4
); );
$conditions = array( $conditions = array(
'OR', DB::OR,
['AND', ['effect1Id', $summonEffects], ['effect1MiscValue', $this->typeId]], [DB::AND, ['effect1Id', $summonEffects], ['effect1MiscValue', $this->typeId]],
['AND', ['effect2Id', $summonEffects], ['effect2MiscValue', $this->typeId]], [DB::AND, ['effect2Id', $summonEffects], ['effect2MiscValue', $this->typeId]],
['AND', ['effect3Id', $summonEffects], ['effect3MiscValue', $this->typeId]] [DB::AND, ['effect3Id', $summonEffects], ['effect3MiscValue', $this->typeId]]
); );
$summons = new SpellList($conditions); $summons = new SpellList($conditions);
@ -478,15 +478,15 @@ class ObjectBaseResponse extends TemplateResponse implements ICache
if ($_ = $this->subject->getField('lootId')) if ($_ = $this->subject->getField('lootId'))
{ {
// check if loot_link entry exists (only difficulty: 1) // check if loot_link entry exists (only difficulty: 1)
if ($npcId = DB::Aowow()->selectCell('SELECT `npcId` FROM ?_loot_link WHERE `objectId` = ?d AND `difficulty` = 1', $this->typeId)) if ($npcId = DB::Aowow()->selectCell('SELECT `npcId` FROM ::loot_link WHERE `objectId` = %i AND `difficulty` = 1', $this->typeId))
{ {
// get id set of npc // get id set of npc
$lootEntries = DB::Aowow()->selectCol( $lootEntries = DB::Aowow()->selectCol(
'SELECT ll.`difficulty` AS ARRAY_KEY, o.`lootId` 'SELECT ll.`difficulty` AS ARRAY_KEY, o.`lootId`
FROM ?_creature c FROM ::creature c
LEFT JOIN ?_loot_link ll ON ll.`npcId` IN (c.`id`, c.`difficultyEntry1`, c.`difficultyEntry2`, c.`difficultyEntry3`) LEFT JOIN ::loot_link ll ON ll.`npcId` IN (c.`id`, c.`difficultyEntry1`, c.`difficultyEntry2`, c.`difficultyEntry3`)
LEFT JOIN ?_objects o ON o.`id` = ll.`objectId` LEFT JOIN ::objects o ON o.`id` = ll.`objectId`
WHERE c.`id` = ?d WHERE c.`id` = %i
ORDER BY ll.`difficulty` ASC', ORDER BY ll.`difficulty` ASC',
$npcId $npcId
); );
@ -579,7 +579,7 @@ class ObjectBaseResponse extends TemplateResponse implements ICache
if ($this->difficulties) if ($this->difficulties)
{ {
$conditions = array( $conditions = array(
'AND', DB::AND,
['id', $this->difficulties], ['id', $this->difficulties],
['id', $this->typeId, '!'] ['id', $this->typeId, '!']
); );

View file

@ -116,7 +116,7 @@ class PetBaseResponse extends TemplateResponse implements ICache
['ct.typeFlags', NPC_TYPEFLAG_TAMEABLE, '&'], ['ct.typeFlags', NPC_TYPEFLAG_TAMEABLE, '&'],
['ct.family', $this->typeId], // displayed petType ['ct.family', $this->typeId], // displayed petType
[ [
'OR', // at least neutral to at least one faction DB::OR, // at least neutral to at least one faction
['ft.A', 1, '<'], ['ft.A', 1, '<'],
['ft.H', 1, '<'] ['ft.H', 1, '<']
] ]
@ -166,13 +166,13 @@ class PetBaseResponse extends TemplateResponse implements ICache
$conditions = [ $conditions = [
['s.typeCat', -3], // Pet-Ability ['s.typeCat', -3], // Pet-Ability
[ [
'OR', DB::OR,
// match: first skillLine // match: first skillLine
['skillLine1', $this->subject->getField('skillLineId')], ['skillLine1', $this->subject->getField('skillLineId')],
// match: second skillLine (if not mask) // match: second skillLine (if not mask)
['AND', ['skillLine1', 0, '>'], ['skillLine2OrMask', $this->subject->getField('skillLineId')]], [DB::AND, ['skillLine1', 0, '>'], ['skillLine2OrMask', $this->subject->getField('skillLineId')]],
// match: skillLineMask (if mask) // match: skillLineMask (if mask)
['AND', ['skillLine1', -1], ['skillLine2OrMask', $mask, '&']] [DB::AND, ['skillLine1', -1], ['skillLine2OrMask', $mask, '&']]
] ]
]; ];
@ -190,7 +190,7 @@ class PetBaseResponse extends TemplateResponse implements ICache
$conditions = array( $conditions = array(
['s.typeCat', -7], ['s.typeCat', -7],
[ // last rank or unranked [ // last rank or unranked
'OR', DB::OR,
['s.cuFlags', SPELL_CU_LAST_RANK, '&'], ['s.cuFlags', SPELL_CU_LAST_RANK, '&'],
['s.rankNo', 0] ['s.rankNo', 0]
] ]

View file

@ -47,7 +47,7 @@ class ProfileAvatarResponse extends TextResponse
$profileId = substr($this->_get['id'], 0, -4); $profileId = substr($this->_get['id'], 0, -4);
$charData = DB::Aowow()->selectRow('SELECT `race`, `gender` FROM ?_profiler_profiles WHERE id = ?d', $profileId); $charData = DB::Aowow()->selectRow('SELECT `race`, `gender` FROM ::profiler_profiles WHERE id = %i', $profileId);
if (!$charData) if (!$charData)
$this->generate404(); $this->generate404();

Some files were not shown because too many files have changed in this diff Show more