| 689 | } |
| 690 | |
| 691 | void TaskManager::SharedTaskSelector(Client* client, Mob* mob, const std::vector<int>& tasks, bool ignore_cooldown) |
| 692 | { |
| 693 | LogTasks("SharedTaskSelector called with size [{}]", tasks.size()); |
| 694 | |
| 695 | if (tasks.empty()) { |
| 696 | return; |
| 697 | } |
| 698 | |
| 699 | if (!ignore_cooldown && client->HasTaskRequestCooldownTimer()) { |
| 700 | client->SendTaskRequestCooldownTimerMessage(); |
| 701 | return; |
| 702 | } |
| 703 | |
| 704 | // check if requester already has a shared task (no need to query group/raid members if so) |
| 705 | if (client->GetTaskState()->HasActiveSharedTask()) { |
| 706 | client->MessageString(Chat::Red, TaskStr::REQUEST_HAVE); |
| 707 | return; |
| 708 | } |
| 709 | |
| 710 | // get group/raid member character data from db (need to query for character ids) |
| 711 | // todo: group/raids need refactored to avoid queries and ignore offline members (through world) |
| 712 | auto request = SharedTask::GetRequestCharacters(database, client->CharacterID()); |
| 713 | |
| 714 | // check if any group/raid member already has a shared task (already checked solo character) |
| 715 | bool validation_failed = false; |
| 716 | if (request.group_type != SharedTaskRequestGroupType::Solo) { |
| 717 | auto shared_task_members = SharedTaskMembersRepository::GetWhere( |
| 718 | database, |
| 719 | fmt::format("character_id IN ({}) LIMIT 1", Strings::Join(request.character_ids, ","))); |
| 720 | |
| 721 | if (!shared_task_members.empty()) { |
| 722 | validation_failed = true; |
| 723 | |
| 724 | auto it = std::find_if(request.members.begin(), request.members.end(), |
| 725 | [&](const SharedTaskMember& member) { |
| 726 | return member.character_id == shared_task_members.front().character_id; |
| 727 | }); |
| 728 | |
| 729 | if (it != request.members.end()) { |
| 730 | if (request.group_type == SharedTaskRequestGroupType::Group) { |
| 731 | client->MessageString(Chat::Red, TaskStr::REQUEST_GROUP_HAS, it->character_name.c_str()); |
| 732 | } |
| 733 | else { |
| 734 | client->MessageString(Chat::Red, TaskStr::REQUEST_RAID_HAS, it->character_name.c_str()); |
| 735 | } |
| 736 | } |
| 737 | } |
| 738 | } |
| 739 | |
| 740 | if (!validation_failed) { |
| 741 | // run type and level filters on task selections |
| 742 | std::vector<int> task_list; |
| 743 | |
| 744 | for (int i = 0; i < tasks.size() && task_list.size() < MAXCHOOSERENTRIES; ++i) { |
| 745 | if (CanOfferSharedTask(tasks[i], request)) |
| 746 | { |
| 747 | task_list.push_back(tasks[i]); |
| 748 | } |
nothing calls this directly
no test coverage detected