From 073124ceceedce1e368c20b7764b2a0ecdd6319e Mon Sep 17 00:00:00 2001 From: Vincent Stumpf Date: Sun, 22 Oct 2023 06:50:03 +0000 Subject: [PATCH 1/2] Add itemlink module --- lib/Flux/Template.php | 31 ++++++ modules/itemlink/index.php | 142 ++++++++++++++++++++++++ themes/default/itemlink/emptysocket.png | Bin 0 -> 644 bytes themes/default/itemlink/index.php | 78 +++++++++++++ themes/default/itemlink/nosocket.png | Bin 0 -> 650 bytes 5 files changed, 251 insertions(+) create mode 100644 modules/itemlink/index.php create mode 100644 themes/default/itemlink/emptysocket.png create mode 100644 themes/default/itemlink/index.php create mode 100644 themes/default/itemlink/nosocket.png diff --git a/lib/Flux/Template.php b/lib/Flux/Template.php index aa1837de..f459fa9b 100644 --- a/lib/Flux/Template.php +++ b/lib/Flux/Template.php @@ -205,6 +205,13 @@ class Flux_Template { */ public $referer; + /** + * Base62 Dictionary + * @access public + * @var array + */ + public $base62_dict = array(); + /** * Construct new template onbject. * @@ -245,6 +252,10 @@ public function __construct(Flux_Config $config) } } + $base62 = str_split('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'); + for ($i = 0; ($i < count($base62)); $i++) { + $this->base62_dict[$base62[$i]] = $i; + } } /** @@ -1521,5 +1532,25 @@ public function cap_value($amount, $min, $max) { return ($amount >= $max) ? $max : (($amount <= $min) ? $min : $amount); } + + /** + * Parse a Base62 String to an Integer + * Returns a pair of (int, int) where the first int is the parsed value + * and the second int is the index of the first character after the parsed + * value. + * @access public + */ + public function parseBase62Until($str, $idx, $until = 0) + { + $ret = 0; + $until = $until == 0 ? strlen($str) : $until + $idx; + while (($idx < $until) && array_key_exists($str[$idx], $this->base62_dict)) { + $ret *= 62; + $ret += $this->base62_dict[$str[$idx]]; + $idx++; + } + return array($ret, $idx); + } + } ?> diff --git a/modules/itemlink/index.php b/modules/itemlink/index.php new file mode 100644 index 00000000..8b64f906 --- /dev/null +++ b/modules/itemlink/index.php @@ -0,0 +1,142 @@ += 20200724) { + $cardsep = ')'; + $optsep = '+'; + $optparamsep = ','; + $optvalsep = '-'; +} else if ($packetver >= 20161116) { + $cardsep = '('; + $optsep = '*'; + $optparamsep = '+'; + $optvalsep = ','; +} + + +$itemlink = $params->get('itemlink'); + +$itemlink_len = strlen($itemlink); + +// get substring 5 characters +$ret = $this->parseBase62Until($itemlink, 0, 5); +$equip = $ret[0]; +$idx = $ret[1]; + +$isequip = substr($itemlink, 5, 1); + +$idx = 6; + +// nameid +$ret = $this->parseBase62Until($itemlink, $idx); +$nameid = $ret[0]; +$idx = $ret[1]; + +if ($server->isRenewal) { + $fromTables = array("{$server->charMapDatabase}.item_db_re", "{$server->charMapDatabase}.item_db2_re"); +} else { + $fromTables = array("{$server->charMapDatabase}.item_db", "{$server->charMapDatabase}.item_db2"); +} +$tableName = "{$server->charMapDatabase}.items"; +$tempTable = new Flux_TemporaryTable($server->connection, $tableName, $fromTables); +$itemDescTable = Flux::config('FluxTables.ItemDescTable'); + +$sql = "SELECT items.id AS item_id, name_english AS name, slots "; + +if (Flux::config('ShowItemDesc')) { + $sql .= ', itemdesc '; +} + +$sql .= "FROM {$server->charMapDatabase}.items "; +if (Flux::config('ShowItemDesc')) { + $sql .= "LEFT OUTER JOIN {$server->charMapDatabase}.$itemDescTable ON $itemDescTable.itemid = items.id "; +} +$sql .= "WHERE items.id = ? LIMIT 1"; + +$sth = $server->connection->getStatement($sql); +$sth->execute(array($nameid)); + +$item = $sth->fetch(); + +if (!$item) { + return; +} + +$title = "Viewing Item Link for ($item->name)"; + + +// refines +if ($itemlink[$idx] == '%') { + $idx++; + $ret = $this->parseBase62Until($itemlink, $idx); + $refine = $ret[0]; + $idx = $ret[1]; +} else { + $refine = 0; +} + +// view +if ($itemlink[$idx] == '&') { + $idx++; + $ret = $this->parseBase62Until($itemlink, $idx); + $view = $ret[0]; + $idx = $ret[1]; +} else { + $view = 0; +} + +// enchantgrade +if ($itemlink[$idx] == '\'') { + $idx++; + $ret = $this->parseBase62Until($itemlink, $idx); + $enchantgrade = $ret[0]; + $idx = $ret[1]; +} else { + $enchantgrade = 0; +} + +// cards +$cards = []; +while ($idx < $itemlink_len && $itemlink[$idx] == $cardsep) { + $idx++; + $ret = $this->parseBase62Until($itemlink, $idx); + + $sth = $server->connection->getStatement($sql); + $sth->execute(array($ret[0])); + $card = $sth->fetch(); + $cards[] = $card; + + $idx = $ret[1]; +} + +// options +$options = []; +while ($idx < $itemlink_len && $itemlink[$idx] == $optsep) { + $option = []; + $idx++; + $ret = $this->parseBase62Until($itemlink, $idx); + $option['opt'] = $ret[0]; + $idx = $ret[1]; + if ($itemlink[$idx] != $optparamsep) { + break; + } + $idx++; + $ret = $this->parseBase62Until($itemlink, $idx); + $option['param'] = $ret[0]; + $idx = $ret[1]; + if ($itemlink[$idx] != $optvalsep) { + break; + } + $idx++; + $ret = $this->parseBase62Until($itemlink, $idx); + $option['val'] = $ret[0]; + $idx = $ret[1]; + array_push($options, $option); +} +?> diff --git a/themes/default/itemlink/emptysocket.png b/themes/default/itemlink/emptysocket.png new file mode 100644 index 0000000000000000000000000000000000000000..e86dfe515955ebff1e14d4a8d7c1cfda0559ddc6 GIT binary patch literal 644 zcmV-~0(EX>4Tx04R}tkv&MmP!xqvQ%j{(94sQ@kfA!+MMWG-6^me@v=v%)FnQ@8G-*gu zTpR`0f`dPcRR65=OT+~*wT&EgC5=%%S4G}ULsG3{AqH@)#N?kat9cB(j`N3BtMleSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{003M`L_t(Y$L*9$3IHGo1-<`$TDt98uT>BdeSJaT9AJh* z6$yeT$@KM7rr?I`5Bd^SWo eA(XQb{7V6_5!dp!5C_}<0000 + + +iconImage($nameid); ?> +itemImage($nameid) ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + = $i && $cards[$i - 1]): ?> + + + slots >= $i): ?> + + + + + + + + 0): ?> + + + + + = $i && $options[$i - 1]): ?> + + + + + + +
Item + + + + +
Name + name . ($isequip ? " [$item->slots]" : "") ?> + linkToItem($nameid, $itemname) ?> +
Item ID
Refine +
Description itemdesc) ?>
Slots
Slot + linkToItem($cards[$i - 1]->item_id, $cards[$i - 1]->name) ?> + EmptyNone
Options
+ itemRandOption($options[$i - 1]['opt'], $options[$i - 1]['val'])) ?> +
+ + +

Item not found

+ diff --git a/themes/default/itemlink/nosocket.png b/themes/default/itemlink/nosocket.png new file mode 100644 index 0000000000000000000000000000000000000000..726c3e20d17ad086586584e50062b5db245e30db GIT binary patch literal 650 zcmV;50(Jd~P)EX>4Tx04R}tkv&MmP!xqvQ%j{(94sQ@kfA!+MMWG-6^me@v=v%)FnQ@8G-*gu zTpR`0f`dPcRR65=OT+~*wT&EgC5=%%S4G}ULsG3{AqH@)#N?kat9cB(j`N3BtMleSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{003f1L_t(Y$75g^1*3p2;Mmr^|H;+MNUGsh-p-6vvjCsV ziM5E4(qJKE5hJz29G69m)QnJU7BN!OaBP;)*9VkZf-N2xsg=Qqj%0Ey!k1JTDJ?Qc k&Dlg-M6DDz3Wfmy0KRE8vCI)r=l}o!07*qoM6N<$g40D1RsaA1 literal 0 HcmV?d00001 From 9db41677eb5da07d312d0011d679a01e9f38d8d1 Mon Sep 17 00:00:00 2001 From: vstumpf Date: Wed, 3 Jul 2024 21:59:27 +0000 Subject: [PATCH 2/2] Use base64 if base64 is in the query parameters --- lib/Flux/Template.php | 9 +++++++++ modules/itemlink/index.php | 4 ++++ themes/default/itemlink/index.php | 2 ++ 3 files changed, 15 insertions(+) diff --git a/lib/Flux/Template.php b/lib/Flux/Template.php index f459fa9b..b5393ff1 100644 --- a/lib/Flux/Template.php +++ b/lib/Flux/Template.php @@ -1552,5 +1552,14 @@ public function parseBase62Until($str, $idx, $until = 0) return array($ret, $idx); } + /** + * Parse a Base64 string with url encoding + * Base64URL is the normal base64 with +/= replaced with -_. + * @access public + */ + public function base64Url_decode($str) { + return base64_decode(strtr($str, '-_.', '+/=')); + } } + ?> diff --git a/modules/itemlink/index.php b/modules/itemlink/index.php index 8b64f906..6c4e6e04 100644 --- a/modules/itemlink/index.php +++ b/modules/itemlink/index.php @@ -22,6 +22,10 @@ $itemlink = $params->get('itemlink'); +if ($params->get('base64')) { + $itemlink = $this->base64Url_decode($itemlink); +} + $itemlink_len = strlen($itemlink); // get substring 5 characters diff --git a/themes/default/itemlink/index.php b/themes/default/itemlink/index.php index 7723412a..1acc50c4 100644 --- a/themes/default/itemlink/index.php +++ b/themes/default/itemlink/index.php @@ -27,10 +27,12 @@ Item ID + Refine + + Description