[Merchants] Add Merchant Data Bucket capability. (#2160)

* [Merchants] Add Merchant Data Bucket capability.
- Allows server operators to limit merchant items based on data bucket values and comparisons.
- Adds 3 columns, bucket_name, bucket_value, and bucket_comparison to merchantlist table.
- Bucket is checked based on GetBucketKey()-bucket_name.
- Buckets are mass loaded when using the merchant so it's not a database call per item, just a grouping of all their buckets from the start.
- This is a nearly year old pull request redone for master.
- bucket_comparison Values are as follows:
        - bucket_comparison 0: bucket_name == bucket_value
        - bucket_comparison 1: bucket_name != bucket_value
        - bucket_comparison 2: bucket_name >= bucket_value
        - bucket_comparison 3: bucket_name <= bucket_value
        - bucket_comparison 4: bucket_name > bucket_value
        - bucket_comparison 5: bucket_name < bucket_value
        - bucket_comparison 6: bucket_name is any of  pipe(|)-separated bucket_value
        - bucket_comparison 7: bucket_name is not any of  pipe(|)-separated bucket_value
        - bucket_comparison 8: bucket_name is between first and second value of pipe(|)-separated bucket_value
        - bucket_comparison 9: bucket_name is not between first and second value of pipe(|)-separated  bucket_value

* Revert query change.
This commit is contained in:
Kinglykrab
2022-05-09 21:36:51 -04:00
committed by GitHub
parent 6e0d101457
commit 763fc82379
9 changed files with 379 additions and 169 deletions
+164
View File
@@ -11048,3 +11048,167 @@ void Client::ReconnectUCS()
QueuePacket(outapp);
safe_delete(outapp);
}
bool Client::CheckMerchantDataBucket(uint8 bucket_comparison, std::string bucket_value, std::string player_value)
{
std::vector<std::string> bucket_checks;
bool found = false;
bool passes = false;
switch (bucket_comparison) {
case MerchantBucketComparison::BucketEqualTo:
{
if (player_value != bucket_value) {
break;
}
passes = true;
break;
}
case MerchantBucketComparison::BucketNotEqualTo:
{
if (player_value == bucket_value) {
break;
}
passes = true;
break;
}
case MerchantBucketComparison::BucketGreaterThanOrEqualTo:
{
if (player_value < bucket_value) {
break;
}
passes = true;
break;
}
case MerchantBucketComparison::BucketLesserThanOrEqualTo:
{
if (player_value > bucket_value) {
break;
}
passes = true;
break;
}
case MerchantBucketComparison::BucketGreaterThan:
{
if (player_value <= bucket_value) {
break;
}
passes = true;
break;
}
case MerchantBucketComparison::BucketLesserThan:
{
if (player_value >= bucket_value) {
break;
}
passes = true;
break;
}
case MerchantBucketComparison::BucketIsAny:
{
bucket_checks = split_string(bucket_value, "|");
if (bucket_checks.empty()) {
break;
}
for (const auto &bucket : bucket_checks) {
if (player_value == bucket) {
found = true;
break;
}
}
if (!found) {
break;
}
passes = true;
break;
}
case MerchantBucketComparison::BucketIsNotAny:
{
bucket_checks = split_string(bucket_value, "|");
if (bucket_checks.empty()) {
break;
}
for (const auto &bucket : bucket_checks) {
if (player_value == bucket) {
found = true;
break;
}
}
if (found) {
break;
}
passes = true;
break;
}
case MerchantBucketComparison::BucketIsBetween:
{
bucket_checks = split_string(bucket_value, "|");
if (bucket_checks.empty()) {
break;
}
if (
std::stoll(player_value) < std::stoll(bucket_checks[0]) ||
std::stoll(player_value) > std::stoll(bucket_checks[1])
) {
break;
}
passes = true;
break;
}
case MerchantBucketComparison::BucketIsNotBetween:
{
bucket_checks = split_string(bucket_value, "|");
if (bucket_checks.empty()) {
break;
}
if (
std::stoll(player_value) >= std::stoll(bucket_checks[0]) &&
std::stoll(player_value) <= std::stoll(bucket_checks[1])
) {
break;
}
passes = true;
break;
}
}
return passes;
}
std::map<std::string,std::string> Client::GetMerchantDataBuckets()
{
std::map<std::string,std::string> merchant_data_buckets;
auto query = fmt::format(
"SELECT `key`, `value` FROM data_buckets WHERE `key` LIKE '{}-%'",
EscapeString(GetBucketKey())
);
auto results = database.QueryDatabase(query);
if (!results.Success() || !results.RowCount()) {
return merchant_data_buckets;
}
for (auto row : results) {
merchant_data_buckets.insert(std::pair<std::string,std::string>(row[0], row[1]));
}
return merchant_data_buckets;
}