From 01e3984020e10d8ad366bea57d4b4fd080bb6f04 Mon Sep 17 00:00:00 2001 From: mirzaev Date: Sun, 16 Mar 2025 18:02:21 +0700 Subject: [PATCH] progress #9, progrss #10 --- composer.json | 3 +- svoboda/svoboder/system/databases/.gitignore | 3 + .../svoboder/system/localizations/english.php | 433 ++-- .../svoboder/system/localizations/russian.php | 430 ++-- svoboda/svoboder/system/members.baza | Bin 0 -> 21 bytes svoboda/svoboder/system/models/account.php | 31 +- .../system/models/account/localization.php | 105 + .../svoboder/system/models/distribution.php | 32 +- .../localization.php} | 20 +- .../system/models/distribution/message.php | 105 + .../system/models/enumerations/entity.php | 7 +- .../models/enumerations/member/status.php | 39 + svoboda/svoboder/system/models/member.php | 113 ++ .../system/models/telegram/account.php | 160 ++ .../buttons/account/localization/create.php | 228 +++ .../buttons/account/localization/update.php | 102 + .../{registration.php => declaration.php} | 57 +- .../telegram/buttons/distribution/search.php | 1244 +++++++++++- .../telegram/buttons/distribution/select.php | 276 +++ .../models/telegram/buttons/member/search.php | 312 +++ .../system/models/telegram/commands.php | 294 ++- .../system/models/telegram/distribution.php | 141 +- .../system/models/telegram/middlewares.php | 161 +- .../processes/account/localization/create.php | 911 +++++++++ .../processes/account/localization/update.php | 776 ++++++++ .../{registration.php => declaration.php} | 298 +-- .../create.php} | 0 .../processes/distribution/search.php | 767 +++++--- .../processes/distribution/select.php | 1751 +++++++++++++++++ .../language/select.php} | 24 +- .../telegram/processes/member/search.php | 1405 +++++++++++++ svoboda/svoboder/system/public/index.php | 66 + svoboda/svoboder/system/public/telegram.php | 110 +- svoboda/svoboder/system/settings/.gitignore | 1 + svoboda/svoboder/system/settings/system.php | 25 + 35 files changed, 9583 insertions(+), 847 deletions(-) create mode 100644 svoboda/svoboder/system/databases/.gitignore create mode 100644 svoboda/svoboder/system/members.baza create mode 100755 svoboda/svoboder/system/models/account/localization.php rename svoboda/svoboder/system/models/{localizations/distribution.php => distribution/localization.php} (79%) create mode 100755 svoboda/svoboder/system/models/distribution/message.php create mode 100755 svoboda/svoboder/system/models/enumerations/member/status.php create mode 100755 svoboda/svoboder/system/models/member.php create mode 100755 svoboda/svoboder/system/models/telegram/account.php create mode 100755 svoboda/svoboder/system/models/telegram/buttons/account/localization/create.php create mode 100755 svoboda/svoboder/system/models/telegram/buttons/account/localization/update.php rename svoboda/svoboder/system/models/telegram/buttons/distribution/{registration.php => declaration.php} (76%) create mode 100755 svoboda/svoboder/system/models/telegram/buttons/distribution/select.php create mode 100755 svoboda/svoboder/system/models/telegram/buttons/member/search.php create mode 100755 svoboda/svoboder/system/models/telegram/processes/account/localization/create.php create mode 100755 svoboda/svoboder/system/models/telegram/processes/account/localization/update.php rename svoboda/svoboder/system/models/telegram/processes/distribution/{registration.php => declaration.php} (69%) rename svoboda/svoboder/system/models/telegram/processes/distribution/{localization.php => localization/create.php} (100%) create mode 100755 svoboda/svoboder/system/models/telegram/processes/distribution/select.php rename svoboda/svoboder/system/models/telegram/{selections.php => processes/language/select.php} (83%) create mode 100755 svoboda/svoboder/system/models/telegram/processes/member/search.php create mode 100755 svoboda/svoboder/system/public/index.php create mode 100755 svoboda/svoboder/system/settings/system.php diff --git a/composer.json b/composer.json index 7575284..fd271b8 100755 --- a/composer.json +++ b/composer.json @@ -30,7 +30,8 @@ "mirzaev/baza": "^3.1.0", "svoboda/time": "^1.0", "badfarm/zanzara": "^0.9.1", - "react/filesystem": "^0.1.2" + "react/filesystem": "^0.1.2", + "react/async": "^4.3" }, "autoload": { "psr-4": { diff --git a/svoboda/svoboder/system/databases/.gitignore b/svoboda/svoboder/system/databases/.gitignore new file mode 100644 index 0000000..c936709 --- /dev/null +++ b/svoboda/svoboder/system/databases/.gitignore @@ -0,0 +1,3 @@ +!.gitignore +*.baza +*.php diff --git a/svoboda/svoboder/system/localizations/english.php b/svoboda/svoboder/system/localizations/english.php index 694cdce..f6ce6db 100644 --- a/svoboda/svoboder/system/localizations/english.php +++ b/svoboda/svoboder/system/localizations/english.php @@ -5,28 +5,326 @@ return [ // System 'svoboda' => 'Svoboda', 'empty' => 'Empty', + 'yes' => 'Yes', + 'no' => 'No', // Main menu 'menu_title' => 'Main menu', 'menu_accounts' => 'Accounts', 'menu_members' => 'Members', 'menu_distributions' => 'Distributions', + 'menu_not_syncronized' => 'The database does not synchronize with the blockchain network', 'menu_button_site' => 'Site', 'menu_button_map' => 'Map', 'menu_button_blog' => 'Blog', 'menu_button_projects' => 'Projects', 'menu_button_members' => 'Members', 'menu_button_distributions' => 'Distributions', - 'menu_button_volunteering' => 'Become a volunteer', - 'menu_button_message' => 'Send a message', + + // Members + 'members_title' => 'Registry of members', + 'members_description' => 'Member is a person who has any form of affiliation with *Svoboda*', + 'members_button_search' => 'Search', + + // Members search + 'member_search_started' => 'Process of the member search started', + 'member_search_not_started' => 'Process of the member search has not started', + 'member_search_ended' => 'Process of the member search ended', + 'member_search_not_localized' => 'Failed to initialize the member account localization', + 'member_search_not_named' => 'No name', + 'member_search_status' => 'Status', + 'member_search_status_2' => 'Member', + 'member_search_status_1' => 'Planned', + 'member_search_status_0' => 'Unknown', + 'member_search_continiued' => 'Process of the member search found and continiued', + 'member_search_empty' => 'No members found', + 'member_search_title' => 'Member search', + 'member_search_distribution' => 'Distribution', + 'member_search_page_next_exists' => 'There are more members in the registry', + 'member_search_page_next_not_exists' => 'There are no more members in the registry', + 'member_search_button_name' => 'Name', + 'member_search_name_request_title' => 'Enter name', + 'member_search_name_request_description' => 'Search will be conducted by members names using the Levenshtein function', + 'member_search_name_request_not_acceptable' => 'Failed to process the name', + 'member_search_name_request_too_short' => 'Name length must be \>\= 2 and \<\= 128', + 'member_search_name_request_too_long' => 'Name length must be \>\= 2 and \<\= 128', + 'member_search_name_request_restricted_characters_title' => "Restricted any characters except letters, dashes and spaces", + 'member_search_name_request_restricted_characters_description' => "Remove these characters:", + 'member_search_name_update_success' => 'Name replaced:', + 'member_search_name_update_fail' => 'Failed to replace name', + 'member_search_distribution_selection_description' => 'The selected distribution will be used to search for members', + 'member_search_distribution_update_success' => 'Distribution replaced:', + 'member_search_distribution_update_fail' => 'Failed to replace distribution', + 'member_search_status_select_title' => 'Select the member status', + 'member_search_status_update_success' => 'Status replaced:', + 'member_search_status_update_fail' => 'Failed to replace status', + 'member_search_button_start' => 'Start the search', + 'member_search_button_end' => 'End the search', + 'member_search_button_page_next' => 'Next page', + 'member_search_button_message' => 'Message', + 'member_search_button_distribution' => 'Distribution', + 'member_search_button_status' => 'Status', + 'member_search_button_status_2' => 'Member', + 'member_search_button_status_1' => 'Planned', + 'member_search_button_status_0' => 'Unknown', // Distributions 'distributions_title' => 'Registry of distributions', 'distributions_description' => '*Distribution* is an autonomous cell of Svoboda, representing any type of formation \(for example: commune\), but necessarily inherits the *Vhod* protocol and tied to a location', - 'distributions_registered' => 'Registered', - 'distributions_confirmed' => 'Confirmed', + 'distributions_declared' => 'Declared', + 'distributions_recognized' => 'Recognized', 'distributions_button_search' => 'Search', - 'distributions_button_register' => 'Registrate', + 'distributions_button_declare' => 'Declare', + + // Distribution selection + /* 'select_distributions_title' => 'Select distribution', + 'select_distributions_description' => 'The selected distribution will be used in the current process', + 'select_distribution_button_registrate' => 'Registrate a distribution', */ + + // Distribution declaration + 'distribution_declaration_started' => 'Process of the distribution declaration started', + 'distribution_declaration_not_started' => 'Process of the distribution declaration has not started', + 'distribution_declaration_ended' => 'Process of the distribution declaration ended', + 'distribution_declaration_continiued' => 'Process of the distribution declaration found and continiued', + 'distribution_declaration_generation' => 'The distribution record generation', + 'distribution_declaration_created_distribution' => 'Created the distribution record in the database', + 'distribution_declaration_created_localization' => 'Created the distribution localization record in the database', + 'distribution_declaration_canceled' => 'Process of the distribution declaration canceled', + 'distribution_declaration_completed' => 'Process of the distribution declaration completed', + 'distribution_declaration_not_created_distribution' => 'Failed to create the distribution record in the database', + 'distribution_declaration_not_created_localization' => 'Failed to create the distribution localization record in the database', + 'distribution_declaration_button_language' => 'Language', + 'distribution_declaration_select_language_title' => 'Choose a language', + 'distribution_declaration_select_language_description' => "The selected language will create a localization for users with the same language\n\nYou can create 1 localization for each language", + 'distribution_declaration_language_update_success' => 'Language replaced:', + 'distribution_declaration_language_update_fail' => 'Failed to replace language', + 'distribution_declaration_button_name' => 'Name', + 'distribution_declaration_name_request' => 'Enter name', + 'distribution_declaration_name_request_not_acceptable' => 'Failed to process the name', + 'distribution_declaration_name_request_too_short' => 'Name length must be \>\= 3 and \<\= 64', + 'distribution_declaration_name_request_too_long' => 'Name length must be \>\= 3 and \<\= 64', + 'distribution_declaration_name_request_spaces' => "No more than 2 spaces are allowed", + 'distribution_declaration_name_request_restricted_characters_title' => "Restricted any characters except letters", + 'distribution_declaration_name_request_restricted_characters_description' => "Remove these characters:", + 'distribution_declaration_name_update_success' => 'Name replaced:', + 'distribution_declaration_name_update_fail' => 'Failed to replace name', + 'distribution_declaration_button_location' => 'Location', + 'distribution_declaration_button_location_send' => 'Send location', + 'distribution_declaration_location_send_title' => 'Send location', + 'distribution_declaration_location_send_description' => "You now have a button on your main keyboard\nWhen you click on it, you can select a location on the map\n\n*Send latitude and longitude in the format:* 50\.969043, 9\.797588", + 'distribution_declaration_location_send_not_acceptable' => 'Failed to process the location', + 'distribution_declaration_location_send_latitude_too_small' => 'Latitude must be \>\= 0 and \<\=90', + 'distribution_declaration_location_send_latitude_too_big' => 'Latitude must be \>\= 0 and \<\=90', + 'distribution_declaration_location_send_longitude_too_small' => 'Longitude must be \>\= 0 and \<\=180', + 'distribution_declaration_location_send_longitude_too_big' => 'Longitude must be \>\= 0 and \<\=180', + 'distribution_declaration_location_update_success' => 'Location replaced:', + 'distribution_declaration_location_update_fail' => 'Failed to replace location', + 'distribution_declaration_button_confirm' => 'Confirm', + 'distribution_declaration_button_cancel' => 'Cancel', + + // Distribution localization + 'distribution_localization_started' => 'declaration of the distribution process started', + 'distribution_localization_continiued' => 'declaration of the distribution process found and continiued', + 'distribution_localization_created' => 'Created the distribution localization record in the database', + 'distribution_localization_not_created' => 'Failed to create the distribution localization record in the database', + 'distribution_localization_select_language_title' => 'Choose a language', + 'distribution_localization_select_language_description' => "The selected language will create a localization for users with the same language\n\nYou can create 1 localization for each language", + + // Distribution search + 'distribution_search_started' => 'Process of the distribution search started', + 'distribution_search_not_started' => 'Process of the distribution search has not started', + 'distribution_search_ended' => 'Process of the distribution search ended', + 'distribution_search_not_localized' => 'Failed to initialize the distribution localization', + 'distribution_search_not_named' => 'No name', + 'distribution_search_continiued' => 'Process of the distribution search found and continiued', + 'distribution_search_empty' => 'No distributions found', + 'distribution_search_title' => 'Distribution search', + 'distribution_search_members' => 'Members', + 'distribution_search_recognized' => 'Recognized', + 'distribution_search_planners' => 'Planners', + 'distribution_search_volunteers' => 'Volunteers', + 'distribution_search_messages' => 'Messages', + 'distribution_search_location' => 'Location', + 'distribution_search_page_next_exists' => 'There are more distributions in the registry', + 'distribution_search_page_next_not_exists' => 'There are no more distributions in the registry', + 'distribution_search_button_name' => 'Name', + 'distribution_search_name_request_title' => 'Enter name', + 'distribution_search_name_request_description' => 'Search will be conducted by distributions names using the Levenshtein function', + 'distribution_search_name_request_not_acceptable' => 'Failed to process the name', + 'distribution_search_name_request_too_short' => 'Name length must be \>\= 3 and \<\= 64', + 'distribution_search_name_request_too_long' => 'Name length must be \>\= 3 and \<\= 64', + 'distribution_search_name_request_restricted_characters_title' => "Restricted any characters except letters", + 'distribution_search_name_request_restricted_characters_description' => "Remove these characters:", + 'distribution_search_name_update_success' => 'Name replaced:', + 'distribution_search_name_update_fail' => 'Failed to replace name', + 'distribution_search_button_location' => 'Location', + 'distribution_search_button_location_send' => 'Send location', + 'distribution_search_location_send_title' => 'Send location', + 'distribution_search_location_send_description' => "You now have a button on your main keyboard\nWhen you click on it, you can select a location on the map\n\n*Send latitude and longitude in the format:* 50\.969043, 9\.797588", + 'distribution_search_location_send_not_acceptable' => 'Failed to process the location', + 'distribution_search_location_send_latitude_too_small' => 'Latitude must be \>\= 0 and \<\=90', + 'distribution_search_location_send_latitude_too_big' => 'Latitude must be \>\= 0 and \<\=90', + 'distribution_search_location_send_longitude_too_small' => 'Longitude must be \>\= 0 and \<\=180', + 'distribution_search_location_send_longitude_too_big' => 'Longitude must be \>\= 0 and \<\=180', + 'distribution_search_location_update_success' => 'Location replaced:', + 'distribution_search_location_update_fail' => 'Failed to replace location', + 'distribution_search_button_distance' => 'Distance', + 'distribution_search_distance_request_title' => 'Enter distance', + 'distribution_search_distance_request_description' => 'Search will be performed within a radius of this value using the Vincenty formula', + 'distribution_search_distance_request_not_acceptable' => 'Failed to process the distance', + 'distribution_search_distance_request_too_short_km' => 'Distance value must be \>\= 0 and \<\= 600', + 'distribution_search_distance_request_too_long_km' => 'Distance value must be \>\= 0 and \<\= 600', + 'distribution_search_distance_request_restricted_characters_title' => "Restricted any characters except digitals", + 'distribution_search_distance_request_restricted_characters_description' => "Delete these characters:", + 'distribution_search_distance_update_success' => 'Distance replaced:', + 'distribution_search_distance_update_fail' => 'Failed to replace distance', + 'distribution_search_button_start' => 'Start the search', + 'distribution_search_button_end' => 'End the search', + 'distribution_search_button_page_next' => 'Next page', + 'distribution_search_button_map' => 'Map', + 'distribution_search_button_members' => 'Members', + 'distribution_search_button_volunteers' => 'Volunteers', + 'distribution_search_button_plan' => 'Plan', + 'distribution_search_button_unplan' => 'Cancel the planning', + 'distribution_search_planned' => 'You planned to join to the distribution', + 'distribution_search_already_planned' => 'You are already planned to join to the distribution', + 'distribution_search_unplanned' => 'You canceled planning to join to the distribution', + 'distribution_search_already_unplanned' => 'You are already canceled planning to join to the distribution', + 'distribution_search_button_join' => 'Join', + 'distribution_search_button_leave' => 'Leave', + 'distribution_search_joined_title' => 'You joined the distribution', + 'distribution_search_joined_description' => 'You have claimed to be a member of the distribution, now you need to get recognition from its members', + 'distribution_search_already_joined' => 'You are already joined to the distribution', + 'distribution_search_leaved' => 'You leaved the distribution', + 'distribution_search_already_leaved' => 'You are already leaved the distribution', + 'distribution_search_button_message' => 'Message', + 'distribution_search_km' => 'km', + 'distribution_search_mi' => 'ml', + 'distribution_search_member_not_updated' => 'Failed to update the member record in the database', + 'distribution_search_member_not_created' => 'Failed to create the member record in the database', + 'distribution_search_distribution_not_initialized' => 'Failed to initalize the distribution', + 'distribution_search_message_not_initialized' => 'Failed to initialized the message', + 'distribution_search_another_joined' => 'You are already a member of another distribution', + 'distribution_search_another_planned' => 'You are already planning to join another distribution', + + // Distribution select + 'distribution_select_started' => 'Process of the distribution selection started', + 'distribution_select_not_started' => 'Process of the distribution selection has not started', + 'distribution_select_ended' => 'Process of the distribution selection ended', + 'distribution_select_not_localized' => 'Failed to initialize the distribution localization', + 'distribution_select_not_named' => 'No name', + 'distribution_select_continiued' => 'Process of the distribution select found and continiued', + 'distribution_select_empty' => 'No distributions found', + 'distribution_select_title' => 'Distribution selection', + 'distribution_select_button_name' => 'Name', + 'distribution_select_name_request_title' => 'Enter name', + 'distribution_select_name_request_description' => 'Selection will be conducted by distributions names using the Levenshtein function', + 'distribution_select_name_request_not_acceptable' => 'Failed to process the name', + 'distribution_select_name_request_too_short' => 'Name length must be \>\= 3 and \<\= 64', + 'distribution_select_name_request_too_long' => 'Name length must be \>\= 3 and \<\= 64', + 'distribution_select_name_request_restricted_characters_title' => "Restricted any characters except letters", + 'distribution_select_name_request_restricted_characters_description' => "Remove these characters:", + 'distribution_select_name_update_success' => 'Name replaced:', + 'distribution_select_name_update_fail' => 'Failed to replace name', + 'distribution_select_button_location' => 'Location', + 'distribution_select_button_location_send' => 'Send location', + 'distribution_select_location_send_title' => 'Send location', + 'distribution_select_location_send_description' => "You now have a button on your main keyboard\nWhen you click on it, you can select a location on the map\n\n*Send latitude and longitude in the format:* 50\.969043, 9\.797588", + 'distribution_select_location_send_not_acceptable' => 'Failed to process the location', + 'distribution_select_location_send_latitude_too_small' => 'Latitude must be \>\= 0 and \<\=90', + 'distribution_select_location_send_latitude_too_big' => 'Latitude must be \>\= 0 and \<\=90', + 'distribution_select_location_send_longitude_too_small' => 'Longitude must be \>\= 0 and \<\=180', + 'distribution_select_location_send_longitude_too_big' => 'Longitude must be \>\= 0 and \<\=180', + 'distribution_select_location_update_success' => 'Location replaced:', + 'distribution_select_location_update_fail' => 'Failed to replace location', + 'distribution_select_page_next_exists' => 'There are more distributions in the registry', + 'distribution_select_page_next_not_exists' => 'There are no more distributions in the registry', + 'distribution_select_button_distance' => 'Distance', + 'distribution_select_distance_request_title' => 'Enter distance', + 'distribution_select_distance_request_description' => 'Selection will be performed within a radius of this value using the Vincenty formula', + 'distribution_select_distance_request_not_acceptable' => 'Failed to process the distance', + 'distribution_select_distance_request_too_short_km' => 'Distance value must be \>\= 0 and \<\= 600', + 'distribution_select_distance_request_too_long_km' => 'Distance value must be \>\= 0 and \<\= 600', + 'distribution_select_distance_request_restricted_characters_title' => "Restricted any characters except digitals", + 'distribution_select_distance_request_restricted_characters_description' => "Delete these characters:", + 'distribution_select_distance_update_success' => 'Distance replaced:', + 'distribution_select_distance_update_fail' => 'Failed to replace distance', + 'distribution_select_button_delete' => 'Delete', + 'distribution_select_button_cancel' => 'Cancel', + 'distribution_select_button_page_next' => 'Next page', + 'distribution_select_button_select' => 'Select', + 'distribution_select_km' => 'km', + 'distribution_select_mi' => 'ml', + + // Account + 'account_title' => 'Account', + 'account_export' => 'This account can be exported to the Svoboda main blockchain network in the future', + 'account_data' => "⚠️ Your data may be given to the special services of Russia\nBe careful and think with your head.", + 'account_security_repository' => 'Information security', + 'account_security_repository_mirror_github' => 'mirror', + 'account_authorized_system' => 'Access to the system', + 'account_authorized_messages' => 'Access to messages', + 'account_authorized_joins' => 'Access to joins', + 'account_authorized_settings' => 'Access to settings', + 'account_authorized_system_accounts' => 'System access to accounts management', + 'account_authorized_system_distributions' => 'System access to distributions management', + 'account_authorized_system_members' => 'System access to members management', + 'account_authorized_system_settings' => 'System access to system settings', + 'account_button_localizations' => 'Localizations', + 'account_localization_create_failted_to_initialize_language' => 'Failed to initialize language', + + 'account_localization_title' => 'Localizations', + 'account_localization_amount' => 'Amount', + 'account_localization_create' => 'Create a localization', + 'account_localization_create_started' => 'Process of the account localization creating started', + 'account_localization_create_not_started' => 'Process of the account localization creating not started', + 'account_localization_create_ended' => 'Process of the account localization creating ended', + 'account_localization_create_continiued' => 'Process of the account localization creating found and continiued', + 'account_localization_create_generation' => 'The account localization record generation', + 'account_localization_create_created' => 'Created the account localization record in the database', + 'account_localization_create_canceled' => 'Process of the account localization creating canceled', + 'account_localization_create_completed' => 'Process of the account localization creating completed', + 'account_localization_create_not_created' => 'Failed to create the account localization record in the database', + 'account_localization_create_every_language_created' => 'Localizations have already been created for all languages existing in the registry', + 'account_localization_create_button_language' => 'Language', + 'account_localization_create_select_language_title' => 'Choose a language', + 'account_localization_create_select_language_description' => "The selected language will be used when creating the account localization\n\nYou can create 1 localization for each language", + 'account_localization_create_language_update_success' => 'Language replaced:', + 'account_localization_create_language_update_fail' => 'Failed to replace language', + 'account_localization_create_button_name' => 'Name', + 'account_localization_create_name_request' => 'Enter name', + 'account_localization_create_name_request_not_acceptable' => 'Failed to process the name', + 'account_localization_create_name_request_too_short' => 'Name length must be \>\= 2 and \<\= 128', + 'account_localization_create_name_request_too_long' => 'Name length must be \>\= 2 and \<\= 128', + 'account_localization_create_name_request_restricted_characters_title' => "Restricted any characters except letters, dashes and spaces", + 'account_localization_create_name_request_restricted_characters_description' => "Remove these characters:", + 'account_localization_create_name_update_success' => 'Name replaced:', + 'account_localization_create_name_update_fail' => 'Failed to replace name', + 'account_localization_create_button_confirm' => 'Confirm', + 'account_localization_create_button_cancel' => 'Cancel', + 'account_localization_update_started' => 'Process of the account localization updating started', + 'account_localization_update_not_started' => 'Process of the account localization updating not started', + 'account_localization_update_ended' => 'Process of the account localization updating ended', + 'account_localization_update_continiued' => 'Process of the account localization updating found and continiued', + 'account_localization_update_generation' => 'The account localization record generation', + 'account_localization_update_generation_target' => 'Editing', + 'account_localization_update_updated' => 'Updated the account localization record in the database', + 'account_localization_update_canceled' => 'Process of the account localization updating canceled', + 'account_localization_update_completed' => 'Process of the account localization updating completed', + 'account_localization_update_not_updated' => 'Failed to update the account localization record in the database', + 'account_localization_update_not_initialized_localization' => 'Failed to initialize the account localization from the database', + 'account_localization_update_button_name' => 'Name', + 'account_localization_update_name_request' => 'Enter name', + 'account_localization_update_name_request_not_acceptable' => 'Failed to process the name', + 'account_localization_update_name_request_too_short' => 'Name length must be \>\= 2 and \<\= 128', + 'account_localization_update_name_request_too_long' => 'Name length must be \>\= 2 and \<\= 128', + 'account_localization_update_name_request_restricted_characters_title' => "Restricted any characters except letters, dashes and spaces", + 'account_localization_update_name_request_restricted_characters_description' => "Remove these characters:", + 'account_localization_update_name_update_success' => 'Name replaced:', + 'account_localization_update_name_update_fail' => 'Failed to replace name', + 'account_localization_update_button_confirm' => 'Confirm', + 'account_localization_update_button_cancel' => 'Cancel', + 'account_localization_search' => 'search', // Language setting 'settings_select_language_title' => 'Select language', @@ -34,6 +332,11 @@ return [ 'settings_language_update_success' => 'Language replaced:', 'settings_language_update_fail' => 'Failed to replace language', + // Language selection + 'select_language_title' => 'Select language', + 'select_language_description' => 'The selected language will be used in the current process', + 'select_language_button_add' => 'Add a language', + // Repository 'repository_title' => 'Repository', 'repository_text' => << 'YouTube', 'author_button_message' => 'Send a message', - // Language selection - 'select_language_title' => 'Select language', - 'select_language_description' => 'The selected language will be used in the current process', - 'select_language_button_add' => 'Add a language', - - // Distribution selection - 'select_distributions_title' => 'Select distribution', - 'select_distributions_description' => 'The selected distribution will be used in the current process', - 'select_distribution_button_registrate' => 'Registrate a distribution', - - // Distribution registration - 'distribution_registration_started' => 'Process of the distribution registration started', - 'distribution_registration_not_started' => 'Process of the distribution registration has not started', - 'distribution_search_ended' => 'Process of the distribution registration ended', - 'distribution_registration_continiued' => 'Process of the distribution registration found and continiued', - 'distribution_registration_generation' => 'The distribution record generation', - 'distribution_registration_created_distribution' => 'Created the distribution record in the database', - 'distribution_registration_created_localization' => 'Created the distribution localization record in the database', - 'distribution_registration_canceled' => 'Process of the distribution registration canceled', - 'distribution_registration_completed' => 'Process of the distribution registration completed', - 'distribution_registration_not_created_distribution' => 'Failed to create the distribution record in the database', - 'distribution_registration_not_created_localization' => 'Failed to create the distribution localization record in the database', - 'distribution_registration_button_language' => 'Language', - 'distribution_registration_select_language_title' => 'Choose language', - 'distribution_registration_select_language_description' => "The selected language will create a localization for users with the same language\n\nYou can create 1 localization for each language", - 'distribution_registration_language_update_success' => 'Language replaced:', - 'distribution_registration_language_update_fail' => 'Failed to replace language', - 'distribution_registration_button_name' => 'Name', - 'distribution_registration_name_request' => 'Enter name', - 'distribution_registration_name_request_not_acceptable' => 'Failed to process the name', - 'distribution_registration_name_request_too_short' => 'Name length must be \>\= 3 and \<\= 32', - 'distribution_registration_name_request_too_long' => 'Name length must be \>\= 3 and \<\= 32', - 'distribution_registration_name_request_spaces' => "No more than 2 spaces are allowed", - 'distribution_registration_name_request_restricted_characters_title' => "Restricted any characters except letters", - 'distribution_registration_name_request_restricted_characters_description' => "Remove these characters:", - 'distribution_registration_name_update_success' => 'Name replaced:', - 'distribution_registration_name_update_fail' => 'Failed to replace name', - 'distribution_registration_button_location' => 'Location', - 'distribution_registration_button_location_send' => 'Send location', - 'distribution_registration_location_send_title' => 'Send location', - 'distribution_registration_location_send_description' => "You now have a button on your main keyboard\nWhen you click on it, you can select a location on the map\n\n*Send latitude and longitude in the format:* 50\.969043, 9\.797588", - 'distribution_registration_location_send_not_acceptable' => 'Failed to process the location', - 'distribution_registration_location_send_latitude_too_small' => 'Latitude must be \>\= 0 and \<\=90', - 'distribution_registration_location_send_latitude_too_big' => 'Latitude must be \>\= 0 and \<\=90', - 'distribution_registration_location_send_longitude_too_small' => 'Longitude must be \>\= 0 and \<\=180', - 'distribution_registration_location_send_longitude_too_big' => 'Longitude must be \>\= 0 and \<\=180', - 'distribution_registration_location_update_success' => 'Location replaced:', - 'distribution_registration_location_update_fail' => 'Failed to replace location', - 'distribution_registration_button_confirm' => 'Confirm', - 'distribution_registration_button_cancel' => 'Cancel', - - // Distribution localization - 'distribution_localization_started' => 'Registration of the distribution process started', - 'distribution_localization_continiued' => 'Registration of the distribution process found and continiued', - 'distribution_localization_created' => 'Created the distribution localization record in the database', - 'distribution_localization_not_created' => 'Failed to create the distribution localization record in the database', - 'distribution_localization_select_language_title' => 'Choose language', - 'distribution_localization_select_language_description' => "The selected language will create a localization for users with the same language\n\nYou can create 1 localization for each language", - - // Distribution search - 'distribution_search_started' => 'Process of the distribution search started', - 'distribution_search_not_started' => 'Process of the distribution search has not started', - 'distribution_search_not_localized' => 'Failed to initialize the distribution localization', - 'distribution_search_not_named' => 'No name', - 'distribution_search_continiued' => 'Process of the distribution search found and continiued', - 'distribution_search_empty' => 'No distributions found', - 'distribution_search_title' => 'Distribution search', - 'distribution_search_members' => 'Members', - 'distribution_search_location' => 'Location', - 'distribution_search_page_next_exists' => 'There are more distributions in the registry', - 'distribution_search_page_next_not_exists' => 'There are no more distributions in the registry', - 'distribution_search_button_text' => 'Text', - 'distribution_search_text_request_title' => 'Enter search text', - 'distribution_search_text_request_description' => 'Search will be conducted by names using the Levenshtein function', - 'distribution_search_text_request_not_acceptable' => 'Failed to process the search text', - 'distribution_search_text_request_too_short' => 'Search text length must be \>\= 3 and \<\= 64', - 'distribution_search_text_request_too_long' => 'Search text length must be \>\= 3 and \<\= 64', - 'distribution_search_text_request_restricted_characters_title' => "Restricted any characters except letters", - 'distribution_search_text_request_restricted_characters_description' => "Remove these characters:", - 'distribution_search_text_update_success' => 'Search text replaced:', - 'distribution_search_text_update_fail' => 'Failed to replace search text', - 'distribution_search_button_location' => 'Location', - 'distribution_search_button_location_send' => 'Send location', - 'distribution_search_location_send_title' => 'Send location', - 'distribution_search_location_send_description' => "You now have a button on your main keyboard\nWhen you click on it, you can select a location on the map\n\n*Send latitude and longitude in the format:* 50\.969043, 9\.797588", - 'distribution_search_location_send_not_acceptable' => 'Failed to process the location', - 'distribution_search_location_send_latitude_too_small' => 'Latitude must be \>\= 0 and \<\=90', - 'distribution_search_location_send_latitude_too_big' => 'Latitude must be \>\= 0 and \<\=90', - 'distribution_search_location_send_longitude_too_small' => 'Longitude must be \>\= 0 and \<\=180', - 'distribution_search_location_send_longitude_too_big' => 'Longitude must be \>\= 0 and \<\=180', - 'distribution_search_location_update_success' => 'Location replaced:', - 'distribution_search_location_update_fail' => 'Failed to replace location', - 'distribution_search_button_distance' => 'Distance', - 'distribution_search_distance_request_title' => 'Enter distance', - 'distribution_search_distance_request_description' => 'Search will be performed within a radius of this value using the Vincenty formula', - 'distribution_search_distance_request_not_acceptable' => 'Failed to process the distance', - 'distribution_search_distance_request_too_short_km' => 'Distance value must be \>\= 0 and \<\= 600', - 'distribution_search_distance_request_too_long_km' => 'Distance value must be \>\= 0 and \<\= 600', - 'distribution_search_distance_request_restricted_characters_title' => "Restricted any characters except digitals", - 'distribution_search_distance_request_restricted_characters_description' => "Delete these characters:", - 'distribution_search_distance_update_success' => 'Distance replaced:', - 'distribution_search_distance_update_fail' => 'Failed to replace distance', - 'distribution_search_button_confirmed' => 'Confirmed', - 'distribution_search_button_confirmed_all' => 'All', - 'distribution_search_confirmed_update_success' => 'Filter by status replaced:', - 'distribution_search_confirmed_update_fail' => 'Failed to replace filter by status', - 'distribution_search_button_start' => 'Start the search', - 'distribution_search_button_end' => 'End the search', - 'distribution_search_button_page_next' => 'Next page', - 'distribution_search_button_map' => 'Map', - 'distribution_search_button_members' => 'Members', - 'distribution_search_button_message' => 'Send a message', - 'distribution_search_km' => 'km', - 'distribution_search_mi' => 'ml', - // Authorization 'not_authorized_system' => 'You do not have access to the system', - 'not_authorized_contact' => 'You do not have access to contact with the organisation', - 'not_authorized_request' => 'You do not have access to requesting to the organisation', + 'not_authorized_messages' => 'You do not have access to send messages', + 'not_authorized_joins' => 'You do not have access to joins', 'not_authorized_settings' => 'You do not have access to the settings', 'not_authorized_system_settings' => 'You do not have access to the system settings', + 'not_authorized_system_distributions' => 'You do not have access to distributions administration', // Other 'why_so_shroomious' => 'why so shroomious', diff --git a/svoboda/svoboder/system/localizations/russian.php b/svoboda/svoboder/system/localizations/russian.php index c7b4364..6a561fb 100644 --- a/svoboda/svoboder/system/localizations/russian.php +++ b/svoboda/svoboder/system/localizations/russian.php @@ -5,28 +5,323 @@ return [ // Система 'svoboda' => 'Свобода', 'empty' => 'Пусто', + 'yes' => 'Да', + 'no' => 'Нет', // Главное меню 'menu_title' => 'Главное меню', 'menu_accounts' => 'Аккаунты', 'menu_members' => 'Участники', 'menu_distributions' => 'Дистрибутивы', + 'menu_not_syncronized' => 'База данных не синхронизируется с блокчейн сетью', 'menu_button_site' => 'Сайт', 'menu_button_map' => 'Карта', 'menu_button_blog' => 'Блог', 'menu_button_projects' => 'Проекты', 'menu_button_members' => 'Участники', 'menu_button_distributions' => 'Дистрибутивы', - 'menu_button_volunteering' => 'Стать волонтёром', - 'menu_button_message' => 'Отправить сообщение', + + // Участники + 'members_title' => 'Реестр участников', + 'members_description' => 'Участник \- личность имеющая любую форму взаимоотношений со *Свободой*', + 'members_button_search' => 'Поиск', + + // Поиск участника + 'member_search_started' => 'Процесс поиска участника дистрибутива запущен', + 'member_search_not_started' => 'Процесс поиска участника дистрибутива не запущен', + 'member_search_ended' => 'Процесс поиска участника дистрибутива завершён', + 'member_search_not_localized' => 'Не удалось инициализировать локализацию аккаунта участника', + 'member_search_not_named' => 'Нет имени', + 'member_search_status' => 'Статус', + 'member_search_status_2' => 'Участие', + 'member_search_status_2_emoji' => '🧳', + 'member_search_status_1' => 'Планирование', + 'member_search_status_1_emoji' => '📅', + 'member_search_status_0' => 'Неизвестно', + 'member_search_status_0_emoji' => '👽', + 'member_search_continiued' => 'Процесс поиска участника дистрибутива найден и продолжен', + 'member_search_empty' => 'Не найдены участники дистрибутивов', + 'member_search_title' => 'Поиск участника дистрибутива', + 'member_search_distribution' => 'Дистрибутив', + 'member_search_page_next_exists' => 'В реестре есть ещё участники дистрибутивов', + 'member_search_page_next_not_exists' => 'В реестре больше нет участников дистрибутивов', + 'member_search_button_name' => 'Имя', + 'member_search_name_request_title' => 'Введи имя', + 'member_search_name_request_description' => 'Поиск будет проводиться по именам участников дистрибутивов с использованием функции Левенштейна', + 'member_search_name_request_not_acceptable' => 'Не удалось обработать имя', + 'member_search_name_request_too_short' => 'Длина имени должна быть \>\= 2 и \<\= 128', + 'member_search_name_request_too_long' => 'Длина имени должна быть \>\= 2 и \<\= 128', + 'member_search_name_request_restricted_characters_title' => "Запрещены любые символы кроме букв", + 'member_search_name_request_restricted_characters_description' => "Удали эти символы:", + 'member_search_name_update_success' => 'Имя заменено:', + 'member_search_name_update_fail' => 'Не удалось заменить имя', + 'member_search_button_start' => 'Начать поиск', + 'member_search_button_end' => 'Завершить поиск', + 'member_search_button_page_next' => 'Следующая страница', + 'member_search_button_message' => 'Сообщение', + 'member_search_button_distribution' => 'Дистрибутив', + 'member_search_button_status' => 'Статус', + 'member_search_button_status_2' => 'участие', + 'member_search_button_status_2_emoji' => '🧳', + 'member_search_button_status_1' => 'планирование', + 'member_search_button_status_1_emoji' => '📅', + 'member_search_button_status_0' => 'неизвестно', + 'member_search_button_status_0_emoji' => '👽', // Дистрибутивы 'distributions_title' => 'Реестр дистрибутивов', 'distributions_description' => '*Дистрибутив* \- это автономная ячейка Свободы, являющаяся любым видом формирования \(например: коммуна\), но обязательно наследующая *Vhod* протокол, участвующая в глобальных процессах организации и привязанная к местоположению', - 'distributions_registered' => 'Зарегистрировано', - 'distributions_confirmed' => 'Подтверждено', + 'distributions_declared' => 'Объявленные', + 'distributions_recognized' => 'Признанные', 'distributions_button_search' => 'Поиск', - 'distributions_button_register' => 'Зарегистрировать', + 'distributions_button_declare' => 'Объявить', + + // Выбор дистрибутива + /* 'select_distributions_title' => 'Выбери дистрибутив', + 'select_distributions_description' => 'Выбранный дистрибутив будет использован в текущем процесса', + 'select_distribution_button_registrate' => 'Зарегистрировать дистрибутив', */ + + // Объявление дистрибутива + 'distribution_declaration_started' => 'Процесс объявления дистрибутива запущен', + 'distribution_declaration_not_started' => 'Процесс объявления дистрибутива не запущен', + 'distribution_declaration_ended' => 'Процесс объявления дистрибутива завершён', + 'distribution_declaration_continiued' => 'Процесс объявления дистрибутива найден и продолжен', + 'distribution_declaration_generation' => 'Генерация записи дистрибутива', + 'distribution_declaration_created_distribution' => 'Создана запись дистрибутива в базе данных', + 'distribution_declaration_created_localization' => 'Создана запись локализации дистрибутива в базе данных', + 'distribution_declaration_canceled' => 'Процесс объявления дистрибутива отменён', + 'distribution_declaration_completed' => 'Процесс объявления дистрибутива завершен', + 'distribution_declaration_not_created_distribution' => 'Не удалось создать запись дистрибутива в базе данных', + 'distribution_declaration_not_created_localization' => 'Не удалось создать запись локализации дистрибутива в базе данных', + 'distribution_declaration_button_language' => 'Язык', + 'distribution_declaration_select_language_title' => 'Выбери язык', + 'distribution_declaration_select_language_description' => "Выбранный язык позволит создать локализацию для пользователей с таким же языком\n\nТы можешь создать 1 локализацию для каждого языка", + 'distribution_declaration_language_update_success' => 'Язык заменён:', + 'distribution_declaration_language_update_fail' => 'Не удалось заменить язык', + 'distribution_declaration_button_name' => 'Название', + 'distribution_declaration_name_request' => 'Введи название', + 'distribution_declaration_name_request_not_acceptable' => 'Не удалось обработать название', + 'distribution_declaration_name_request_too_short' => 'Длина имени должна быть \>\= 3 и \<\= 64', + 'distribution_declaration_name_request_too_long' => 'Длина имени должна быть \>\= 3 и \<\= 64', + 'distribution_declaration_name_request_spaces' => "Разрешено использовать не более чем 2 пробела", + 'distribution_declaration_name_request_restricted_characters_title' => "Запрещены любые символы кроме букв", + 'distribution_declaration_name_request_restricted_characters_description' => "Удали эти символы:", + 'distribution_declaration_name_update_success' => 'Название заменено:', + 'distribution_declaration_name_update_fail' => 'Не удалось заменить название', + 'distribution_declaration_button_location' => 'Местоположение', + 'distribution_declaration_button_location_send' => 'Отправить местоположение', + 'distribution_declaration_location_send_title' => 'Отправь местоположение', + 'distribution_declaration_location_send_description' => "У тебя появилась кнопка на основной клавиатуре\nПри нажатии на неё можно будет выбрать локацию на карте\n\n*Пришли широту и долготу в формате:* 50\.969043, 9\.797588", + 'distribution_declaration_location_send_not_acceptable' => 'Не удалось обработать местоположение', + 'distribution_declaration_location_send_latitude_too_small' => 'Широта должна быть \>\= 0 и \<\=90', + 'distribution_declaration_location_send_latitude_too_big' => 'Широта должна быть \>\= 0 и \<\=90', + 'distribution_declaration_location_send_longitude_too_small' => 'Долгота должна быть \>\= 0 и \<\=180', + 'distribution_declaration_location_send_longitude_too_big' => 'Долгота должна быть \>\= 0 и \<\=180', + 'distribution_declaration_location_update_success' => 'Местоположение заменено:', + 'distribution_declaration_location_update_fail' => 'Не удалось заменить местоположение', + 'distribution_declaration_button_confirm' => 'Подтвердить', + 'distribution_declaration_button_cancel' => 'Отменить', + + // Локализация дистрибутива + 'distribution_localization_started' => 'Запущен процесс локализации дистрибутива', + 'distribution_localization_continiued' => 'Найден и продолжен процесс локализации дистрибутива', + 'distribution_localization_created' => 'Создана запись локализации дистрибутива в базе данных', + 'distribution_localization_not_created' => 'Не удалось создать запись локализации дистрибутива в базе данных', + 'distribution_localization_select_language_title' => 'Выбери язык', + 'distribution_localization_select_language_description' => "Выбранный язык позволит создать локализацию для пользователей с таким же языком\n\nТы можешь создать 1 локализацию для каждого языка", + + // Поиск дистрибутива + 'distribution_search_started' => 'Процесс поиска дистрибутива запущен', + 'distribution_search_not_started' => 'Процесс поиска дистрибутива не запущен', + 'distribution_search_ended' => 'Процесс поиска дистрибутива завершён', + 'distribution_search_not_localized' => 'Не удалось инициализировать локализацию дистрибутива', + 'distribution_search_not_named' => 'Нет названия', + 'distribution_search_continiued' => 'Процесс поиска дистрибутива найден и продолжен', + 'distribution_search_empty' => 'Не найдены дистрибутивы', + 'distribution_search_title' => 'Поиск дистрибутива', + 'distribution_search_members' => 'Участники', + 'distribution_search_recognized' => 'Признанные', + 'distribution_search_planners' => 'Планирующие', + 'distribution_search_volunteers' => 'Волонтёры', + 'distribution_search_messages' => 'Сообщения', + 'distribution_search_location' => 'Местоположение', + 'distribution_search_page_next_exists' => 'В реестре есть ещё дистрибутивы', + 'distribution_search_page_next_not_exists' => 'В реестре больше нет дистрибутивов', + 'distribution_search_button_name' => 'Название', + 'distribution_search_name_request_title' => 'Введи название', + 'distribution_search_name_request_description' => 'Поиск будет проводиться по названиям с использованием функции Левенштейна', + 'distribution_search_name_request_not_acceptable' => 'Не удалось обработать название', + 'distribution_search_name_request_too_short' => 'Длина названия должна быть \>\= 3 и \<\= 64', + 'distribution_search_name_request_too_long' => 'Длина названия должна быть \>\= 3 и \<\= 64', + 'distribution_search_name_request_restricted_characters_title' => "Запрещены любые символы кроме букв", + 'distribution_search_name_request_restricted_characters_description' => "Удали эти символы:", + 'distribution_search_name_update_success' => 'Название заменено:', + 'distribution_search_name_update_fail' => 'Не удалось заменить название', + 'distribution_search_button_location' => 'Местоположение', + 'distribution_search_button_location_send' => 'Отправить местоположение', + 'distribution_search_location_send_title' => 'Отправь местоположение', + 'distribution_search_location_send_description' => "У тебя появилась кнопка на основной клавиатуре\nПри нажатии на неё можно будет выбрать локацию на карте\n\n*Пришли широту и долготу в формате:* 50\.969043, 9\.797588", + 'distribution_search_location_send_not_acceptable' => 'Не удалось обработать местоположение', + 'distribution_search_location_send_latitude_too_small' => 'Широта должна быть \>\= 0 и \<\=90', + 'distribution_search_location_send_latitude_too_big' => 'Широта должна быть \>\= 0 и \<\=90', + 'distribution_search_location_send_longitude_too_small' => 'Долгота должна быть \>\= 0 и \<\=180', + 'distribution_search_location_send_longitude_too_big' => 'Долгота должна быть \>\= 0 и \<\=180', + 'distribution_search_location_update_success' => 'Местоположение заменено:', + 'distribution_search_location_update_fail' => 'Не удалось заменить местоположение', + 'distribution_search_button_distance' => 'Расстояние', + 'distribution_search_distance_request_title' => 'Введи расстояние', + 'distribution_search_distance_request_description' => 'Поиск будет производиться в радиусе от этого значения по формуле Винсенти', + 'distribution_search_distance_request_not_acceptable' => 'Не удалось обработать расстояние', + 'distribution_search_distance_request_too_short_km' => 'Длина расстояния должна быть \>\= 0 и \<\= 600', + 'distribution_search_distance_request_too_long_km' => 'Длина расстояния должна быть \>\= 0 и \<\= 600', + 'distribution_search_distance_request_restricted_characters_title' => "Запрещены любые символы кроме цифр", + 'distribution_search_distance_request_restricted_characters_description' => "Удали эти символы:", + 'distribution_search_distance_update_success' => 'Расстояние заменено:', + 'distribution_search_distance_update_fail' => 'Не удалось заменить расстояние', + 'distribution_search_button_start' => 'Начать поиск', + 'distribution_search_button_end' => 'Завершить поиск', + 'distribution_search_button_page_next' => 'Следующая страница', + 'distribution_search_button_map' => 'Карта', + 'distribution_search_button_members' => 'Участники', + 'distribution_search_button_volunteers' => 'Волонтёры', + 'distribution_search_button_plan' => 'Запланировать', + 'distribution_search_button_unplan' => 'Отменить планирование', + 'distribution_search_planned' => 'Ты запланировал вступление в дистрибутив', + 'distribution_search_already_planned' => 'Ты уже запланировал вступление в дистрибутив', + 'distribution_search_unplanned' => 'Ты отменил запланированное вступление в дистрибутив', + 'distribution_search_already_unplanned' => 'Ты уже отменил запланировал вступление в дистрибутив', + 'distribution_search_button_join' => 'Присоединиться', + 'distribution_search_button_leave' => 'Покинуть', + 'distribution_search_joined_title' => 'Ты вступил в дистрибутив', + 'distribution_search_joined_description' => 'Ты заявил о том, что являешься участником дистрибутива, теперь тебе надо получить признание от его участников', + 'distribution_search_already_joined' => 'Ты уже вступил дистрибутив', + 'distribution_search_leaved' => 'Ты покинул дистрибутив', + 'distribution_search_already_leaved' => 'Ты уже покинул дистрибутив', + 'distribution_search_button_message' => 'Сообщение', + 'distribution_search_km' => 'км', + 'distribution_search_mi' => 'мл', + 'distribution_search_member_not_updated' => 'Не удалось обновить запись участника дистрибутива в базе данных', + 'distribution_search_member_not_created' => 'Не удалось создать запись участника дистрибутива в базе данных', + 'distribution_search_distribution_not_initialized' => 'Не удалось инициализировать дистрибутив', + 'distribution_search_message_not_initialized' => 'Не удалось инициализировать сообщение', + 'distribution_search_another_joined' => 'Ты уже являешься участником другого дистрибутива', + 'distribution_search_another_planned' => 'Ты уже планируешь вступить в другой дистрибутив', + + // Выбор дистрибутива + 'distribution_select_started' => 'Процесс выбора дистрибутива запущен', + 'distribution_select_not_started' => 'Процесс выбора дистрибутива не запущен', + 'distribution_select_ended' => 'Процесс выбора дистрибутива завершён', + 'distribution_select_not_localized' => 'Не удалось инициализировать локализацию дистрибутива', + 'distribution_select_not_named' => 'Нет названия', + 'distribution_select_continiued' => 'Процесс выбора дистрибутива найден и продолжен', + 'distribution_select_empty' => 'Не найдены дистрибутивы', + 'distribution_select_title' => 'Выбор дистрибутива', + 'distribution_select_page_next_exists' => 'В реестре есть ещё дистрибутивы', + 'distribution_select_page_next_not_exists' => 'В реестре больше нет дистрибутивов', + 'distribution_select_button_name' => 'Название', + 'distribution_select_name_request_title' => 'Введи название', + 'distribution_select_name_request_description' => 'выбор будет проводиться по названиям с использованием функции Левенштейна', + 'distribution_select_name_request_not_acceptable' => 'Не удалось обработать название', + 'distribution_select_name_request_too_short' => 'Длина названия должна быть \>\= 3 и \<\= 64', + 'distribution_select_name_request_too_long' => 'Длина названия должна быть \>\= 3 и \<\= 64', + 'distribution_select_name_request_restricted_characters_title' => "Запрещены любые символы кроме букв", + 'distribution_select_name_request_restricted_characters_description' => "Удали эти символы:", + 'distribution_select_name_update_success' => 'Название заменено:', + 'distribution_select_name_update_fail' => 'Не удалось заменить название', + 'distribution_select_button_location' => 'Местоположение', + 'distribution_select_button_location_send' => 'Отправить местоположение', + 'distribution_select_location_send_title' => 'Отправь местоположение', + 'distribution_select_location_send_description' => "У тебя появилась кнопка на основной клавиатуре\nПри нажатии на неё можно будет выбрать локацию на карте\n\n*Пришли широту и долготу в формате:* 50\.969043, 9\.797588", + 'distribution_select_location_send_not_acceptable' => 'Не удалось обработать местоположение', + 'distribution_select_location_send_latitude_too_small' => 'Широта должна быть \>\= 0 и \<\=90', + 'distribution_select_location_send_latitude_too_big' => 'Широта должна быть \>\= 0 и \<\=90', + 'distribution_select_location_send_longitude_too_small' => 'Долгота должна быть \>\= 0 и \<\=180', + 'distribution_select_location_send_longitude_too_big' => 'Долгота должна быть \>\= 0 и \<\=180', + 'distribution_select_location_update_success' => 'Местоположение заменено:', + 'distribution_select_location_update_fail' => 'Не удалось заменить местоположение', + 'distribution_select_button_distance' => 'Расстояние', + 'distribution_select_distance_request_title' => 'Введи расстояние', + 'distribution_select_distance_request_description' => 'Поиск будет производиться в радиусе от этого значения по формуле Винсенти', + 'distribution_select_distance_request_not_acceptable' => 'Не удалось обработать расстояние', + 'distribution_select_distance_request_too_short_km' => 'Длина расстояния должна быть \>\= 0 и \<\= 600', + 'distribution_select_distance_request_too_long_km' => 'Длина расстояния должна быть \>\= 0 и \<\= 600', + 'distribution_select_distance_request_restricted_characters_title' => "Запрещены любые символы кроме цифр", + 'distribution_select_distance_request_restricted_characters_description' => "Удали эти символы:", + 'distribution_select_distance_update_success' => 'Расстояние заменено:', + 'distribution_select_distance_update_fail' => 'Не удалось заменить расстояние', + 'distribution_select_button_select' => 'Выбрать', + 'distribution_select_button_cancel' => 'Отменить выбор', + 'distribution_select_button_page_next' => 'Следующая страница', + + // Аккаунт + 'account_title' => 'Аккаунт', + 'account_export' => 'Этот аккаунт может быть экспортирован в основную блокчейн сеть Свободы в будущем', + 'account_data' => "⚠️ Твои данные могут быть выданы спецслужбам России\nБудь осторожен и думай своей головой", + 'account_security_repository' => 'Информационная безопасность', + 'account_security_repository_mirror_github' => 'зеркало', + 'account_authorized_system' => 'Доступ к системе', + 'account_authorized_messages' => 'Доступ к сообщениям', + 'account_authorized_joins' => 'Доступ к вступлениям', + 'account_authorized_settings' => 'Доступ к изменению настроек', + 'account_authorized_system_accounts' => 'Системный доступ к управлению аккаунтами', + 'account_authorized_system_distributions' => 'Системный доступ к управлению дистрибутивами', + 'account_authorized_system_members' => 'Системный доступ к управлению участниками дистрибутивов', + 'account_authorized_system_settings' => 'Системный доступ к системным настройкам', + 'account_button_localizations' => 'Локализации', + 'account_localization_create_failted_to_initialize_language' => 'Не удалось инициализировать язык', + + 'account_localization_title' => 'Локализации', + 'account_localization_amount' => 'Количество', + 'account_localization_create' => 'Создать локализацию', + 'account_localization_create_started' => 'Процесс создания локализации аккаунта запущен', + 'account_localization_create_not_started' => 'Процесс создания локализации аккаунта не запущен', + 'account_localization_create_ended' => 'Процесс создания локализации аккаунта завершён', + 'account_localization_create_continiued' => 'Процесс создания локализации аккаунта найден и продолжен', + 'account_localization_create_generation' => 'Генерация записи локализации аккаунта', + 'account_localization_create_created' => 'Создана запись локализации аккаунта в базе данных', + 'account_localization_create_canceled' => 'Процесс создания локализации аккаунта отменён', + 'account_localization_create_completed' => 'Процесс создания локализации аккаунта завершен', + 'account_localization_create_not_created' => 'Не удалось создать запись локализации аккаунта в базе данных', + 'account_localization_create_every_language_created' => 'Для всех существующих в реестре языков уже были созданы локализации', + 'account_localization_create_button_language' => 'Язык', + 'account_localization_create_select_language_title' => 'Выбери язык', + 'account_localization_create_select_language_description' => "Выбранный язык будет использован при создания локализации аккаунта\n\nТы можешь создать 1 локализацию для каждого языка", + 'account_localization_create_language_update_success' => 'Язык заменён:', + 'account_localization_create_language_update_fail' => 'Не удалось заменить язык', + 'account_localization_create_button_name' => 'Имя', + 'account_localization_create_name_request' => 'Введи имя', + 'account_localization_create_name_request_not_acceptable' => 'Не удалось обработать имя', + 'account_localization_create_name_request_too_short' => 'Длина имени должна быть \>\= 2 и \<\= 128', + 'account_localization_create_name_request_too_long' => 'Длина имени должна быть \>\= 2 и \<\= 128', + 'account_localization_create_name_request_restricted_characters_title' => "Запрещены любые символы кроме букв, тире и пробелов", + 'account_localization_create_name_request_restricted_characters_description' => "Удали эти символы:", + 'account_localization_create_name_update_success' => 'Имя заменено:', + 'account_localization_create_name_update_fail' => 'Не удалось заменить имя', + 'account_localization_create_button_confirm' => 'Подтвердить', + 'account_localization_create_button_cancel' => 'Отменить', + 'account_localization_update_started' => 'Процесс обновления локализации аккаунта запущен', + 'account_localization_update_not_started' => 'Процесс обновления локализации аккаунта не запущен', + 'account_localization_update_ended' => 'Процесс обновления локализации аккаунта завершён', + 'account_localization_update_continiued' => 'Процесс обновления локализации аккаунта найден и продолжен', + 'account_localization_update_generation' => 'Генерация записи локализации аккаунта', + 'account_localization_update_generation_target' => 'Редактирование', + 'account_localization_update_updated' => 'Обновлена запись локализации аккаунта в базе данных', + 'account_localization_update_canceled' => 'Процесс обновления локализации аккаунта отменён', + 'account_localization_update_completed' => 'Процесс обновления локализации аккаунта завершен', + 'account_localization_update_not_updated' => 'Не удалось обновить запись локализации аккаунта в базе данных', + 'account_localization_update_not_initialized_localization' => 'Не удалось инициализировать локализацию аккаунта из базы данных', + 'account_localization_update_button_name' => 'Имя', + 'account_localization_update_name_request' => 'Введи имя', + 'account_localization_update_name_request_not_acceptable' => 'Не удалось обработать имя', + 'account_localization_update_name_request_too_short' => 'Длина имени должна быть \>\= 2 и \<\= 128', + 'account_localization_update_name_request_too_long' => 'Длина имени должна быть \>\= 2 и \<\= 128', + 'account_localization_update_name_request_restricted_characters_title' => "Запрещены любые символы кроме букв, тире и пробелов", + 'account_localization_update_name_request_restricted_characters_description' => "Удали эти символы:", + 'account_localization_update_name_update_success' => 'Имя заменено:', + 'account_localization_update_name_update_fail' => 'Не удалось заменить имя', + 'account_localization_update_button_confirm' => 'Подтвердить', + 'account_localization_update_button_cancel' => 'Отменить', + 'account_localization_search' => 'Поиск', // Настройки языка 'settings_select_language_title' => 'Выбери язык', @@ -34,6 +329,11 @@ return [ 'settings_language_update_success' => 'Язык заменён:', 'settings_language_update_fail' => 'Не удалось заменить язык', + // Выбор языка + 'select_language_title' => 'Выбери язык', + 'select_language_description' => 'Выбранный язык будет использован в текущем процессе', + 'select_language_button_add' => 'Добавить язык', + // Репозиторий 'repository_title' => 'Репозиторий', 'repository_text' => << 'YouTube', 'author_button_message' => 'Отправить сообщение', - // Выбор языка - 'select_language_title' => 'Выбери язык', - 'select_language_description' => 'Выбранный язык будет использован в текущем процессе', - 'select_language_button_add' => 'Добавить язык', - - // Выбор дистрибутива - 'select_distributions_title' => 'Выбери дистрибутив', - 'select_distributions_description' => 'Выбранный дистрибутив будет использован в текущем процесса', - 'select_distribution_button_registrate' => 'Зарегистрировать дистрибутив', - - // Регистрация дистрибутива - 'distribution_registration_started' => 'Процесс регистрации дистрибутива запущен', - 'distribution_registration_not_started' => 'Процесс регистрации дистрибутива не запущен', - 'distribution_registration_continiued' => 'Процесс регистрации дистрибутива найден и продолжен', - 'distribution_registration_generation' => 'Генерация записи дистрибутива', - 'distribution_registration_created_distribution' => 'Создана запись дистрибутива в базе данных', - 'distribution_registration_created_localization' => 'Создана запись локализации дистрибутива в базе данных', - 'distribution_registration_canceled' => 'Процесс регистрации дистрибутива отменён', - 'distribution_registration_completed' => 'Процесс регистрации дистрибутива завершен', - 'distribution_registration_not_created_distribution' => 'Не удалось создать запись дистрибутива в базе данных', - 'distribution_registration_not_created_localization' => 'Не удалось создать запись локализации дистрибутива в базе данных', - 'distribution_registration_button_language' => 'Язык', - 'distribution_registration_select_language_title' => 'Выбери язык', - 'distribution_registration_select_language_description' => "Выбранный язык позволит создать локализацию для пользователей с таким же языком\n\nТы можешь создать 1 локализацию для каждого языка", - 'distribution_registration_language_update_success' => 'Язык заменён:', - 'distribution_registration_language_update_fail' => 'Не удалось заменить язык', - 'distribution_registration_button_name' => 'Название', - 'distribution_registration_name_request' => 'Введи название', - 'distribution_registration_name_request_not_acceptable' => 'Не удалось обработать название', - 'distribution_registration_name_request_too_short' => 'Длина имени должна быть \>\= 3 и \<\= 32', - 'distribution_registration_name_request_too_long' => 'Длина имени должна быть \>\= 3 и \<\= 32', - 'distribution_registration_name_request_spaces' => "Разрешено использовать не более чем 2 пробела", - 'distribution_registration_name_request_restricted_characters_title' => "Запрещены любые символы кроме букв", - 'distribution_registration_name_request_restricted_characters_description' => "Удали эти символы:", - 'distribution_registration_name_update_success' => 'Название заменено:', - 'distribution_registration_name_update_fail' => 'Не удалось заменить название', - 'distribution_registration_button_location' => 'Местоположение', - 'distribution_registration_button_location_send' => 'Отправить местоположение', - 'distribution_registration_location_send_title' => 'Отправь местоположение', - 'distribution_registration_location_send_description' => "У тебя появилась кнопка на основной клавиатуре\nПри нажатии на неё можно будет выбрать локацию на карте\n\n*Пришли широту и долготу в формате:* 50\.969043, 9\.797588", - 'distribution_registration_location_send_not_acceptable' => 'Не удалось обработать местоположение', - 'distribution_registration_location_send_latitude_too_small' => 'Широта должна быть \>\= 0 и \<\=90', - 'distribution_registration_location_send_latitude_too_big' => 'Широта должна быть \>\= 0 и \<\=90', - 'distribution_registration_location_send_longitude_too_small' => 'Долгота должна быть \>\= 0 и \<\=180', - 'distribution_registration_location_send_longitude_too_big' => 'Долгота должна быть \>\= 0 и \<\=180', - 'distribution_registration_location_update_success' => 'Местоположение заменено:', - 'distribution_registration_location_update_fail' => 'Не удалось заменить местоположение', - 'distribution_registration_button_confirm' => 'Подтвердить', - 'distribution_registration_button_cancel' => 'Отменить', - - // Локализация дистрибутива - 'distribution_localization_started' => 'Запущен процесс локализации дистрибутива', - 'distribution_localization_continiued' => 'Найден и продолжен процесс локализации дистрибутива', - 'distribution_localization_created' => 'Создана запись локализации дистрибутива в базе данных', - 'distribution_localization_not_created' => 'Не удалось создать запись локализации дистрибутива в базе данных', - 'distribution_localization_select_language_title' => 'Выбери язык', - 'distribution_localization_select_language_description' => "Выбранный язык позволит создать локализацию для пользователей с таким же языком\n\nТы можешь создать 1 локализацию для каждого языка", - - // Поиск дистрибутива - 'distribution_search_started' => 'Процесс поиска дистрибутива запущен', - 'distribution_search_not_started' => 'Процесс поиска дистрибутива не запущен', - 'distribution_search_ended' => 'Процесс поиска дистрибутива завершён', - 'distribution_search_not_localized' => 'Не удалось инициализировать локализацию дистрибутива', - 'distribution_search_not_named' => 'Нет названия', - 'distribution_search_continiued' => 'Процесс поиска дистрибутива найден и продолжен', - 'distribution_search_empty' => 'Не найдены дистрибутивы', - 'distribution_search_title' => 'Поиск дистрибутива', - 'distribution_search_members' => 'Участники', - 'distribution_search_location' => 'Местоположение', - 'distribution_search_page_next_exists' => 'В реестре есть ещё дистрибутивы', - 'distribution_search_page_next_not_exists' => 'В реестре больше нет дистрибутивов', - 'distribution_search_button_text' => 'Текст', - 'distribution_search_text_request_title' => 'Введи текст для поиска', - 'distribution_search_text_request_description' => 'Поиск будет проводиться по названиям с использованием функции Левенштейна', - 'distribution_search_text_request_not_acceptable' => 'Не удалось обработать поисковый текст', - 'distribution_search_text_request_too_short' => 'Длина поскового текста должна быть \>\= 3 и \<\= 64', - 'distribution_search_text_request_too_long' => 'Длина поискового текста должна быть \>\= 3 и \<\= 64', - 'distribution_search_text_request_restricted_characters_title' => "Запрещены любые символы кроме букв", - 'distribution_search_text_request_restricted_characters_description' => "Удали эти символы:", - 'distribution_search_text_update_success' => 'Поисковый текст заменён:', - 'distribution_search_text_update_fail' => 'Не удалось заменить поисковый текст', - 'distribution_search_button_location' => 'Местоположение', - 'distribution_search_button_location_send' => 'Отправить местоположение', - 'distribution_search_location_send_title' => 'Отправь местоположение', - 'distribution_search_location_send_description' => "У тебя появилась кнопка на основной клавиатуре\nПри нажатии на неё можно будет выбрать локацию на карте\n\n*Пришли широту и долготу в формате:* 50\.969043, 9\.797588", - 'distribution_search_location_send_not_acceptable' => 'Не удалось обработать местоположение', - 'distribution_search_location_send_latitude_too_small' => 'Широта должна быть \>\= 0 и \<\=90', - 'distribution_search_location_send_latitude_too_big' => 'Широта должна быть \>\= 0 и \<\=90', - 'distribution_search_location_send_longitude_too_small' => 'Долгота должна быть \>\= 0 и \<\=180', - 'distribution_search_location_send_longitude_too_big' => 'Долгота должна быть \>\= 0 и \<\=180', - 'distribution_search_location_update_success' => 'Местоположение заменено:', - 'distribution_search_location_update_fail' => 'Не удалось заменить местоположение', - 'distribution_search_button_distance' => 'Расстояние', - 'distribution_search_distance_request_title' => 'Введи расстояние', - 'distribution_search_distance_request_description' => 'Поиск будет производиться в радиусе от этого значения по формуле Винсенти', - 'distribution_search_distance_request_not_acceptable' => 'Не удалось обработать расстояние', - 'distribution_search_distance_request_too_short_km' => 'Длина расстояния должна быть \>\= 0 и \<\= 600', - 'distribution_search_distance_request_too_long_km' => 'Длина расстояния должна быть \>\= 0 и \<\= 600', - 'distribution_search_distance_request_restricted_characters_title' => "Запрещены любые символы кроме цифр", - 'distribution_search_distance_request_restricted_characters_description' => "Удали эти символы:", - 'distribution_search_distance_update_success' => 'Расстояние заменено:', - 'distribution_search_distance_update_fail' => 'Не удалось заменить расстояние', - 'distribution_search_button_confirmed' => 'Подтверждённые', - 'distribution_search_button_confirmed_all' => 'Все', - 'distribution_search_confirmed_update_success' => 'Фильтр по статусу заменён:', - 'distribution_search_confirmed_update_fail' => 'Не удалось заменить фильтр по статусу', - 'distribution_search_button_start' => 'Начать поиск', - 'distribution_search_button_end' => 'Завершить поиск', - 'distribution_search_button_page_next' => 'Следующая страница', - 'distribution_search_button_map' => 'Карта', - 'distribution_search_button_members' => 'Участники', - 'distribution_search_button_message' => 'Отправить сообщение', - 'distribution_search_km' => 'км', - 'distribution_search_mi' => 'мл', - // Авторизация 'not_authorized_system' => 'У тебя нет доступа к системе', - 'not_authorized_contact' => 'У тебя нет доступа к коммуникации с организацией', - 'not_authorized_request' => 'У тебя нет доступа к отправке запросов в организацию', + 'not_authorized_messages' => 'У тебя нет доступа к сообщениям', + 'not_authorized_joins' => 'У тебя нет доступа к вступлениям', 'not_authorized_settings' => 'У тебя нет доступа к настройкам', 'not_authorized_system_settings' => 'У тебя нет доступа к системным настройкам', + 'not_authorized_system_distributions' => 'У тебя нет доступа к администрированию дистрибутивов', // Прочее 'why_so_shroomious' => 'почему такой грибъёзный', diff --git a/svoboda/svoboder/system/members.baza b/svoboda/svoboder/system/members.baza new file mode 100644 index 0000000000000000000000000000000000000000..acae9392763f68da5446f5bc157c528c110637ac GIT binary patch literal 21 WcmZQ%U|?W`VkXZYiHt8;q8I@X76R}9 literal 0 HcmV?d00001 diff --git a/svoboda/svoboder/system/models/account.php b/svoboda/svoboder/system/models/account.php index e0707da..22921dd 100755 --- a/svoboda/svoboder/system/models/account.php +++ b/svoboda/svoboder/system/models/account.php @@ -5,7 +5,8 @@ declare(strict_types=1); namespace svoboda\svoboder\models; // Files of the project -use svoboda\svoboder\models\core; +use svoboda\svoboder\models\core, + svoboda\svoboder\models\account\localization; // Svoboda time use svoboda\time\statement as svoboda; @@ -48,6 +49,13 @@ final class account extends core */ public protected(set) database $database; + /** + * Localization + * + * @var localization $localization The localizations implementator + */ + public protected(set) localization $localization; + /** * Constructor * @@ -67,18 +75,21 @@ final class account extends core new column('language', type::string, ['length' => 2]), new column('robot', type::char), new column('authorized_system', type::char), - new column('authorized_contact', type::char), - new column('authorized_request', type::char), + new column('authorized_messages', type::char), + new column('authorized_joins', type::char), new column('authorized_settings', type::char), new column('authorized_system_accounts', type::char), new column('authorized_system_distributions', type::char), new column('authorized_system_members', type::char), /* new column('authorized_system_', type::char), */ new column('authorized_system_settings', type::char), - new column('created', type::integer_unsigned), - new column('updated', type::integer_unsigned) + new column('updated', type::integer_unsigned), + new column('created', type::integer_unsigned) ) ->connect($this->file); + + // Initializing the localizations implementator + $this->localization = new localization; } /** @@ -201,10 +212,18 @@ final class account extends core svoboda::timestamp() ); - // Creating the accound record in the database + // Creating the record in the database $created = $this->database->write($record); // Exit (success) return $created ? $identifier : false; } + + public function localizations(): array|false + { + + + // Exit (fail) + return false; + } } diff --git a/svoboda/svoboder/system/models/account/localization.php b/svoboda/svoboder/system/models/account/localization.php new file mode 100755 index 0000000..008e8de --- /dev/null +++ b/svoboda/svoboder/system/models/account/localization.php @@ -0,0 +1,105 @@ + + */ +final class localization extends core +{ + /** + * File + * + * @var string $database Path to the database file + */ + protected string $file = DATABASES . DIRECTORY_SEPARATOR . 'accounts' . DIRECTORY_SEPARATOR . 'localizations.baza'; + + /** + * Database + * + * @var database $database The database + */ + public protected(set) database $database; + + /** + * Constructor + * + * @return void + */ + public function __construct() + { + // Initializing the database + $this->database = new database() + ->encoding(encoding::utf8) + ->columns( + new column('identifier', type::integer_unsigned), + new column('account', type::integer_unsigned), + new column('language', type::string, ['length' => 2]), + new column('name', type::string, ['length' => 128]), + new column('updated', type::integer_unsigned), + new column('created', type::integer_unsigned) + ) + ->connect($this->file); + } + + /** + * Create + * + * Creates the account localization record in the database + * + * @param int $account Identifier of the account + * @param language $language Language + * @param string $name Name of the account + * + * @return int|false The record identifier, if created + */ + public function create(int $account, language $language, string $name): int|false + { + // Initializing the identifier + $identifier = $this->database->count() + 1; + + // Initializing the record + $record = $this->database->record( + $identifier, + $account, + $language->name, + $name, + svoboda::timestamp(), + svoboda::timestamp() + ); + + // Creating the record in the database + $created = $this->database->write($record); + + // Exit (success) + return $created ? $identifier : false; + } +} diff --git a/svoboda/svoboder/system/models/distribution.php b/svoboda/svoboder/system/models/distribution.php index 94e8c6a..53395d4 100755 --- a/svoboda/svoboder/system/models/distribution.php +++ b/svoboda/svoboder/system/models/distribution.php @@ -5,7 +5,9 @@ declare(strict_types=1); namespace svoboda\svoboder\models; // Files of the project -use svoboda\svoboder\models\core; +use svoboda\svoboder\models\core, + svoboda\svoboder\models\distribution\localization, + svoboda\svoboder\models\distribution\message; // Svoboda time use svoboda\time\statement as svoboda; @@ -48,6 +50,20 @@ final class distribution extends core */ public protected(set) database $database; + /** + * Localization + * + * @var localization $localization The localizations implementator + */ + public protected(set) localization $localization; + + /** + * Message + * + * @var localization $localization The messages implementator + */ + public protected(set) message $message; + /** * Constructor * @@ -61,13 +77,18 @@ final class distribution extends core ->columns( new column('identifier', type::integer_unsigned), new column('creator', type::integer_unsigned), - new column('accepted', type::char), new column('latitude', type::float), new column('longitude', type::float), - new column('created', type::integer_unsigned), - new column('updated', type::integer_unsigned) + new column('updated', type::integer_unsigned), + new column('created', type::integer_unsigned) ) ->connect($this->file); + + // Initializing the localizations implementator + $this->localization = new localization; + + // Initializing the messages implementator + $this->message = new message; } /** @@ -90,14 +111,13 @@ final class distribution extends core $record = $this->database->record( $identifier, $creator, - 0, $latitude, $longitude, svoboda::timestamp(), svoboda::timestamp() ); - // Creating the accound record in the database + // Creating the record in the database $created = $this->database->write($record); // Exit (success) diff --git a/svoboda/svoboder/system/models/localizations/distribution.php b/svoboda/svoboder/system/models/distribution/localization.php similarity index 79% rename from svoboda/svoboder/system/models/localizations/distribution.php rename to svoboda/svoboder/system/models/distribution/localization.php index 9098cc2..34fc6f9 100755 --- a/svoboda/svoboder/system/models/localizations/distribution.php +++ b/svoboda/svoboder/system/models/distribution/localization.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace svoboda\svoboder\models\localizations; +namespace svoboda\svoboder\models\distribution; // Files of the project use svoboda\svoboder\models\core, @@ -26,21 +26,21 @@ use Exception as exception, RuntimeException as exception_runtime; /** - * Distribution + * Localization * - * @package svoboda\svoboder\models\localizations + * @package svoboda\svoboder\models\distributions * * @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License * @author Arsen Mirzaev Tatyano-Muradovich */ -final class distribution extends core +final class localization extends core { /** * File * * @var string $database Path to the database file */ - protected string $file = DATABASES . DIRECTORY_SEPARATOR . 'localizations' . DIRECTORY_SEPARATOR . 'distributions.baza'; + protected string $file = DATABASES . DIRECTORY_SEPARATOR . 'distributions' . DIRECTORY_SEPARATOR . 'localizations.baza'; /** * Database @@ -63,9 +63,9 @@ final class distribution extends core new column('identifier', type::integer_unsigned), new column('distribution', type::integer_unsigned), new column('language', type::string, ['length' => 2]), - new column('name', type::string, ['length' => 32]), - new column('created', type::integer_unsigned), - new column('updated', type::integer_unsigned) + new column('name', type::string, ['length' => 64]), + new column('updated', type::integer_unsigned), + new column('created', type::integer_unsigned) ) ->connect($this->file); } @@ -77,7 +77,7 @@ final class distribution extends core * * @param int $distribution Identifier of the distribution * @param language $language Language - * @param string $name Name + * @param string $name Name of the distribution * * @return int|false The record identifier, if created */ @@ -96,7 +96,7 @@ final class distribution extends core svoboda::timestamp() ); - // Creating the accound record in the database + // Creating the record in the database $created = $this->database->write($record); // Exit (success) diff --git a/svoboda/svoboder/system/models/distribution/message.php b/svoboda/svoboder/system/models/distribution/message.php new file mode 100755 index 0000000..dbbb7ea --- /dev/null +++ b/svoboda/svoboder/system/models/distribution/message.php @@ -0,0 +1,105 @@ + + */ +final class message extends core +{ + /** + * File + * + * @var string $database Path to the database file + */ + protected string $file = DATABASES . DIRECTORY_SEPARATOR . 'distributions' . DIRECTORY_SEPARATOR . 'messages.baza'; + + /** + * Database + * + * @var database $database The database + */ + public protected(set) database $database; + + /** + * Constructor + * + * @return void + */ + public function __construct() + { + // Initializing the database + $this->database = new database() + ->encoding(encoding::ascii) + ->columns( + new column('identifier', type::integer_unsigned), + new column('distribution', type::integer_unsigned), + new column('account', type::integer_unsigned), + new column('text', type::string, ['length' => 512]), + new column('updated', type::integer_unsigned), + new column('created', type::integer_unsigned) + ) + ->connect($this->file); + } + + /** + * Create + * + * Creates the message record in the database + * + * @param int $distribution Identifier of the distribution + * @param int $account Identifier of the account + * @param string $text Text + * + * @return int|false The record identifier, if created + */ + public function create(int $distribution, int $account, string $text): int|false + { + // Initializing the identifier + $identifier = $this->database->count() + 1; + + // Initializing the record + $record = $this->database->record( + $identifier, + $distribution, + $account, + $text, + svoboda::timestamp(), + svoboda::timestamp() + ); + + // Creating the record in the database + $created = $this->database->write($record); + + // Exit (success) + return $created ? $identifier : false; + } +} diff --git a/svoboda/svoboder/system/models/enumerations/entity.php b/svoboda/svoboder/system/models/enumerations/entity.php index 488c7e0..a3ff2e0 100755 --- a/svoboda/svoboder/system/models/enumerations/entity.php +++ b/svoboda/svoboder/system/models/enumerations/entity.php @@ -14,8 +14,9 @@ namespace svoboda\svoboder\models\enumerations; * @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License * @author Arsen Mirzaev Tatyano-Muradovich */ -enum entity +enum entity: int { - case account; - case distribution; + case system = 0; + case account = 1; + case distribution = 2; } diff --git a/svoboda/svoboder/system/models/enumerations/member/status.php b/svoboda/svoboder/system/models/enumerations/member/status.php new file mode 100755 index 0000000..15bad5a --- /dev/null +++ b/svoboda/svoboder/system/models/enumerations/member/status.php @@ -0,0 +1,39 @@ + + */ +enum status: int +{ + case unknown = 0; + case planned = 1; + case joined = 2; + + /** + * Emoji + * + * Initialize emoji of the status + * + * @return string Emoji of the status + */ + public function emoji(): string + { + // Exit (success) + return match ($this) { + status::unknown => '👽', + status::planned => '📅', + status::joined => '🧳' + }; + } +} diff --git a/svoboda/svoboder/system/models/member.php b/svoboda/svoboder/system/models/member.php new file mode 100755 index 0000000..8566043 --- /dev/null +++ b/svoboda/svoboder/system/models/member.php @@ -0,0 +1,113 @@ + + */ +final class member extends core +{ + /** + * File + * + * @var string $database Path to the database file + */ + protected string $file = DATABASES . DIRECTORY_SEPARATOR . 'members.baza'; + + /** + * Database + * + * Identifier: The record identifier + * Distribution: The distribution + * Account: The account + * Status: 1 - planned; 2 - joined + * Updated: Timestamp of the last the record update + * Created: Timestamp of the record creating + * + * @var database $database The database + */ + public protected(set) database $database; + + /** + * Constructor + * + * @return void + */ + public function __construct() + { + // Initializing the database + $this->database = new database() + ->encoding(encoding::ascii) + ->columns( + new column('identifier', type::integer_unsigned), + new column('distribution', type::integer_unsigned), + new column('account', type::integer_unsigned), + new column('status', type::char), + new column('updated', type::integer_unsigned), + new column('created', type::integer_unsigned) + ) + ->connect($this->file); + } + + /** + * Create + * + * Creates the member record in the database + * + * @param int $distribution Identifier of the distribution + * @param int $account Identifier of the account + * @param status $status The distribution memberhip status + * + * @return int|false The record identifier, if created + */ + public function create(int $distribution, int $account, status $status = status::unknown): int|false + {var_dump($this->database->count()); + // Initializing the identifier + $identifier = $this->database->count() + 1; + + // Initializing the record + $record = $this->database->record( + $identifier, + $distribution, + $account, + $status->value, + svoboda::timestamp(), + svoboda::timestamp() + ); + + // Creating the record in the database + $created = $this->database->write($record); + + // Exit (success) + return $created ? $identifier : false; + } +} diff --git a/svoboda/svoboder/system/models/telegram/account.php b/svoboda/svoboder/system/models/telegram/account.php new file mode 100755 index 0000000..865e995 --- /dev/null +++ b/svoboda/svoboder/system/models/telegram/account.php @@ -0,0 +1,160 @@ + + */ +final class account extends core +{ + /** + * Localizations + * + * Sends a message with the localizations menu + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function localizations(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Initializing the title + $title = '🗺 *' . $localization['account_localization_title'] . '*'; + + // Initializing the account model + $model_account = new model; + + // Initializing existed account localizations + $existed = $model_account->localization->database->read( + filter: fn(record $localization) => $localization->account === $account->identifier, + amount: ACCOUNT_LOCALIZATION_ACCOUNT_LOCALIZATIONS_AMOUNT + ); + + // Initializing localizations amount + $amount = '*' . $localization['account_localization_amount'] . ':* ' . count($existed); + + // Declaring the buffer of generated keyboard with languages + $keyboard = []; + + // Initializing the iterator of rows + $row = 0; + + foreach ($existed as $record) { + // Iterating over existed account localizations + + try { + // Initializing the localization language + $language = language::{$record->language}; + + // Initializing the row + $keyboard[$row] ??= []; + + // Writing the language choose button into the buffer of generated keyboard with languages + $keyboard[$row][] = [ + 'text' => ($language->flag() ? $language->flag() . ' ' : '') . $language->label($language), + 'callback_data' => "account_localization_update_$language->name" + ]; + + // When reaching 4 buttons in a row, move to the next row + if (count($keyboard[$row]) === 4) ++$row; + } catch (error $error) { + // Sending the message + $context->sendMessage('⚠️ *' . $localization['account_localization_create_failted_to_initialize_language'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + if (count($existed) !== count(language::cases())) { + // Not all languages in the registry have localizations created (expected) + + // Writing the button for helping lozalizing + $keyboard[$row === 0 && empty($keyboard[0]) ? 0 : ++$row] = [ + [ + 'text' => '✏️ ' . $localization['account_localization_create'], + 'callback_data' => 'account_localization_create_start' + ] + ]; + } + + // Sending the message + $context->sendMessage( + << [ + 'inline_keyboard' => $keyboard, + 'disable_notification' => true, + 'remove_keyboard' => true + ], + ] + )->then(function (message $message) use ($context) { + // Sended the message + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } +} diff --git a/svoboda/svoboder/system/models/telegram/buttons/account/localization/create.php b/svoboda/svoboder/system/models/telegram/buttons/account/localization/create.php new file mode 100755 index 0000000..bfa523d --- /dev/null +++ b/svoboda/svoboder/system/models/telegram/buttons/account/localization/create.php @@ -0,0 +1,228 @@ + + */ +final class create extends core +{ + /** + * Language + * + * Send the language selection menu + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function language(context $context) + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing language + $language = $context->get('language'); + + if ($language) { + // Initialized language + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(process_account_localization_create::PROCESS) + ->then(function (?array $process) use ($context, $account, $localization) { + // Readed from the telegram user buffer + + if ($process) { + // Found started account localization create process + + // Initializing the account model + $model_account = new account; + + // Initializing the account localizations + $existed = $model_account->localization->database->read( + filter: fn(record $localization) => $localization->account === $account->identifier, + amount: ACCOUNT_LOCALIZATION_CREATE_ACCOUNT_LOCALIZATIONS_AMOUNT + ); + + // Declaring the buffer of languages to exclude + $exclude = []; + + // Initializing languages to exclude + foreach ($existed as $record) $exclude[] = $record->language; + + if (count($exclude) !== count(language::cases())) { + // Not all languages in the registry have localizations created (expected) + + // Sending the language selection + selections::language( + context: $context, + prefix: 'account_localization_create_select_language_', + title: '🌏 *' . $localization['account_localization_create_select_language_title'] . '*', + description: '🌏 *' . $localization['account_localization_create_select_language_description'] . '*', + exclude: $exclude + ); + } else { + // All languages in the registry have localizations created (expected) + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['account_localization_create_every_language_created'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not found started account localization create process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['account_localization_create_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized language + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize language*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Name + * + * Request to enter name + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function name(context $context) + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(process_account_localization_create::PROCESS) + ->then(function (?array $process) use ($context, $account, $localization) { + // Readed from the telegram user buffer + + if ($process) { + // Found started account localization create process + + // Sending the message + $context->sendMessage('📄 *' . $localization['account_localization_create_name_request'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Writing into the account localization create buffer + $context->nextStep([process_account_localization_create::class, 'name']); + }); + } else { + // Not found started account localization create process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['account_localization_create_not_started'] . '*'); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } +} diff --git a/svoboda/svoboder/system/models/telegram/buttons/account/localization/update.php b/svoboda/svoboder/system/models/telegram/buttons/account/localization/update.php new file mode 100755 index 0000000..3670a11 --- /dev/null +++ b/svoboda/svoboder/system/models/telegram/buttons/account/localization/update.php @@ -0,0 +1,102 @@ + + */ +final class update extends core +{ + /** + * Name + * + * Request to enter name + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function name(context $context) + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(process_account_localization_update::PROCESS) + ->then(function (?array $process) use ($context, $account, $localization) { + // Readed from the telegram user buffer + + if ($process) { + // Found started account localization update process + + // Sending the message + $context->sendMessage('📄 *' . $localization['account_localization_update_name_request'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Writing into the account localization update buffer + $context->nextStep([process_account_localization_update::class, 'name']); + }); + } else { + // Not found started account localization update process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['account_localization_update_not_started'] . '*'); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } +} diff --git a/svoboda/svoboder/system/models/telegram/buttons/distribution/registration.php b/svoboda/svoboder/system/models/telegram/buttons/distribution/declaration.php similarity index 76% rename from svoboda/svoboder/system/models/telegram/buttons/distribution/registration.php rename to svoboda/svoboder/system/models/telegram/buttons/distribution/declaration.php index f0779c8..76a42a5 100755 --- a/svoboda/svoboder/system/models/telegram/buttons/distribution/registration.php +++ b/svoboda/svoboder/system/models/telegram/buttons/distribution/declaration.php @@ -8,9 +8,8 @@ namespace svoboda\svoboder\models\telegram\buttons\distribution; use svoboda\svoboder\models\core, svoboda\svoboder\models\account, svoboda\svoboder\models\distribution, - svoboda\svoboder\models\telegram\selections, - svoboda\svoboder\models\telegram\processes\distribution\registration as process_distribution_registration, - svoboda\svoboder\models\localization\distribution as distribution_localization, + svoboda\svoboder\models\telegram\processes\language\select as process_language_select, + svoboda\svoboder\models\telegram\processes\distribution\declaration as process_distribution_declaration, svoboda\svoboder\models\enumerations\language; // Framework for Telegram @@ -21,14 +20,14 @@ use Zanzara\Context as context, use mirzaev\baza\record; /** - * Telegram distribution registration buttons + * Telegram distribution declaration buttons * * @package svoboda\svoboder\models\telegram\buttons\distribution * * @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License * @author Arsen Mirzaev Tatyano-Muradovich */ -final class registration extends core +final class declaration extends core { /** * Language @@ -60,25 +59,25 @@ final class registration extends core // Initialized localization // Reading from the telegram user buffer - $context->getUserDataItem('distribution_registration') + $context->getUserDataItem(process_distribution_declaration::PROCESS) ->then(function ($distribution) use ($context, $account, $localization) { // Readed from the telegram user buffer if ($distribution) { - // Found started registration process + // Found started declaration process // Sending the language selection - selections::language( + process_language_select::menu( context: $context, - prefix: 'distribution_registration_select_language_', - title: '🌏 *' . $localization['distribution_registration_select_language_title'] . '*', - description: '🌏 *' . $localization['distribution_registration_select_language_description'] . '*' + prefix: 'distribution_declaration_select_language_', + title: '🌏 *' . $localization['distribution_declaration_select_language_title'] . '*', + description: '🌏 *' . $localization['distribution_declaration_select_language_description'] . '*' ); } else { - // Not found started registration process + // Not found started declaration process // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_registration_not_started'] . '*'); + $context->sendMessage('⚠️ *' . $localization['distribution_declaration_not_started'] . '*'); } }); } else { @@ -137,26 +136,26 @@ final class registration extends core // Initialized localization // Reading from the telegram user buffer - $context->getUserDataItem('distribution_registration') + $context->getUserDataItem(process_distribution_declaration::PROCESS) ->then(function ($distribution) use ($context, $account, $localization) { // Readed from the telegram user buffer if ($distribution) { - // Found started registration process + // Found started declaration process // Sending the message - $context->sendMessage('📄 *' . $localization['distribution_registration_name_request'] . '*') + $context->sendMessage('📄 *' . $localization['distribution_declaration_name_request'] . '*') ->then(function (message $message) use ($context) { // Sended the message - // Writing into the distribution registration buffer - $context->nextStep([process_distribution_registration::class, 'name']); + // Writing into the distribution declaration buffer + $context->nextStep([process_distribution_declaration::class, 'name']); }); } else { - // Not found started registration process + // Not found started declaration process // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_registration_not_started'] . '*'); + $context->sendMessage('⚠️ *' . $localization['distribution_declaration_not_started'] . '*'); } }); } else { @@ -205,18 +204,18 @@ final class registration extends core // Initialized localization // Reading from the telegram user buffer - $context->getUserDataItem('distribution_registration') + $context->getUserDataItem(process_distribution_declaration::PROCESS) ->then(function ($distribution) use ($context, $account, $localization) { // Readed from the telegram user buffer if ($distribution) { - // Found started registration process + // Found started declaration process // Initializing the message title - $title = '🗺 *' . $localization['distribution_registration_location_send_title'] . '*'; + $title = '🗺 *' . $localization['distribution_declaration_location_send_title'] . '*'; // Initializing the message description - $description = $localization['distribution_registration_location_send_description']; + $description = $localization['distribution_declaration_location_send_description']; // Sending the message $context->sendMessage( @@ -230,7 +229,7 @@ final class registration extends core 'keyboard' => [ [ [ - 'text' => '🗺 ' . $localization['distribution_registration_button_location_send'], + 'text' => '🗺 ' . $localization['distribution_declaration_button_location_send'], 'request_location' => true ] ], @@ -242,14 +241,14 @@ final class registration extends core )->then(function (message $message) use ($context) { // Sended the message - // Writing into the distribution registration buffer - $context->nextStep([process_distribution_registration::class, 'location']); + // Writing into the distribution declaration buffer + $context->nextStep([process_distribution_declaration::class, 'location']); }); } else { - // Not found started registration process + // Not found started declaration process // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_registration_not_started'] . '*'); + $context->sendMessage('⚠️ *' . $localization['distribution_declaration_not_started'] . '*'); } }); } else { diff --git a/svoboda/svoboder/system/models/telegram/buttons/distribution/search.php b/svoboda/svoboder/system/models/telegram/buttons/distribution/search.php index f3f2d11..7706358 100755 --- a/svoboda/svoboder/system/models/telegram/buttons/distribution/search.php +++ b/svoboda/svoboder/system/models/telegram/buttons/distribution/search.php @@ -6,17 +6,18 @@ namespace svoboda\svoboder\models\telegram\buttons\distribution; // Files of the project use svoboda\svoboder\models\core, - svoboda\svoboder\models\account, svoboda\svoboder\models\distribution, - svoboda\svoboder\models\telegram\selections, + svoboda\svoboder\models\member, svoboda\svoboder\models\telegram\processes\distribution\search as process_distribution_search, - svoboda\svoboder\models\localization\distribution as distribution_localization, - svoboda\svoboder\models\enumerations\language; + svoboda\svoboder\models\enumerations\member\status; // Framework for Telegram use Zanzara\Context as context, Zanzara\Telegram\Type\Message as message; +// Svoboda time +use svoboda\time\statement as svoboda; + // Baza database use mirzaev\baza\record; @@ -31,15 +32,15 @@ use mirzaev\baza\record; final class search extends core { /** - * Text + * Name * - * Request to enter search text + * Request to enter search name * * @param context $context Request data from Telegram * * @return void */ - public static function text(context $context) + public static function name(context $context) { // Initializing the account $account = $context->get('account'); @@ -54,7 +55,7 @@ final class search extends core // Initialized localization // Reading from the telegram user buffer - $context->getUserDataItem('distribution_search') + $context->getUserDataItem(process_distribution_search::PROCESS) ->then(function ($search) use ($context, $account, $localization) { // Readed from the telegram user buffer @@ -62,10 +63,10 @@ final class search extends core // Found started search process // Initializing title for the message - $title = '📄 *' . $localization['distribution_search_text_request_title'] . '*'; + $title = '📄 *' . $localization['distribution_search_name_request_title'] . '*'; // Initializing description for the message - $description = $localization['distribution_search_text_request_description']; + $description = $localization['distribution_search_name_request_description']; // Sending the message $context->sendMessage(<<nextStep([process_distribution_search::class, 'text']); + $context->nextStep([process_distribution_search::class, 'name']); }); } else { // Not found started search process @@ -132,7 +133,7 @@ final class search extends core // Initialized localization // Reading from the telegram user buffer - $context->getUserDataItem('distribution_search') + $context->getUserDataItem(process_distribution_search::PROCESS) ->then(function ($search) use ($context, $account, $localization) { // Readed from the telegram user buffer @@ -224,7 +225,7 @@ final class search extends core // Initialized localization // Reading from the telegram user buffer - $context->getUserDataItem('distribution_search') + $context->getUserDataItem(process_distribution_search::PROCESS) ->then(function ($search) use ($context, $account, $localization) { // Readed from the telegram user buffer @@ -278,4 +279,1221 @@ final class search extends core }); } } + + /** + * Plan + * + * Request to plan to join to the distribution + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function plan(context $context) + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Initializing the message + $message = $context->getCallbackQuery()->getMessage(); + + if ($message instanceof message) { + // Initialized the message + + // Initializing the distribution information + preg_match('/^(\d+)(?:\s)?(\w+\s*\w*\s*\w*)(?:\s)?(🪽)?$/muU', $message->getText(), $matches); + $identifier = (int) $matches[1]; + $name = $matches[2]; + $recognized = isset($matches[3]) && $matches[3] === '🪽'; + + if (!empty($identifier) && $identifier !== 0) { + // Initialized the distribution identifier + + // Initializing the distribution model + $model_distribution = new distribution; + + // Initializing the distribution + $distribution = $model_distribution->database->read( + filter: fn(record $record) => $record->identifier === $identifier, + amount: 1 + )[0] ?? null; + + if ($distribution instanceof record) { + // Initialized the distribution + + // Initializing the member model + $model_member = new member; + + // Initializing function of the message join buttom updating + $update = function (context $context, record $member) use ($account, $localization, $distribution, $name, $recognized, $model_member): void { + // Searching for the another member records + $another = $model_member->database->read( + filter: fn(record $record) => $record->identifier !== $member->identifier && $record->account === $member->accoount && $record->status !== status::unknown->value, + amount: 1 + )[0] ?? null; + + // Initializing the updated inline keyboard of the message + $keyboard = process_distribution_search::keyboard( + distribution: $distribution, + member: $another ?? $member, + localization: $localization, + messages: $account->authorized_messages === 1, + joins: $account->authorized_joins === 1, + ); + + // Initializing the updated text of the message + $text = process_distribution_search::message( + distribution: $distribution, + localization: $localization, + name: $name, + recognized: $recognized + ); + + // Sending the updated message inline keyboard + $context->editMessageText( + $text, + [ + 'message_inline_id' => $context->getCallbackQuery()->getInlineMessageId(), + 'reply_markup' => ['inline_keyboard' => $keyboard] + ] + ); + }; + + if (!empty($model_member->database->read( + filter: fn(record $member) => $member->distribution !== $distribution->identifier && $member->account === $account->identifier && $member->status === status::joined->value, + amount: 1 + ))) { + // Found joining to another distribution + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_another_joined'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } else { + // Not found joining to another distribution + + + if (!empty($model_member->database->read( + filter: fn(record $member) => $member->distribution !== $distribution->identifier && $member->account === $account->identifier && $member->status === status::planned->value, + amount: 1 + ))) { + // Found planning to join to another distribution + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_another_planned'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } else { + // Not found planned to join to another distribution + + // Searching for the member record + $member = $model_member->database->read( + filter: fn(record $record) => $record->distribution === $distribution->identifier && $record->account === $account->identifier, + amount: 1 + )[0] ?? null; + + if ($member instanceof record) { + // Found the member of the distribution + + if ($member->status === status::unknown->value) { + // The account has leaved the distribution + + // Updating the member record + $updated = $model_member->database->read( + filter: fn(record $record) => $record->identifier === $member->identifier, + update: function (record &$record) { + $record->status = status::planned->value; + $record->updated = svoboda::timestamp(); + }, + amount: 1 + )[0] ?? null; + + if ($updated) { + // Updated the member record + + // Deprecating other records + $model_member->database->read( + filter: fn(record $record) => $record->identifier !== $updated->identifier && $record->account === $updated->account, + update: function (record &$record) { + $record->status = status::unknown->value; + $record->updated = svoboda::timestamp(); + }, + amount: DISTRIBUTIONS_SEARCH_MEMBER_DEPRECATING_RECORDS_AMOUNT + )[0] ?? null; + + // Sending the message + $context->sendMessage('📅 *' . $localization['distribution_search_planned'] . '*') + ->then(function (message $message) use ($context, $update, $updated) { + // Sended the message + + // Updating the message with the plan button + $update($context, $updated); + + // Ending the conversation process + $context->endConversation(); + }); + } else { + // Not updated the member record + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_member_not_updated'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else if ($member->status === status::planned->value) { + // The account has already planned to join to the distribution + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_already_planned'] . '*') + ->then(function (message $message) use ($context, $update, $member) { + // Sended the message + + // Updating the message with the plan button + $update($context, $member); + + // Ending the conversation process + $context->endConversation(); + }); + } else if ($member->status === status::joined->value) { + // The account has already joined to the distribution + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_already_joined'] . '*') + ->then(function (message $message) use ($context, $update, $member) { + // Sended the message + + // Updating the message with the plan button + $update($context, $member); + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not found the member of the distribution + + // Creating the member record + $record = $model_member->create( + distribution: $distribution->identifier, + account: $account->identifier, + status: status::planned + ); + + if ($record) { + // Created the member record + + // Searching for the member record + $member = $model_member->database->read( + filter: fn(record $member) => $member->identifier === $record, + amount: 1 + )[0] ?? null; + + if ($member instanceof record) { + // Found the member of the distribution + + // Deprecating other records + $model_member->database->read( + filter: fn(record $record) => $record->identifier !== $member->identifier && $record->account === $member->account, + update: function (record &$record) { + $record->status = status::unknown->value; + $record->updated = svoboda::timestamp(); + }, + amount: DISTRIBUTIONS_SEARCH_MEMBER_DEPRECATING_RECORDS_AMOUNT + )[0] ?? null; + + // Sending the message + $context->sendMessage('📅 *' . $localization['distribution_search_planned'] . '*') + ->then(function (message $message) use ($context, $update, $member) { + // Sended the message + + // Updating the message with the plan button + $update($context, $member); + + // Ending the conversation process + $context->endConversation(); + }); + } else { + // Not found the member of the distribution + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_member_not_created'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not created the member record + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_member_not_created'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + } + } + } else { + // Not initialized the distribution + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_distribution_not_initialized'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the distribution identifier + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_distribution_not_initialized'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the message + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_message_not_initialized'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Unplan + * + * Request to unplan to join to the distribution + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function unplan(context $context) + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Initializing the message + $message = $context->getCallbackQuery()->getMessage(); + + if ($message instanceof message) { + // Initialized the message + + // Initializing the distribution information + preg_match('/^(\d+)(?:\s)?(\w+\s*\w*\s*\w*)(?:\s)?(🪽)?$/muU', $message->getText(), $matches); + $identifier = (int) $matches[1]; + $name = $matches[2]; + $recognized = isset($matches[3]) && $matches[3] === '🪽'; + + if (!empty($identifier) && $identifier !== 0) { + // Initialized the distribution identifier + + // Initializing the distribution model + $model_distribution = new distribution; + + // Initializing the distribution + $distribution = $model_distribution->database->read( + filter: fn(record $record) => $record->identifier === $identifier, + amount: 1 + )[0] ?? null; + + if ($distribution instanceof record) { + // Initialized the distribution + + // Initializing the member model + $model_member = new member; + + // Initializing function of the message join buttom updating + $update = function (context $context, record $member) use ($account, $localization, $distribution, $name, $recognized): void { + // Initializing the updated inline keyboard of the message + $keyboard = process_distribution_search::keyboard( + distribution: $distribution, + member: $member, + localization: $localization, + messages: $account->authorized_messages === 1, + joins: $account->authorized_joins === 1, + ); + + // Initializing the updated text of the message + $text = process_distribution_search::message( + distribution: $distribution, + localization: $localization, + name: $name, + recognized: $recognized + ); + + // Sending the updated message inline keyboard + $context->editMessageText( + $text, + [ + 'message_inline_id' => $context->getCallbackQuery()->getInlineMessageId(), + 'reply_markup' => ['inline_keyboard' => $keyboard] + ] + ); + }; + + // Searching for the member record + $member = $model_member->database->read( + filter: fn(record $record) => $record->distribution === $distribution->identifier && $record->account === $account->identifier, + amount: 1 + )[0] ?? null; + + if ($member instanceof record) { + // Found the member of the distribution + + if ($member->status === status::unknown->value) { + // The account has leaved the distribution + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_already_unplanned'] . '*') + ->then(function (message $message) use ($context, $update, $member) { + // Sended the message + + // Updating the message with the plan button + $update($context, $member); + + // Ending the conversation process + $context->endConversation(); + }); + } else if ($member->status === status::planned->value) { + // The account has planned to join to the distribution + + // Updating the member record + $updated = $model_member->database->read( + filter: fn(record $record) => $record->identifier === $member->identifier, + update: function (record &$record) { + $record->status = status::unknown->value; + $record->updated = svoboda::timestamp(); + }, + amount: 1 + )[0] ?? null; + + if ($updated) { + // Updated the member record + + // Sending the message + $context->sendMessage('❌ *' . $localization['distribution_search_unplanned'] . '*') + ->then(function (message $message) use ($context, $update, $updated) { + // Sended the message + + // Updating the message with the plan button + $update($context, $updated); + + // Ending the conversation process + $context->endConversation(); + }); + } else { + // Not updated the member record + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_member_not_updated'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else if ($member->status === status::joined->value) { + // The account has already joined to the distribution + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_already_joined'] . '*') + ->then(function (message $message) use ($context, $update, $member) { + // Sended the message + + // Updating the message with the plan button + $update($context, $member); + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not found the member of the distribution + + // Creating the member record + $record = $model_member->create( + distribution: $distribution->identifier, + account: $account->identifier, + status: status::unknown + ); + + if ($record) { + // Created the member record + + // Searching for the member record + $member = $model_member->database->read( + filter: fn(record $member) => $member->identifier === $record, + amount: 1 + )[0] ?? null; + + if ($member instanceof record) { + // Found the member of the distribution + + // Sending the message + $context->sendMessage('❌ *' . $localization['distribution_search_unplanned'] . '*') + ->then(function (message $message) use ($context, $update, $member) { + // Sended the message + + // Updating the message with the plan button + $update($context, $member); + + // Ending the conversation process + $context->endConversation(); + }); + } else { + // Not found the member of the distribution + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_member_not_created'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not created the member record + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_member_not_created'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + } else { + // Not initialized the distribution + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_distribution_not_initialized'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the distribution identifier + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_distribution_not_initialized'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the message + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_message_not_initialized'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Join + * + * Request to join to the distribution + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function join(context $context) + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Initializing the message + $message = $context->getCallbackQuery()->getMessage(); + + if ($message instanceof message) { + // Initialized the message + + // Initializing the distribution information + preg_match('/^(\d+)(?:\s)?(\w+\s*\w*\s*\w*)(?:\s)?(🪽)?$/muU', $message->getText(), $matches); + $identifier = (int) $matches[1]; + $name = $matches[2]; + $recognized = isset($matches[3]) && $matches[3] === '🪽'; + + if (!empty($identifier) && $identifier !== 0) { + // Initialized the distribution identifier + + // Initializing the distribution model + $model_distribution = new distribution; + + // Initializing the distribution + $distribution = $model_distribution->database->read( + filter: fn(record $record) => $record->identifier === $identifier, + amount: 1 + )[0] ?? null; + + if ($distribution instanceof record) { + // Initialized the distribution + + // Initializing the distribution model + $model_member = new member; + + // Initializing function of the message join buttom updating + $update = function (context $context, record $member) use ($account, $localization, $distribution, $name, $recognized, $model_member): void { + // Searching for the another member records + $another = $model_member->database->read( + filter: fn(record $record) => $record->identifier !== $member->identifier && $record->account === $member->accoount && $record->status !== status::unknown->value, + amount: 1 + )[0] ?? null; + + // Initializing the updated inline keyboard of the message + $keyboard = process_distribution_search::keyboard( + distribution: $distribution, + member: $another ?? $member, + localization: $localization, + messages: $account->authorized_messages === 1, + joins: $account->authorized_joins === 1, + ); + + // Initializing the updated text of the message + $text = process_distribution_search::message( + distribution: $distribution, + localization: $localization, + name: $name, + recognized: $recognized + ); + + // Sending the updated message inline keyboard + $context->editMessageText( + $text, + [ + 'message_inline_id' => $context->getCallbackQuery()->getInlineMessageId(), + 'reply_markup' => ['inline_keyboard' => $keyboard] + ] + ); + }; + + if (!empty($model_member->database->read( + filter: fn(record $member) => $member->distribution !== $distribution->identifier && $member->account === $account->identifier && $member->status === status::joined->value, + amount: 1 + ))) { + // Found joining to another distribution + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_another_joined'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } else { + // Not found joining to another distribution + + // Searching for the member record + $member = $model_member->database->read( + filter: fn(record $member) => $member->distribution === $distribution->identifier && $member->account === $account->identifier, + amount: 1 + )[0] ?? null; + + if ($member instanceof record) { + // Found the member of the distribution + + if ($member->status === status::unknown->value || $member->status === status::planned->value) { + // The account has planned to join to the distribution or leaved the distribution + + // Updating the member record + $updated = $model_member->database->read( + filter: fn(record $record) => $record->identifier === $member->identifier, + update: function (record &$record) { + $record->status = status::joined->value; + $record->updated = svoboda::timestamp(); + }, + amount: 1 + )[0] ?? null; + + if ($updated instanceof record) { + // Updated the member record + + // Deprecating other records + $model_member->database->read( + filter: fn(record $record) => $record->identifier !== $updated->identifier && $record->account === $updated->account, + update: function (record &$record) { + $record->status = status::unknown->value; + $record->updated = svoboda::timestamp(); + }, + amount: DISTRIBUTIONS_SEARCH_MEMBER_DEPRECATING_RECORDS_AMOUNT + )[0] ?? null; + + // Initializing the message title + $title = '🤝 *' . $localization['distribution_search_joined_title'] . '*'; + + // Initializing the message description + $description = $localization['distribution_search_joined_description']; + + // Sending the message + $context->sendMessage( + <<then(function (message $message) use ($context, $update, $updated) { + // Sended the message + + // Updating the message with the join button + $update($context, $updated); + + // Ending the conversation process + $context->endConversation(); + }); + } else { + // Not updated the member record + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_member_not_updated'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else if ($member->status === status::joined->value) { + // The account has already joined to the distribution + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_already_joined'] . '*') + ->then(function (message $message) use ($context, $update, $member) { + // Sended the message + + // Updating the message with the join button + $update($context, $member); + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not found the member of the distribution + + // Creating the member record + $record = $model_member->create( + distribution: $distribution->identifier, + account: $account->identifier, + status: status::joined + ); + + if ($record) { + // Created the member record + + // Searching for the member record + $member = $model_member->database->read( + filter: fn(record $member) => $member->identifier === $record, + amount: 1 + )[0] ?? null; + + if ($member instanceof record) { + // Found the member of the distribution + + // Deprecating other records + $model_member->database->read( + filter: fn(record $record) => $record->identifier !== $member->identifier && $record->account === $member->account, + update: function (record &$record) { + $record->status = status::unknown->value; + $record->updated = svoboda::timestamp(); + }, + amount: DISTRIBUTIONS_SEARCH_MEMBER_DEPRECATING_RECORDS_AMOUNT + )[0] ?? null; + + // Initializing the message title + $title = '🤝 *' . $localization['distribution_search_joined_title'] . '*'; + + // Initializing the message description + $description = $localization['distribution_search_joined_description']; + + // Sending the message + $context->sendMessage( + <<then(function (message $message) use ($context, $update, $member) { + // Sended the message + + // Updating the message with the join button + $update($context, $member); + + // Ending the conversation process + $context->endConversation(); + }); + } else { + // Not found the member of the distribution + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_member_not_created'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not created the member record + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_member_not_created'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + } + } else { + // Not initialized the distribution + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_distribution_not_initialized'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the distribution identifier + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_distribution_not_initialized'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the message + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_message_not_initialized'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Leave + * + * Request to leave from the distribution + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function leave(context $context) + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Initializing the message + $message = $context->getCallbackQuery()->getMessage(); + + if ($message instanceof message) { + // Initialized the message + + // Initializing the distribution information + preg_match('/^(\d+)(?:\s)?(\w+\s*\w*\s*\w*)(?:\s)?(🪽)?$/muU', $message->getText(), $matches); + $identifier = (int) $matches[1]; + $name = $matches[2]; + $recognized = isset($matches[3]) && $matches[3] === '🪽'; + + if (!empty($identifier) && $identifier !== 0) { + // Initialized the distribution identifier + + // Initializing the distribution model + $model_distribution = new distribution; + + // Initializing the distribution + $distribution = $model_distribution->database->read( + filter: fn(record $record) => $record->identifier === $identifier, + amount: 1 + )[0] ?? null; + + if ($distribution instanceof record) { + // Initialized the distribution + + // Initializing the member model + $model_member = new member; + + // Initializing function of the message join buttom updating + $update = function (context $context, record $member) use ($account, $localization, $distribution, $name, $recognized): void { + // Initializing the updated inline keyboard of the message + $keyboard = process_distribution_search::keyboard( + distribution: $distribution, + member: $member, + localization: $localization, + messages: $account->authorized_messages === 1, + joins: $account->authorized_joins === 1, + ); + + // Initializing the updated text of the message + $text = process_distribution_search::message( + distribution: $distribution, + localization: $localization, + name: $name, + recognized: $recognized + ); + + // Sending the updated message inline keyboard + $context->editMessageText( + $text, + [ + 'message_inline_id' => $context->getCallbackQuery()->getInlineMessageId(), + 'reply_markup' => ['inline_keyboard' => $keyboard] + ] + ); + }; + + // Searching for the member record + $member = $model_member->database->read( + filter: fn(record $record) => $record->distribution === $distribution->identifier && $record->account === $account->identifier, + amount: 1 + )[0] ?? null; + + if ($member instanceof record) { + // Found the member of the distribution + + if ($member->status === status::unknown->value || $member->status === status::planned->value) { + // The account has planned to join to the distribution or leaved the distribution + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_already_leaved'] . '*') + ->then(function (message $message) use ($context, $update, $member) { + // Sended the message + + // Updating the message with the join button + $update($context, $member); + + // Ending the conversation process + $context->endConversation(); + }); + } else if ($member->status === 2) { + // The account has joined to the distribution + + // Updating the member record + $updated = $model_member->database->read( + filter: fn(record $record) => $record->identifier === $member->identifier, + update: function (record &$record) { + $record->status = status::unknown->value; + $record->updated = svoboda::timestamp(); + }, + amount: 1 + )[0] ?? null; + + if ($updated instanceof record) { + // Updated the member record + + // Sending the message + $context->sendMessage('👋 *' . $localization['distribution_search_leaved'] . '*') + ->then(function (message $message) use ($context, $update, $updated) { + // Sended the message + + // Updating the message with the join button + $update($context, $updated); + + // Ending the conversation process + $context->endConversation(); + }); + } else { + // Not updated the member record + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_member_not_updated'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + } else { + // Not found the member of the distribution + + // Creating the member record + $record = $model_member->create( + distribution: $distribution->identifier, + account: $account->identifier, + status: status::unknown + ); + + if ($record) { + // Created the member record + + // Searching for the member record + $member = $model_member->database->read( + filter: fn(record $member) => $member->identifier === $record, + amount: 1 + )[0] ?? null; + + if ($member instanceof record) { + // Found the member of the distribution + + // Sending the message + $context->sendMessage('👋 *' . $localization['distribution_search_leaved'] . '*') + ->then(function (message $message) use ($context, $update, $member) { + // Sended the message + + // Updating the message with the join button + $update($context, $member); + + // Ending the conversation process + $context->endConversation(); + }); + } else { + // Not found the member of the distribution + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_member_not_created'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not created the member record + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_member_not_created'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + } else { + // Not initialized the distribution + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_distribution_not_initialized'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the distribution identifier + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_distribution_not_initialized'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the message + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['distribution_search_message_not_initialized'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } } diff --git a/svoboda/svoboder/system/models/telegram/buttons/distribution/select.php b/svoboda/svoboder/system/models/telegram/buttons/distribution/select.php new file mode 100755 index 0000000..4f4652a --- /dev/null +++ b/svoboda/svoboder/system/models/telegram/buttons/distribution/select.php @@ -0,0 +1,276 @@ + + */ +final class select extends core +{ + /** + * Name + * + * Request to enter name + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function name(context $context) + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(process_distribution_select::PROCESS) + ->then(function ($select) use ($context, $account, $localization) { + // Readed from the telegram user buffer + + if ($select) { + // Found started select process + + // Initializing title for the message + $title = '📄 *' . $localization[process_distribution_select::PROCESS . '_name_request_title'] . '*'; + + // Initializing description for the message + $description = $localization[process_distribution_select::PROCESS . '_name_request_description']; + + // Sending the message + $context->sendMessage(<<then(function (message $message) use ($context) { + // Sended the message + + // Writing into the distribution select buffer + $context->nextStep([process_distribution_select::class, 'name']); + }); + } else { + // Not found started select process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[process_distribution_select::PROCESS . '_not_started'] . '*'); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function ($message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function ($message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Location + * + * Request to send location + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function location(context $context) + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(process_distribution_select::PROCESS) + ->then(function ($select) use ($context, $account, $localization) { + // Readed from the telegram user buffer + + if ($select) { + // Found started select process + + // Initializing the message title + $title = '🗺 *' . $localization[process_distribution_select::PROCESS . '_location_send_title'] . '*'; + + // Initializing the message description + $description = $localization[process_distribution_select::PROCESS . '_location_send_description']; + + // Sending the message + $context->sendMessage( + << [ + 'keyboard' => [ + [ + [ + 'text' => '🗺 ' . $localization[process_distribution_select::PROCESS . '_button_location_send'], + 'request_location' => true + ] + ], + ], + 'disable_notification' => true + ] + ] + )->then(function (message $message) use ($context) { + // Sended the message + + // Writing into the distribution select buffer + $context->nextStep([process_distribution_select::class, 'location']); + }); + } else { + // Not found started select process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[process_distribution_select::PROCESS . '_not_started'] . '*'); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function ($message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function ($message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Distance + * + * Request to send distance + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function distance(context $context) + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(process_distribution_select::PROCESS) + ->then(function ($select) use ($context, $account, $localization) { + // Readed from the telegram user buffer + + if ($select) { + // Found started select process + + // Initializing the message title + $title = '🔭 *' . $localization[process_distribution_select::PROCESS . '_distance_request_title'] . '* \(' . $localization[process_distribution_select::PROCESS . '_km'] . '\)'; + + // Initializing the message description + $description = $localization[process_distribution_select::PROCESS . '_distance_request_description']; + + // Sending the message + $context->sendMessage( + <<then(function (message $message) use ($context) { + // Sended the message + + // Writing into the distribution select buffer + $context->nextStep([process_distribution_select::class, 'distance']); + }); + } else { + // Not found started select process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[process_distribution_select::PROCESS . '_not_started'] . '*'); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function ($message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function ($message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } +} diff --git a/svoboda/svoboder/system/models/telegram/buttons/member/search.php b/svoboda/svoboder/system/models/telegram/buttons/member/search.php new file mode 100755 index 0000000..c657861 --- /dev/null +++ b/svoboda/svoboder/system/models/telegram/buttons/member/search.php @@ -0,0 +1,312 @@ + + */ +final class search extends core +{ + /** + * Name + * + * Request to enter name + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function name(context $context) + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(process_member_search::PROCESS) + ->then(function ($search) use ($context, $account, $localization) { + // Readed from the telegram user buffer + + if ($search) { + // Found started search process + + // Initializing title for the message + $title = '📄 *' . $localization[process_member_search::PROCESS . '_name_request_title'] . '*'; + + // Initializing description for the message + $description = $localization[process_member_search::PROCESS . '_name_request_description']; + + // Sending the message + $context->sendMessage(<<then(function (message $message) use ($context) { + // Sended the message + + // Writing into the member search buffer + $context->nextStep([process_member_search::class, 'name']); + }); + } else { + // Not found started search process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[process_member_search::PROCESS . '_not_started'] . '*'); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function ($message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function ($message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Distribution + * + * Request to choose distribution + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function distribution(context $context) + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(process_member_search::PROCESS) + ->then(function ($search) use ($context, $account, $localization) { + // Readed from the telegram user buffer + + if ($search) { + // Found started search process + + // Starting the distribution selection process + process_distribution_select::start( + context: $context, + select: function (context $context, array $distribution) use ($search) { + + if (!empty($distribution['distribution']) && !empty($distribution['localization'])) { + // Initialized the distribution + + // Writing the distribution into the process buffer + $search['distribution'] = $distribution; + + // Writing to the telegram user buffer + $context->setUserDataItem(process_member_search::PROCESS, $search) + ->then(function () use ($context) { + // Writed into the telegram user buffer + + // Sending the list of found distributions and menu + process_member_search::menu($context); + }); + } else { + // Not initialized the distribution + } + }, + delete: function (context $context) use ($search) { + // Deleting the distribution from the process buffer + $search['distribution'] = [ + 'distribution' => null, + 'localization' => null + ]; + + // Writing to the telegram user buffer + $context->setUserDataItem(process_member_search::PROCESS, $search) + ->then(function () use ($context) { + // Writed into the telegram user buffer + + // Sending the list of found distributions and menu + process_member_search::menu($context); + }); + }, + cancel: function (context $context) { + // Sending the list of found distributions and menu + process_member_search::menu($context); + }, + description: $localization[process_member_search::PROCESS . '_distribution_selection_description'] + ); + } else { + // Not found started search process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[process_member_search::PROCESS . '_not_started'] . '*'); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function ($message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function ($message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Status + * + * Request to choose status + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function status(context $context) + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(process_member_search::PROCESS) + ->then(function ($search) use ($context, $account, $localization) { + // Readed from the telegram user buffer + + if ($search) { + // Found started search process + + // Declaring the keyboard buffer + $keyboard = [[]]; + + // Initializing the amount of buttons in one row + $amount = MEMBERS_SEARCH_STATUS_ROW_AMOUNT ?? 8; + + // Initializing the rows iterator + $row = 0; + + foreach (status::cases() as $status) { + // Iterating over statuses + + // Moving to the next row + if (count($keyboard[$row]) >= $amount) ++$row; + + // Initializing the row + $keyboard[$row] ??= []; + + // Generating the button and writing into the keyboard buffer + $keyboard[$row][] = [ + 'text' => $status->emoji() . ' ' . $localization[process_member_search::PROCESS . "_button_status_$status->value"], + 'callback_data' => process_member_search::PROCESS . "_status_$status->name" + ]; + } + + // Sending the message + $context->sendMessage( + '👤 *' . $localization[process_member_search::PROCESS . '_status_select_title'] . '*', + [ + 'reply_markup' => [ + 'inline_keyboard' => $keyboard, + 'disable_notification' => true + ] + ] + ); + } else { + // Not found started search process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[process_member_search::PROCESS . '_not_started'] . '*'); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function ($message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function ($message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } +} diff --git a/svoboda/svoboder/system/models/telegram/commands.php b/svoboda/svoboder/system/models/telegram/commands.php index 3cd8e76..0e911ab 100755 --- a/svoboda/svoboder/system/models/telegram/commands.php +++ b/svoboda/svoboder/system/models/telegram/commands.php @@ -8,7 +8,8 @@ namespace svoboda\svoboder\models\telegram; use svoboda\svoboder\models\core, svoboda\svoboder\models\account, svoboda\svoboder\models\distribution, - svoboda\svoboder\models\telegram\selections, + svoboda\svoboder\models\member, + svoboda\svoboder\models\telegram\processes\language\select as process_language_select, svoboda\svoboder\models\enumerations\language; // Framework for Telegram @@ -56,13 +57,46 @@ final class commands extends core $title = '📋 *' . $localization['menu_title'] . '*'; // Initializing accounts - $accounts = '*' . $localization['menu_accounts'] . '* ' . ((new account)->database->count() ?? 0); + $accounts = '*' . $localization['menu_accounts'] . ':* ' . ((new account)->database->count() ?? 0); + + // Initializing the member model + $model_member = new member; + + // Searching for members records + $records = $model_member->database->read( + filter: function (record $member, array $records = []) { + if ($member->status === 2) { + // The account joined to the distribution + + foreach ($records as $record) { + // Iterating over readed records + + if ($record->identifier === $member->identifier) { + // Found a dublicate of the member + + // Exit (success) + return false; + } + } + + // Exit (success) + return true; + } + + // Exit (success) + return false; + }, + amount: MENU_MEMBERS_AMOUNT + ) ?? []; // Initializing members - $members = '*' . $localization['menu_members'] . '* ' . 0; + $members = '*' . $localization['menu_members'] . ':* ' . count($records); // Initializing distributions - $distributions = '*' . $localization['menu_distributions'] . '* ' . ((new distribution)->database->count() ?? 0); + $distributions = '*' . $localization['menu_distributions'] . ':* ' . ((new distribution)->database->count() ?? 0); + + // Initializing the data syncronization for the message + $syncronization = '⛓️‍💥 ' . $localization['menu_not_syncronized']; // Sending the message $context->sendMessage( @@ -72,14 +106,16 @@ final class commands extends core $accounts $members $distributions + + $syncronization TXT, [ 'reply_markup' => [ 'inline_keyboard' => [ [ [ - 'text' => '📺 ' . $localization['menu_button_site'], - 'url' => 'https://svoboda.works' + 'text' => '🔥 ' . $localization['menu_button_projects'], + 'callback_data' => 'projects' ], [ 'text' => '🗺 ' . $localization['menu_button_map'], @@ -87,34 +123,24 @@ final class commands extends core 'url' => 'https://telegram.map.svoboda.works' ] ], - /* [ - 'text' => '🔥 ' . $localization['menu_button_blog'], - 'url' => 'https://t.me/svoboder_bot' - ] */ + [ + 'text' => '📺 ' . $localization['menu_button_site'], + 'url' => 'https://svoboda.works' + ] ], [ /* [ 'text' => '🏗 ' . $localization['menu_button_projects'], 'callback_data' => 'prjects' ], */ - /* [ + [ 'text' => '🐣 ' . $localization['menu_button_members'], - 'callback_data' => 'message' - ], */ + 'callback_data' => 'members' + ], [ 'text' => '🏘 ' . $localization['menu_button_distributions'], 'callback_data' => 'distributions' ] - ], - [ - /* [ - 'text' => '🤟 ' . $localization['menu_button_volunteering'], - 'callback_data' => 'volunteering' - ], */ - [ - 'text' => '✉️ ' . $localization['menu_button_message'], - 'callback_data' => 'message' - ] ] ], 'disable_notification' => true, @@ -188,6 +214,98 @@ final class commands extends core } } + /** + * Members + * + * Responce for the command: "/members" + * + * Sends the members menu + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function members(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing language + $language = $context->get('language'); + + if ($language instanceof language) { + // Initialized language + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Initializing the message title + $title = '🐣 *' . $localization['members_title'] . '*'; + + // Initializing the message description + $description = $localization['members_description']; + + // Sending the message + $context->sendMessage( + << [ + 'inline_keyboard' => [ + [ + [ + 'text' => '🔎 ' . $localization['members_button_search'], + 'callback_data' => 'member_search_start' + ] + ] + ], + 'disable_notification' => true, + 'remove_keyboard' => true + ], + ] + ); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized language + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize language*') + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** * Distributions * @@ -228,22 +346,19 @@ final class commands extends core // Initializing the distribution model $model = new distribution; - // Initializing the message "registered" row - $registered = '*' . $localization['distributions_registered'] . ':* ' . $model->database->count(); + // Initializing the message "declared" row + $declared = '*' . $localization['distributions_declared'] . ':* ' . $model->database->count(); // Initializing the message "confirmed" row - $confirmed = '*' . $localization['distributions_confirmed'] . ':* ' . count($model->database->read( - filter: fn(record $record) => $record->confirmed, - amount: 1000 - )); + $recognized = '*' . $localization['distributions_recognized'] . ':* ' . 0; // Sending the message $context->sendMessage( << [ [ [ - 'text' => '📋 ' . $localization['distributions_button_register'], - 'callback_data' => 'distribution_registration_start' + 'text' => '📋 ' . $localization['distributions_button_declare'], + 'callback_data' => 'distribution_declaration_start' ], [ 'text' => '🔎 ' . $localization['distributions_button_search'], @@ -298,6 +413,117 @@ final class commands extends core } } + /** + * Account + * + * Responce for the command: "/account" + * + * Sends information about account with menu + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function account(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Initializing title for the message + $title = '🫵 ' . $localization['account_title']; + + // Declaring buufer of rows about authorizations + $authorizations = ''; + + // Initializing rows about authorization + foreach ($account->values() as $key => $value) { + // Iterating over account parameters + + if (str_starts_with($key, 'authorized_')) { + // Iterating over account authorizations + + // Skipping system authorizations + if (str_starts_with($key, 'authorized_system_')) continue; + + // Writing into buffer of rows about authorizations + $authorizations .= ($value ? '✅' : '❎') . ' *' . ($localization["account_$key"] ?? $key) . ':* ' . ($value ? $localization['yes'] : $localization['no']) . "\n"; + } + } + + // Trimming the last line break character + $authorizations = trim($authorizations, "\n"); + + // Initializing the data export for the message + $export = '📤 ' . $localization['account_export']; + + // Initializing the data security for the message + $data = $localization['account_data']; + + // Initializing the data security repository for the message + $security = '📁 [' . $localization['account_security_repository'] . '](https://git.svoboda.works/mirzaev/security) \([' . $localization['account_security_repository_mirror_github'] . '](https://github.com/mature-woman/security)\)'; + + // Sending the message + $context->sendMessage( + << [ + 'inline_keyboard' => [ + [ + [ + 'text' => '🗺 ' . $localization['account_button_localizations'], + 'callback_data' => 'account_localizations' + ] + ] + ], + 'remove_keyboard' => true, + 'disable_notification' => true + ], + 'link_preview_options' => [ + 'is_disabled' => true + ] + ] + ); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } + /** * Language * @@ -330,7 +556,7 @@ final class commands extends core // Initialized localization // Sending the language selection - selections::language( + process_language_select::menu( context: $context, prefix: 'settings_language_', title: '🌏 *' . $localization['settings_select_language_title'] . '*', diff --git a/svoboda/svoboder/system/models/telegram/distribution.php b/svoboda/svoboder/system/models/telegram/distribution.php index 7155483..2823b82 100755 --- a/svoboda/svoboder/system/models/telegram/distribution.php +++ b/svoboda/svoboder/system/models/telegram/distribution.php @@ -8,7 +8,6 @@ namespace svoboda\svoboder\models\telegram; use svoboda\svoboder\models\core, svoboda\svoboder\models\account, svoboda\svoboder\models\distribution as model, - svoboda\svoboder\models\localization\distribution as distribution_localization, svoboda\svoboder\models\enumerations\language; // Framework for Telegram @@ -26,4 +25,142 @@ use mirzaev\baza\record; * @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License * @author Arsen Mirzaev Tatyano-Muradovich */ -final class distribution extends core {} +final class distribution extends core +{ + /** + * Distributions + * + * Sends a message with a list of distributions to + * which the account is a creator, member, planned or volunteer + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function list(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Initializing the title + $title = '🏘 *' . $localization['distributions_list_title'] . '*'; + + // Initializing the account model + $model_account = new account; + + // Initializing accounts + $accounts = '*' . $localization['menu_accounts'] . ':* ' . ($model_account->database->count() ?? 0); + + // Initializing members + $members = '*' . $localization['menu_members'] . ':* ' . 0; + + // Initializing trusted members + $members_trusted = '*' . $localization['menu_members_trusted'] . ':* ' . 0; + + // Initializing planners + $planners = '*' . $localization['menu_planners'] . ':* ' . 0; + + // Initializing volunteers + $volunteers = '*' . $localization['menu_volunteers'] . ':* ' . 0; + + // Initializing the distribution model + $model_distribution = new model; + + // Initializing distributions + $distributions = '*' . $localization['menu_distributions'] . ':* ' . ($model_distribution->database->count() ?? 0); + + // Initializing trusted distributions + $distributions_trusted = '*' . $localization['menu_distributions_trusted'] . ':* ' . 0; + + // Initializing distributions messages + $distributions_messages = '*' . $localization['menu_distributions_messages'] . ':* ' . ($model_distribution->message->database->count() ?? 0); + + // Sending the message + $context->sendMessage( + << [ + 'inline_keyboard' => [ + [ + [ + 'text' => '🔥 ' . $localization['menu_button_projects'], + 'callback_data' => 'projects' + ], + [ + 'text' => '🗺 ' . $localization['menu_button_map'], + 'web_app' => [ + 'url' => 'https://telegram.map.svoboda.works' + ] + ], + [ + 'text' => '📺 ' . $localization['menu_button_site'], + 'url' => 'https://svoboda.works' + ] + ], + [ + /* [ + 'text' => '🏗 ' . $localization['menu_button_projects'], + 'callback_data' => 'prjects' + ], */ + [ + 'text' => '🐣 ' . $localization['menu_button_members'], + 'callback_data' => 'message' + ], + [ + 'text' => '🏘 ' . $localization['menu_button_distributions'], + 'callback_data' => 'distributions' + ] + ] + ], + 'disable_notification' => true, + 'remove_keyboard' => true + ], + ] + ) + ->then(function (message $message) use ($context) { + // Sended the message + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } +} diff --git a/svoboda/svoboder/system/models/telegram/middlewares.php b/svoboda/svoboder/system/models/telegram/middlewares.php index ac1295a..1a9e79b 100755 --- a/svoboda/svoboder/system/models/telegram/middlewares.php +++ b/svoboda/svoboder/system/models/telegram/middlewares.php @@ -66,6 +66,8 @@ final class middlewares extends core // Sending the message $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') ->then(function (message $message) use ($context) { + // Sended the message + // Ending the conversation process $context->endConversation(); }); @@ -120,6 +122,8 @@ final class middlewares extends core // Sending the message $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') ->then(function (message $message) use ($context) { + // Sended the message + // Ending the conversation process $context->endConversation(); }); @@ -175,6 +179,8 @@ final class middlewares extends core // Sending the message $context->sendMessage('⚠️ *Failed to initialize localization*') ->then(function (message $message) use ($context) { + // Sended the message + // Ending the conversation process $context->endConversation(); }); @@ -185,6 +191,8 @@ final class middlewares extends core // Sending the message $context->sendMessage('⚠️ *Failed to initialize the localization file*') ->then(function (message $message) use ($context) { + // Sended the message + // Ending the conversation process $context->endConversation(); }); @@ -195,6 +203,8 @@ final class middlewares extends core // Sending the message $context->sendMessage('⚠️ *Failed to initialize language*') ->then(function (message $message) use ($context) { + // Sended the message + // Ending the conversation process $context->endConversation(); }); @@ -205,6 +215,8 @@ final class middlewares extends core // Sending the message $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') ->then(function (message $message) use ($context) { + // Sended the message + // Ending the conversation process $context->endConversation(); }); @@ -249,6 +261,8 @@ final class middlewares extends core // Sending the message $context->sendMessage('⛔ *' . $localization['not_authorized_system'] . '*') ->then(function (message $message) use ($context) { + // Sended the message + // Ending the conversation process $context->endConversation(); }); @@ -261,6 +275,8 @@ final class middlewares extends core // Sending the message $context->sendMessage('⚠️ *Failed to initialize localization*') ->then(function (message $message) use ($context) { + // Sended the message + // Ending the conversation process $context->endConversation(); }); @@ -272,6 +288,8 @@ final class middlewares extends core // Sending the message $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') ->then(function (message $message) use ($context) { + // Sended the message + // Ending the conversation process $context->endConversation(); }); @@ -316,6 +334,8 @@ final class middlewares extends core // Sending the message $context->sendMessage('⛔ *' . $localization['not_authorized_contact'] . '*') ->then(function (message $message) use ($context) { + // Sended the message + // Ending the conversation process $context->endConversation(); }); @@ -328,6 +348,8 @@ final class middlewares extends core // Sending the message $context->sendMessage('⚠️ *Failed to initialize localization*') ->then(function (message $message) use ($context) { + // Sended the message + // Ending the conversation process $context->endConversation(); }); @@ -339,6 +361,8 @@ final class middlewares extends core // Sending the message $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') ->then(function (message $message) use ($context) { + // Sended the message + // Ending the conversation process $context->endConversation(); }); @@ -346,16 +370,16 @@ final class middlewares extends core } /** - * Request (middleware) + * Join (middleware) * - * Check the account for access to request to the organization + * Check the account for access to join to distributions * * @param context $context * @param node $next * * @return void */ - public static function request(context $context, node $next): void + public static function join(context $context, node $next): void { // Is the process stopped? if ($context->get('stop')) return; @@ -366,39 +390,43 @@ final class middlewares extends core if ($account instanceof record) { // Initialized the account - if ($account->authorized_request) { - // Authorized the account to request to the organization + // Initializing localization + $localization = $context->get('localization'); - // Continuation of the process - $next($context); - } else { - // Not authorized the account to request to the organization + if ($localization) { + // Initialized localization - // Initializing localization - $localization = $context->get('localization'); + if ($account->authorized_joins) { + // Authorized the account to joint to distributions - if ($localization) { - // Initialized localization + // Continuation of the process + $next($context); + } else { + // Not authorized the account to joint to distributions // Sending the message - $context->sendMessage('⛔ *' . $localization['not_authorized_request'] . '*') + $context->sendMessage('⛔ *' . $localization['not_authorized_joins'] . '*') ->then(function (message $message) use ($context) { + // Sended the message + // Ending the conversation process $context->endConversation(); }); // Stopping the process $context->set('stop', true); - } else { - // Not initialized localization - - // Sending the message - $context->sendMessage('⚠️ *Failed to initialize localization*') - ->then(function (message $message) use ($context) { - // Ending the conversation process - $context->endConversation(); - }); } + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); } } else { // Not initialized the account @@ -406,6 +434,8 @@ final class middlewares extends core // Sending the message $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') ->then(function (message $message) use ($context) { + // Sended the message + // Ending the conversation process $context->endConversation(); }); @@ -450,6 +480,8 @@ final class middlewares extends core // Sending the message $context->sendMessage('⛔ *' . $localization['not_authorized_settings'] . '*') ->then(function (message $message) use ($context) { + // Sended the message + // Ending the conversation process $context->endConversation(); }); @@ -462,6 +494,8 @@ final class middlewares extends core // Sending the message $context->sendMessage('⚠️ *Failed to initialize localization*') ->then(function (message $message) use ($context) { + // Sended the message + // Ending the conversation process $context->endConversation(); }); @@ -473,6 +507,8 @@ final class middlewares extends core // Sending the message $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') ->then(function (message $message) use ($context) { + // Sended the message + // Ending the conversation process $context->endConversation(); }); @@ -517,6 +553,8 @@ final class middlewares extends core // Sending the message $context->sendMessage('⛔ *' . $localization['not_authorized_system_settings'] . '*') ->then(function (message $message) use ($context) { + // Sended the message + // Ending the conversation process $context->endConversation(); }); @@ -529,6 +567,8 @@ final class middlewares extends core // Sending the message $context->sendMessage('⚠️ *Failed to initialize localization*') ->then(function (message $message) use ($context) { + // Sended the message + // Ending the conversation process $context->endConversation(); }); @@ -540,6 +580,81 @@ final class middlewares extends core // Sending the message $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Distributions administration (middleware) + * + * Check the account for access to distributions administration + * + * @param context $context + * @param node $next + * + * @return void + */ + public static function distributions_administration(context $context, node $next): void + { + // Is the process stopped? + if ($context->get('stop')) return; + + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + if ($account->authorized_system_distributions) { + // Authorized the account to distributions administration + + // Continuation of the process + $next($context); + } else { + // Not authorized the account to distributions administration + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Sending the message + $context->sendMessage('⛔ *' . $localization['not_authorized_system_distributions'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + + // Stopping the process + $context->set('stop', true); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + // Ending the conversation process $context->endConversation(); }); diff --git a/svoboda/svoboder/system/models/telegram/processes/account/localization/create.php b/svoboda/svoboder/system/models/telegram/processes/account/localization/create.php new file mode 100755 index 0000000..beea7f6 --- /dev/null +++ b/svoboda/svoboder/system/models/telegram/processes/account/localization/create.php @@ -0,0 +1,911 @@ + + */ +final class create extends core +{ + /** + * Process + * + * @var const string PROCESS Name of the process in the telegram user buffer + */ + public const string PROCESS = 'account_localization_create'; + + /** + * Start + * + * Starting the account localization creating process + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function start(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing language + $language = $context->get('language'); + + if ($language instanceof language) { + // Initialized language + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $process) use ($context, $account, $language, $localization) { + // Readed from the telegram user buffer + + if ($process) { + // Found started account localization create process + + // Sending the message + $context->sendMessage('📂 *' . $localization['account_localization_create_continiued'] . '*') + ->then(function (message $message) use ($context, $account, $language, $localization) { + // Sended the message + + // Sending the account localization create menu + static::menu($context); + }); + } else { + // Not found started account localization create process + + // Initializing buffer of languages + $languages = language::cases(); + + // Deleting the actual language from buffer of languages + unset($languages[array_search($language, $languages, strict: true)]); + + // Sorting buffer of languages by the actual language + $languages = [$language, ...$languages]; + + // Initializing the account model + $model_account = new account; + + // Initializing the account localizations + $existed = $model_account->localization->database->read( + filter: fn(record $localization) => $localization->account === $account->identifier, + amount: ACCOUNT_LOCALIZATION_CREATE_ACCOUNT_LOCALIZATIONS_AMOUNT + ); + + if (count($existed) !== count(language::cases())) { + // Not all languages in the registry have localizations created (expected) + + // Declaring the buffer of languages to exclude + $exclude = []; + + // Initializing languages to exclude + foreach ($existed as $record) $exclude[] = $record->language; + + if (!empty($exclude)) { + // Initialized languages to exclude + + // Deleting excluded languages + $languages = array_filter($languages, fn(language $language) => array_search($language->name, $exclude, strict: true) === false); + } + + // Initializing the account localization create buffer + $process = [ + 'language' => array_values($languages)[0], + 'name' => null, + ]; + + // Writing to the telegram user buffer + $context->setUserDataItem(static::PROCESS, $process) + ->then(function () use ($context, $account, $localization) { + // Writed to the telegram user buffer + + // Sending the message + $context->sendMessage('📂 *' . $localization['account_localization_create_started'] . '*') + ->then(function (message $message) use ($context, $account, $localization) { + // Sended the message + + // Sending the account localization create menu + static::menu($context); + }); + }); + } else { + // All languages in the registry have localizations created (expected) + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['account_localization_create_every_language_created'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized language + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize language*') + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Cancel + * + * Ending the account localization create process + * without creating the localization record in the database + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function cancel(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $process) use ($context, $localization) { + // Readed from the telegram user buffer + + if ($process) { + // Found started account localization create process + + // Deleting in the telegram user buffer + $context->deleteUserDataItem(static::PROCESS) + ->then(function () use ($context, $localization) { + // Deleted in the telegram user buffer + + // Sending the message + $context->sendMessage('🗑 *' . $localization['account_localization_create_canceled'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the account localizations menu + telegram_account::localizations($context); + }); + }); + } else { + // Not found started account localization create process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['account_localization_create_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the account localizations menu + telegram_account::localizations($context); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * End + * + * Ending the account localization create process + * and creating the localization record in the database + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function end(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing language + $language = $context->get('language'); + + if ($language instanceof language) { + // Initialized language + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $process) use ($context, $account, $language, $localization) { + // Readed from the telegram user buffer + + if ($process) { + // Found started account localization create process + + // Initializing the account model + $model_account = new account; + + // Creating the account localization + $created_localization = $model_account->localization->create( + account: $account->identifier, + language: $process['language'], + name: $process['name'] + ); + + if ($created_localization) { + // Created the account localization + + // Sending the message + $context->sendMessage('✏️ *' . $localization['account_localization_create_created'] . '*') + ->then(function (message $message) use ($context, $account, $language, $localization) { + // Sended the message + + // Deleting from the telegram user buffer + $context->deleteUserDataItem(static::PROCESS) + ->then(function () use ($context, $localization) { + // Deleted from the telegram user buffer + + // Sending the message + $context->sendMessage('✅ *' . $localization['account_localization_create_completed'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the account localizations menu + telegram_account::localizations($context); + }); + }); + }); + } else { + // Not created the account localization + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['account_localization_create_not_created'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not found started account localization create process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['account_localization_create_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the account localizations menu + telegram_account::localizations($context); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized language + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize language*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Menu + * + * Sends the account localization create menu with parameters: language, name + * When all parameters was initialized then sends the complete button + * + * @param context $context Request data from Telegram + * + * @return void + */ + protected static function menu(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing language + $language = $context->get('language'); + + if ($language) { + // Initialized language + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $process) use ($context, $account, $language, $localization) { + // Readed from the telegram user buffer + + if ($process) { + // Found started account localization create process + + // Initializing the buffer of generated keyboard with languages + $keyboard = [ + [ + [ + 'text' => empty($process['language']) ? '🟢 ' . $localization['account_localization_create_button_language'] : '🟢 ' . $localization['account_localization_create_button_language'] . ': ' . $process['language']->flag() . ' ' . $process['language']->label($language), + 'callback_data' => 'account_localization_create_language' + ] + ], + [ + [ + 'text' => empty($process['name']) ? '🔴 ' . $localization['account_localization_create_button_name'] : '🟢 ' . $localization['account_localization_create_button_name'] . ': ' . $process['name'], + 'callback_data' => 'account_localization_create_name' + ] + ], + ]; + + // Initializing the index of last row + $last = count($keyboard); + + // Initializing the last row + $keyboard[$last] ??= []; + + // Initializing the button for canceling the generation process + $keyboard[$last][] = [ + 'text' => '❎ ' . $localization['account_localization_create_button_cancel'], + 'callback_data' => 'account_localization_create_cancel' + ]; + + if ( + !empty($process['language']) && + !empty($process['name']) + ) { + // Initialized all requeired parameters + + // Initializing the button for completing the generation process + $keyboard[$last][] = [ + 'text' => '✅ ' . $localization['account_localization_create_button_confirm'], + 'callback_data' => 'account_localization_create_end' + ]; + } + + // Ending the conversation process + $context->endConversation() + ->then(function () use ($context, $localization, $keyboard) { + // Deinitialized the conversation process + + // Sending the message + $context->sendMessage( + '📀 *' . $localization['account_localization_create_generation'] . '*', + [ + 'reply_markup' => [ + 'inline_keyboard' => $keyboard, + 'disable_notification' => true, + 'remove_keyboard' => true + ], + ] + ); + }); + } else { + // Not found started account localization create process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['account_localization_create_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the account localizations menu + telegram_account::localizations($context); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized language + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize language*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Language + * + * Write language into the account localization create buffer + * + * @param context $context Request data from Telegram + * @param language $new The language + * + * @return void + */ + public static function language(context $context, language $new): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing language + $language = $context->get('language'); + + if ($language instanceof language) { + // Initialized language + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $process) use ($context, $account, $language, $localization, $new) { + // Readed from the telegram user buffer + + if ($process) { + // Found started account localization create process + + try { + // Initializing the old language + $old = $process['language']; + + // Writing into the account localization create process buffer + $process['language'] = $new; + + // Writing to the telegram user buffer + $context->setUserDataItem(static::PROCESS, $process) + ->then(function () use ($context, $account, $language, $localization, $new, $old) { + // Writed to the telegram user buffer + + // Sending the message + $context->sendMessage('✅ *' . $localization['account_localization_create_language_update_success'] . '* ' . ($old->flag() ? $old->flag() . ' ' : '') . $old->label($language) . ' → *' . ($new->flag() ? $new->flag() . ' ' : '') . $new->label($language) . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Sending the account localization create menu + static::menu($context); + }); + }); + } catch (error $error) { + // Failed to send the message about language update + + // Sending the message + $context->sendMessage('❎ *' . $localization['account_localization_create_language_update_fail']) + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not found started account localization create process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['account_localization_create_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the account localizations menu + telegram_account::localizations($context); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized language + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize language*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Name + * + * Write name into the account localization create buffer + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function name(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $process) use ($context, $account, $localization) { + // Readed from the telegram user buffer + + if ($process) { + // Found started account localization create process + + // Initializing the new name + $new = $context->getMessage()->getText(); + + if (!empty($new)) { + // Initialized the new name + + if (mb_strlen($new) >= 2) { + // Passed minimum length check + + if (mb_strlen($new) <= 128) { + // Passed maximum length check + + // Search for restricted characters + preg_match_all('/[\W\d]/u', $new, $matches); + + // Declaring the buffer of found restricted characters + $characters = []; + + foreach ($matches[0] as $match) { + // Iterating over found restricted characters + + if (match ($match) { + ' ', '-' => false, + default => true + }) { + // Found a restricted character + + // Writing into the buffer of found restricted characters + $characters[] = $match; + } + } + + if (empty($characters)) { + // Not found restricted characters + + try { + // Initializing the old name + $old = empty($process['name']) ? '_' . $localization['empty'] . '_' : $process['name']; + + // Writing into the account localization create process buffer + $process['name'] = $new; + + // Writing to the telegram user buffer + $context->setUserDataItem(static::PROCESS, $process) + ->then(function () use ($context, $account, $localization, $new, $old) { + // Writed to the telegram user buffer + + // Escaping characters for markdown + $escaped = str_replace('-', '\\-', $new); + + // Sending the message + $context->sendMessage('✅ *' . $localization['account_localization_create_name_update_success'] . "* $old → *$escaped*") + ->then(function (message $message) use ($context) { + // Sended the message + + // Sending the account localization create menu + static::menu($context); + }); + }); + } catch (error $error) { + // Failed to send the message about name update + + // Sending the message + $context->sendMessage('❎ *' . $localization['account_localization_create_name_update_fail']) + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Found restricted characters + + // Initializing title of the message + $title = '⚠️ *' . $localization['account_localization_create_name_request_restricted_characters_title'] . '*'; + + // Initializing description of the message + $description = '*' . $localization['account_localization_create_name_request_restricted_characters_description'] . '* \\' . implode(', \\', $characters); + + // Sending the message + $context->sendMessage( + <<then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter name again + button_account_localization_create::name($context); + }); + } + } else { + // Not passed maximum length check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['account_localization_create_name_request_too_long'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter name again + button_account_localization_create::name($context); + }); + } + } else { + // Not passed minimum length check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['account_localization_create_name_request_too_short'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter name again + button_account_localization_create::name($context); + }); + } + } else { + // Failed to initialize the new name + + // Sending the message + $context->sendMessage('📄 *' . $localization['account_localization_create_name_request_not_acceptable'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter name again + button_account_localization_create::name($context); + }); + } + } else { + // Not found started account localization create process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['account_localization_create_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the account localizations menu + telegram_account::localizations($context); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } +} diff --git a/svoboda/svoboder/system/models/telegram/processes/account/localization/update.php b/svoboda/svoboder/system/models/telegram/processes/account/localization/update.php new file mode 100755 index 0000000..d0843f9 --- /dev/null +++ b/svoboda/svoboder/system/models/telegram/processes/account/localization/update.php @@ -0,0 +1,776 @@ + + */ +final class update extends core +{ + /** + * Process + * + * @var const string PROCESS Name of the process in the telegram user buffer + */ + public const string PROCESS = 'account_localization_update'; + + /** + * Start + * + * Starting the account localization creating process + * + * @param context $context Request data from Telegram + * @param language $target The language + * + * @return void + */ + public static function start(context $context, language $target): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing language + $language = $context->get('language'); + + if ($language instanceof language) { + // Initialized language + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $process) use ($context, $account, $language, $target, $localization) { + // Readed from the telegram user buffer + + if ($process) { + // Found started account localization update process + + // Sending the message + $context->sendMessage('📂 *' . $localization['account_localization_update_continiued'] . '*') + ->then(function (message $message) use ($context, $account, $language, $localization) { + // Sended the message + + // Sending the account localization update menu + static::menu($context); + }); + } else { + // Not found started account localization update process + + // Initializing the account model + $model_account = new account; + + // Initializing the account localization + $record = $model_account->localization->database->read( + filter: fn(record $localization) => $localization->account === $account->identifier && $localization->language === $target->name, + amount: 1 + )[0] ?? null; + + if ($record instanceof record) { + // Initialized the account localization + + // Initializing the account localization update buffer + $process = [ + 'record' => $record, + 'language' => $target, + 'name' => $record?->name, + ]; + + // Writing to the telegram user buffer + $context->setUserDataItem(static::PROCESS, $process) + ->then(function () use ($context, $account, $localization) { + // Writed to the telegram user buffer + + // Sending the message + $context->sendMessage('📂 *' . $localization['account_localization_update_started'] . '*') + ->then(function (message $message) use ($context, $account, $localization) { + // Sended the message + + // Sending the account localization update menu + static::menu($context); + }); + }); + } else { + // Not initialized the account localization + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['account_localization_update_not_initialized_localization'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized language + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize language*') + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Cancel + * + * Ending the account localization update process + * without creating the localization record in the database + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function cancel(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $process) use ($context, $localization) { + // Readed from the telegram user buffer + + if ($process) { + // Found started account localization update process + + // Deleting in the telegram user buffer + $context->deleteUserDataItem(static::PROCESS) + ->then(function () use ($context, $localization) { + // Deleted in the telegram user buffer + + // Sending the message + $context->sendMessage('🗑 *' . $localization['account_localization_update_canceled'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the account localizations menu + telegram_account::localizations($context); + }); + }); + } else { + // Not found started account localization update process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['account_localization_update_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the account localizations menu + telegram_account::localizations($context); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * End + * + * Ending the account localization update process + * and creating the localization record in the database + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function end(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing language + $language = $context->get('language'); + + if ($language instanceof language) { + // Initialized language + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $process) use ($context, $account, $language, $localization) { + // Readed from the telegram user buffer + + if ($process) { + // Found started account localization update process + + // Initializing the account model + $model_account = new account; + + // Updating the account localization + $updated_localization = $model_account->localization->database->read( + filter: fn(record $localization) => $localization->identifier === $process['record']->identifier, + update: function (record &$localization) use ($process) { + $localization->name = $process['name']; + $localization->updated = svoboda::timestamp(); + }, + amount: 1 + ); + + if ($updated_localization) { + // Updated the account localization + + // Sending the message + $context->sendMessage('✏️ *' . $localization['account_localization_update_updated'] . '*') + ->then(function (message $message) use ($context, $account, $language, $localization) { + // Sended the message + + // Deleting from the telegram user buffer + $context->deleteUserDataItem(static::PROCESS) + ->then(function () use ($context, $localization) { + // Deleted from the telegram user buffer + + // Sending the message + $context->sendMessage('✅ *' . $localization['account_localization_update_completed'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the account localizations menu + telegram_account::localizations($context); + }); + }); + }); + } else { + // Not updated the account localization + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['account_localization_update_not_updated'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not found started account localization update process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['account_localization_update_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the account localizations menu + telegram_account::localizations($context); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized language + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize language*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Menu + * + * Sends the account localization update menu with parameters: language, name + * When all parameters was initialized then sends the complete button + * + * @param context $context Request data from Telegram + * + * @return void + */ + protected static function menu(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing language + $language = $context->get('language'); + + if ($language) { + // Initialized language + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $process) use ($context, $account, $language, $localization) { + // Readed from the telegram user buffer + + if ($process) { + // Found started account localization update process + + // Initializing the buffer of generated keyboard with languages + $keyboard = [ + [ + [ + 'text' => empty($process['name']) ? '🔴 ' . $localization['account_localization_update_button_name'] : '🟢 ' . $localization['account_localization_update_button_name'] . ': ' . $process['name'], + 'callback_data' => 'account_localization_update_name' + ] + ], + ]; + + // Initializing the index of last row + $last = count($keyboard); + + // Initializing the last row + $keyboard[$last] ??= []; + + // Initializing the button for canceling the generation process + $keyboard[$last][] = [ + 'text' => '❎ ' . $localization['account_localization_update_button_cancel'], + 'callback_data' => 'account_localization_update_cancel' + ]; + + if ( + !empty($process['record']) && + !empty($process['name']) + ) { + // Initialized all requeired parameters + + // Initializing the button for completing the generation process + $keyboard[$last][] = [ + 'text' => '✅ ' . $localization['account_localization_update_button_confirm'], + 'callback_data' => 'account_localization_update_end' + ]; + } + + // Ending the conversation process + $context->endConversation() + ->then(function () use ($context, $language, $localization, $keyboard, $process) { + // Deinitialized the conversation process + + // Initializing the message title + $title = '📀 *' . $localization['account_localization_update_generation'] . '*'; + + // Initializing the message target + $target = '*' . $localization['account_localization_update_generation_target'] . ':* ' . $process['language']->flag() . ' *' . $process['language']->label($language) . '* \(' . $process['record']->identifier . '\)'; + + // Sending the message + $context->sendMessage( + << [ + 'inline_keyboard' => $keyboard, + 'disable_notification' => true, + 'remove_keyboard' => true + ], + ] + ); + }); + } else { + // Not found started account localization update process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['account_localization_update_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the account localizations menu + telegram_account::localizations($context); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized language + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize language*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Name + * + * Write name into the account localization update buffer + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function name(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $process) use ($context, $account, $localization) { + // Readed from the telegram user buffer + + if ($process) { + // Found started account localization update process + + // Initializing the new name + $new = $context->getMessage()->getText(); + + if (!empty($new)) { + // Initialized the new name + + if (mb_strlen($new) >= 2) { + // Passed minimum length check + + if (mb_strlen($new) <= 128) { + // Passed maximum length check + + // Search for restricted characters + preg_match_all('/[\W\d]/u', $new, $matches); + + // Declaring the buffer of found restricted characters + $characters = []; + + foreach ($matches[0] as $match) { + // Iterating over found restricted characters + + if (match ($match) { + ' ', '-' => false, + default => true + }) { + // Found a restricted character + + // Writing into the buffer of found restricted characters + $characters[] = $match; + } + } + + if (empty($characters)) { + // Not found restricted characters + + try { + // Initializing the old name + $old = empty($process['name']) ? '_' . $localization['empty'] . '_' : $process['name']; + + // Writing into the account localization update process buffer + $process['name'] = $new; + + // Writing to the telegram user buffer + $context->setUserDataItem(static::PROCESS, $process) + ->then(function () use ($context, $account, $localization, $new, $old) { + // Writed to the telegram user buffer + + // Escaping characters for markdown + $escaped = str_replace('-', '\\-', $new); + + // Sending the message + $context->sendMessage('✅ *' . $localization['account_localization_update_name_update_success'] . "* $old → *$escaped*") + ->then(function (message $message) use ($context) { + // Sended the message + + // Sending the account localization update menu + static::menu($context); + }); + }); + } catch (error $error) { + // Failed to send the message about name update + + // Sending the message + $context->sendMessage('❎ *' . $localization['account_localization_update_name_update_fail']) + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Found restricted characters + + // Initializing title of the message + $title = '⚠️ *' . $localization['account_localization_update_name_request_restricted_characters_title'] . '*'; + + // Initializing description of the message + $description = '*' . $localization['account_localization_update_name_request_restricted_characters_description'] . '* \\' . implode(', \\', $characters); + + // Sending the message + $context->sendMessage( + <<then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter name again + button_account_localization_update::name($context); + }); + } + } else { + // Not passed maximum length check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['account_localization_update_name_request_too_long'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter name again + button_account_localization_update::name($context); + }); + } + } else { + // Not passed minimum length check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['account_localization_update_name_request_too_short'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter name again + button_account_localization_update::name($context); + }); + } + } else { + // Failed to initialize the new name + + // Sending the message + $context->sendMessage('📄 *' . $localization['account_localization_update_name_request_not_acceptable'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter name again + button_account_localization_update::name($context); + }); + } + } else { + // Not found started account localization update process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['account_localization_update_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the account localizations menu + telegram_account::localizations($context); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } +} diff --git a/svoboda/svoboder/system/models/telegram/processes/distribution/registration.php b/svoboda/svoboder/system/models/telegram/processes/distribution/declaration.php similarity index 69% rename from svoboda/svoboder/system/models/telegram/processes/distribution/registration.php rename to svoboda/svoboder/system/models/telegram/processes/distribution/declaration.php index dd66948..9916150 100755 --- a/svoboda/svoboder/system/models/telegram/processes/distribution/registration.php +++ b/svoboda/svoboder/system/models/telegram/processes/distribution/declaration.php @@ -7,11 +7,9 @@ namespace svoboda\svoboder\models\telegram\processes\distribution; // Files of the project use svoboda\svoboder\models\core, svoboda\svoboder\models\distribution, - svoboda\svoboder\models\localizations\distribution as distribution_localization, svoboda\svoboder\models\enumerations\language, svoboda\svoboder\models\telegram\commands, - svoboda\svoboder\models\telegram\processes\distribution\localization, - svoboda\svoboder\models\telegram\buttons\distribution\registration as button_distribution_registration; + svoboda\svoboder\models\telegram\buttons\distribution\declaration as button_distribution_declaration; // Framework for Telegram use Zanzara\Context as context, @@ -24,19 +22,26 @@ use mirzaev\baza\record; use Error as error; /** - * Distribution registration process + * Distribution declaration process * * @package svoboda\svoboder\models\telegram\processes\distribution * * @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License * @author Arsen Mirzaev Tatyano-Muradovich */ -final class registration extends core +final class declaration extends core { + /** + * Process + * + * @var const string PROCESS Name of the process in the telegram user buffer + */ + public const string PROCESS = 'distribution_declaration'; + /** * Start * - * Starting the distribution registration process + * Starting the distribution declaration process * * @param context $context Request data from Telegram * @@ -63,25 +68,25 @@ final class registration extends core // Initialized localization // Reading from the telegram user buffer - $context->getUserDataItem('distribution_registration') - ->then(function ($distribution) use ($context, $account, $language, $localization) { + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $distribution) use ($context, $account, $language, $localization) { // Readed from the telegram user buffer if ($distribution) { - // Found started registration process + // Found started distribution declaration process // Sending the message - $context->sendMessage('📂 *' . $localization['distribution_registration_continiued'] . '*') + $context->sendMessage('📂 *' . $localization[static::PROCESS . '_continiued'] . '*') ->then(function (message $message) use ($context, $account, $language, $localization) { // Sended the message - // Sending the generation menu - static::generation($context); + // Sending the distribution declaration menu + static::menu($context); }); } else { - // Not found started registretion process + // Not found started distribution declaration process - // Initializing the distribution registration buffer + // Initializing the distribution declaration buffer $distribution = [ 'latitude' => null, 'longitude' => null, @@ -92,17 +97,17 @@ final class registration extends core ]; // Writing to the telegram user buffer - $context->setUserDataItem('distribution_registration', $distribution) + $context->setUserDataItem(static::PROCESS, $distribution) ->then(function () use ($context, $account, $localization) { // Writed to the telegram user buffer // Sending the message - $context->sendMessage('📂 *' . $localization['distribution_registration_started'] . '*') + $context->sendMessage('📂 *' . $localization[static::PROCESS . '_started'] . '*') ->then(function (message $message) use ($context, $account, $localization) { // Sended the message - // Sending the generation menu - static::generation($context); + // Sending the distribution declaration menu + static::menu($context); }); }); } @@ -142,7 +147,7 @@ final class registration extends core /** * Cancel * - * Ending the distribution registration process + * Ending the distribution declaration process * without creating the distribution record in the database * * @param context $context Request data from Telegram @@ -164,20 +169,20 @@ final class registration extends core // Initialized localization // Reading from the telegram user buffer - $context->getUserDataItem('distribution_registration') - ->then(function ($distribution) use ($context, $localization) { + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $distribution) use ($context, $localization) { // Readed from the telegram user buffer if ($distribution) { - // Found started registration process + // Found started distribution declaration process // Deleting in the telegram user buffer - $context->deleteUserDataItem('distribution_registration') + $context->deleteUserDataItem(static::PROCESS) ->then(function () use ($context, $localization) { // Deleted in the telegram user buffer // Sending the message - $context->sendMessage('🗑 *' . $localization['distribution_registration_canceled'] . '*') + $context->sendMessage('🗑 *' . $localization[static::PROCESS . '_canceled'] . '*') ->then(function (message $message) use ($context) { // Sended the message @@ -189,10 +194,19 @@ final class registration extends core }); }); } else { - // Not found started registretion process + // Not found started distribution declaration process // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_registration_not_started'] . '*'); + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the distributions menu + commands::distributions($context); + }); } }); } else { @@ -224,7 +238,7 @@ final class registration extends core /** * End * - * Ending the distribution registration process + * Ending the distribution declaration process * and creating the distribution record in the database * * @param context $context Request data from Telegram @@ -252,16 +266,18 @@ final class registration extends core // Initialized localization // Reading from the telegram user buffer - $context->getUserDataItem('distribution_registration') - ->then(function ($distribution) use ($context, $account, $language, $localization) { + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $distribution) use ($context, $account, $language, $localization) { // Readed from the telegram user buffer if ($distribution) { - // Found started registration process + // Found started distribution declaration process + + // Initializing the distribution model + $model_distribution = new distribution; // Creating the distribution - /* $created_distribution = new distribution->create( */ - $created_distribution = (new distribution)->create( + $created_distribution = $model_distribution->create( creator: $account->identifier, latitude: $distribution['latitude'], longitude: $distribution['longitude'] @@ -271,13 +287,12 @@ final class registration extends core // Created the distribution // Sending the message - $context->sendMessage('✏️ *' . $localization['distribution_registration_created_distribution'] . '*') - ->then(function (message $message) use ($context, $account, $language, $localization, $distribution, $created_distribution) { + $context->sendMessage('✏️ *' . $localization[static::PROCESS . '_created_distribution'] . '*') + ->then(function (message $message) use ($context, $account, $language, $localization, $distribution, $model_distribution, $created_distribution) { // Sended the message // Initializing the distribution localization - /* $created_localization = new distribution_localization->create( */ - $created_localization = (new distribution_localization)->create( + $created_localization = $model_distribution->localization->create( distribution: $created_distribution, language: $distribution['localization']['language'], name: $distribution['localization']['name'] @@ -287,17 +302,17 @@ final class registration extends core // Created the localization // Sending the message - $context->sendMessage('✏️ *' . $localization['distribution_registration_created_localization'] . '*') + $context->sendMessage('✏️ *' . $localization[static::PROCESS . '_created_localization'] . '*') ->then(function (message $message) use ($context, $localization) { // Sended the message // Deleting from the telegram user buffer - $context->deleteUserDataItem('distribution_registration') + $context->deleteUserDataItem(static::PROCESS) ->then(function () use ($context, $localization) { // Deleted from the telegram user buffer // Sending the message - $context->sendMessage('✅ *' . $localization['distribution_registration_completed'] . '*') + $context->sendMessage('✅ *' . $localization[static::PROCESS . '_completed'] . '*') ->then(function (message $message) use ($context) { // Sended the message @@ -313,7 +328,7 @@ final class registration extends core // Not created the distribution localization // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_registration_not_created_localization'] . '*') + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_created_localization'] . '*') ->then(function (message $message) use ($context) { // Sended the message @@ -326,7 +341,7 @@ final class registration extends core // Not created the distribution // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_registration_not_created_distribution'] . '*') + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_created_distribution'] . '*') ->then(function (message $message) use ($context) { // Sended the message @@ -335,10 +350,13 @@ final class registration extends core }); } } else { - // Not found started registretion process + // Not found started distribution declaration process - // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_registration_not_started'] . '*'); + // Ending the conversation process + $context->endConversation(); + + // Sending the distributions menu + commands::distributions($context); } }); } else { @@ -382,14 +400,14 @@ final class registration extends core /** * Generation * - * Sends the generation menu with parameters: language, name, location + * Sends the distribution declaration menu with parameters: language, name, location * When all parameters was initialized then sends the complete button * * @param context $context Request data from Telegram * * @return void */ - protected static function generation(context $context): void + protected static function menu(context $context): void { // Initializing the account $account = $context->get('account'); @@ -410,31 +428,31 @@ final class registration extends core // Initialized localization // Reading from the telegram user buffer - $context->getUserDataItem('distribution_registration') - ->then(function ($distribution) use ($context, $account, $language, $localization) { + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $distribution) use ($context, $account, $language, $localization) { // Readed from the telegram user buffer if ($distribution) { - // Found started registration process + // Found started distribution declaration process // Initializing the buffer of generated keyboard with languages $keyboard = [ [ [ - 'text' => empty($distribution['localization']['language']) ? '🟢 ' . $localization['distribution_registration_button_language'] : '🟢 ' . $localization['distribution_registration_button_language'] . ': ' . $distribution['localization']['language']->flag() . ' ' . $distribution['localization']['language']->label($language), - 'callback_data' => 'distribution_registration_language' + 'text' => empty($distribution['localization']['language']) ? '🟢 ' . $localization[static::PROCESS . '_button_language'] : '🟢 ' . $localization['distribution_declaration_button_language'] . ': ' . $distribution['localization']['language']->flag() . ' ' . $distribution['localization']['language']->label($language), + 'callback_data' => static::PROCESS . '_language' ] ], [ [ - 'text' => empty($distribution['localization']['name']) ? '🔴 ' . $localization['distribution_registration_button_name'] : '🟢 ' . $localization['distribution_registration_button_name'] . ': ' . $distribution['localization']['name'], - 'callback_data' => 'distribution_registration_name' + 'text' => empty($distribution['localization']['name']) ? '🔴 ' . $localization[static::PROCESS . '_button_name'] : '🟢 ' . $localization['distribution_declaration_button_name'] . ': ' . $distribution['localization']['name'], + 'callback_data' => static::PROCESS . '_name' ] ], [ [ - 'text' => empty($distribution['latitude']) || empty('longitude') ? '🔴 ' . $localization['distribution_registration_button_location'] : '🟢 ' . $localization['distribution_registration_button_location'] . ': ' . $distribution['latitude'] . ', ' . $distribution['longitude'], - 'callback_data' => 'distribution_registration_location' + 'text' => empty($distribution['latitude']) || empty('longitude') ? '🔴 ' . $localization[static::PROCESS . '_button_location'] : '🟢 ' . $localization['distribution_declaration_button_location'] . ': ' . $distribution['latitude'] . ', ' . $distribution['longitude'], + 'callback_data' => static::PROCESS . '_location' ] ], ]; @@ -447,8 +465,8 @@ final class registration extends core // Initializing the button for canceling the generation process $keyboard[$last][] = [ - 'text' => '❎ ' . $localization['distribution_registration_button_cancel'], - 'callback_data' => 'distribution_registration_cancel' + 'text' => '❎ ' . $localization[static::PROCESS . '_button_cancel'], + 'callback_data' => static::PROCESS . '_cancel' ]; if ( @@ -461,8 +479,8 @@ final class registration extends core // Initializing the button for completing the generation process $keyboard[$last][] = [ - 'text' => '✅ ' . $localization['distribution_registration_button_confirm'], - 'callback_data' => 'distribution_registration_end' + 'text' => '✅ ' . $localization[static::PROCESS . '_button_confirm'], + 'callback_data' => static::PROCESS . '_end' ]; } @@ -473,7 +491,7 @@ final class registration extends core // Sending the message $context->sendMessage( - '📀 *' . $localization['distribution_registration_generation'] . '*', + '📀 *' . $localization[static::PROCESS . '_generation'] . '*', [ 'reply_markup' => [ 'inline_keyboard' => $keyboard, @@ -484,10 +502,19 @@ final class registration extends core ); }); } else { - // Not found started registretion process + // Not found started distribution declaration process // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_registration_not_started'] . '*'); + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the distributions menu + commands::distributions($context); + }); } }); } else { @@ -525,7 +552,7 @@ final class registration extends core /** * Language * - * Write language into the distribution registration buffer + * Write language into the distribution declaration buffer * * @param context $context Request data from Telegram * @param language $new The language @@ -553,49 +580,58 @@ final class registration extends core // Initialized localization // Reading from the telegram user buffer - $context->getUserDataItem('distribution_registration') - ->then(function ($distribution) use ($context, $account, $language, $localization, $new) { + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $distribution) use ($context, $account, $language, $localization, $new) { // Readed from the telegram user buffer if ($distribution) { - // Found started registration process + // Found started distribution declaration process try { // Initializing the old language $old = $distribution['localization']['language']; - // Writing into the distribution registration process buffer + // Writing into the distribution declaration process buffer $distribution['localization']['language'] = $new; // Writing to the telegram user buffer - $context->setUserDataItem('distribution_registration', $distribution) + $context->setUserDataItem(static::PROCESS, $distribution) ->then(function () use ($context, $account, $language, $localization, $new, $old) { // Writed to the telegram user buffer // Sending the message - $context->sendMessage('✅ *' . $localization['distribution_registration_language_update_success'] . '* ' . ($old->flag() ? $old->flag() . ' ' : '') . $old->label($language) . ' → *' . ($new->flag() ? $new->flag() . ' ' : '') . $new->label($language) . '*') + $context->sendMessage('✅ *' . $localization[static::PROCESS . '_language_update_success'] . '* ' . ($old->flag() ? $old->flag() . ' ' : '') . $old->label($language) . ' → *' . ($new->flag() ? $new->flag() . ' ' : '') . $new->label($language) . '*') ->then(function (message $message) use ($context) { // Sended the message - // Sending the generation menu - static::generation($context); + // Sending the distribution declaration menu + static::menu($context); }); }); } catch (error $error) { // Failed to send the message about language update // Sending the message - $context->sendMessage('❎ *' . $localization['distribution_registration_language_update_fail']) + $context->sendMessage('❎ *' . $localization[static::PROCESS . '_language_update_fail']) ->then(function (message $message) use ($context) { // Ending the conversation process $context->endConversation(); }); } } else { - // Not found started registretion process + // Not found started distribution declaration process // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_registration_not_started'] . '*'); + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the distributions menu + commands::distributions($context); + }); } }); } else { @@ -633,7 +669,7 @@ final class registration extends core /** * Name * - * Write name into the distribution registration buffer + * Write name into the distribution declaration buffer * * @param context $context Request data from Telegram * @@ -654,12 +690,12 @@ final class registration extends core // Initialized localization // Reading from the telegram user buffer - $context->getUserDataItem('distribution_registration') - ->then(function ($distribution) use ($context, $account, $localization) { + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $distribution) use ($context, $account, $localization) { // Readed from the telegram user buffer if ($distribution) { - // Found started registration process + // Found started distribution declaration process // Initializing the new name $new = $context->getMessage()->getText(); @@ -670,7 +706,7 @@ final class registration extends core if (mb_strlen($new) >= 3) { // Passed minimum length check - if (mb_strlen($new) <= 32) { + if (mb_strlen($new) <= 64) { // Passed maximum length check // Search for restricted characters @@ -708,28 +744,28 @@ final class registration extends core // Initializing the old name $old = empty($distribution['localization']['name']) ? '_' . $localization['empty'] . '_' : $distribution['localization']['name']; - // Writing into the distribution registration process buffer + // Writing into the distribution declaration process buffer $distribution['localization']['name'] = $new; // Writing to the telegram user buffer - $context->setUserDataItem('distribution_registration', $distribution) + $context->setUserDataItem(static::PROCESS, $distribution) ->then(function () use ($context, $account, $localization, $new, $old) { // Writed to the telegram user buffer // Sending the message - $context->sendMessage('✅ *' . $localization['distribution_registration_name_update_success'] . "* $old → *$new*") + $context->sendMessage('✅ *' . $localization[static::PROCESS . '_name_update_success'] . "* $old → *$new*") ->then(function (message $message) use ($context) { // Sended the message - // Sending the generation menu - static::generation($context); + // Sending the distribution declaration menu + static::menu($context); }); }); } catch (error $error) { // Failed to send the message about name update // Sending the message - $context->sendMessage('❎ *' . $localization['distribution_registration_name_update_fail']) + $context->sendMessage('❎ *' . $localization[static::PROCESS . '_name_update_fail']) ->then(function (message $message) use ($context) { // Ending the conversation process $context->endConversation(); @@ -739,7 +775,7 @@ final class registration extends core // Number of spaces is more than 2 // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_registration_name_request_spaces'] . '*') + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_name_request_spaces'] . '*') ->then(function (message $message) use ($context) { // Sended the message @@ -747,17 +783,17 @@ final class registration extends core $context->endConversation(); // Requesting to enter name again - button_distribution_registration::name($context); + button_distribution_declaration::name($context); }); } } else { // Found restricted characters // Initializing title of the message - $title = '⚠️ *' . $localization['distribution_registration_name_request_restricted_characters_title'] . '*'; + $title = '⚠️ *' . $localization[static::PROCESS . '_name_request_restricted_characters_title'] . '*'; // Initializing description of the message - $description = '*' . $localization['distribution_registration_name_request_restricted_characters_description'] . '* \\' . implode(', \\', $characters); + $description = '*' . $localization[static::PROCESS . '_name_request_restricted_characters_description'] . '* \\' . implode(', \\', $characters); // Sending the message $context->sendMessage( @@ -774,14 +810,14 @@ final class registration extends core $context->endConversation(); // Requesting to enter name again - button_distribution_registration::name($context); + button_distribution_declaration::name($context); }); } } else { // Not passed maximum length check // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_registration_name_request_too_long'] . '*') + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_name_request_too_long'] . '*') ->then(function (message $message) use ($context) { // Sended the message @@ -789,14 +825,14 @@ final class registration extends core $context->endConversation(); // Requesting to enter name again - button_distribution_registration::name($context); + button_distribution_declaration::name($context); }); } } else { // Not passed minimum length check // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_registration_name_request_too_short'] . '*') + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_name_request_too_short'] . '*') ->then(function (message $message) use ($context) { // Sended the message @@ -804,14 +840,14 @@ final class registration extends core $context->endConversation(); // Requesting to enter name again - button_distribution_registration::name($context); + button_distribution_declaration::name($context); }); } } else { // Failed to initialize the new name // Sending the message - $context->sendMessage('📄 *' . $localization['distribution_registration_name_request_not_acceptable'] . '*') + $context->sendMessage('📄 *' . $localization[static::PROCESS . '_name_request_not_acceptable'] . '*') ->then(function (message $message) use ($context) { // Sended the message @@ -819,14 +855,23 @@ final class registration extends core $context->endConversation(); // Requesting to enter name again - button_distribution_registration::name($context); + button_distribution_declaration::name($context); }); } } else { - // Not found started registretion process + // Not found started distribution declaration process // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_registration_not_started'] . '*'); + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the distributions menu + commands::distributions($context); + }); } }); } else { @@ -854,7 +899,7 @@ final class registration extends core /** * Location * - * Write latitude and longitude into the distribution registration buffer + * Write latitude and longitude into the distribution declaration buffer * * @param context $context Request data from Telegram * @@ -875,12 +920,12 @@ final class registration extends core // Initialized localization // Reading from the telegram user buffer - $context->getUserDataItem('distribution_registration') - ->then(function ($distribution) use ($context, $account, $localization) { + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $distribution) use ($context, $account, $localization) { // Readed from the telegram user buffer if ($distribution) { - // Found started registration process + // Found started declaration process // Initializing the new location preg_match_all('/(\-?\d{1,2})\.?(\d*)/', $context->getMessage()->getText(), $matches); @@ -913,12 +958,12 @@ final class registration extends core // Initializing the old location $old = str_replace('.', '\\.', (empty($distribution['latitude']) ? '_' . $localization['empty'] . '_' : $distribution['latitude']) . ', ' . (empty($distribution['longitude']) ? '_' . $localization['empty'] . '_' : $distribution['longitude'])); - // Writing into the distribution registration process buffer + // Writing into the distribution declaration process buffer $distribution['latitude'] = $latitude; $distribution['longitude'] = $longitude; // Writing to the telegram user buffer - $context->setUserDataItem('distribution_registration', $distribution) + $context->setUserDataItem(static::PROCESS, $distribution) ->then(function () use ($context, $account, $localization, $latitude, $longitude, $old) { // Writed to the telegram user buffer @@ -926,19 +971,19 @@ final class registration extends core $new = str_replace('.', '\\.', $latitude . ', ' . $longitude); // Sending the message - $context->sendMessage('✅ *' . $localization['distribution_registration_location_update_success'] . "*\n$old → *$new*") + $context->sendMessage('✅ *' . $localization[static::PROCESS . '_location_update_success'] . "*\n$old → *$new*") ->then(function (message $message) use ($context) { // Sended the message - // Sending the generation menu - static::generation($context); + // Sending the distribution declaration menu + static::menu($context); }); }); } catch (error $error) { // Failed to send the message about name update // Sending the message - $context->sendMessage('❎ *' . $localization['distribution_registration_name_update_fail']) + $context->sendMessage('❎ *' . $localization[static::PROCESS . '_name_update_fail']) ->then(function (message $message) use ($context) { // Ending the conversation process $context->endConversation(); @@ -948,7 +993,7 @@ final class registration extends core // Not passed longitude maximum value check // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_registration_location_send_longitude_too_big'] . '*') + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_location_send_longitude_too_big'] . '*') ->then(function (message $message) use ($context) { // Sended the message @@ -956,14 +1001,14 @@ final class registration extends core $context->endConversation(); // Requesting to enter locaztion again - button_distribution_registration::location($context); + button_distribution_declaration::location($context); }); } } else { // Not passed longitude minimum value check // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_registration_location_send_longitude_too_small'] . '*') + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_location_send_longitude_too_small'] . '*') ->then(function (message $message) use ($context) { // Sended the message @@ -971,14 +1016,14 @@ final class registration extends core $context->endConversation(); // Requesting to enter locaztion again - button_distribution_registration::location($context); + button_distribution_declaration::location($context); }); } } else { // Not passed latitude maximum value check // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_registration_location_send_latitude_too_big'] . '*') + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_location_send_latitude_too_big'] . '*') ->then(function (message $message) use ($context) { // Sended the message @@ -986,14 +1031,14 @@ final class registration extends core $context->endConversation(); // Requesting to enter locaztion again - button_distribution_registration::location($context); + button_distribution_declaration::location($context); }); } } else { // Not passed latitude minimum value check // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_registration_location_send_latitude_too_small'] . '*') + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_location_send_latitude_too_small'] . '*') ->then(function (message $message) use ($context) { // Sended the message @@ -1001,14 +1046,14 @@ final class registration extends core $context->endConversation(); // Requesting to enter locaztion again - button_distribution_registration::location($context); + button_distribution_declaration::location($context); }); } } else { // Failed to initialize the new name // Sending the message - $context->sendMessage('📄 *' . $localization['distribution_registration_location_send_not_acceptable'] . '*') + $context->sendMessage('📄 *' . $localization[static::PROCESS . '_location_send_not_acceptable'] . '*') ->then(function (message $message) use ($context) { // Sended the message @@ -1016,14 +1061,14 @@ final class registration extends core $context->endConversation(); // Requesting to send location again - button_distribution_registration::location($context); + button_distribution_declaration::location($context); }); } } else { // Not initialized the new location // Sending the message - $context->sendMessage('📄 *' . $localization['distribution_registration_location_send_not_acceptable'] . '*') + $context->sendMessage('📄 *' . $localization[static::PROCESS . '_location_send_not_acceptable'] . '*') ->then(function (message $message) use ($context) { // Sended the message @@ -1031,14 +1076,23 @@ final class registration extends core $context->endConversation(); // Requesting to send locaztion again - button_distribution_registration::location($context); + button_distribution_declaration::location($context); }); } } else { - // Not found started registretion process + // Not found started distribution declaratoin process // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_registration_not_started'] . '*'); + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the distributions menu + commands::distributions($context); + }); } }); } else { diff --git a/svoboda/svoboder/system/models/telegram/processes/distribution/localization.php b/svoboda/svoboder/system/models/telegram/processes/distribution/localization/create.php similarity index 100% rename from svoboda/svoboder/system/models/telegram/processes/distribution/localization.php rename to svoboda/svoboder/system/models/telegram/processes/distribution/localization/create.php diff --git a/svoboda/svoboder/system/models/telegram/processes/distribution/search.php b/svoboda/svoboder/system/models/telegram/processes/distribution/search.php index 598af5f..f9d90b0 100755 --- a/svoboda/svoboder/system/models/telegram/processes/distribution/search.php +++ b/svoboda/svoboder/system/models/telegram/processes/distribution/search.php @@ -8,12 +8,15 @@ namespace svoboda\svoboder\models\telegram\processes\distribution; use svoboda\svoboder\models\core, svoboda\svoboder\models\account, svoboda\svoboder\models\distribution, - svoboda\svoboder\models\localizations\distribution as distribution_localization, + svoboda\svoboder\models\member, svoboda\svoboder\models\telegram\buttons\distribution\search as button_distribution_search, svoboda\svoboder\models\enumerations\language, svoboda\svoboder\models\telegram\commands, svoboda\svoboder\models\traits\coordinates; +// Event-driven library for PHP +use function React\Async\await; + // Framework for Telegram use Zanzara\Context as context, Zanzara\Telegram\Type\Message as message; @@ -39,6 +42,13 @@ final class search extends core coordinates::distance as vincenty; } + /** + * Process + * + * @var const string PROCESS Name of the process in the telegram user buffer + */ + public const string PROCESS = 'distribution_search'; + /** * Start * @@ -69,48 +79,47 @@ final class search extends core // Initialized localization // Reading from the telegram user buffer - $context->getUserDataItem('distribution_search') - ->then(function ($distribution) use ($context, $account, $language, $localization) { + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $search) use ($context, $account, $language, $localization) { // Readed from the telegram user buffer - if ($distribution) { + if ($search) { // Found started search process // Sending the message - $context->sendMessage('🗂 *' . $localization['distribution_search_continiued'] . '*') + $context->sendMessage('🗂 *' . $localization[static::PROCESS . '_continiued'] . '*') ->then(function (message $message) use ($context, $account, $language, $localization) { // Sended the message // Sending the list of found distributions and menu - static::search($context); + static::menu($context); }); } else { // Not found started search process // Initializing the distribution search buffer $search = [ - 'text' => null, + 'name' => null, 'location' => [ 'latitude' => null, 'longitude' => null, - 'distance' => 300 + 'distance' => DISTRIBUTIONS_SEARCH_DISTRIBUTION_DISTANCE ], - 'page' => 0, - 'confirmed' => true + 'page' => 0 ]; // Writing to the telegram user buffer - $context->setUserDataItem('distribution_search', $search) + $context->setUserDataItem(static::PROCESS, $search) ->then(function () use ($context, $account, $localization) { // Writed to the telegram user buffer // Sending the message - $context->sendMessage('🗂 *' . $localization['distribution_search_started'] . '*') + $context->sendMessage('🗂 *' . $localization[static::PROCESS . '_started'] . '*') ->then(function (message $message) use ($context, $account, $localization) { // Sended the message // Sending the list of found distributions and menu - static::search($context); + static::menu($context); }); }); } @@ -177,20 +186,20 @@ final class search extends core // Initialized localization // Reading from the telegram user buffer - $context->getUserDataItem('distribution_search') - ->then(function ($search) use ($context, $localization) { + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $search) use ($context, $localization) { // Readed from the telegram user buffer if ($search) { // Found started search process // Deleting from the telegram user buffer - $context->deleteUserDataItem('distribution_search', $search) + $context->deleteUserDataItem(static::PROCESS, $search) ->then(function () use ($context, $search, $localization) { // Deleted from the telegram user buffer // Sending the message - $context->sendMessage('🗂 *' . $localization['distribution_search_ended'] . '*') + $context->sendMessage('🗂 *' . $localization[static::PROCESS . '_ended'] . '*') ->then(function (message $message) use ($context) { // Sended the message @@ -204,8 +213,11 @@ final class search extends core } else { // Not found started search process - // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_search_not_started'] . '*'); + // Ending the conversation process + $context->endConversation(); + + // Sending the distributions menu + commands::distributions($context); } }); } else { @@ -235,15 +247,15 @@ final class search extends core } /** - * Search + * Menu * - * Sends the list of found distributions and menu with parameters: text + * Sends the list of found distributions and menu with parameters: text, location, distance * * @param context $context Request data from Telegram * * @return void */ - protected static function search(context $context): void + protected static function menu(context $context): void { // Initializing the account $account = $context->get('account'); @@ -264,8 +276,8 @@ final class search extends core // Initialized localization // Reading from the telegram user buffer - $context->getUserDataItem('distribution_search') - ->then(function ($search) use ($context, $account, $language, $localization) { + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $search) use ($context, $account, $language, $localization) { // Readed from the telegram user buffer if ($search) { @@ -275,51 +287,44 @@ final class search extends core $keyboard = [ [ [ - 'text' => empty($search['text']) ? '🔴 ' . $localization['distribution_search_button_text'] : '🟢 ' . $localization['distribution_search_button_text'] . ': ' . $search['text'], - 'callback_data' => 'distribution_search_text' + 'text' => empty($search['name']) ? '🔴 ' . $localization[static::PROCESS . '_button_name'] : '🟢 ' . $localization['distribution_search_button_name'] . ': ' . $search['name'], + 'callback_data' => static::PROCESS . '_name' ] ], [ [ - 'text' => $search['confirmed'] ? '🪽 ' . $localization['distribution_search_button_confirmed'] : '🏘 ' . $localization['distribution_search_button_confirmed_all'], - 'callback_data' => 'distribution_search_confirmed' + 'text' => empty($search['location']['latitude']) || empty($search['location']['longitude']) ? '🔴 ' . $localization[static::PROCESS . '_button_location'] : '🟢 ' . $localization['distribution_search_button_location'] . ': ' . $search['location']['latitude'] . ', ' . $search['location']['longitude'], + 'callback_data' => static::PROCESS . '_location' ] ], [ [ - 'text' => empty($search['location']['latitude']) || empty($search['location']['longitude']) ? '🔴 ' . $localization['distribution_search_button_location'] : '🟢 ' . $localization['distribution_search_button_location'] . ': ' . $search['location']['latitude'] . ', ' . $search['location']['longitude'], - 'callback_data' => 'distribution_search_location' - ] - ], - [ - [ - 'text' => empty($search['location']['distance']) ? '🔴 ' . $localization['distribution_search_button_distance'] : '🟢 ' . $localization['distribution_search_button_distance'] . ': ' . $search['location']['distance'] . ' ' . $localization['distribution_search_km'], - 'callback_data' => 'distribution_search_distance' + 'text' => empty($search['location']['distance']) ? '🔴 ' . $localization[static::PROCESS . '_button_distance'] : '🟢 ' . $localization['distribution_search_button_distance'] . ': ' . $search['location']['distance'] . ' ' . $localization['distribution_search_km'], + 'callback_data' => static::PROCESS . '_distance' ] ] ]; // Ending the conversation process $context->endConversation() - ->then(function () use ($context, $language, $localization, $search, $keyboard) { + ->then(function () use ($context, $account, $language, $localization, $search, $keyboard) { // Deinitialized the conversation process // Initializing the distribution model - $model = new distribution; + $model_distribution = new distribution; // Initializing amount of readed distributions per page - $page = 3; + $page = DISTRIBUTIONS_SEARCH_PAGE; if ( - empty($search['text']) && + empty($search['name']) && empty($search['location']['latitude']) && - empty($search['location']['longitude']) && - $search['confirmed'] === false + empty($search['location']['longitude']) ) { // Each search parameter is empty // Search for distributions - $distributions = $model->database->read( + $distributions = $model_distribution->database->read( amount: $page + 1, offset: $search['page'] < 1 ? 0 : $page * $search['page'] ); @@ -327,57 +332,55 @@ final class search extends core // The search buffer has at least one parameter // Search for distributions - $distributions = $model->database->read( - filter: function (record $record) use ($search) { + $distributions = $model_distribution->database->read( + filter: function (record $distribution) use ($search, $model_distribution) { // Initializing the matched buffer $matched = false; - if ($search['confirmed']) { - // Requested only confirmed - - if ($record->confirmed === 1) { - // The distribution is confirmed - - // Reinitializing the matched buffer - $matched = true; - } else { - // The distribution is not confirmed - - // Exit (success) - return false; - } - } - - if (!empty($search['text'])) { - // Requested search by text - - // Initializing the distribution localization model - $model = new distribution_localization; + if (!empty($search['name'])) { + // Requested search by name // Initializing localizations - $localizations = $model->database->read( - filter: fn(record $_record) => $_record->distribution === $record->identifier, - amount: 100 + $localizations = $model_distribution->localization->database->read( + filter: fn(record $localization) => $localization->distribution === $distribution->identifier, + amount: DISTRIBUTIONS_SEARCH_DISTRIBUTION_LOCALIZATIONS_AMOUNT ); + // Initializing the result status + $result = false; + foreach ($localizations as $localization) { // Iterating over localizations - if (levenshtein($localization->name, $search['text']) <= 4) { - // Names matched by Levenshtein function + // Splitting the localization name into parts + $parts = preg_split('/[\s]/', $localization->name); - // Reinitializing the matched buffer - $matched = true; + foreach ($parts as $part) { + // Iterating over localization name parts - // Exit (success) - break; - } else { - // Names not matched by Levenshtein function + if (levenshtein($part, $search['name']) <= DISTRIBUTIONS_SEARCH_DISTRIBUTION_NAME_LEVENSHTEIN_DISTANCE) { + // Names matched by Levenshtein function - // Exit (success) - return false; + // Reinitializing the matched buffer + $result = true; + + // Exit (success) + break 2; + } } } + + if ($result) { + // Names matched by Levenshtein function + + // Reinitializing the matched buffer + $matched = true; + } else { + // Names not matched by Levenshtein function + + // Exit (success) + return false; + } } if ( @@ -391,8 +394,8 @@ final class search extends core static::vincenty( $search['location']['latitude'], $search['location']['longitude'], - $record->latitude, - $record->longitude + $distribution->latitude, + $distribution->longitude ) <= $search['location']['distance'] * 1000 ) { // Matched by distance to distribution @@ -422,7 +425,7 @@ final class search extends core unset($distributions[$page]); // Initializing the title - $title = '🔎 *' . $localization['distribution_search_title'] . '*'; + $title = '🔍 *' . $localization[static::PROCESS . '_title'] . '*'; // Sending the message $context->sendMessage( @@ -436,14 +439,14 @@ final class search extends core 'remove_keyboard' => true ], ] - )->then(function (message $message) use ($context, $language, $localization, $search, $page, $next, $distributions) { + )->then(function (message $message) use ($context, $account, $language, $localization, $search, $page, $next, $distributions, $model_distribution) { // Sended the message if (count($distributions) > 0) { // Initialized distributions - // Initializing the distributions localization model - $model = new distribution_localization; + // Initializing the member model + $model_member = new member; foreach ($distributions as $distribution) { // Iterating over found distributions @@ -452,12 +455,9 @@ final class search extends core $values = null; // Initializing localizations - $localizations = $model->database->read( - filter: function (record $record) use ($distribution) { - // Exit (success) - return $record->distribution === $distribution->identifier; - }, - amount: 300 + $localizations = $model_distribution->localization->database->read( + filter: fn(record $localization) => $localization->distribution === $distribution->identifier, + amount: DISTRIBUTIONS_SEARCH_DISTRIBUTION_LOCALIZATIONS_AMOUNT ); if (count($localizations) > 0) { @@ -498,14 +498,11 @@ final class search extends core // Not initialized localization by english language // Initializing the account model - $model = new account; + $model_account = new account; // Initializing the distribution creator account - $creator = $model->database->read( - filter: function (record $record) use ($distribution) { - // Exit (success) - return $record->identifier === $distribution->creator; - }, + $creator = $model_account->database->read( + filter: fn(record $account) => $account->identifier === $distribution->creator, amount: 1 )[0] ?? null; @@ -516,9 +513,9 @@ final class search extends core // Iterating over localizations if ($record->language === $creator->language) { - // Found localization by the distribution creator language + // Found localization by the distribution creator account language - // Initializing localization by the distribution creator language + // Initializing localization by the distribution creator account language $values = $record; // Exit (success) @@ -528,9 +525,9 @@ final class search extends core } if (is_null($values)) { - // Not initialized localization by the distribution creator language + // Not initialized localization by the distribution creator account language - // Initializing localization by the distribution creator language + // Initializing localization by the first found record $values = $localizations[0]; } } @@ -539,7 +536,7 @@ final class search extends core // Not initialized the distributions localizations // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_search_not_localized'] . '*') + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_localized'] . '*') ->then(function (message $message) use ($context) { // Sended the message @@ -548,69 +545,59 @@ final class search extends core }); } - // Initializing name for the message - $name = $values instanceof record ? $values->name : $localization['distribution_search_not_named']; + // Searching for the member record + $member = $model_member->database->read( + filter: fn(record $member) => $member->distribution === $distribution->identifier && $member->account === $account->identifier, + amount: 1 + )[0] ?? null; - // Initializing accepting status for the message - $accepted = $distribution->accepted ? '🪽' : ''; + // Searching for the another member records + $another = $model_member->database->read( + filter: fn(record $member) => $member->distribution !== $distribution->identifier && $member->account === $account->identifier && $member->status !== 0, + amount: 1 + )[0] ?? null; - // Initializing members of the distribution - $members = []; + // Initializing buffer of keyboard + $keyboard = static::keyboard( + distribution: $distribution, + member: $another ?? $member, + localization: $localization, + messages: $account->authorized_messages === 1, + joins: $account->authorized_joins === 1, + ); - // Initializing amount of members for the message - $amount = '*' . $localization['distribution_search_members'] . ':* ' . count($members); + /* if ($account->authorized_system_distributions) { + // Authorized access to distribution administration - // Initializing location for the message - $location = '*' . $localization['distribution_search_location'] . ':* ' . str_replace('.', '\\.', (empty($distribution->latitude) ? '_' . $localization['empty'] . '_' : round($distribution->latitude, 6)) . ', ' . (empty($distribution->longitude) ? '_' . $localization['empty'] . '_' : round($distribution->longitude, 6))); + // Initializing identifier of the row for administration buttons + $identifier = count($keyboard); + + // Initializing the row for administration buttons + $keyboard[$identifier] ??= []; + + // Initializing the distribution accepting toggle button + $keyboard[$identifier][] = [ + 'text' => $distribution->recognized ? '🏠 ' . $localization[static::PROCESS . '_button_recognized'] : '🏚 ' . $localization['distribution_search_button_not_recognized'], + 'callback_data' => static::PROCESS . '_trust_toggle' + ]; + } */ // Sending the message - $context->sendMessage( - <<identifier* \- $name $accepted - - $amount - $location - TXT, + await($context->sendMessage( + static::message( + distribution: $distribution, + localization: $localization, + name: $values?->name, + recognized: false + ), [ 'reply_markup' => [ - 'inline_keyboard' => [ - [ - [ - 'text' => '🗺 ' . $localization['distribution_search_button_map'], - 'web_app' => [ - 'url' => 'https://telegram.map.svoboda.works?distribution=' . $distribution->identifier - ] - ], - /* [ - 'text' => ' ' . $localization['distribution_search_button_vhod'], - 'callback_data' => 'distribution_search_vhod' - ], */ - [ - 'text' => '🐣 ' . $localization['distribution_search_button_members'], - 'callback_data' => 'distribution_search_members' - ], - ], - /* [ - [ - 'text' => ' ' . $localization['distribution_search_button_telegram'], - 'url' => 'https://t.me/' - ], - ], */ - [ - [ - 'text' => '✉️ ' . $localization['distribution_search_button_message'], - 'callback_data' => 'distribution_search_message' - ], - ], - ], + 'inline_keyboard' => $keyboard, 'disable_notification' => true, 'remove_keyboard' => true ], ] - )->then(function (message $message) use ($context, $next) { - // Sended the message - - }); + )); } if ($next) { @@ -618,20 +605,20 @@ final class search extends core // Sending the message $context->sendMessage( - '🔎 *' . $localization['distribution_search_page_next_exists'] . '*', + '🔎 *' . $localization[static::PROCESS . '_page_next_exists'] . '*', [ 'reply_markup' => [ 'inline_keyboard' => [ [ [ - 'text' => $localization['distribution_search_button_end'], - 'callback_data' => 'distribution_search_end' + 'text' => '🔒 ' . $localization[static::PROCESS . '_button_end'], + 'callback_data' => static::PROCESS . '_end' ] ], [ [ - 'text' => $localization['distribution_search_button_page_next'], - 'callback_data' => 'distribution_search_next' + 'text' => $localization[static::PROCESS . '_button_page_next'], + 'callback_data' => static::PROCESS . '_next' ] ] ], @@ -650,14 +637,14 @@ final class search extends core // Sending the message $context->sendMessage( - '🔎 *' . $localization['distribution_search_page_next_not_exists'] . '*', + '🔎 *' . $localization[static::PROCESS . '_page_next_not_exists'] . '*', [ 'reply_markup' => [ 'inline_keyboard' => [ [ [ - 'text' => $localization['distribution_search_button_end'], - 'callback_data' => 'distribution_search_end' + 'text' => '🔒 ' . $localization[static::PROCESS . '_button_end'], + 'callback_data' => static::PROCESS . '_end' ] ] ], @@ -678,14 +665,14 @@ final class search extends core // Sending the message $context->sendMessage( - '⚠️ *' . $localization['distribution_search_empty'] . '*', + '⚠️ *' . $localization[static::PROCESS . '_empty'] . '*', [ 'reply_markup' => [ 'inline_keyboard' => [ [ [ - 'text' => $localization['distribution_search_button_end'], - 'callback_data' => 'distribution_search_end' + 'text' => '🔒 ' . $localization[static::PROCESS . '_button_end'], + 'callback_data' => static::PROCESS . '_end' ] ] ], @@ -707,12 +694,15 @@ final class search extends core // Not found started search process // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_search_not_started'] . '*') + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*') ->then(function (message $message) use ($context) { // Sended the message // Ending the conversation process $context->endConversation(); + + // Sending the distributions menu + commands::distributions($context); }); } }); @@ -755,15 +745,15 @@ final class search extends core } /** - * Text + * Name * - * Write search text into the distribution search buffer + * Write search name into the distribution search buffer * * @param context $context Request data from Telegram * * @return void */ - public static function text(context $context): void + public static function name(context $context): void { // Initializing the account $account = $context->get('account'); @@ -778,18 +768,18 @@ final class search extends core // Initialized localization // Reading from the telegram user buffer - $context->getUserDataItem('distribution_search') + $context->getUserDataItem(static::PROCESS) ->then(function ($search) use ($context, $localization) { // Readed from the telegram user buffer if ($search) { // Found started search process - // Initializing the new search text + // Initializing the new search name $new = $context->getMessage()->getText(); if (!empty($new)) { - // Initialized the new text + // Initialized the new search name if (mb_strlen($new) >= 3) { // Passed minimum length check @@ -826,31 +816,31 @@ final class search extends core // Not found restricted characters try { - // Initializing the old search text - $old = empty($search['text']) ? '_' . $localization['empty'] . '_' : $search['text']; + // Initializing the old search name + $old = empty($search['name']) ? '_' . $localization['empty'] . '_' : $search['name']; // Writing into the distribution search process buffer - $search['text'] = $new; + $search['name'] = $new; // Writing to the telegram user buffer - $context->setUserDataItem('distribution_search', $search) + $context->setUserDataItem(static::PROCESS, $search) ->then(function () use ($context, $localization, $new, $old) { // Writed to the telegram user buffer // Sending the message - $context->sendMessage('✅ *' . $localization['distribution_search_text_update_success'] . "* $old → *$new*") + $context->sendMessage('✅ *' . $localization[static::PROCESS . '_name_update_success'] . "* $old → *$new*") ->then(function (message $message) use ($context) { // Sended the message - // Sending the search menu - static::search($context); + // Sending the distribution search menu + static::menu($context); }); }); } catch (error $error) { - // Failed to send the message about search text update + // Failed to send the message about search name update // Sending the message - $context->sendMessage('❎ *' . $localization['distribution_search_text_update_fail']) + $context->sendMessage('❎ *' . $localization[static::PROCESS . '_name_update_fail']) ->then(function (message $message) use ($context) { // Ending the conversation process $context->endConversation(); @@ -860,10 +850,10 @@ final class search extends core // Found restricted characters // Initializing title of the message - $title = '⚠️ *' . $localization['distribution_search_text_request_restricted_characters_title'] . '*'; + $title = '⚠️ *' . $localization[static::PROCESS . '_name_request_restricted_characters_title'] . '*'; // Initializing description of the message - $description = '*' . $localization['distribution_search_text_request_restricted_characters_description'] . '* \\' . implode(', \\', $characters); + $description = '*' . $localization[static::PROCESS . '_name_request_restricted_characters_description'] . '* \\' . implode(', \\', $characters); // Sending the message $context->sendMessage( @@ -879,147 +869,69 @@ final class search extends core // Ending the conversation process $context->endConversation(); - // Requesting to enter search text again - button_distribution_search::text($context); + // Requesting to enter search name again + button_distribution_search::name($context); }); } } else { // Not passed maximum length check // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_search_text_request_too_long'] . '*') + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_name_request_too_long'] . '*') ->then(function (message $message) use ($context) { // Sended the message // Ending the conversation process $context->endConversation(); - // Requesting to enter search text again - button_distribution_search::text($context); + // Requesting to enter search name again + button_distribution_search::name($context); }); } } else { // Not passed minimum length check // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_search_text_request_too_short'] . '*') + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_name_request_too_short'] . '*') ->then(function (message $message) use ($context) { // Sended the message // Ending the conversation process $context->endConversation(); - // Requesting to enter search text again - button_distribution_search::text($context); + // Requesting to enter search name again + button_distribution_search::name($context); }); } } else { - // Failed to initialize the new search text + // Failed to initialize the new search name // Sending the message - $context->sendMessage('📄 *' . $localization['distribution_search_text_request_not_acceptable'] . '*') + $context->sendMessage('📄 *' . $localization[static::PROCESS . '_name_request_not_acceptable'] . '*') ->then(function (message $message) use ($context) { // Sended the message // Ending the conversation process $context->endConversation(); - // Requesting to enter search text again - button_distribution_search::text($context); + // Requesting to enter search name again + button_distribution_search::name($context); }); } } else { // Not found started search process // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_search_not_started'] . '*'); - } - }); - } else { - // Not initialized localization + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message - // Sending the message - $context->sendMessage('⚠️ *Failed to initialize localization*') - ->then(function (message $message) use ($context) { - // Sended the message + // Ending the conversation process + $context->endConversation(); - // Ending the conversation process - $context->endConversation(); - }); - } - } else { - // Not initialized the account - - // Sending the message - $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') - ->then(function (message $message) use ($context) { - // Sended the message - - // Ending the conversation process - $context->endConversation(); - }); - } - } - - /** - * Confirmed - * - * Toggle filter by confirmation status into the distribution search buffer - * - * @param context $context Request data from Telegram - * - * @return void - */ - public static function confirmed(context $context): void - { - // Initializing the account - $account = $context->get('account'); - - if ($account instanceof record) { - // Initialized the account - - // Initializing localization - $localization = $context->get('localization'); - - if ($localization) { - // Initialized localization - - // Reading from the telegram user buffer - $context->getUserDataItem('distribution_search') - ->then(function ($search) use ($context, $localization) { - // Readed from the telegram user buffer - - if ($search) { - // Found started search process - - // Iverting the "confirmed" parameter - $search['confirmed'] = !$search['confirmed']; - - // Writing to the telegram user buffer - $context->setUserDataItem('distribution_search', $search) - ->then(function () use ($context, $search, $localization) { - // Writed to the telegram user buffer - - // Initializing the old value for the message - $old = $search['confirmed'] ? $localization['distribution_search_button_confirmed_all'] : $localization['distribution_search_button_confirmed']; - - // Initializing the new value for the message - $new = $search['confirmed'] ? $localization['distribution_search_button_confirmed'] : $localization['distribution_search_button_confirmed_all']; - - // Sending the message - $context->sendMessage('✅ *' . $localization['distribution_search_confirmed_update_success'] . "* $old → *$new*") - ->then(function (message $message) use ($context) { - // Sended the message - - // Sending the search menu - static::search($context); - }); + // Sending the distributions menu + commands::distributions($context); }); - } else { - // Not found started search process - - // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_search_not_started'] . '*'); } }); } else { @@ -1072,7 +984,7 @@ final class search extends core // Initialized localization // Reading from the telegram user buffer - $context->getUserDataItem('distribution_search') + $context->getUserDataItem(static::PROCESS) ->then(function ($search) use ($context, $localization) { // Readed from the telegram user buffer @@ -1115,7 +1027,7 @@ final class search extends core $search['location']['longitude'] = $longitude; // Writing to the telegram user buffer - $context->setUserDataItem('distribution_search', $search) + $context->setUserDataItem(static::PROCESS, $search) ->then(function () use ($context, $localization, $latitude, $longitude, $old) { // Writed to the telegram user buffer @@ -1123,19 +1035,19 @@ final class search extends core $new = str_replace('.', '\\.', $latitude . ', ' . $longitude); // Sending the message - $context->sendMessage('✅ *' . $localization['distribution_search_location_update_success'] . "*\n$old → *$new*") + $context->sendMessage('✅ *' . $localization[static::PROCESS . '_location_update_success'] . "*\n$old → *$new*") ->then(function (message $message) use ($context) { // Sended the message - // Sending the search menu - static::search($context); + // Sending the distribution search menu + static::menu($context); }); }); } catch (error $error) { // Failed to send the message about name update // Sending the message - $context->sendMessage('❎ *' . $localization['distribution_search_location_update_fail']) + $context->sendMessage('❎ *' . $localization[static::PROCESS . '_location_update_fail']) ->then(function (message $message) use ($context) { // Sended the message @@ -1147,7 +1059,7 @@ final class search extends core // Not passed longitude maximum value check // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_search_location_send_longitude_too_big'] . '*') + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_location_send_longitude_too_big'] . '*') ->then(function (message $message) use ($context) { // Sended the message @@ -1162,7 +1074,7 @@ final class search extends core // Not passed longitude minimum value check // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_search_location_send_longitude_too_small'] . '*') + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_location_send_longitude_too_small'] . '*') ->then(function (message $message) use ($context) { // Sended the message @@ -1177,7 +1089,7 @@ final class search extends core // Not passed latitude maximum value check // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_search_location_send_latitude_too_big'] . '*') + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_location_send_latitude_too_big'] . '*') ->then(function (message $message) use ($context) { // Sended the message @@ -1192,7 +1104,7 @@ final class search extends core // Not passed latitude minimum value check // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_search_location_send_latitude_too_small'] . '*') + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_location_send_latitude_too_small'] . '*') ->then(function (message $message) use ($context) { // Sended the message @@ -1207,7 +1119,7 @@ final class search extends core // Failed to initialize the new location // Sending the message - $context->sendMessage('📄 *' . $localization['distribution_search_location_send_not_acceptable'] . '*') + $context->sendMessage('📄 *' . $localization[static::PROCESS . '_location_send_not_acceptable'] . '*') ->then(function (message $message) use ($context) { // Sended the message @@ -1222,7 +1134,7 @@ final class search extends core // Not initialized the new location // Sending the message - $context->sendMessage('📄 *' . $localization['distribution_search_location_send_not_acceptable'] . '*') + $context->sendMessage('📄 *' . $localization[static::PROCESS . '_location_send_not_acceptable'] . '*') ->then(function (message $message) use ($context) { // Sended the message @@ -1237,7 +1149,16 @@ final class search extends core // Not found started search process // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_search_not_started'] . '*'); + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the distributions menu + commands::distributions($context); + }); } }); } else { @@ -1286,7 +1207,7 @@ final class search extends core // Initialized localization // Reading from the telegram user buffer - $context->getUserDataItem('distribution_search') + $context->getUserDataItem(static::PROCESS) ->then(function ($search) use ($context, $localization) { // Readed from the telegram user buffer @@ -1302,7 +1223,7 @@ final class search extends core // Search for restricted characters preg_match_all('/[^\d]/u', $new, $matches); - // Initializing the buffer of found restricted characters (except spaces) + // Initializing found restricted characters $characters = $matches[0]; if (empty($characters)) { @@ -1325,24 +1246,24 @@ final class search extends core $search['location']['distance'] = $new; // Writing to the telegram user buffer - $context->setUserDataItem('distribution_search', $search) + $context->setUserDataItem(static::PROCESS, $search) ->then(function () use ($context, $localization, $new, $old) { // Writed to the telegram user buffer // Sending the message - $context->sendMessage('✅ *' . $localization['distribution_search_distance_update_success'] . "* $old \(" . $localization['distribution_search_km'] . '\) ' . " → *$new* \(" . $localization['distribution_search_km'] . '\)') + $context->sendMessage('✅ *' . $localization[static::PROCESS . '_distance_update_success'] . "* $old \(" . $localization['distribution_search_km'] . '\) ' . " → *$new* \(" . $localization['distribution_search_km'] . '\)') ->then(function (message $message) use ($context) { // Sended the message - // Sending the search menu - static::search($context); + // Sending the distribution search menu + static::menu($context); }); }); } catch (error $error) { // Failed to send the message about name update // Sending the message - $context->sendMessage('❎ *' . $localization['distribution_search_distance_update_fail']) + $context->sendMessage('❎ *' . $localization[static::PROCESS . '_distance_update_fail']) ->then(function (message $message) use ($context) { // Sended the message @@ -1354,7 +1275,7 @@ final class search extends core // Not passed maximum value check // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_search_distance_request_too_long_km'] . '*') + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_distance_request_too_long_km'] . '*') ->then(function (message $message) use ($context) { // Sended the message @@ -1369,7 +1290,7 @@ final class search extends core // Not passed minimum value check // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_search_distance_request_too_short_km'] . '*') + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_distance_request_too_short_km'] . '*') ->then(function (message $message) use ($context) { // Sended the message @@ -1384,10 +1305,10 @@ final class search extends core // Found restricted characters // Initializing title of the message - $title = '⚠️ *' . $localization['distribution_search_distance_request_restricted_characters_title'] . '*'; + $title = '⚠️ *' . $localization[static::PROCESS . '_distance_request_restricted_characters_title'] . '*'; // Initializing description of the message - $description = '*' . $localization['distribution_search_distance_request_restricted_characters_description'] . '* \\' . implode(', \\', $characters); + $description = '*' . $localization[static::PROCESS . '_distance_request_restricted_characters_description'] . '* \\' . implode(', \\', $characters); // Sending the message $context->sendMessage( @@ -1411,7 +1332,7 @@ final class search extends core // Failed to initialize the new distance // Sending the message - $context->sendMessage('📄 *' . $localization['distribution_search_distance_request_not_acceptable'] . '*') + $context->sendMessage('📄 *' . $localization[static::PROCESS . '_distance_request_not_acceptable'] . '*') ->then(function (message $message) use ($context) { // Sended the message @@ -1426,7 +1347,16 @@ final class search extends core // Not found started search process // Sending the message - $context->sendMessage('⚠️ *' . $localization['distribution_search_not_started'] . '*'); + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the distributions menu + commands::distributions($context); + }); } }); } else { @@ -1454,4 +1384,231 @@ final class search extends core }); } } + + /** + * Message text + * + * Generate text with the distribution infornation + * + * @param record $distribution The distribution + * @param array $localization The account localization + * @param string|null $name Localized name of the distribution + * @param bool $recognized Add the icon for recognized distributions? + * + * @return string Generated text + */ + public static function message( + record $distribution, + array $localization, + ?string $name = null, + bool $recognized = false + ): string { + // Initializing name for the message + $name = $name ?? $localization[static::PROCESS . '_not_named']; + + // Initializing accepting status for the message + $recognized = $recognized ? '🪽' : ''; + + // Initializing the member model + $model_member = new member; + + // Searching for members records + $members = $model_member->database->read( + filter: fn(record $record) => $record->distribution === $distribution->identifier, + amount: DISTRIBUTIONS_SEARCH_MEMBERS_AMOUNT + ) ?? []; + + // Initializing amount of recognized members for the message + $members_recognized = '*' . $localization[static::PROCESS . '_recognized'] . ':* ' . 0; + + // Initializing amount of members for the message + $amount = '*' . $localization[static::PROCESS . '_members'] . ':* ' . count(array_filter($members, fn(record $member) => $member?->status === 2)); + + // Initializing planners + $planners = '*' . $localization[static::PROCESS . '_planners'] . ':* ' . count(array_filter($members, fn(record $member) => $member?->status === 1)); + + // Initializing volunteers + $volunteers = '*' . $localization[static::PROCESS . '_volunteers'] . ':* ' . 0; + + // Initializing messages + $messages = '*' . $localization[static::PROCESS . '_messages'] . ':* ' . 0; + + // Initializing location for the message + $location = '*' . $localization[static::PROCESS . '_location'] . ':* ' . str_replace('.', '\\.', (empty($distribution->latitude) ? '_' . $localization['empty'] . '_' : round($distribution->latitude, 6)) . ', ' . (empty($distribution->longitude) ? '_' . $localization['empty'] . '_' : round($distribution->longitude, 6))); + + // Exit (success) + return <<identifier *$name* $recognized + + $amount + $members_recognized + $planners + $volunteers + + $messages + + $location + TXT; + } + + /** + * Keyboard (inline) + * + * Generate inline keyboard for the distribution + * + * @param record $distribution The distribution + * @param record|null $member The distribution member + * @param array $localization The account localization + * @param bool $planned Is the account planned to join to the distribution? + * @param bool $joined Is the account joined to the distribution? + * @param bool $messages Generate messages buttons? (is the account allowed to send messages?) + * @param bool $joins Generate joining buttons? (is the account allowed to join?) + * + * @return array Generated inline keyboard + */ + public static function keyboard( + record $distribution, + ?record $member, + array $localization, + bool $messages = false, + bool $joins = false, + ): array { + // Initializing the buffer of keyboard + $keyboard = [ + [ + [ + 'text' => '🗺 ' . $localization[static::PROCESS . '_button_map'], + 'web_app' => [ + /* 'url' => 'https://telegram.map.svoboda.works?distribution=' . $distribution->identifier */ + 'url' => "https://www.openstreetmap.org/#map=12/$distribution->latitude/$distribution->longitude" + ] + ] + ], + [ + /* [ + 'text' => ' ' . $localization[static::PROCESS . '_button_vhod'], + 'callback_data' => static::PROCESS . '_vhod' + ], */ + [ + 'text' => '🤟 ' . $localization[static::PROCESS . '_button_volunteers'], + 'callback_data' => static::PROCESS . '_volunteers' + ], + [ + 'text' => '🐣 ' . $localization[static::PROCESS . '_button_members'], + 'callback_data' => static::PROCESS . '_members' + ] + ] + ] + /* [ + [ + 'text' => ' ' . $localization[static::PROCESS . '_button_telegram'], + 'url' => 'https://t.me/' + ], + ], */; + + if ($joins) { + // Requested joining buttons + + if ($member instanceof record) { + // Initialized the member + + if ($member->distribution === $distribution->identifier) { + // The member distribution matched the distribution + + if ($member->status === 2) { + // The member was joined to the distribution + + // Writing the joining buttons into the buffer of keyboard + $keyboard[] = [ + [ + 'text' => '🧳 ' . $localization[static::PROCESS . '_button_leave'], + 'callback_data' => static::PROCESS . '_leave' + ] + ]; + } else if ($member->status === 1) { + // The member was planning to join to the distribution + + // Writing the joining buttons into the buffer of keyboard + $keyboard[] = [ + [ + 'text' => '❌ ' . $localization[static::PROCESS . '_button_unplan'], + 'callback_data' => static::PROCESS . '_unplan' + ], + [ + 'text' => '🧳 ' . $localization[static::PROCESS . '_button_join'], + 'callback_data' => static::PROCESS . '_join' + ] + ]; + } else { + // The member status is unknown + + // Writing the joining buttons into the buffer of keyboard + $keyboard[] = [ + [ + 'text' => '📅 ' . $localization[static::PROCESS . '_button_plan'], + 'callback_data' => static::PROCESS . '_plan' + ], + [ + 'text' => '🧳 ' . $localization[static::PROCESS . '_button_join'], + 'callback_data' => static::PROCESS . '_join' + ] + ]; + } + } else { + // The member distribution not matched the distribution + + if ($member->status === 2) { + // The member was joined to the distribution + + } else if ($member->status === 1) { + // The member was planning to join to the distribution + + } else { + // The member status is unknown + + // Writing the joining buttons into the buffer of keyboard + $keyboard[] = [ + [ + 'text' => '📅 ' . $localization[static::PROCESS . '_button_plan'], + 'callback_data' => static::PROCESS . '_plan' + ], + [ + 'text' => '🧳 ' . $localization[static::PROCESS . '_button_join'], + 'callback_data' => static::PROCESS . '_join' + ] + ]; + } + } + } else { + // Not initialized the member + + // Writing the joining buttons into the buffer of keyboard + $keyboard[] = [ + [ + 'text' => '📅 ' . $localization[static::PROCESS . '_button_plan'], + 'callback_data' => static::PROCESS . '_plan' + ], + [ + 'text' => '🧳 ' . $localization[static::PROCESS . '_button_join'], + 'callback_data' => static::PROCESS . '_join' + ] + ]; + } + } + + if ($messages) { + // Requested messages buttons + + // Writing the messages buttons into the buffer of joinings + $keyboard[] = [ + [ + 'text' => '✉️ ' . $localization[static::PROCESS . '_button_message'], + 'callback_data' => static::PROCESS . '_message' + ] + ]; + } + + // Exit (success) + return $keyboard; + } } diff --git a/svoboda/svoboder/system/models/telegram/processes/distribution/select.php b/svoboda/svoboder/system/models/telegram/processes/distribution/select.php new file mode 100755 index 0000000..9be0cb3 --- /dev/null +++ b/svoboda/svoboder/system/models/telegram/processes/distribution/select.php @@ -0,0 +1,1751 @@ + + */ +final class select extends core +{ + use coordinates { + coordinates::distance as vincenty; + } + + /** + * Process + * + * @var const string PROCESS Name of the process in the telegram user buffer + */ + public const string PROCESS = 'distribution_select'; + + /** + * Start + * + * Starting the distribution select process + * + * @param context $context Request data from Telegram + * @param callable $select The distribution selection function (context $context, array $distribution = ['distribution', 'localization']) + * @param callable $delete The distribution deletion function (context $context) + * @param callable $cancel The process canceling function (context $context) + * @param string|null $description Description of the message + * + * @return void + */ + public static function start(context $context, callable $select, callable $delete, callable $cancel, ?string $description = null): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing language + $language = $context->get('language'); + + if ($language instanceof language) { + // Initialized language + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $_select) use ($context, $account, $language, $localization, $select, $delete, $cancel, $description) { + // Readed from the telegram user buffer + + if ($_select) { + // Found started select process + + // Sending the message + $context->sendMessage('🗂 *' . $localization[static::PROCESS . '_continiued'] . '*') + ->then(function (message $message) use ($context, $account, $language, $localization) { + // Sended the message + + // Sending the list of found distributions and menu + static::menu($context); + }); + } else { + // Not found started select process + + // Initializing the distribution select buffer + $_select = [ + 'name' => null, + 'location' => [ + 'latitude' => null, + 'longitude' => null, + 'distance' => DISTRIBUTIONS_SELECT_DISTRIBUTION_DISTANCE + ], + 'events' => [ + 'select' => $select, + 'delete' => $delete, + 'cancel' => $cancel + ], + 'page' => 0 + ]; + + // Writing to the telegram user buffer + $context->setUserDataItem(static::PROCESS, $_select) + ->then(function () use ($context, $account, $localization, $description) { + // Writed to the telegram user buffer + + // Initializing title for the message + $title = '🗂 *' . $localization[static::PROCESS . '_started'] . '*'; + + // Sending the message + $context->sendMessage( + empty($description) + ? + $title + : + <<then(function (message $message) use ($context, $account, $localization) { + // Sended the message + + // Sending the list of found distributions and menu + static::menu($context); + }); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized language + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize language*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Select + * + * End the distribution select process + * and process the distribution selection telegram button listener + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function select(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing language + $language = $context->get('language'); + + if ($language instanceof language) { + // Initialized language + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $select) use ($context, $language, $localization) { + // Readed from the telegram user buffer + + if ($select) { + // Found started select process + + // Declaring the target distribution + $distribution = [ + 'distribution' => null, + 'localization' => null + ]; + + // Initializing the message text + $text = $context->getCallbackQuery()?->getMessage()?->getText(); + + if (!empty($text)) { + // Initialized the message text + + // Searching for the distribution identifier + preg_match('/^(\d)+[\w\s]+$/mu', $text, $matches); + + // Initializing the distribution identifier + $identifier = $matches[1] ?? null; + + if (!empty($identifier)) { + // Initialized the distribution identifier + + // Type conversion + $identifier = (int) $identifier; + + // Initializing the distribution model + $model_distribution = new distribution; + + // Initializing the distribution + $distribution['distribution'] = $model_distribution->database->read( + filter: fn(record $record) => $record->identifier === $identifier, + amount: 1 + )[0] ?? null; + + if ($distribution['distribution'] instanceof record) { + // Initialized the distribution + + // Searching for the distribution localizations records + $distribution_localizations = $model_distribution->localization->database->read( + filter: fn(record $localization) => $localization->distribution === $distribution['distribution']->identifier, + amount: MEMBERS_SEARCH_DISTRIBUTION_LOCALIZATIONS_AMOUNT + ); + + if (count($distribution_localizations) > 0) { + // Initialized the distributions localizations + + foreach ($distribution_localizations as $record) { + // Iterating over localizations + + if ($record->language === $language->name) { + // Found localization by the account language + + // Initializing localization by the account language + $distribution['localization'] = $record; + + // Exit (success) + break; + } + } + if (is_null($distribution['localization'])) { + // Not initialized localization by the account language + + foreach ($distribution_localizations as $record) { + // Iterating over localizations + + if ($record->language === 'en') { + // Found localization by english language + + // Initializing localization by english language + $distribution['localization'] = $record; + + // Exit (success) + break; + } + } + + if (is_null($distribution['localization'])) { + // Not initialized localization by english language + + // Initializing the account model + $model_account = new account; + + // Initializing the distribution creator account + $creator = $model_account->database->read( + filter: fn(record $account) => $account->identifier === $distribution['distribution']->creator, + amount: 1 + )[0] ?? null; + + if ($creator instanceof record) { + // Initialized the distribution creator account + + foreach ($distribution_localizations as $record) { + // Iterating over localizations + + if ($record->language === $creator->language) { + // Found localization by the distribution creator account language + + // Initializing localization by the distribution creator account language + $distribution['localization'] = $record; + + // Exit (success) + break; + } + } + } + + if (is_null($distribution['localization'])) { + // Not initialized localization by the distribution creator account language + + // Initializing localization by the first found record + $distribution['localization'] = $distribution_localizations[0]; + } + } + } + } + } + + // Deleting from the telegram user buffer + $context->deleteUserDataItem(static::PROCESS) + ->then(function () use ($context, $select, $language, $localization, $distribution) { + // Deleted from the telegram user buffer + + // Sending the message + $context->sendMessage('🗂 *' . $localization[static::PROCESS . '_ended'] . '*') + ->then(function (message $message) use ($context, $select, $distribution) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Processing the event + $select['events']['select'](context: $context, distribution: $distribution); + }); + }); + } else { + // Not initialized the distribution identifier + + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + } + } else { + // Not initialized the message text + + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + } + } else { + // Not found started select process + + // Ending the conversation process + $context->endConversation(); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized language + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize language*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Delete + * + * End the distribution select process + * and process the distribution deletion telegram button listener + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function delete(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $select) use ($context, $localization) { + // Readed from the telegram user buffer + + if ($select) { + // Found started select process + + // Deleting from the telegram user buffer + $context->deleteUserDataItem(static::PROCESS, $select) + ->then(function () use ($context, $select, $localization) { + // Deleted from the telegram user buffer + + // Sending the message + $context->sendMessage('🗂 *' . $localization[static::PROCESS . '_ended'] . '*') + ->then(function (message $message) use ($context, $select) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Processing the event + $select['events']['delete'](context: $context); + }); + }); + } else { + // Not found started select process + + // Ending the conversation process + $context->endConversation(); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Cancel + * + * End the distribution select process + * and process the distribution canceling telegram button listener + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function cancel(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $select) use ($context, $localization) { + // Readed from the telegram user buffer + + if ($select) { + // Found started select process + + // Deleting from the telegram user buffer + $context->deleteUserDataItem(static::PROCESS, $select) + ->then(function () use ($context, $select, $localization) { + // Deleted from the telegram user buffer + + // Sending the message + $context->sendMessage('🗂 *' . $localization[static::PROCESS . '_ended'] . '*') + ->then(function (message $message) use ($context, $select) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Processing the event + $select['events']['cancel'](context: $context); + }); + }); + } else { + // Not found started select process + + // Ending the conversation process + $context->endConversation(); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Menu + * + * Sends the list of found distributions and menu with parameters: text, location, distance + * + * @param context $context Request data from Telegram + * + * @return void + */ + protected static function menu(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing language + $language = $context->get('language'); + + if ($language) { + // Initialized language + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $select) use ($context, $account, $language, $localization) { + // Readed from the telegram user buffer + + if ($select) { + // Found started select process + + // Initializing the buffer of generated keyboard with languages + $keyboard = [ + [ + [ + 'text' => empty($select['name']) ? '🔴 ' . $localization[static::PROCESS . '_button_name'] : '🟢 ' . $localization['distribution_select_button_name'] . ': ' . $select['name'], + 'callback_data' => static::PROCESS . '_name' + ] + ], + [ + [ + 'text' => empty($select['location']['latitude']) || empty($select['location']['longitude']) ? '🔴 ' . $localization[static::PROCESS . '_button_location'] : '🟢 ' . $localization['distribution_select_button_location'] . ': ' . $select['location']['latitude'] . ', ' . $select['location']['longitude'], + 'callback_data' => static::PROCESS . '_location' + ] + ], + [ + [ + 'text' => empty($select['location']['distance']) ? '🔴 ' . $localization[static::PROCESS . '_button_distance'] : '🟢 ' . $localization['distribution_select_button_distance'] . ': ' . $select['location']['distance'] . ' ' . $localization['distribution_select_km'], + 'callback_data' => static::PROCESS . '_distance' + ] + ] + ]; + + // Ending the conversation process + $context->endConversation() + ->then(function () use ($context, $account, $language, $localization, $select, $keyboard) { + // Deinitialized the conversation process + + // Initializing the distribution model + $model_distribution = new distribution; + + // Initializing amount of readed distributions per page + $page = DISTRIBUTIONS_SELECT_PAGE; + + if ( + empty($select['name']) && + empty($select['location']['latitude']) && + empty($select['location']['longitude']) + ) { + // Each select parameter is empty + + // Search for distributions + $distributions = $model_distribution->database->read( + amount: $page + 1, + offset: $select['page'] < 1 ? 0 : $page * $select['page'] + ); + } else { + // The select buffer has at least one parameter + + // Search for distributions + $distributions = $model_distribution->database->read( + filter: function (record $distribution) use ($select, $model_distribution) { + // Initializing the matched buffer + $matched = false; + + if (!empty($select['name'])) { + // Requested select by name + + // Initializing localizations + $localizations = $model_distribution->localization->database->read( + filter: fn(record $localization) => $localization->distribution === $distribution->identifier, + amount: DISTRIBUTIONS_SELECT_DISTRIBUTION_LOCALIZATIONS_AMOUNT + ); + + // Initializing the result status + $result = false; + + foreach ($localizations as $localization) { + // Iterating over localizations + + // Splitting the localization name into parts + $parts = preg_split('/[\s]/', $localization->name); + + foreach ($parts as $part) { + // Iterating over localization name parts + + if (levenshtein($part, $select['name']) <= DISTRIBUTIONS_SELECT_DISTRIBUTION_NAME_LEVENSHTEIN_DISTANCE) { + // Names matched by Levenshtein function + + // Reinitializing the matched buffer + $result = true; + + // Exit (success) + break 2; + } + } + } + + if ($result) { + // Names matched by Levenshtein function + + // Reinitializing the matched buffer + $matched = true; + } else { + // Names not matched by Levenshtein function + + // Exit (success) + return false; + } + } + + if ( + !empty($select['location']['latitude']) && + !empty($select['location']['longitude']) && + !empty($select['location']['distance']) + ) { + // Requested select by location + + if ( + static::vincenty( + $select['location']['latitude'], + $select['location']['longitude'], + $distribution->latitude, + $distribution->longitude + ) <= $select['location']['distance'] * 1000 + ) { + // Matched by distance to distribution + + // Reinitializing the matched buffer + $matched = true; + } else { + // Not matched by distance to distribution + + // Exit (success) + return false; + } + } + + // Exit (success) + return $matched; + }, + amount: $page + 1, + offset: $select['page'] < 1 ? 0 : $page * $select['page'] + ); + } + + // Initializing the next page existence status + $next = count($distributions) > $page; + + // Deleting the additional readed distribution + unset($distributions[$page]); + + // Initializing the title + $title = '🔍 *' . $localization[static::PROCESS . '_title'] . '*'; + + // Sending the message + $context->sendMessage( + << [ + 'inline_keyboard' => $keyboard, + 'disable_notification' => true, + 'remove_keyboard' => true + ], + ] + )->then(function (message $message) use ($context, $account, $language, $localization, $select, $page, $next, $distributions, $model_distribution) { + // Sended the message + + if (count($distributions) > 0) { + // Initialized distributions + + // Initializing the member model + $model_member = new member; + + foreach ($distributions as $distribution) { + // Iterating over found distributions + + // Declaring the buffer of localized values + $values = null; + + // Initializing localizations + $localizations = $model_distribution->localization->database->read( + filter: fn(record $localization) => $localization->distribution === $distribution->identifier, + amount: DISTRIBUTIONS_SELECT_DISTRIBUTION_LOCALIZATIONS_AMOUNT + ); + + if (count($localizations) > 0) { + // Initialized the distributions localizations + + foreach ($localizations as $record) { + // Iterating over localizations + + if ($record->language === $language->name) { + // Found localization by the account language + + // Initializing localization by the account language + $values = $record; + + // Exit (success) + break; + } + } + + if (is_null($values)) { + // Not initialized localization by the account language + + foreach ($localizations as $record) { + // Iterating over localizations + + if ($record->language === 'en') { + // Found localization by english language + + // Initializing localization by english language + $values = $record; + + // Exit (success) + break; + } + } + + if (is_null($values)) { + // Not initialized localization by english language + + // Initializing the account model + $model_account = new account; + + // Initializing the distribution creator account + $creator = $model_account->database->read( + filter: fn(record $account) => $account->identifier === $distribution->creator, + amount: 1 + )[0] ?? null; + + if ($creator instanceof record) { + // Initialized the distribution creator account + + foreach ($localizations as $record) { + // Iterating over localizations + + if ($record->language === $creator->language) { + // Found localization by the distribution creator account language + + // Initializing localization by the distribution creator account language + $values = $record; + + // Exit (success) + break; + } + } + } + + if (is_null($values)) { + // Not initialized localization by the distribution creator account language + + // Initializing localization by the first found record + $values = $localizations[0]; + } + } + } + } else { + // Not initialized the distributions localizations + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_localized'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + + // Search for the member record + $member = $model_member->database->read( + filter: fn(record $member) => $member->distribution === $distribution->identifier && $member->account === $account->identifier, + amount: 1 + )[0] ?? null; + + // Initializing buffer of keyboard + $keyboard = static::keyboard( + localization: $localization + ); + + // Sending the message + await($context->sendMessage( + static::message( + distribution: $distribution, + localization: $localization, + name: $values?->name, + recognized: false + ), + [ + 'reply_markup' => [ + 'inline_keyboard' => $keyboard, + 'disable_notification' => true, + 'remove_keyboard' => true + ], + ] + )); + } + + if ($next) { + // Exists the next page + + // Sending the message + $context->sendMessage( + '🔎 *' . $localization[static::PROCESS . '_page_next_exists'] . '*', + [ + 'reply_markup' => [ + 'inline_keyboard' => [ + [ + [ + 'text' => '🔥 ' . $localization[static::PROCESS . '_button_delete'], + 'callback_data' => static::PROCESS . '_delete' + ], + [ + 'text' => '❌ ' . $localization[static::PROCESS . '_button_cancel'], + 'callback_data' => static::PROCESS . '_cancel' + ] + ], + [ + [ + 'text' => $localization[static::PROCESS . '_button_page_next'], + 'callback_data' => static::PROCESS . '_next' + ] + ] + ], + 'disable_notification' => true, + 'remove_keyboard' => true + ], + ] + )->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } else { + // Not exists the next page + + // Sending the message + $context->sendMessage( + '🔎 *' . $localization[static::PROCESS . '_page_next_not_exists'] . '*', + [ + 'reply_markup' => [ + 'inline_keyboard' => [ + [ + [ + 'text' => '🔥 ' . $localization[static::PROCESS . '_button_delete'], + 'callback_data' => static::PROCESS . '_delete' + ], + [ + 'text' => '❌ ' . $localization[static::PROCESS . '_button_cancel'], + 'callback_data' => static::PROCESS . '_cancel' + ] + ] + ], + 'disable_notification' => true, + 'remove_keyboard' => true + ], + ] + ) + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized distributions + + // Sending the message + $context->sendMessage( + '⚠️ *' . $localization[static::PROCESS . '_empty'] . '*', + [ + 'reply_markup' => [ + 'inline_keyboard' => [ + [ + [ + 'text' => '🔥 ' . $localization[static::PROCESS . '_button_delete'], + 'callback_data' => static::PROCESS . '_delete' + ], + + [ + 'text' => '❌ ' . $localization[static::PROCESS . '_button_cancel'], + 'callback_data' => static::PROCESS . '_cancel' + ] + ] + ], + 'disable_notification' => true, + 'remove_keyboard' => true + ], + ] + ) + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + }); + }); + } else { + // Not found started select process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the distributions menu + commands::distributions($context); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized language + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize language*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Name + * + * Write select name into the distribution select buffer + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function name(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function ($select) use ($context, $localization) { + // Readed from the telegram user buffer + + if ($select) { + // Found started select process + + // Initializing the new select name + $new = $context->getMessage()->getText(); + + if (!empty($new)) { + // Initialized the new select name + + if (mb_strlen($new) >= 3) { + // Passed minimum length check + + if (mb_strlen($new) <= 64) { + // Passed maximum length check + + // Search for restricted characters + preg_match_all('/[\W\d]/u', $new, $matches); + + // Declaring the buffer of found restricted characters (except spaces) + $characters = []; + + // Declaring the counter of found spaces + $spaces = 0; + + foreach ($matches[0] as $match) { + // Iterating over found restricted characters + + if ($match === ' ') { + // Space-character + + // Increasing the counter of found spaces + ++$spaces; + } else { + // Not space-character + + // Writing into the buffer of found restricted characers (except spaces) + $characters[] = $match; + } + } + + if (empty($characters)) { + // Not found restricted characters + + try { + // Initializing the old select name + $old = empty($select['name']) ? '_' . $localization['empty'] . '_' : $select['name']; + + // Writing into the distribution select process buffer + $select['name'] = $new; + + // Writing to the telegram user buffer + $context->setUserDataItem(static::PROCESS, $select) + ->then(function () use ($context, $localization, $new, $old) { + // Writed to the telegram user buffer + + // Sending the message + $context->sendMessage('✅ *' . $localization[static::PROCESS . '_name_update_success'] . "* $old → *$new*") + ->then(function (message $message) use ($context) { + // Sended the message + + // Sending the distribution select menu + static::menu($context); + }); + }); + } catch (error $error) { + // Failed to send the message about select name update + + // Sending the message + $context->sendMessage('❎ *' . $localization[static::PROCESS . '_name_update_fail']) + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Found restricted characters + + // Initializing title of the message + $title = '⚠️ *' . $localization[static::PROCESS . '_name_request_restricted_characters_title'] . '*'; + + // Initializing description of the message + $description = '*' . $localization[static::PROCESS . '_name_request_restricted_characters_description'] . '* \\' . implode(', \\', $characters); + + // Sending the message + $context->sendMessage( + <<then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter select name again + button_distribution_select::name($context); + }); + } + } else { + // Not passed maximum length check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_name_request_too_long'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter select name again + button_distribution_select::name($context); + }); + } + } else { + // Not passed minimum length check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_name_request_too_short'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter select name again + button_distribution_select::name($context); + }); + } + } else { + // Failed to initialize the new select name + + // Sending the message + $context->sendMessage('📄 *' . $localization[static::PROCESS . '_name_request_not_acceptable'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter select name again + button_distribution_select::name($context); + }); + } + } else { + // Not found started select process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the distributions menu + commands::distributions($context); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Location + * + * Write location into the distribution select buffer + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function location(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function ($select) use ($context, $localization) { + // Readed from the telegram user buffer + + if ($select) { + // Found started select process + + // Initializing the new location + preg_match_all('/(\-?\d{1,2})\.?(\d*)/', $context->getMessage()->getText(), $matches); + + if ($matches[0]) { + // Initialized the new location + + // Initializing the new latitude + $latitude = round((float) $matches[0][0], 6); + + // Initializing the new longitude + $longitude = round((float) $matches[0][1], 6); + + if (!empty($latitude) && !empty($longitude)) { + // Initialized the new latitude and the new longitude + + if ($latitude >= 0) { + // Passed latitude minimum value check + + if ($latitude <= 90) { + // Passed latitude maximum value check + + if ($longitude >= 0) { + // Passed longitude minimum value check + + if ($longitude <= 180) { + // Passed longitude maximum value check + + try { + // Initializing the old location + $old = str_replace('.', '\\.', (empty($select['location']['latitude']) ? '_' . $localization['empty'] . '_' : $select['location']['latitude']) . ', ' . (empty($select['location']['longitude']) ? '_' . $localization['empty'] . '_' : $select['location']['longitude'])); + + // Writing into the distribution select process buffer + $select['location']['latitude'] = $latitude; + $select['location']['longitude'] = $longitude; + + // Writing to the telegram user buffer + $context->setUserDataItem(static::PROCESS, $select) + ->then(function () use ($context, $localization, $latitude, $longitude, $old) { + // Writed to the telegram user buffer + + // Initializing the new location + $new = str_replace('.', '\\.', $latitude . ', ' . $longitude); + + // Sending the message + $context->sendMessage('✅ *' . $localization[static::PROCESS . '_location_update_success'] . "*\n$old → *$new*") + ->then(function (message $message) use ($context) { + // Sended the message + + // Sending the distribution select menu + static::menu($context); + }); + }); + } catch (error $error) { + // Failed to send the message about name update + + // Sending the message + $context->sendMessage('❎ *' . $localization[static::PROCESS . '_location_update_fail']) + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not passed longitude maximum value check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_location_send_longitude_too_big'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter locaztion again + button_distribution_select::location($context); + }); + } + } else { + // Not passed longitude minimum value check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_location_send_longitude_too_small'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter locaztion again + button_distribution_select::location($context); + }); + } + } else { + // Not passed latitude maximum value check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_location_send_latitude_too_big'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter locaztion again + button_distribution_select::location($context); + }); + } + } else { + // Not passed latitude minimum value check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_location_send_latitude_too_small'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter locaztion again + button_distribution_select::location($context); + }); + } + } else { + // Failed to initialize the new location + + // Sending the message + $context->sendMessage('📄 *' . $localization[static::PROCESS . '_location_send_not_acceptable'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to send location again + button_distribution_select::location($context); + }); + } + } else { + // Not initialized the new location + + // Sending the message + $context->sendMessage('📄 *' . $localization[static::PROCESS . '_location_send_not_acceptable'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to send locaztion again + button_distribution_select::location($context); + }); + } + } else { + // Not found started select process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the distributions menu + commands::distributions($context); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Distance + * + * Write location distance into the distribution select buffer + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function distance(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function ($select) use ($context, $localization) { + // Readed from the telegram user buffer + + if ($select) { + // Found started select process + + // Initializing the new distance + $new = $context->getMessage()->getText(); + + if (!empty($new)) { + // Initialized the new distance + + // Search for restricted characters + preg_match_all('/[^\d]/u', $new, $matches); + + // Initializing found restricted characters + $characters = $matches[0]; + + if (empty($characters)) { + // Not found restricted characters + + // Converting the new value from string to integer + $new = (int) $new; + + if ($new >= 0) { + // Passed minimum value check + + if ($new <= 600) { + // Passed maximum value check + + try { + // Initializing the old name + $old = empty($select['location']['distance']) ? '_' . $localization['empty'] . '_' : $select['location']['distance']; + + // Writing into the distribution select process buffer + $select['location']['distance'] = $new; + + // Writing to the telegram user buffer + $context->setUserDataItem(static::PROCESS, $select) + ->then(function () use ($context, $localization, $new, $old) { + // Writed to the telegram user buffer + + // Sending the message + $context->sendMessage('✅ *' . $localization[static::PROCESS . '_distance_update_success'] . "* $old \(" . $localization['distribution_select_km'] . '\) ' . " → *$new* \(" . $localization['distribution_select_km'] . '\)') + ->then(function (message $message) use ($context) { + // Sended the message + + // Sending the distribution select menu + static::menu($context); + }); + }); + } catch (error $error) { + // Failed to send the message about name update + + // Sending the message + $context->sendMessage('❎ *' . $localization[static::PROCESS . '_distance_update_fail']) + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not passed maximum value check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_distance_request_too_long_km'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter distance again + button_distribution_select::distance($context); + }); + } + } else { + // Not passed minimum value check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_distance_request_too_short_km'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter ditance again + button_distribution_select::distance($context); + }); + } + } else { + // Found restricted characters + + // Initializing title of the message + $title = '⚠️ *' . $localization[static::PROCESS . '_distance_request_restricted_characters_title'] . '*'; + + // Initializing description of the message + $description = '*' . $localization[static::PROCESS . '_distance_request_restricted_characters_description'] . '* \\' . implode(', \\', $characters); + + // Sending the message + $context->sendMessage( + <<then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter distance again + button_distribution_select::distance($context); + }); + } + } else { + // Failed to initialize the new distance + + // Sending the message + $context->sendMessage('📄 *' . $localization[static::PROCESS . '_distance_request_not_acceptable'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter distance again + button_distribution_select::distance($context); + }); + } + } else { + // Not found started select process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the distributions menu + commands::distributions($context); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Message text + * + * Generate text with the distribution infornation + * + * @param record $distribution The distribution + * @param array $localization The account localization + * @param string|null $name Localized name of the distribution + * @param bool $recognized Add the icon for recognized distributions? + * + * @return string Generated text + */ + public static function message( + record $distribution, + array $localization, + ?string $name = null, + bool $recognized = false + ): string { + // Initializing name for the message + $name = $name ?? $localization[static::PROCESS . '_not_named']; + + // Initializing accepting status for the message + $recognized = $recognized ? '🪽' : ''; + + // Exit (success) + return "$distribution->identifier *$name* $recognized"; + } + + /** + * Keyboard (inline) + * + * Generate inline keyboard for the distribution + * + * @param array $localization The account localization + * + * @return array Generated inline keyboard + */ + public static function keyboard(array $localization): array + { + // Exit (success) + return [ + [ + [ + 'text' => '✅ ' . $localization[static::PROCESS . '_button_select'], + 'callback_data' => static::PROCESS . '_select' + ] + ] + ]; + } +} diff --git a/svoboda/svoboder/system/models/telegram/selections.php b/svoboda/svoboder/system/models/telegram/processes/language/select.php similarity index 83% rename from svoboda/svoboder/system/models/telegram/selections.php rename to svoboda/svoboder/system/models/telegram/processes/language/select.php index f8a681b..fadbc38 100755 --- a/svoboda/svoboder/system/models/telegram/selections.php +++ b/svoboda/svoboder/system/models/telegram/processes/language/select.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace svoboda\svoboder\models\telegram; +namespace svoboda\svoboder\models\telegram\processes\language; // Files of the project use svoboda\svoboder\models\core, @@ -16,28 +16,29 @@ use Zanzara\Context as context, use mirzaev\baza\record; /** - * Telegram selections + * Telegram language select * - * @package svoboda\svoboder\models\telegram + * @package svoboda\svoboder\models\telegram\processes\language * * @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License * @author Arsen Mirzaev Tatyano-Muradovich */ -final class selections extends core +final class select extends core { /** * Language * - * The language choose menu + * Send the language choose menu * * @param context $context Request data from Telegram * @param string $prefix Prefix for 'callback_data' (`$prefix . $language->name`) * @param string $title Title of the message * @param string $description Description of the message + * @param array $exclude Languages that will be excluded ['ru', 'en'...] * * @return void */ - public static function language(context $context, string $prefix, string $title, string $description): void + public static function menu(context $context, string $prefix, string $title, string $description, array $exclude = []): void { // Initializing the account $account = $context->get('account'); @@ -75,6 +76,9 @@ final class selections extends core foreach ($languages as $language) { // Iterating over languages + // Skipping excluded languages + if (array_search($language->name, $exclude, strict: true) !== false) continue; + // Initializing the row $keyboard[$row] ??= []; @@ -89,7 +93,7 @@ final class selections extends core } // Writing the button for helping lozalizing - $keyboard[++$row] = [ + $keyboard[$row === 0 && empty($keyboard[0]) ? 0 : ++$row] = [ [ 'text' => '🗂 ' . $localization['select_language_button_add'], 'url' => 'https://git.svoboda.works/svoboda/svoboder/src/branch/stable/svoboda/svoboder/system/localizations' @@ -112,6 +116,8 @@ final class selections extends core // Sending the message $context->sendMessage('⚠️ *Failed to initialize localization*') ->then(function (message $message) use ($context) { + // Sended the message + // Ending the conversation process $context->endConversation(); }); @@ -122,6 +128,8 @@ final class selections extends core // Sending the message $context->sendMessage('⚠️ *Failed to initialize language*') ->then(function (message $message) use ($context) { + // Sended the message + // Ending the conversation process $context->endConversation(); }); @@ -132,6 +140,8 @@ final class selections extends core // Sending the message $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') ->then(function (message $message) use ($context) { + // Sended the message + // Ending the conversation process $context->endConversation(); }); diff --git a/svoboda/svoboder/system/models/telegram/processes/member/search.php b/svoboda/svoboder/system/models/telegram/processes/member/search.php new file mode 100755 index 0000000..be2f04a --- /dev/null +++ b/svoboda/svoboder/system/models/telegram/processes/member/search.php @@ -0,0 +1,1405 @@ + + */ +final class search extends core +{ + use coordinates { + coordinates::distance as vincenty; + } + + /** + * Process + * + * @var const string PROCESS Name of the process in the telegram user buffer + */ + public const string PROCESS = 'member_search'; + + /** + * Start + * + * Starting the member search process + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function start(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing language + $language = $context->get('language'); + + if ($language instanceof language) { + // Initialized language + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $search) use ($context, $account, $language, $localization) { + // Readed from the telegram user buffer + + // Declaring the target distribution + $distribution = [ + 'distribution' => null, + 'localization' => null + ]; + + // Initializing the message text + $text = $context->getCallbackQuery()?->getMessage()?->getText(); + + if (!empty($text)) { + // Initialized the message text + + // Searching for the distribution identifier + preg_match('/^(\d)+[\w\s]+$/mu', $text, $matches); + + // Initializing the distribution identifier + $identifier = $matches[1] ?? null; + + if (!empty($identifier)) { + // Initialized the distribution identifier + + // Type conversion + $identifier = (int) $identifier; + + // Initializing the distribution model + $model_distribution = new distribution; + + // Initializing the distribution + $distribution['distribution'] = $model_distribution->database->read( + filter: fn(record $record) => $record->identifier === $identifier, + amount: 1 + )[0] ?? null; + + if ($distribution['distribution'] instanceof record) { + // Initialized the distribution + + // Searching for the distribution localizations records + $distribution_localizations = $model_distribution->localization->database->read( + filter: fn(record $localization) => $localization->distribution === $distribution['distribution']->identifier, + amount: MEMBERS_SEARCH_DISTRIBUTION_LOCALIZATIONS_AMOUNT + ); + + if (count($distribution_localizations) > 0) { + // Initialized the distributions localizations + + foreach ($distribution_localizations as $record) { + // Iterating over localizations + + if ($record->language === $language->name) { + // Found localization by the account language + + // Initializing localization by the account language + $distribution['localization'] = $record; + + // Exit (success) + break; + } + } + if (is_null($distribution['localization'])) { + // Not initialized localization by the account language + + foreach ($distribution_localizations as $record) { + // Iterating over localizations + + if ($record->language === 'en') { + // Found localization by english language + + // Initializing localization by english language + $distribution['localization'] = $record; + + // Exit (success) + break; + } + } + + if (is_null($distribution['localization'])) { + // Not initialized localization by english language + + // Initializing the account model + $model_account = new account; + + // Initializing the distribution creator account + $creator = $model_account->database->read( + filter: fn(record $account) => $account->identifier === $distribution['distribution']->creator, + amount: 1 + )[0] ?? null; + + if ($creator instanceof record) { + // Initialized the distribution creator account + + foreach ($distribution_localizations as $record) { + // Iterating over localizations + + if ($record->language === $creator->language) { + // Found localization by the distribution creator account language + + // Initializing localization by the distribution creator account language + $distribution['localization'] = $record; + + // Exit (success) + break; + } + } + } + + if (is_null($distribution['localization'])) { + // Not initialized localization by the distribution creator account language + + // Initializing localization by the first found record + $distribution['localization'] = $distribution_localizations[0]; + } + } + } + } + } + } + } + + if ($search) { + // Found started search process + + // Sending the message + $context->sendMessage('🗂 *' . $localization[static::PROCESS . '_continiued'] . '*') + ->then(function (message $message) use ($context, $account, $language, $localization, $search, $distribution) { + // Sended the message + + if (!empty($distribution['distribution']) && !empty($distribution['localization'])) { + // Initialized the distribution + + // Writing into the process buffer + $search['distribution'] = $distribution; + + // Writing into the telegram user buffer + $context->setUserDataItem(static::PROCESS, $search) + ->then(function () use ($context) { + // Writing into the telegram user buffer + + // Sending the list of found member and menu + static::menu($context); + }); + } else { + // Not initialized the distribution + + // Sending the list of found member and menu + static::menu($context); + } + }); + } else { + // Not found started search process + + // Initializing the member search buffer + $search = [ + 'name' => null, + 'distribution' => $distribution, + 'status' => status::joined, + 'page' => 0 + ]; + + // Writing to the telegram user buffer + $context->setUserDataItem(static::PROCESS, $search) + ->then(function () use ($context, $account, $localization) { + // Writed to the telegram user buffer + + // Sending the message + $context->sendMessage('🗂 *' . $localization[static::PROCESS . '_started'] . '*') + ->then(function (message $message) use ($context, $account, $localization) { + // Sended the message + + // Sending the list of found member and menu + static::menu($context); + }); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized language + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize language*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * End + * + * Ending the member search process + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function end(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $search) use ($context, $localization) { + // Readed from the telegram user buffer + + if ($search) { + // Found started search process + + // Deleting from the telegram user buffer + $context->deleteUserDataItem(static::PROCESS, $search) + ->then(function () use ($context, $search, $localization) { + // Deleted from the telegram user buffer + + // Sending the message + $context->sendMessage('🗂 *' . $localization[static::PROCESS . '_ended'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the members menu + commands::members($context); + }); + }); + } else { + // Not found started search process + + // Ending the conversation process + $context->endConversation(); + + // Sending the members menu + commands::members($context); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Search + * + * Sends the list of found members and menu with parameters: name, distribution, status + * + * @param context $context Request data from Telegram + * + * @return void + * + * @todo rename to "search"? + */ + public static function menu(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing language + $language = $context->get('language'); + + if ($language) { + // Initialized language + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $search) use ($context, $account, $language, $localization) { + // Readed from the telegram user buffer + + if ($search) { + // Found started search process + + // Initializing the buffer of generated keyboard with languages + $keyboard = [ + [ + [ + 'text' => empty($search['name']) ? '🔴 ' . $localization[static::PROCESS . '_button_name'] : '🟢 ' . $localization['member_search_button_name'] . ': ' . $search['name'], + 'callback_data' => static::PROCESS . '_name' + ] + ], + [ + [ + 'text' => empty($search['distribution']['distribution']) || empty($search['distribution']['localization']) ? '🔴 ' . $localization[static::PROCESS . '_button_distribution'] : '🟢 ' . $localization['member_search_button_distribution'] . ': ' . $search['distribution']['localization']->name, + 'callback_data' => static::PROCESS . '_distribution' + ] + ], + [ + [ + 'text' => ($search['status']->emoji() ?? status::unknown->emoji()) . ' ' . $localization['member_search_button_status'] . ': ' . $localization['member_search_button_status_' . ($search['status']->value ?? status::unknown->value)], + 'callback_data' => static::PROCESS . '_status' + ] + ], + ]; + + // Ending the conversation process + $context->endConversation() + ->then(function () use ($context, $account, $language, $localization, $search, $keyboard) { + // Deinitialized the conversation process + + // Initializing the member model + $model_member = new member; + + // Initializing amount of readed members per page + $page = MEMBERS_SEARCH_PAGE; + + if ( + empty($search['name']) && + empty($search['distribution']['distribution']) && + empty($search['distribution']['localization']) && + empty($search['status']) + ) { + // Each search parameter is empty + + // Search for members + $members = $model_member->database->read( + amount: $page + 1, + offset: $search['page'] < 1 ? 0 : $page * $search['page'] + ); + } else { + // The search buffer has at least one parameter + + // Initializing the account model + $model_account = new account; + + // Search for members + $members = $model_member->database->read( + filter: function (record $member) use ($search, $model_account) { + // Initializing the matched buffer + $matched = false; + + if (!empty($search['name'])) { + // Requested search by name + + // Initializing the account localizations + $localizations = $model_account->localization->database->read( + filter: fn(record $localization) => $localization->account === $member->account, + amount: MEMBERS_SEARCH_ACCOUNT_LOCALIZATIONS_AMOUNT + ); + + // Initializing the result status + $result = false; + + foreach ($localizations as $localization) { + // Iterating over localizations + + // Splitting the localization name into parts + $parts = preg_split('/[\-\s]/', $localization->name); + + foreach ($parts as $part) { + // Iterating over localization name parts + + if (levenshtein($part, $search['name']) <= MEMBERS_SEARCH_MEMBER_NAME_LEVENSHTEIN_DISTANCE) { + // Names matched by Levenshtein function + + // Reinitializing the matched buffer + $result = true; + + // Exit (success) + break 2; + } + } + } + + if ($result) { + // Names matched by Levenshtein function + + // Reinitializing the matched buffer + $matched = true; + } else { + // Names not matched by Levenshtein function + + // Exit (success) + return false; + } + } + + if (!empty($search['distribution']['distribution'])) { + // Requested search by distribution + + if ($member->distribution === $search['distribution']['distribution']?->identifier) { + // Distributions matched + + // Reinitializing the matched buffer + $matched = true; + } else { + // Distributions not matched + + // Exit (success) + return false; + } + } + + if ($search['status'] instanceof status) { + // Requested search by status + + if ($member->status === $search['status']->value) { + // Statuses matched + + // Reinitializing the matched buffer + $matched = true; + } else { + // Statuses not matched + + // Exit (success) + return false; + } + } + + // Exit (success) + return $matched; + }, + amount: $page + 1, + offset: $search['page'] < 1 ? 0 : $page * $search['page'] + ); + } + + // Initializing the next page existence status + $next = count($members) > $page; + + // Deleting the additional readed members + unset($members[$page]); + + // Initializing the title + $title = '🔍 *' . $localization[static::PROCESS . '_title'] . '*'; + + // Sending the message + $context->sendMessage( + << [ + 'inline_keyboard' => $keyboard, + 'disable_notification' => true, + 'remove_keyboard' => true + ], + ] + )->then(function (message $message) use ($context, $account, $language, $localization, $search, $page, $next, $members) { + // Sended the message + + if (count($members) > 0) { + // Initialized members + + foreach ($members as $member) { + // Iterating over found members + + // Declaring the buffer of localized values + $values = null; + + // Initializing the account model + $model_account = new account; + + // Initializing localizations + $localizations = $model_account->localization->database->read( + filter: fn(record $localization) => $localization->account === $member->account, + amount: MEMBERS_SEARCH_ACCOUNT_LOCALIZATIONS_AMOUNT + ); + + if (count($localizations) > 0) { + // Initialized the members localizations + + foreach ($localizations as $record) { + // Iterating over localizations + + if ($record->language === $language->name) { + // Found localization by the account language + + // Initializing localization by the account language + $values = $record; + + // Exit (success) + break; + } + } + + if (is_null($values)) { + // Not initialized localization by the account language + + foreach ($localizations as $record) { + // Iterating over localizations + + if ($record->language === 'en') { + // Found localization by english language + + // Initializing localization by english language + $values = $record; + + // Exit (success) + break; + } + } + + if (is_null($values)) { + // Not initialized localization by english language + + // Initializing the account model + $model_account = new account; + + // Initializing the member account + $member_account = $model_account->database->read( + filter: fn(record $account) => $account->identifier === $member->account, + amount: 1 + )[0] ?? null; + + if ($member_account instanceof record) { + // Initialized the member account + + foreach ($localizations as $record) { + // Iterating over localizations + + if ($record->language === $member_account->language) { + // Found localization by the member account language + + // Initializing localization by the member account language + $values = $record; + + // Exit (success) + break; + } + } + } + + if (is_null($values)) { + // Not initialized localization by the member account language + + // Initializing localization by the first found record + $values = $localizations[0]; + } + } + } + } else { + // Not initialized the members localizations + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_localized'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + + // Initializing buffer of keyboard + $keyboard = static::keyboard( + member: $member, + localization: $localization, + messages: $account->authorized_messages === 1, + ); + + /* if ($account->authorized_system_distributions) { + // Authorized access to distribution administration + + // Initializing identifier of the row for administration buttons + $identifier = count($keyboard); + + // Initializing the row for administration buttons + $keyboard[$identifier] ??= []; + + // Initializing the distribution accepting toggle button + $keyboard[$identifier][] = [ + 'text' => $distribution->recognized ? '🏠 ' . $localization[static::PROCESS . '_button_recognized'] : '🏚 ' . $localization['distribution_search_button_not_recognized'], + 'callback_data' => static::PROCESS . '_trust_toggle' + ]; + } */ + + // Sending the message + await($context->sendMessage( + static::message( + context: $context, + language: $language, + member: $member, + localization: $localization, + name: $values?->name, + recognized: false + ), + [ + 'reply_markup' => [ + 'inline_keyboard' => $keyboard, + 'disable_notification' => true, + 'remove_keyboard' => true + ], + ] + )); + } + + if ($next) { + // Exists the next page + + // Sending the message + $context->sendMessage( + '🔎 *' . $localization[static::PROCESS . '_page_next_exists'] . '*', + [ + 'reply_markup' => [ + 'inline_keyboard' => [ + [ + [ + 'text' => '🔒 ' . $localization[static::PROCESS . '_button_end'], + 'callback_data' => static::PROCESS . '_end' + ] + ], + [ + [ + 'text' => $localization[static::PROCESS . '_button_page_next'], + 'callback_data' => static::PROCESS . '_next' + ] + ] + ], + 'disable_notification' => true, + 'remove_keyboard' => true + ], + ] + )->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } else { + // Not exists the next page + + // Sending the message + $context->sendMessage( + '🔎 *' . $localization[static::PROCESS . '_page_next_not_exists'] . '*', + [ + 'reply_markup' => [ + 'inline_keyboard' => [ + [ + [ + 'text' => '🔒 ' . $localization[static::PROCESS . '_button_end'], + 'callback_data' => static::PROCESS . '_end' + ] + ] + ], + 'disable_notification' => true, + 'remove_keyboard' => true + ], + ] + ) + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized members + + // Sending the message + $context->sendMessage( + '⚠️ *' . $localization[static::PROCESS . '_empty'] . '*', + [ + 'reply_markup' => [ + 'inline_keyboard' => [ + [ + [ + 'text' => '🔒 ' . $localization[static::PROCESS . '_button_end'], + 'callback_data' => static::PROCESS . '_end' + ] + ] + ], + 'disable_notification' => true, + 'remove_keyboard' => true + ], + ] + ) + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + }); + }); + } else { + // Not found started search process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the members menu + commands::members($context); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized language + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize language*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Name + * + * Write name into the member search buffer + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function name(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function ($search) use ($context, $localization) { + // Readed from the telegram user buffer + + if ($search) { + // Found started search process + + // Initializing the new name + $new = $context->getMessage()->getText(); + + if (!empty($new)) { + // Initialized the new name + + if (mb_strlen($new) >= 2) { + // Passed minimum length check + + if (mb_strlen($new) <= 128) { + // Passed maximum length check + + // Search for restricted characters + preg_match_all('/[\W\d]/u', $new, $matches); + + // Declaring the buffer of found restricted characters + $characters = []; + + foreach ($matches[0] as $match) { + // Iterating over found restricted characters + + if (match ($match) { + ' ', '-' => false, + default => true + }) { + // Found a restricted character + + // Writing into the buffer of found restricted characters + $characters[] = $match; + } + } + + if (empty($characters)) { + // Not found restricted characters + + try { + // Initializing the old name + $old = empty($search['name']) ? '_' . $localization['empty'] . '_' : $search['name']; + + // Writing into the member search process buffer + $search['name'] = $new; + + // Writing to the telegram user buffer + $context->setUserDataItem(static::PROCESS, $search) + ->then(function () use ($context, $localization, $new, $old) { + // Writed to the telegram user buffer + + // Escaping characters for markdown + $escaped = str_replace('-', '\\-', $new); + + // Sending the message + $context->sendMessage('✅ *' . $localization[static::PROCESS . '_name_update_success'] . "* $old → *$escaped*") + ->then(function (message $message) use ($context) { + // Sended the message + + // Sending the search menu + static::menu($context); + }); + }); + } catch (error $error) { + // Failed to send the message about name update + + // Sending the message + $context->sendMessage('❎ *' . $localization[static::PROCESS . '_name_update_fail']) + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Found restricted characters + + // Initializing title of the message + $title = '⚠️ *' . $localization[static::PROCESS . '_name_request_restricted_characters_title'] . '*'; + + // Initializing description of the message + $description = '*' . $localization[static::PROCESS . '_name_request_restricted_characters_description'] . '* \\' . implode(', \\', $characters); + + // Sending the message + $context->sendMessage( + <<then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter name again + button_member_search::name($context); + }); + } + } else { + // Not passed maximum length check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_name_request_too_long'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter name again + button_member_search::name($context); + }); + } + } else { + // Not passed minimum length check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_name_request_too_short'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter name again + button_member_search::name($context); + }); + } + } else { + // Failed to initialize the new name + + // Sending the message + $context->sendMessage('📄 *' . $localization[static::PROCESS . '_name_request_not_acceptable'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter name again + button_member_search::name($context); + }); + } + } else { + // Not found started search process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the members menu + commands::members($context); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Status + * + * Write status into the member search buffer + * + * @param context $context Request data from Telegram + * @param status $status The member status + * + * @return void + */ + public static function status(context $context, status $status): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function ($search) use ($context, $localization, $status) { + // Readed from the telegram user buffer + + if ($search) { + // Found started search process + try { + // Initializing the old status + $old = empty($search['status']) ? '_' . $localization['empty'] . '_' : $search['status']->emoji() . ' ' . $localization[static::PROCESS . '_status_' . $search['status']->value]; + + // Writing into the member search process buffer + $search['status'] = $status; + + // Writing to the telegram user buffer + $context->setUserDataItem(static::PROCESS, $search) + ->then(function () use ($context, $localization, $status, $old) { + // Writed to the telegram user buffer + + // Sending the message + $context->sendMessage('✅ *' . $localization[static::PROCESS . '_status_update_success'] . "* $old → *" . $status->emoji() . ' ' . $localization[static::PROCESS . "_status_$status->value"] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Sending the search menu + static::menu($context); + }); + }); + } catch (error $error) { + // Failed to send the message about status update + + // Sending the message + $context->sendMessage('❎ *' . $localization[static::PROCESS . '_status_update_fail']) + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not found started search process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*'); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + + /** + * Message text + * + * Generate text with the distribution member infornation + * + * @param context $context Request data from Telegram + * @param record $member The distribution member + * @param language $language The account language + * @param array $localization The account localization + * @param string|null $name Localized name of the member + * @param bool $recognized Add the icon for recognized distribution member? + * + * @return string Generated text + */ + public static function message( + context $context, + record $member, + language $language, + array $localization, + ?string $name = null, + bool $recognized = false + ): string { + // Initializing name for the message + if (!empty($name)) $name = str_replace('-', '\\-', $name); + else $name = $localization[static::PROCESS . '_not_named']; + + // Initializing accepting status for the message + $recognized = $recognized ? '🪽' : ''; + + // Initializing the distribution model + $model_distribution = new distribution; + + // Searching for the distribution + $distribution = $model_distribution->database->read( + filter: fn(record $distribution) => $distribution->identifier === $member->distribution, + amount: 1 + )[0] ?? null; + + if ($distribution instanceof record) { + // Initialized the distribution + + // Searching for the distribution localizations records + $distribution_localizations = $model_distribution->localization->database->read( + filter: fn(record $localization) => $localization->distribution === $distribution->identifier, + amount: MEMBERS_SEARCH_DISTRIBUTION_LOCALIZATIONS_AMOUNT + ); + + // Declaring the buffer of the distribution localization + $distribution_localization = null; + + if (count($distribution_localizations) > 0) { + // Initialized the distributions localizations + + foreach ($distribution_localizations as $record) { + // Iterating over localizations + + if ($record->language === $language->name) { + // Found localization by the account language + + // Initializing localization by the account language + $distribution_localization = $record; + + // Exit (success) + break; + } + } + if (is_null($distribution_localization)) { + // Not initialized localization by the account language + + foreach ($distribution_localizations as $record) { + // Iterating over localizations + + if ($record->language === 'en') { + // Found localization by english language + + // Initializing localization by english language + $distribution_localization = $record; + + // Exit (success) + break; + } + } + + if (is_null($distribution_localization)) { + // Not initialized localization by english language + + // Initializing the account model + $model_account = new account; + + // Initializing the distribution creator account + $creator = $model_account->database->read( + filter: fn(record $account) => $account->identifier === $distribution->creator, + amount: 1 + )[0] ?? null; + + if ($creator instanceof record) { + // Initialized the distribution creator account + + foreach ($distribution_localizations as $record) { + // Iterating over localizations + + if ($record->language === $creator->language) { + // Found localization by the distribution creator account language + + // Initializing localization by the distribution creator account language + $distribution_localization = $record; + + // Exit (success) + break; + } + } + } + + if (is_null($distribution_localization)) { + // Not initialized localization by the distribution creator account language + + // Initializing localization by the first found record + $distribution_localization = $distribution_localizations[0]; + } + } + } + } else { + // Not initialized the distributions localizations + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_localized'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + + if ($distribution_localization instanceof record) { + // Initialized the distribution localization + + // Initializing relation for the message + $relation = '*' . $localization[static::PROCESS . '_distribution'] . ':* ' . $distribution_localization->name; + + // Initializing the member status + $status = status::from($member->status) ?? status::unknown; + + // Initializing status for the message + $_status = '*' . $localization[static::PROCESS . '_status'] . ':* ' . $status->emoji() . ' ' . $localization[static::PROCESS . "_status_$status->value"]; + + /* // Initializing amount of recognized members for the message + $members_recognized = '*' . $localization[static::PROCESS . '_recognized'] . ':* ' . 0; + + // Initializing amount of members for the message + $amount = '*' . $localization[static::PROCESS . '_members'] . ':* ' . count(array_filter($members, fn(record $member) => $member?->status === 2)); + + // Initializing planners + $planners = '*' . $localization[static::PROCESS . '_planners'] . ':* ' . count(array_filter($members, fn(record $member) => $member?->status === 1)); + + // Initializing volunteers + $volunteers = '*' . $localization[static::PROCESS . '_volunteers'] . ':* ' . 0; + + // Initializing messages + $messages = '*' . $localization[static::PROCESS . '_messages'] . ':* ' . 0; + + // Initializing location for the message + $location = '*' . $localization[static::PROCESS . '_location'] . ':* ' . str_replace('.', '\\.', (empty($distribution->latitude) ? '_' . $localization['empty'] . '_' : round($distribution->latitude, 6)) . ', ' . (empty($distribution->longitude) ? '_' . $localization['empty'] . '_' : round($distribution->longitude, 6))); */ + + // Exit (success) + return <<identifier:$member->identifier:$member->account *$name* $recognized + + $relation + $_status + TXT; + } else { + // Not initialized the distribution localization + + } + } else { + // Not initialized the distribution + + } + } + + /** + * Keyboard (inline) + * + * Generate inline keyboard for the member + * + * @param record $member The member + * @param array $localization The account localization + * @param bool $messages Generate messages buttons? (is the account allowed to send messages?) + * + * @return array Generated inline keyboard + */ + public static function keyboard( + record $member, + array $localization, + bool $messages = false, + ): array { + // Initializing the buffer of keyboard + $keyboard = []; + + if ($messages) { + // Requested messages buttons + + // Writing the messages buttons into the buffer of joinings + $keyboard[] = [ + [ + 'text' => '✉️ ' . $localization[static::PROCESS . '_button_message'], + 'callback_data' => static::PROCESS . '_message' + ] + ]; + } + + // Exit (success) + return $keyboard; + } +} diff --git a/svoboda/svoboder/system/public/index.php b/svoboda/svoboder/system/public/index.php new file mode 100755 index 0000000..bb0024d --- /dev/null +++ b/svoboda/svoboder/system/public/index.php @@ -0,0 +1,66 @@ +router + ->write('/', new route('index', 'index'), 'GET') + ->write('/map', new route('map', 'index'), 'GET') +; + +// Handling request +$$core->start(); diff --git a/svoboda/svoboder/system/public/telegram.php b/svoboda/svoboder/system/public/telegram.php index d3fb4fb..567489f 100755 --- a/svoboda/svoboder/system/public/telegram.php +++ b/svoboda/svoboder/system/public/telegram.php @@ -10,13 +10,23 @@ use svoboda\svoboder\models\distribution, svoboda\svoboder\models\telegram\middlewares, svoboda\svoboder\models\telegram\commands, svoboda\svoboder\models\telegram\buttons, - svoboda\svoboder\models\telegram\selections, + svoboda\svoboder\models\telegram\account, svoboda\svoboder\models\telegram\settings, + svoboda\svoboder\models\enumerations\member\status, svoboda\svoboder\models\enumerations\language, - svoboda\svoboder\models\telegram\processes\distribution\registration as process_distribution_registration, + svoboda\svoboder\models\telegram\processes\member\search as process_member_search, + svoboda\svoboder\models\telegram\buttons\member\search as button_member_search, + svoboda\svoboder\models\telegram\processes\distribution\declaration as process_distribution_declaration, svoboda\svoboder\models\telegram\processes\distribution\search as process_distribution_search, - svoboda\svoboder\models\telegram\buttons\distribution\registration as button_distribution_registration, + svoboda\svoboder\models\telegram\processes\distribution\select as process_distribution_select, + svoboda\svoboder\models\telegram\buttons\distribution\declaration as button_distribution_declaration, svoboda\svoboder\models\telegram\buttons\distribution\search as button_distribution_search, + svoboda\svoboder\models\telegram\buttons\distribution\select as button_distribution_select, + svoboda\svoboder\models\telegram\processes\account\localization\create as process_account_localization_create, + svoboda\svoboder\models\telegram\processes\account\localization\update as process_account_localization_update, + svoboda\svoboder\models\telegram\buttons\account\localization\create as button_account_localization_create, + svoboda\svoboder\models\telegram\buttons\account\localization\update as button_account_localization_update, + svoboda\svoboder\models\telegram\buttons\distribution\administration as button_distribution_administration, svoboda\svoboder\models\telegram\processes\distribution\localization as process_distribution_localization; // Framework for Telegram @@ -24,9 +34,6 @@ use Zanzara\Zanzara as zanzara, Zanzara\Context as context, Zanzara\Config as config; -// Baza database -use mirzaev\baza\record; - // Enabling debugging /* ini_set('error_reporting', E_ALL); ini_set('display_errors', 1); @@ -56,6 +63,9 @@ define('TELEGRAM_KEY', require(SETTINGS . DIRECTORY_SEPARATOR . 'telegram.php')) // Initializing dependencies require ROOT . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php'; +// Initializing system settings +require SETTINGS . DIRECTORY_SEPARATOR . 'system.php'; + // Initializing the configuration $config = new config(); $config->setParseMode(config::PARSE_MODE_MARKDOWN); @@ -76,59 +86,54 @@ $robot->middleware([middlewares::class, 'system']); // Initializing the robot commands handlers $robot->onCommand('start', [commands::class, 'menu']); $robot->onCommand('menu', [commands::class, 'menu']); +$robot->onCommand('members', [commands::class, 'members']); +$robot->onCommand('account', [commands::class, 'account']); +$robot->onCommand('distributions', [commands::class, 'distributions']); /* $robot->onCommand('request', [telegram::class, 'request_start'])->middleware([telegram::class, 'request']); */ /* $robot->onCommand('svoboda', [commands::class, 'svoboda']); $robot->onCommand('members', [commands::class, 'members']); */ $robot->onCommand('language', [commands::class, 'language'])->middleware([middlewares::class, 'settings']); -$robot->onCommand('society', [commands::class, 'society']); $robot->onCommand('repository', [commands::class, 'repository']); /* $robot->onCommand('projects', [commands::class, 'projects']); */ $robot->onCommand('author', [commands::class, 'author']); +$robot->onCommand('society', [commands::class, 'society']); +/* $robot->onCommand('system_settings', [commands::class, 'system_settings'])->middleware([middlewares::class, 'system_settings']); */ -// Initializing the robot distrubitions menu handlers -$robot->onCommand('distributions', [commands::class, 'distributions']); +// Initializing the robot buttons handlers $robot->onCbQueryData(['distributions'], [commands::class, 'distributions']); // Remake to buttons? - -// Initializing the robot distributions search button handlers $robot->onCbQueryData(['distribution_search_start'], [process_distribution_search::class, 'start']); -$robot->onCbQueryData(['distribution_search_text'], [button_distribution_search::class, 'text']); +$robot->onCbQueryData(['distribution_search_name'], [button_distribution_search::class, 'name']); /* $robot->onCbQueryData(['distribution_search_next'], [process_distribution_search::class, 'text']); */ $robot->onCbQueryData(['distribution_search_end'], [process_distribution_search::class, 'end']); -$robot->onCbQueryData(['distribution_search_confirmed'], [process_distribution_search::class, 'confirmed']); $robot->onCbQueryData(['distribution_search_location'], [button_distribution_search::class, 'location']); $robot->onCbQueryData(['distribution_search_distance'], [button_distribution_search::class, 'distance']); - -// Initializing the robot distribution search location send button handler +$robot->onCbQueryData(['distribution_search_plan'], [button_distribution_search::class, 'plan'])->middleware([middlewares::class, 'join']); +$robot->onCbQueryData(['distribution_search_unplan'], [button_distribution_search::class, 'unplan'])->middleware([middlewares::class, 'join']); +$robot->onCbQueryData(['distribution_search_join'], [button_distribution_search::class, 'join'])->middleware([middlewares::class, 'join']); +$robot->onCbQueryData(['distribution_search_leave'], [button_distribution_search::class, 'leave'])->middleware([middlewares::class, 'join']); $robot->onCbQueryData(['distribution_search_location'], [button_distribution_search::class, 'location']); +$robot->onCbQueryData(['distribution_search_members'], [process_member_search::class, 'start']); -// Initializing the robot distributions registration buttons handlers -$robot->onCbQueryData(['distribution_registration_start'], [process_distribution_registration::class, 'start']); -$robot->onCbQueryData(['distribution_registration_cancel'], [process_distribution_registration::class, 'cancel']); -$robot->onCbQueryData(['distribution_registration_end'], [process_distribution_registration::class, 'end']); +$robot->onCbQueryData(['distribution_select_name'], [button_distribution_select::class, 'name']); +$robot->onCbQueryData(['distribution_select_location'], [button_distribution_select::class, 'location']); +$robot->onCbQueryData(['distribution_select_distance'], [button_distribution_select::class, 'distance']); +/* $robot->onCbQueryData(['distribution_select_next'], [process_distribution_select::class, 'next']); */ +$robot->onCbQueryData(['distribution_select_select'], [process_distribution_select::class, 'select']); +$robot->onCbQueryData(['distribution_select_delete'], [process_distribution_select::class, 'delete']); +$robot->onCbQueryData(['distribution_select_cancel'], [process_distribution_select::class, 'cancel']); -// Initializing the robot distribution localization language select button handler -$robot->onCbQueryData(['distribution_registration_language'], [button_distribution_registration::class, 'language']); - -// Initializing the robot distribution registration language buttons handlers -foreach (language::cases() as $language) { - // Iterating over languages - - // Initializing language buttons - $robot->onCbQueryData(['distribution_registration_select_language_' . $language->name], fn(context $context) => process_distribution_registration::language($context, $language)); -}; - -// Initializing the robot distribution registration localization name enter button handler -$robot->onCbQueryData(['distribution_registration_name'], [button_distribution_registration::class, 'name']); - -// Initializing the robot distribution registration location send button handler -$robot->onCbQueryData(['distribution_registration_location'], [button_distribution_registration::class, 'location']); - - -// Initializing the robot distributions localization buttons handlers +$robot->onCbQueryData(['distribution_declaration_start'], [process_distribution_declaration::class, 'start']); +$robot->onCbQueryData(['distribution_declaration_cancel'], [process_distribution_declaration::class, 'cancel']); +$robot->onCbQueryData(['distribution_declaration_end'], [process_distribution_declaration::class, 'end']); +$robot->onCbQueryData(['distribution_declaration_language'], [button_distribution_declaration::class, 'language']); +foreach (language::cases() as $language) + $robot->onCbQueryData(['distribution_declaration_select_language_' . $language->name], fn(context $context) => process_distribution_declaration::language($context, $language)); +$robot->onCbQueryData(['distribution_declaration_name'], [button_distribution_declaration::class, 'name']); +$robot->onCbQueryData(['distribution_declaration_location'], [button_distribution_declaration::class, 'location']); +/* $robot->onCbQueryData(['distribution_accept_toggle'], [button_distribution_administration::class, 'accept'])->middleware([middlewares::class, 'distributions_administration']); */ /* $robot->onCbQueryData(['distribution_localization_start'], [process_distribution_localization::class, 'start']); */ /* $robot->onCbQueryData(['distribution_localization_language'], [distribution_localization::class, 'language']); $robot->onCbQueryData(['distribution_localization_name'], [distribution_localization::class, 'name']); */ - /* // Initializing the robot distribution localization language select button handler $robot->onCbQueryData( ['distribution_localization_language'], @@ -152,6 +157,30 @@ foreach (language::cases() as $language) { // Initializing the robot distributions menu buttons handlers /* $robot->onCbQueryData(['distributions_search_start'], [process_distribution_search::class, 'start']); */ +$robot->onCbQueryData(['members'], [commands::class, 'members']); // Remake to buttons? +$robot->onCbQueryData(['member_search_start'], [process_member_search::class, 'start']); +$robot->onCbQueryData(['member_search_name'], [button_member_search::class, 'name']); +$robot->onCbQueryData(['member_search_distribution'], [button_member_search::class, 'distribution']); +foreach (status::cases() as $status) + $robot->onCbQueryData(['member_search_status_' . $status->name], fn(context $context) => process_member_search::status($context, $status)); +$robot->onCbQueryData(['member_search_status'], [button_member_search::class, 'status']); +$robot->onCbQueryData(['member_search_end'], [process_member_search::class, 'end']); + +$robot->onCbQueryData(['account_localizations'], [account::class, 'localizations']); +$robot->onCbQueryData(['account_localization_create_start'], [process_account_localization_create::class, 'start']); +$robot->onCbQueryData(['account_localization_create_cancel'], [process_account_localization_create::class, 'cancel']); +$robot->onCbQueryData(['account_localization_create_end'], [process_account_localization_create::class, 'end']); +$robot->onCbQueryData(['account_localization_create_language'], [button_account_localization_create::class, 'language']); +$robot->onCbQueryData(['account_localization_update_cancel'], [process_account_localization_update::class, 'cancel']); +$robot->onCbQueryData(['account_localization_update_end'], [process_account_localization_update::class, 'end']); +foreach (language::cases() as $language) { + $robot->onCbQueryData(['account_localization_create_select_language_' . $language->name], fn(context $context) => process_account_localization_create::language($context, $language)); + $robot->onCbQueryData(['account_localization_update_' . $language->name], fn(context $context) => process_account_localization_update::start($context, $language)); +} +$robot->onCbQueryData(['account_localization_create_name'], [button_account_localization_create::class, 'name']); +$robot->onCbQueryData(['account_localization_update_name'], [button_account_localization_update::class, 'name']); +/* $robot->onCbQueryData(['account_localizations_search'], [process_account_localization_search::class, 'start']); */ + // Initializing the robot settings language buttons handlers foreach (language::cases() as $language) { // Iterating over languages @@ -160,8 +189,5 @@ foreach (language::cases() as $language) { $robot->onCbQueryData(['settings_language_' . $language->name], fn(context $context) => settings::language($context, $language)); }; -// Initializing the robot protected commands handlers -/* $robot->onCommand('system_settings', [commands::class, 'system_settings'])->middleware([middlewares::class, 'system_settings']); */ - // Starting chat-robot $robot->run(); diff --git a/svoboda/svoboder/system/settings/.gitignore b/svoboda/svoboder/system/settings/.gitignore index 2027072..1b1dbf3 100755 --- a/svoboda/svoboder/system/settings/.gitignore +++ b/svoboda/svoboder/system/settings/.gitignore @@ -1,3 +1,4 @@ * +!system.php !.gitignore !*.sample diff --git a/svoboda/svoboder/system/settings/system.php b/svoboda/svoboder/system/settings/system.php new file mode 100755 index 0000000..e011d6c --- /dev/null +++ b/svoboda/svoboder/system/settings/system.php @@ -0,0 +1,25 @@ +