diff --git a/.dialyzer_ignore.exs b/.dialyzer_ignore.exs index 5dec52e7b..5b8f838a6 100644 --- a/.dialyzer_ignore.exs +++ b/.dialyzer_ignore.exs @@ -1,570 +1,591 @@ [ {"lib/central/input_helper.ex", :guard_fail}, -{"lib/gen_server.ex", :callback_info_missing}, -{"lib/nostrum/consumer.ex", :unknown_function}, -{"lib/teiserver.ex", :unknown_type}, -{"lib/teiserver.ex", :invalid_contract}, -{"lib/teiserver/account.ex", :unknown_type}, -{"lib/teiserver/account.ex", :invalid_contract}, -{"lib/teiserver/account.ex", :call}, -{"lib/teiserver/account.ex", :no_return}, -{"lib/teiserver/account/accolades/accolade_bot_server.ex", :unknown_type}, -{"lib/teiserver/account/accolades/accolade_bot_server.ex", :no_return}, -{"lib/teiserver/account/accolades/accolade_bot_server.ex", :call}, -{"lib/teiserver/account/accolades/accolade_chat_server.ex", :no_return}, -{"lib/teiserver/account/accolades/accolade_chat_server.ex", :call}, -{"lib/teiserver/account/accolades/accolade_chat_server.ex", :unknown_type}, -{"lib/teiserver/account/caches/user_cache_lib.ex", :no_return}, -{"lib/teiserver/account/caches/user_cache_lib.ex", :call}, -{"lib/teiserver/account/caches/user_cache_lib.ex", :unknown_type}, -{"lib/teiserver/account/libs/accolade_lib.ex", :unknown_type}, -{"lib/teiserver/account/libs/accolade_lib.ex", :no_return}, -{"lib/teiserver/account/libs/accolade_lib.ex", :call}, -{"lib/teiserver/account/libs/auth_lib.ex", :unknown_type}, -{"lib/teiserver/account/libs/badge_type_lib.ex", :unknown_type}, -{"lib/teiserver/account/libs/client_lib.ex", :unknown_type}, -{"lib/teiserver/account/libs/friend_lib.ex", :unknown_type}, -{"lib/teiserver/account/libs/friend_request_lib.ex", :unknown_type}, -{"lib/teiserver/account/libs/party_lib.ex", :no_return}, -{"lib/teiserver/account/libs/party_lib.ex", :call}, -{"lib/teiserver/account/libs/rating_lib.ex", :unknown_type}, -{"lib/teiserver/account/libs/relationship_lib.ex", :unknown_type}, -{"lib/teiserver/account/libs/smurf_key_lib.ex", :unknown_type}, -{"lib/teiserver/account/libs/smurf_key_type_lib.ex", :unknown_type}, -{"lib/teiserver/account/libs/user_lib.ex", :unknown_type}, -{"lib/teiserver/account/libs/user_lib.ex", :call}, -{"lib/teiserver/account/libs/user_stat_lib.ex", :unknown_type}, -{"lib/teiserver/account/plugs/auth_plug.ex", :call}, -{"lib/teiserver/account/queries/friend_queries.ex", :unknown_type}, -{"lib/teiserver/account/queries/friend_request_queries.ex", :unknown_type}, -{"lib/teiserver/account/queries/relationship_queries.ex", :unknown_type}, -{"lib/teiserver/account/queries/user_queries.ex", :unknown_type}, -{"lib/teiserver/account/reports/ban_evasion_report.ex", :invalid_contract}, -{"lib/teiserver/account/reports/growth_report.ex", :callback_spec_type_mismatch}, -{"lib/teiserver/account/reports/growth_report.ex", :no_return}, -{"lib/teiserver/account/reports/growth_report.ex", :call}, -{"lib/teiserver/account/reports/leaderboard_report.ex", :invalid_contract}, -{"lib/teiserver/account/reports/mapping_report.ex", :invalid_contract}, -{"lib/teiserver/account/reports/open_skill_report.ex", :invalid_contract}, -{"lib/teiserver/account/reports/population_report.ex", :no_return}, -{"lib/teiserver/account/reports/population_report.ex", :call}, -{"lib/teiserver/account/reports/population_report.ex", :pattern_match}, -{"lib/teiserver/account/reports/population_report.ex", :invalid_contract}, -{"lib/teiserver/account/reports/population_report.ex", :unused_fun}, -{"lib/teiserver/account/reports/records_report.ex", :invalid_contract}, -{"lib/teiserver/account/reports/retention_report.ex", :invalid_contract}, -{"lib/teiserver/account/reports/time_compare_report.ex", :invalid_contract}, -{"lib/teiserver/account/reports/time_compare_report.ex", :call}, -{"lib/teiserver/account/reports/tournament_report.ex", :invalid_contract}, -{"lib/teiserver/account/reports/user_age_report.ex", :invalid_contract}, -{"lib/teiserver/account/reports/week_on_week_report.ex", :invalid_contract}, -{"lib/teiserver/account/schemas/accolade.ex", :unknown_type}, -{"lib/teiserver/account/schemas/badge_type.ex", :unknown_type}, -{"lib/teiserver/account/schemas/friend.ex", :unknown_type}, -{"lib/teiserver/account/schemas/friend_request.ex", :unknown_type}, -{"lib/teiserver/account/schemas/relationship.ex", :unknown_type}, -{"lib/teiserver/account/schemas/smurf_key.ex", :unknown_type}, -{"lib/teiserver/account/schemas/smurf_key_type.ex", :unknown_type}, -{"lib/teiserver/account/servers/client_server.ex", :unknown_type}, -{"lib/teiserver/account/servers/login_throttle_server.ex", :unknown_type}, -{"lib/teiserver/account/servers/party_server.ex", :no_return}, -{"lib/teiserver/account/servers/party_server.ex", :call}, -{"lib/teiserver/account/servers/party_server.ex", :unknown_type}, -{"lib/teiserver/account/tasks/merge_accounts_task.ex", :no_return}, -{"lib/teiserver/account/tasks/merge_accounts_task.ex", :pattern_match}, -{"lib/teiserver/account/tasks/recalculate_user_cache_task.ex", :invalid_contract}, -{"lib/teiserver/battle.ex", :unknown_type}, -{"lib/teiserver/battle.ex", :call}, -{"lib/teiserver/battle.ex", :no_return}, -{"lib/teiserver/battle/api_auth.ex", :unknown_type}, -{"lib/teiserver/battle/balance/balance_types.ex", :unknown_type}, -{"lib/teiserver/battle/balance/cheeky_switcher_smart.ex", :unknown_type}, -{"lib/teiserver/battle/balance/cheeky_switcher_smart.ex", :call}, -{"lib/teiserver/battle/balance/cheeky_switcher_smart.ex", :no_return}, -{"lib/teiserver/battle/balance/cheeky_switcher_smart.ex", :pattern_match}, -{"lib/teiserver/battle/balance/cheeky_switcher_smart.ex", :unused_fun}, -{"lib/teiserver/battle/balance/loser_picks.ex", :invalid_contract}, -{"lib/teiserver/battle/libs/balance_lib.ex", :call}, -{"lib/teiserver/battle/libs/balance_lib.ex", :unknown_type}, -{"lib/teiserver/battle/libs/balance_lib.ex", :no_return}, -{"lib/teiserver/battle/libs/match_lib.ex", :unknown_type}, -{"lib/teiserver/battle/mix_tasks/compare_balance_algorithms_task.ex", :callback_info_missing}, -{"lib/teiserver/battle/schemas/match.ex", :unknown_type}, -{"lib/teiserver/battle/servers/match_monitor_server.ex", :unknown_type}, -{"lib/teiserver/battle/servers/match_monitor_server.ex", :call}, -{"lib/teiserver/battle/servers/match_monitor_server.ex", :no_return}, -{"lib/teiserver/battle/tasks/post_match_process_task.ex", :no_return}, -{"lib/teiserver/battle/tasks/post_match_process_task.ex", :call}, -{"lib/teiserver/battle/tasks/post_match_process_task.ex", :unused_fun}, -{"lib/teiserver/benchmark/benchmark_task.ex", :callback_info_missing}, -{"lib/teiserver/bridge/bridge_server.ex", :unknown_type}, -{"lib/teiserver/bridge/bridge_server.ex", :unknown_function}, -{"lib/teiserver/bridge/bridge_server.ex", :call}, -{"lib/teiserver/bridge/bridge_server.ex", :unused_fun}, -{"lib/teiserver/bridge/bridge_server.ex", :no_return}, -{"lib/teiserver/bridge/chat_commands.ex", :unknown_type}, -{"lib/teiserver/bridge/chat_commands.ex", :call}, -{"lib/teiserver/bridge/chat_commands.ex", :unknown_function}, -{"lib/teiserver/bridge/command_lib.ex", :unknown_type}, -{"lib/teiserver/bridge/commands/bridge_command_behaviour.ex", :unknown_type}, -{"lib/teiserver/bridge/commands/textcb_command.ex", :unknown_type}, -{"lib/teiserver/bridge/discord_bridge_bot.ex", :guard_fail}, -{"lib/teiserver/bridge/discord_bridge_bot.ex", :unknown_function}, -{"lib/teiserver/bridge/discord_bridge_bot.ex", :unknown_type}, -{"lib/teiserver/bridge/discord_bridge_bot.ex", :no_return}, -{"lib/teiserver/bridge/discord_bridge_bot.ex", :call}, -{"lib/teiserver/bridge/message_commands.ex", :unknown_type}, -{"lib/teiserver/bridge/message_commands.ex", :call}, -{"lib/teiserver/bridge/message_commands.ex", :pattern_match}, -{"lib/teiserver/bridge/message_commands.ex", :pattern_match_cov}, -{"lib/teiserver/bridge/message_commands.ex", :unknown_function}, -{"lib/teiserver/chat.ex", :unknown_type}, -{"lib/teiserver/chat/chat_room_cache.ex", :unknown_type}, -{"lib/teiserver/chat/chat_room_cache.ex", :call}, -{"lib/teiserver/chat/chat_room_cache.ex", :no_return}, -{"lib/teiserver/chat/libs/direct_message_lib.ex", :unknown_type}, -{"lib/teiserver/chat/libs/lobby_message_lib.ex", :unknown_type}, -{"lib/teiserver/chat/libs/party_message_lib.ex", :unknown_type}, -{"lib/teiserver/chat/libs/room_message_lib.ex", :unknown_type}, -{"lib/teiserver/chat/schemas/direct_message.ex", :unknown_type}, -{"lib/teiserver/chat/schemas/lobby_message.ex", :unknown_type}, -{"lib/teiserver/chat/schemas/party_message.ex", :unknown_type}, -{"lib/teiserver/chat/schemas/room_message.ex", :unknown_type}, -{"lib/teiserver/clans.ex", :unknown_type}, -{"lib/teiserver/clans/libs/clan_invite_lib.ex", :unknown_type}, -{"lib/teiserver/clans/libs/clan_lib.ex", :unknown_type}, -{"lib/teiserver/clans/libs/clan_membership_lib.ex", :unknown_type}, -{"lib/teiserver/communication.ex", :unknown_type}, -{"lib/teiserver/communication.ex", :invalid_contract}, -{"lib/teiserver/communication/libs/discord_channel_lib.ex", :unknown_type}, -{"lib/teiserver/communication/libs/discord_channel_lib.ex", :unknown_function}, -{"lib/teiserver/communication/libs/text_callback_lib.ex", :unknown_type}, -{"lib/teiserver/communication/queries/discord_channel_queries.ex", :unknown_type}, -{"lib/teiserver/communication/schemas/discord_channel.ex", :unknown_type}, -{"lib/teiserver/communication/schemas/text_callback.ex", :unknown_type}, -{"lib/teiserver/config.ex", :unknown_type}, -{"lib/teiserver/coordinator.ex", :pattern_match}, -{"lib/teiserver/coordinator.ex", :unknown_type}, -{"lib/teiserver/coordinator.ex", :no_return}, -{"lib/teiserver/coordinator.ex", :call}, -{"lib/teiserver/coordinator/automod_server.ex", :invalid_contract}, -{"lib/teiserver/coordinator/automod_server.ex", :unknown_type}, -{"lib/teiserver/coordinator/automod_server.ex", :no_return}, -{"lib/teiserver/coordinator/automod_server.ex", :call}, -{"lib/teiserver/coordinator/consul_commands.ex", :unknown_type}, -{"lib/teiserver/coordinator/consul_commands.ex", :call}, -{"lib/teiserver/coordinator/consul_commands.ex", :no_return}, -{"lib/teiserver/coordinator/consul_server.ex", :unknown_type}, -{"lib/teiserver/coordinator/consul_server.ex", :no_return}, -{"lib/teiserver/coordinator/consul_server.ex", :call}, -{"lib/teiserver/coordinator/coordinator_commands.ex", :unknown_type}, -{"lib/teiserver/coordinator/coordinator_commands.ex", :call}, -{"lib/teiserver/coordinator/coordinator_lib.ex", :unknown_type}, -{"lib/teiserver/coordinator/coordinator_parser.ex", :unknown_type}, -{"lib/teiserver/coordinator/coordinator_server.ex", :unknown_type}, -{"lib/teiserver/coordinator/coordinator_server.ex", :no_return}, -{"lib/teiserver/coordinator/coordinator_server.ex", :call}, -{"lib/teiserver/coordinator/spads_parser.ex", :unknown_type}, -{"lib/teiserver/coordinator/spads_parser.ex", :call}, -{"lib/teiserver/data/cache_user.ex", :pattern_match}, -{"lib/teiserver/data/cache_user.ex", :call}, -{"lib/teiserver/data/cache_user.ex", :no_return}, -{"lib/teiserver/data/cache_user.ex", :unused_fun}, -{"lib/teiserver/data/cache_user.ex", :unknown_type}, -{"lib/teiserver/data/cache_user.ex", :invalid_contract}, -{"lib/teiserver/data/client.ex", :unknown_type}, -{"lib/teiserver/data/client.ex", :no_return}, -{"lib/teiserver/data/lobby_id_server.ex", :unknown_type}, -{"lib/teiserver/data/matchmaking.ex", :unknown_type}, -{"lib/teiserver/data/matchmaking.ex", :no_return}, -{"lib/teiserver/data/matchmaking.ex", :call}, -{"lib/teiserver/data/matchmaking.ex", :invalid_contract}, -{"lib/teiserver/data/types.ex", :unknown_type}, -{"lib/teiserver/game.ex", :unknown_type}, -{"lib/teiserver/game/libs/achievement_type_lib.ex", :unknown_type}, -{"lib/teiserver/game/libs/lobby_policy_lib.ex", :unknown_type}, -{"lib/teiserver/game/libs/lobby_policy_lib.ex", :no_return}, -{"lib/teiserver/game/libs/lobby_policy_lib.ex", :call}, -{"lib/teiserver/game/libs/match_rating_lib.ex", :unknown_type}, -{"lib/teiserver/game/libs/queue_lib.ex", :unknown_type}, -{"lib/teiserver/game/libs/rating_log_lib.ex", :unknown_type}, -{"lib/teiserver/game/libs/rating_type_lib.ex", :unknown_type}, -{"lib/teiserver/game/libs/user_achievement_lib.ex", :unknown_type}, -{"lib/teiserver/game/schemas/achievement_type.ex", :unknown_type}, -{"lib/teiserver/game/schemas/lobby_policy.ex", :unknown_type}, -{"lib/teiserver/game/schemas/queue.ex", :unknown_type}, -{"lib/teiserver/game/schemas/rating_log.ex", :unknown_type}, -{"lib/teiserver/game/schemas/rating_type.ex", :unknown_type}, -{"lib/teiserver/game/schemas/user_achievement.ex", :unknown_type}, -{"lib/teiserver/game/servers/balancer_server.ex", :unknown_type}, -{"lib/teiserver/game/servers/lobby_policy_bot_server.ex", :unknown_type}, -{"lib/teiserver/game/servers/lobby_policy_bot_server.ex", :no_return}, -{"lib/teiserver/game/servers/lobby_policy_bot_server.ex", :pattern_match}, -{"lib/teiserver/game/servers/lobby_policy_organiser_server.ex", :unknown_type}, -{"lib/teiserver/game/servers/queue_room_server.ex", :call}, -{"lib/teiserver/game/servers/queue_room_server.ex", :unknown_type}, -{"lib/teiserver/game/servers/queue_wait_server.ex", :unknown_type}, -{"lib/teiserver/helpers/number_helper.ex", :unknown_type}, -{"lib/teiserver/helpers/query_helper.ex", :unknown_type}, -{"lib/teiserver/helpers/schema_helper.ex", :unknown_type}, -{"lib/teiserver/helpers/styling_helpers.ex", :unknown_type}, -{"lib/teiserver/libs/test_lib.ex", :call}, -{"lib/teiserver/libs/test_lib.ex", :unknown_type}, -{"lib/teiserver/libs/test_lib.ex", :no_return}, -{"lib/teiserver/libs/test_lib.ex", :pattern_match}, -{"lib/teiserver/libs/test_lib.ex", :unused_fun}, -{"lib/teiserver/lobby.ex", :no_return}, -{"lib/teiserver/lobby.ex", :unknown_type}, -{"lib/teiserver/lobby.ex", :call}, -{"lib/teiserver/lobby.ex", :pattern_match}, -{"lib/teiserver/lobby.ex", :exact_eq}, -{"lib/teiserver/lobby.ex", :invalid_contract}, -{"lib/teiserver/lobby/commands/explain_command.ex", :no_return}, -{"lib/teiserver/lobby/commands/explain_command.ex", :call}, -{"lib/teiserver/lobby/libs/chat_lib.ex", :unknown_type}, -{"lib/teiserver/lobby/libs/chat_lib.ex", :call}, -{"lib/teiserver/lobby/libs/chat_lib.ex", :no_return}, -{"lib/teiserver/lobby/libs/command_lib.ex", :unknown_type}, -{"lib/teiserver/lobby/libs/lobby_lib.ex", :unknown_type}, -{"lib/teiserver/lobby/libs/lobby_lib.ex", :no_return}, -{"lib/teiserver/lobby/servers/lobby_index_throttle.ex", :guard_fail}, -{"lib/teiserver/lobby/servers/lobby_server.ex", :unknown_type}, -{"lib/teiserver/logging.ex", :no_return}, -{"lib/teiserver/logging.ex", :call}, -{"lib/teiserver/logging.ex", :unknown_type}, -{"lib/teiserver/logging/lib/logging_helpers.ex", :unknown_type}, -{"lib/teiserver/logging/lib/logging_plug.ex", :unknown_type}, -{"lib/teiserver/logging/lib/logging_test_lib.ex", :unknown_type}, -{"lib/teiserver/logging/lib/logging_test_lib.ex", :call}, -{"lib/teiserver/logging/schemas/match_day_log.ex", :unknown_type}, -{"lib/teiserver/logging/schemas/match_month_log.ex", :unknown_type}, -{"lib/teiserver/logging/schemas/server_day_log.ex", :unknown_type}, -{"lib/teiserver/logging/schemas/server_minute_log.ex", :unknown_type}, -{"lib/teiserver/logging/schemas/server_month_log.ex", :unknown_type}, -{"lib/teiserver/logging/schemas/server_quarter_log.ex", :unknown_type}, -{"lib/teiserver/logging/schemas/server_week_log.ex", :unknown_type}, -{"lib/teiserver/logging/schemas/server_year_log.ex", :unknown_type}, -{"lib/teiserver/logging/schemas/user_activity_day_log.ex", :unknown_type}, -{"lib/teiserver/logging/tasks/aggregate_logs_task.ex", :no_return}, -{"lib/teiserver/logging/tasks/aggregate_logs_task.ex", :call}, -{"lib/teiserver/logging/tasks/aggregate_logs_task.ex", :unused_fun}, -{"lib/teiserver/logging/tasks/persist_server_day_task.ex", :call}, -{"lib/teiserver/logging/tasks/persist_server_day_task.ex", :invalid_contract}, -{"lib/teiserver/microblog.ex", :unknown_type}, -{"lib/teiserver/microblog.ex", :invalid_contract}, -{"lib/teiserver/microblog/libs/post_lib.ex", :unknown_type}, -{"lib/teiserver/microblog/libs/post_lib.ex", :invalid_contract}, -{"lib/teiserver/microblog/libs/post_tag_lib.ex", :unknown_type}, -{"lib/teiserver/microblog/libs/post_tag_lib.ex", :invalid_contract}, -{"lib/teiserver/microblog/libs/tag_lib.ex", :unknown_type}, -{"lib/teiserver/microblog/libs/user_preference_lib.ex", :unknown_type}, -{"lib/teiserver/microblog/queries/post_queries.ex", :unknown_type}, -{"lib/teiserver/microblog/queries/post_tag_queries.ex", :unknown_type}, -{"lib/teiserver/microblog/queries/tag_queries.ex", :unknown_type}, -{"lib/teiserver/microblog/queries/user_preference_queries.ex", :pattern_match}, -{"lib/teiserver/microblog/queries/user_preference_queries.ex", :unknown_type}, -{"lib/teiserver/microblog/schemas/post.ex", :unknown_type}, -{"lib/teiserver/microblog/schemas/post_tag.ex", :unknown_type}, -{"lib/teiserver/microblog/schemas/tag.ex", :unknown_type}, -{"lib/teiserver/microblog/schemas/user_preference.ex", :unknown_type}, -{"lib/teiserver/mix_tasks/fake_data.ex", :callback_info_missing}, -{"lib/teiserver/mix_tasks/fake_data.ex", :unused_fun}, -{"lib/teiserver/mix_tasks/fake_data.ex", :unknown_function}, -{"lib/teiserver/mix_tasks/fake_data.ex", :no_return}, -{"lib/teiserver/mix_tasks/fake_data.ex", :call}, -{"lib/teiserver/moderation.ex", :unknown_type}, -{"lib/teiserver/moderation.ex", :invalid_contract}, -{"lib/teiserver/moderation.ex", :call}, -{"lib/teiserver/moderation/libs/action_lib.ex", :unknown_type}, -{"lib/teiserver/moderation/libs/action_lib.ex", :pattern_match}, -{"lib/teiserver/moderation/libs/ban_lib.ex", :unknown_type}, -{"lib/teiserver/moderation/libs/proposal_lib.ex", :unknown_type}, -{"lib/teiserver/moderation/libs/proposal_vote_lib.ex", :unknown_type}, -{"lib/teiserver/moderation/libs/report_group_lib.ex", :unknown_type}, -{"lib/teiserver/moderation/libs/report_group_lib.ex", :call}, -{"lib/teiserver/moderation/libs/report_lib.ex", :unknown_type}, -{"lib/teiserver/moderation/libs/response_lib.ex", :unknown_type}, -{"lib/teiserver/moderation/libs/test_lib.ex", :unknown_type}, -{"lib/teiserver/moderation/queries/report_group_queries.ex", :unknown_type}, -{"lib/teiserver/moderation/reports/activity_report.ex", :invalid_contract}, -{"lib/teiserver/moderation/schemas/action.ex", :unknown_type}, -{"lib/teiserver/moderation/schemas/ban.ex", :unknown_type}, -{"lib/teiserver/moderation/schemas/proposal.ex", :unknown_type}, -{"lib/teiserver/moderation/schemas/proposal_vote.ex", :unknown_type}, -{"lib/teiserver/moderation/schemas/report.ex", :unknown_type}, -{"lib/teiserver/moderation/schemas/report_group.ex", :unknown_type}, -{"lib/teiserver/moderation/schemas/report_group_message.ex", :unknown_type}, -{"lib/teiserver/moderation/schemas/report_group_vote.ex", :unknown_type}, -{"lib/teiserver/moderation/schemas/response.ex", :unknown_type}, -{"lib/teiserver/protocols/spring/spring.ex", :unknown_type}, -{"lib/teiserver/protocols/spring/spring_auth_in.ex", :unknown_type}, -{"lib/teiserver/protocols/spring/spring_battle_in.ex", :unknown_type}, -{"lib/teiserver/protocols/spring/spring_battle_in.ex", :call}, -{"lib/teiserver/protocols/spring/spring_in.ex", :unknown_type}, -{"lib/teiserver/protocols/spring/spring_in.ex", :call}, -{"lib/teiserver/protocols/spring/spring_in.ex", :pattern_match}, -{"lib/teiserver/protocols/spring/spring_lobby_policy_in.ex", :unknown_type}, -{"lib/teiserver/protocols/spring/spring_out.ex", :unknown_type}, -{"lib/teiserver/protocols/spring/spring_out.ex", :call}, -{"lib/teiserver/protocols/spring/spring_out.ex", :no_return}, -{"lib/teiserver/protocols/spring/spring_system_in.ex", :unknown_type}, -{"lib/teiserver/protocols/spring/spring_telemetry_in.ex", :unknown_type}, -{"lib/teiserver/protocols/spring/spring_user_in.ex", :unknown_type}, -{"lib/teiserver/protocols/spring/spring_user_in.ex", :call}, -{"lib/teiserver/protocols/spring/spring_user_in.ex", :pattern_match}, -{"lib/teiserver/protocols/tachyon_json_ws/converters.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_json_ws/handlers/lobby/join_request.ex", :no_return}, -{"lib/teiserver/protocols/tachyon_json_ws/handlers/lobby/join_request.ex", :call}, -{"lib/teiserver/protocols/tachyon_json_ws/handlers/lobby/list_lobbies_request.ex", :no_return}, -{"lib/teiserver/protocols/tachyon_json_ws/handlers/lobby/list_lobbies_request.ex", :call}, -{"lib/teiserver/protocols/tachyon_json_ws/handlers/lobby_host/create_request.ex", :pattern_match}, -{"lib/teiserver/protocols/tachyon_json_ws/handlers/system/disconnect_request.ex", :invalid_contract}, -{"lib/teiserver/protocols/tachyon_json_ws/handlers/system/no_command_error_request.ex", :invalid_contract}, -{"lib/teiserver/protocols/tachyon_json_ws/responses/account/whoami_response.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_json_ws/responses/communication/received_direct_message_response.ex", :invalid_contract}, -{"lib/teiserver/protocols/tachyon_json_ws/responses/communication/received_direct_message_response.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_json_ws/responses/communication/send_direct_message_response.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_json_ws/responses/lobby_host/add_bot_response.ex", :invalid_contract}, -{"lib/teiserver/protocols/tachyon_json_ws/responses/lobby_host/close_response.ex", :invalid_contract}, -{"lib/teiserver/protocols/tachyon_json_ws/responses/lobby_host/create_response.ex", :invalid_contract}, -{"lib/teiserver/protocols/tachyon_json_ws/responses/lobby_host/end_battle_response.ex", :invalid_contract}, -{"lib/teiserver/protocols/tachyon_json_ws/responses/lobby_host/join_request_response.ex", :invalid_contract}, -{"lib/teiserver/protocols/tachyon_json_ws/responses/lobby_host/remove_bot_response.ex", :invalid_contract}, -{"lib/teiserver/protocols/tachyon_json_ws/responses/lobby_host/respond_to_join_request_response.ex", :invalid_contract}, -{"lib/teiserver/protocols/tachyon_json_ws/responses/lobby_host/start_battle_response.ex", :invalid_contract}, -{"lib/teiserver/protocols/tachyon_json_ws/responses/lobby_host/update_bot_response.ex", :invalid_contract}, -{"lib/teiserver/protocols/tachyon_json_ws/responses/lobby_host/updated_status_response.ex", :invalid_contract}, -{"lib/teiserver/protocols/tachyon_json_ws/responses/system/disconnect_response.ex", :invalid_contract}, -{"lib/teiserver/protocols/tachyon_json_ws/responses/system/error_response.ex", :invalid_contract}, -{"lib/teiserver/protocols/tachyon_json_ws/responses/system/ping_response.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_json_ws/responses/telemetry/event_response.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_json_ws/responses/telemetry/property_response.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_json_ws/responses/user/updated_user_client_response.ex", :invalid_contract}, -{"lib/teiserver/protocols/tachyon_json_ws/tachyon_socket.ex", :pattern_match}, -{"lib/teiserver/protocols/tachyon_json_ws/tachyon_socket.ex", :callback_spec_type_mismatch}, -{"lib/teiserver/protocols/tachyon_json_ws/tachyon_socket.ex", :invalid_contract}, -{"lib/teiserver/protocols/tachyon_json_ws/tachyon_socket.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_json_ws/tachyon_socket.ex", :unused_fun}, -{"lib/teiserver/protocols/tachyon_lib.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_v1/auth_in.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_v1/auth_in.ex", :call}, -{"lib/teiserver/protocols/tachyon_v1/auth_in.ex", :pattern_match}, -{"lib/teiserver/protocols/tachyon_v1/auth_out.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_v1/client_in.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_v1/client_out.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_v1/communication_in.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_v1/communication_out.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_v1/config_in.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_v1/config_out.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_v1/config_out.ex", :call}, -{"lib/teiserver/protocols/tachyon_v1/config_out.ex", :no_return}, -{"lib/teiserver/protocols/tachyon_v1/lobby_host_in.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_v1/lobby_host_out.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_v1/lobby_host_out.ex", :call}, -{"lib/teiserver/protocols/tachyon_v1/lobby_in.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_v1/lobby_in.ex", :call}, -{"lib/teiserver/protocols/tachyon_v1/lobby_in.ex", :pattern_match}, -{"lib/teiserver/protocols/tachyon_v1/lobby_out.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_v1/lobby_out.ex", :call}, -{"lib/teiserver/protocols/tachyon_v1/matchmaking_in.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_v1/matchmaking_in.ex", :pattern_match}, -{"lib/teiserver/protocols/tachyon_v1/matchmaking_in.ex", :pattern_match_cov}, -{"lib/teiserver/protocols/tachyon_v1/matchmaking_out.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_v1/party_in.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_v1/party_in.ex", :call}, -{"lib/teiserver/protocols/tachyon_v1/party_out.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_v1/party_out.ex", :call}, -{"lib/teiserver/protocols/tachyon_v1/system_in.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_v1/system_out.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_v1/tachyon.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_v1/tachyon_out.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_v1/telemetry_in.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_v1/user_in.ex", :unknown_type}, -{"lib/teiserver/protocols/tachyon_v1/user_in.ex", :call}, -{"lib/teiserver/protocols/tachyon_v1/user_out.ex", :unknown_type}, -{"lib/teiserver/servers/telemetry_server.ex", :unknown_type}, -{"lib/teiserver/tcp/spring/spring_tcp_server.ex", :call}, -{"lib/teiserver/tcp/spring/spring_tcp_server.ex", :no_return}, -{"lib/teiserver/tcp/spring/spring_tcp_server.ex", :invalid_contract}, -{"lib/teiserver/tcp/spring/spring_tcp_server.ex", :unknown_type}, -{"lib/teiserver/tcp/tachyon/tachyon_tcp_server.ex", :no_return}, -{"lib/teiserver/tcp/tachyon/tachyon_tcp_server.ex", :call}, -{"lib/teiserver/telemetry.ex", :unknown_type}, -{"lib/teiserver/telemetry.ex", :invalid_contract}, -{"lib/teiserver/telemetry/libs/anon_property_lib.ex", :unknown_type}, -{"lib/teiserver/telemetry/libs/complex_client_event_type_lib.ex", :invalid_contract}, -{"lib/teiserver/telemetry/libs/complex_lobby_event_lib.ex", :invalid_contract}, -{"lib/teiserver/telemetry/libs/complex_lobby_event_type_lib.ex", :invalid_contract}, -{"lib/teiserver/telemetry/libs/complex_match_event_lib.ex", :invalid_contract}, -{"lib/teiserver/telemetry/libs/complex_match_event_type_lib.ex", :invalid_contract}, -{"lib/teiserver/telemetry/libs/complex_server_event_lib.ex", :invalid_contract}, -{"lib/teiserver/telemetry/libs/complex_server_event_type_lib.ex", :invalid_contract}, -{"lib/teiserver/telemetry/libs/infolog_lib.ex", :unknown_type}, -{"lib/teiserver/telemetry/libs/property_type_lib.ex", :invalid_contract}, -{"lib/teiserver/telemetry/libs/simple_client_event_type_lib.ex", :invalid_contract}, -{"lib/teiserver/telemetry/libs/simple_lobby_event_type_lib.ex", :invalid_contract}, -{"lib/teiserver/telemetry/libs/simple_match_event_type_lib.ex", :invalid_contract}, -{"lib/teiserver/telemetry/libs/simple_server_event_type_lib.ex", :invalid_contract}, -{"lib/teiserver/telemetry/libs/telemetry_lib.ex", :unknown_type}, -{"lib/teiserver/telemetry/libs/user_property_lib.ex", :unknown_type}, -{"lib/teiserver/telemetry/queries/anon_property_queries.ex", :unknown_type}, -{"lib/teiserver/telemetry/queries/complex_anon_event_queries.ex", :unknown_type}, -{"lib/teiserver/telemetry/queries/complex_client_event_queries.ex", :unknown_type}, -{"lib/teiserver/telemetry/queries/complex_client_event_type_queries.ex", :unknown_type}, -{"lib/teiserver/telemetry/queries/complex_lobby_event_queries.ex", :unknown_type}, -{"lib/teiserver/telemetry/queries/complex_lobby_event_type_queries.ex", :unknown_type}, -{"lib/teiserver/telemetry/queries/complex_match_event_queries.ex", :unknown_type}, -{"lib/teiserver/telemetry/queries/complex_match_event_type_queries.ex", :unknown_type}, -{"lib/teiserver/telemetry/queries/complex_server_event_queries.ex", :unknown_type}, -{"lib/teiserver/telemetry/queries/complex_server_event_type_queries.ex", :unknown_type}, -{"lib/teiserver/telemetry/queries/property_type_queries.ex", :unknown_type}, -{"lib/teiserver/telemetry/queries/simple_anon_event_queries.ex", :unknown_type}, -{"lib/teiserver/telemetry/queries/simple_client_event_queries.ex", :unknown_type}, -{"lib/teiserver/telemetry/queries/simple_client_event_type_queries.ex", :unknown_type}, -{"lib/teiserver/telemetry/queries/simple_lobby_event_queries.ex", :unknown_type}, -{"lib/teiserver/telemetry/queries/simple_lobby_event_type_queries.ex", :unknown_type}, -{"lib/teiserver/telemetry/queries/simple_match_event_queries.ex", :unknown_type}, -{"lib/teiserver/telemetry/queries/simple_match_event_type_queries.ex", :unknown_type}, -{"lib/teiserver/telemetry/queries/simple_server_event_queries.ex", :unknown_type}, -{"lib/teiserver/telemetry/queries/simple_server_event_type_queries.ex", :unknown_type}, -{"lib/teiserver/telemetry/queries/user_property_queries.ex", :unknown_type}, -{"lib/teiserver/telemetry/schemas/anon_property.ex", :unknown_type}, -{"lib/teiserver/telemetry/schemas/complex_anon_event.ex", :unknown_type}, -{"lib/teiserver/telemetry/schemas/complex_client_event.ex", :unknown_type}, -{"lib/teiserver/telemetry/schemas/complex_client_event_type.ex", :unknown_type}, -{"lib/teiserver/telemetry/schemas/complex_lobby_event.ex", :unknown_type}, -{"lib/teiserver/telemetry/schemas/complex_lobby_event_type.ex", :unknown_type}, -{"lib/teiserver/telemetry/schemas/complex_match_event.ex", :unknown_type}, -{"lib/teiserver/telemetry/schemas/complex_match_event_type.ex", :unknown_type}, -{"lib/teiserver/telemetry/schemas/complex_server_event.ex", :unknown_type}, -{"lib/teiserver/telemetry/schemas/complex_server_event_type.ex", :unknown_type}, -{"lib/teiserver/telemetry/schemas/infolog.ex", :unknown_type}, -{"lib/teiserver/telemetry/schemas/property_types.ex", :unknown_type}, -{"lib/teiserver/telemetry/schemas/simple_anon_event.ex", :unknown_type}, -{"lib/teiserver/telemetry/schemas/simple_client_event.ex", :unknown_type}, -{"lib/teiserver/telemetry/schemas/simple_client_event_type.ex", :unknown_type}, -{"lib/teiserver/telemetry/schemas/simple_lobby_event.ex", :unknown_type}, -{"lib/teiserver/telemetry/schemas/simple_lobby_event_type.ex", :unknown_type}, -{"lib/teiserver/telemetry/schemas/simple_match_event.ex", :unknown_type}, -{"lib/teiserver/telemetry/schemas/simple_match_event_type.ex", :unknown_type}, -{"lib/teiserver/telemetry/schemas/simple_server_event.ex", :unknown_type}, -{"lib/teiserver/telemetry/schemas/simple_server_event_type.ex", :unknown_type}, -{"lib/teiserver/telemetry/schemas/user_property.ex", :unknown_type}, -{"lib/teiserver_web/controllers/account/security_controller.ex", :unknown_type}, -{"lib/teiserver_web/controllers/account/session_controller.ex", :unknown_type}, -{"lib/teiserver_web/controllers/admin/accolade_controller.ex", :unknown_type}, -{"lib/teiserver_web/controllers/admin/accolade_controller.ex", :no_return}, -{"lib/teiserver_web/controllers/admin/achievement_controller.ex", :unknown_type}, -{"lib/teiserver_web/controllers/admin/badge_type_controller.ex", :unknown_type}, -{"lib/teiserver_web/controllers/admin/chat_controller.ex", :unknown_type}, -{"lib/teiserver_web/controllers/admin/code_controller.ex", :unknown_type}, -{"lib/teiserver_web/controllers/admin/discord_channel_controller.ex", :unknown_type}, -{"lib/teiserver_web/controllers/admin/discord_channel_controller.ex", :pattern_match}, -{"lib/teiserver_web/controllers/admin/lobby_controller.ex", :no_return}, -{"lib/teiserver_web/controllers/admin/lobby_controller.ex", :call}, -{"lib/teiserver_web/controllers/admin/lobby_policy_controller.ex", :unknown_type}, -{"lib/teiserver_web/controllers/admin/match_controller.ex", :unknown_type}, -{"lib/teiserver_web/controllers/admin/text_callback_controller.ex", :unknown_type}, -{"lib/teiserver_web/controllers/admin/text_callback_controller.ex", :no_return}, -{"lib/teiserver_web/controllers/admin/text_callback_controller.ex", :call}, -{"lib/teiserver_web/controllers/admin/tool_controller.ex", :unknown_type}, -{"lib/teiserver_web/controllers/admin/tool_controller.ex", :no_return}, -{"lib/teiserver_web/controllers/admin/tool_controller.ex", :call}, -{"lib/teiserver_web/controllers/admin/user_controller.ex", :unknown_type}, -{"lib/teiserver_web/controllers/admin/user_controller.ex", :pattern_match}, -{"lib/teiserver_web/controllers/api/hailstorm_controller.ex", :pattern_match}, -{"lib/teiserver_web/controllers/api/hailstorm_controller.ex", :call}, -{"lib/teiserver_web/controllers/api/hailstorm_controller.ex", :no_return}, -{"lib/teiserver_web/controllers/api/hailstorm_controller.ex", :unknown_type}, -{"lib/teiserver_web/controllers/api/session_controller.ex", :unknown_type}, -{"lib/teiserver_web/controllers/api/session_controller.ex", :pattern_match}, -{"lib/teiserver_web/controllers/api/session_controller.ex", :call}, -{"lib/teiserver_web/controllers/api/spads_controller.ex", :call}, -{"lib/teiserver_web/controllers/battle/general_controller.ex", :unknown_type}, -{"lib/teiserver_web/controllers/battle/match_controller.ex", :unknown_type}, -{"lib/teiserver_web/controllers/battle/ratings_controller.ex", :unknown_type}, -{"lib/teiserver_web/controllers/game/queue_controller.ex", :unknown_type}, -{"lib/teiserver_web/controllers/general/general_controller.ex", :unknown_type}, -{"lib/teiserver_web/controllers/logging/aggregate_view_log_controller.ex", :unknown_type}, -{"lib/teiserver_web/controllers/logging/aggregate_view_log_controller.ex", :no_return}, -{"lib/teiserver_web/controllers/logging/audit_log_controller.ex", :unknown_type}, -{"lib/teiserver_web/controllers/logging/general_controller.ex", :unknown_type}, -{"lib/teiserver_web/controllers/logging/match_log_controller.ex", :call}, -{"lib/teiserver_web/controllers/logging/match_log_controller.ex", :no_return}, -{"lib/teiserver_web/controllers/logging/page_view_log_controller.ex", :unknown_type}, -{"lib/teiserver_web/controllers/moderation/action_controller.ex", :unknown_type}, -{"lib/teiserver_web/controllers/moderation/ban_controller.ex", :unknown_type}, -{"lib/teiserver_web/controllers/moderation/ban_controller.ex", :no_return}, -{"lib/teiserver_web/controllers/moderation/ban_controller.ex", :call}, -{"lib/teiserver_web/controllers/moderation/general_controller.ex", :unknown_type}, -{"lib/teiserver_web/controllers/moderation/proposal_controller.ex", :unknown_type}, -{"lib/teiserver_web/controllers/moderation/report_controller.ex", :unknown_type}, -{"lib/teiserver_web/controllers/report/report_controller.ex", :unknown_type}, -{"lib/teiserver_web/controllers/telemetry/complex_client_event_controller.ex", :no_return}, -{"lib/teiserver_web/controllers/telemetry/complex_client_event_controller.ex", :call}, -{"lib/teiserver_web/controllers/telemetry/complex_lobby_event_controller.ex", :no_return}, -{"lib/teiserver_web/controllers/telemetry/complex_lobby_event_controller.ex", :call}, -{"lib/teiserver_web/controllers/telemetry/complex_match_event_controller.ex", :no_return}, -{"lib/teiserver_web/controllers/telemetry/complex_match_event_controller.ex", :call}, -{"lib/teiserver_web/controllers/telemetry/complex_server_event_controller.ex", :no_return}, -{"lib/teiserver_web/controllers/telemetry/complex_server_event_controller.ex", :call}, -{"lib/teiserver_web/controllers/telemetry/simple_client_event_controller.ex", :no_return}, -{"lib/teiserver_web/controllers/telemetry/simple_client_event_controller.ex", :call}, -{"lib/teiserver_web/controllers/telemetry/simple_lobby_event_controller.ex", :no_return}, -{"lib/teiserver_web/controllers/telemetry/simple_lobby_event_controller.ex", :call}, -{"lib/teiserver_web/controllers/telemetry/simple_match_event_controller.ex", :no_return}, -{"lib/teiserver_web/controllers/telemetry/simple_match_event_controller.ex", :call}, -{"lib/teiserver_web/controllers/telemetry/simple_server_event_controller.ex", :no_return}, -{"lib/teiserver_web/controllers/telemetry/simple_server_event_controller.ex", :call}, -{"lib/teiserver_web/live/account/party/index.ex", :no_return}, -{"lib/teiserver_web/live/account/party/index.ex", :pattern_match}, -{"lib/teiserver_web/live/account/party/index.ex", :unused_fun}, -{"lib/teiserver_web/live/account/party/show.ex", :no_return}, -{"lib/teiserver_web/live/account/party/show.ex", :pattern_match}, -{"lib/teiserver_web/live/account/party/show.ex", :call}, -{"lib/teiserver_web/live/account/relationship/index.ex", :call}, -{"lib/teiserver_web/live/account/relationship/index.html.heex", :no_return}, -{"lib/teiserver_web/live/account/relationship/index.html.heex", :call}, -{"lib/teiserver_web/live/admin/chat/index.html.heex", :no_return}, -{"lib/teiserver_web/live/admin/chat/index.html.heex", :call}, -{"lib/teiserver_web/live/admin_dashboard/index.ex", :unknown_type}, -{"lib/teiserver_web/live/admin_dashboard/policy.ex", :unknown_type}, -{"lib/teiserver_web/live/battles/lobbies/index.ex", :guard_fail}, -{"lib/teiserver_web/live/battles/lobbies/index.ex", :exact_eq}, -{"lib/teiserver_web/live/battles/lobbies/show.ex", :exact_eq}, -{"lib/teiserver_web/live/battles/match/chat.ex", :no_return}, -{"lib/teiserver_web/live/battles/match/chat.ex", :call}, -{"lib/teiserver_web/live/battles/match/chat.html.heex", :no_return}, -{"lib/teiserver_web/live/battles/match/chat.html.heex", :call}, -{"lib/teiserver_web/live/battles/match/show.ex", :call}, -{"lib/teiserver_web/live/clients/show.ex", :call}, -{"lib/teiserver_web/live/clients/show.ex", :exact_eq}, -{"lib/teiserver_web/live/communication/chat/room.ex", :call}, -{"lib/teiserver_web/live/microblog/admin/post/post_form_component.ex", :call}, -{"lib/teiserver_web/live/microblog/admin/post/post_form_component.ex", :pattern_match}, -{"lib/teiserver_web/live/microblog/admin/tag/tag_form_component.ex", :pattern_match}, -{"lib/teiserver_web/live/microblog/blog/show.ex", :call}, -{"lib/teiserver_web/live/microblog/blog/show.html.heex", :call}, -{"lib/teiserver_web/live/microblog/microblog_components.ex", :call}, -{"lib/teiserver_web/live/tournament/index.ex", :exact_eq}, -{"lib/teiserver_web/live/tournament/show.ex", :exact_eq}, -{"lib/teiserver_web/plugs/cache_plug.ex", :call}, -{"lib/teiserver_web/router.ex", :no_return}, -{"lib/teiserver_web/templates/account/session/edit.html.heex", :call}, -{"lib/teiserver_web/templates/admin/accolade/edit.html.heex", :call}, -{"lib/teiserver_web/templates/admin/accolade/new.html.heex", :call}, -{"lib/teiserver_web/templates/admin/accolade/show.html.heex", :call}, -{"lib/teiserver_web/templates/admin/chat/index.html.heex", :no_return}, -{"lib/teiserver_web/templates/admin/chat/index.html.heex", :call}, -{"lib/teiserver_web/templates/admin/lobby/lobby_chat.html.heex", :no_return}, -{"lib/teiserver_web/templates/admin/lobby/lobby_chat.html.heex", :call}, -{"lib/teiserver_web/templates/admin/lobby/server_chat.html.heex", :no_return}, -{"lib/teiserver_web/templates/admin/lobby/server_chat.html.heex", :call}, -{"lib/teiserver_web/templates/admin/user/full_chat.html.heex", :no_return}, -{"lib/teiserver_web/templates/admin/user/full_chat.html.heex", :call}, -{"lib/teiserver_web/templates/battle/match/index.html.heex", :no_return}, -{"lib/teiserver_web/templates/battle/match/index.html.heex", :call}, -{"lib/teiserver_web/templates/battle/match/ratings.html.heex", :no_return}, -{"lib/teiserver_web/templates/battle/match/ratings.html.heex", :call}, -{"lib/teiserver_web/views/admin/code_view.ex", :invalid_contract}, + {"lib/gen_server.ex", :callback_info_missing}, + {"lib/nostrum/consumer.ex", :unknown_function}, + {"lib/teiserver.ex", :unknown_type}, + {"lib/teiserver.ex", :invalid_contract}, + {"lib/teiserver/account.ex", :unknown_type}, + {"lib/teiserver/account.ex", :invalid_contract}, + {"lib/teiserver/account.ex", :call}, + {"lib/teiserver/account.ex", :no_return}, + {"lib/teiserver/account/accolades/accolade_bot_server.ex", :unknown_type}, + {"lib/teiserver/account/accolades/accolade_bot_server.ex", :no_return}, + {"lib/teiserver/account/accolades/accolade_bot_server.ex", :call}, + {"lib/teiserver/account/accolades/accolade_chat_server.ex", :no_return}, + {"lib/teiserver/account/accolades/accolade_chat_server.ex", :call}, + {"lib/teiserver/account/accolades/accolade_chat_server.ex", :unknown_type}, + {"lib/teiserver/account/caches/user_cache_lib.ex", :no_return}, + {"lib/teiserver/account/caches/user_cache_lib.ex", :call}, + {"lib/teiserver/account/caches/user_cache_lib.ex", :unknown_type}, + {"lib/teiserver/account/libs/accolade_lib.ex", :unknown_type}, + {"lib/teiserver/account/libs/accolade_lib.ex", :no_return}, + {"lib/teiserver/account/libs/accolade_lib.ex", :call}, + {"lib/teiserver/account/libs/auth_lib.ex", :unknown_type}, + {"lib/teiserver/account/libs/badge_type_lib.ex", :unknown_type}, + {"lib/teiserver/account/libs/client_lib.ex", :unknown_type}, + {"lib/teiserver/account/libs/friend_lib.ex", :unknown_type}, + {"lib/teiserver/account/libs/friend_request_lib.ex", :unknown_type}, + {"lib/teiserver/account/libs/party_lib.ex", :no_return}, + {"lib/teiserver/account/libs/party_lib.ex", :call}, + {"lib/teiserver/account/libs/rating_lib.ex", :unknown_type}, + {"lib/teiserver/account/libs/relationship_lib.ex", :unknown_type}, + {"lib/teiserver/account/libs/smurf_key_lib.ex", :unknown_type}, + {"lib/teiserver/account/libs/smurf_key_type_lib.ex", :unknown_type}, + {"lib/teiserver/account/libs/user_lib.ex", :unknown_type}, + {"lib/teiserver/account/libs/user_lib.ex", :call}, + {"lib/teiserver/account/libs/user_stat_lib.ex", :unknown_type}, + {"lib/teiserver/account/plugs/auth_plug.ex", :call}, + {"lib/teiserver/account/queries/friend_queries.ex", :unknown_type}, + {"lib/teiserver/account/queries/friend_request_queries.ex", :unknown_type}, + {"lib/teiserver/account/queries/relationship_queries.ex", :unknown_type}, + {"lib/teiserver/account/queries/user_queries.ex", :unknown_type}, + {"lib/teiserver/account/reports/ban_evasion_report.ex", :invalid_contract}, + {"lib/teiserver/account/reports/growth_report.ex", :callback_spec_type_mismatch}, + {"lib/teiserver/account/reports/growth_report.ex", :no_return}, + {"lib/teiserver/account/reports/growth_report.ex", :call}, + {"lib/teiserver/account/reports/leaderboard_report.ex", :invalid_contract}, + {"lib/teiserver/account/reports/mapping_report.ex", :invalid_contract}, + {"lib/teiserver/account/reports/open_skill_report.ex", :invalid_contract}, + {"lib/teiserver/account/reports/population_report.ex", :no_return}, + {"lib/teiserver/account/reports/population_report.ex", :call}, + {"lib/teiserver/account/reports/population_report.ex", :pattern_match}, + {"lib/teiserver/account/reports/population_report.ex", :invalid_contract}, + {"lib/teiserver/account/reports/population_report.ex", :unused_fun}, + {"lib/teiserver/account/reports/records_report.ex", :invalid_contract}, + {"lib/teiserver/account/reports/retention_report.ex", :invalid_contract}, + {"lib/teiserver/account/reports/time_compare_report.ex", :invalid_contract}, + {"lib/teiserver/account/reports/time_compare_report.ex", :call}, + {"lib/teiserver/account/reports/tournament_report.ex", :invalid_contract}, + {"lib/teiserver/account/reports/user_age_report.ex", :invalid_contract}, + {"lib/teiserver/account/reports/week_on_week_report.ex", :invalid_contract}, + {"lib/teiserver/account/schemas/accolade.ex", :unknown_type}, + {"lib/teiserver/account/schemas/badge_type.ex", :unknown_type}, + {"lib/teiserver/account/schemas/friend.ex", :unknown_type}, + {"lib/teiserver/account/schemas/friend_request.ex", :unknown_type}, + {"lib/teiserver/account/schemas/relationship.ex", :unknown_type}, + {"lib/teiserver/account/schemas/smurf_key.ex", :unknown_type}, + {"lib/teiserver/account/schemas/smurf_key_type.ex", :unknown_type}, + {"lib/teiserver/account/servers/client_server.ex", :unknown_type}, + {"lib/teiserver/account/servers/login_throttle_server.ex", :unknown_type}, + {"lib/teiserver/account/servers/party_server.ex", :no_return}, + {"lib/teiserver/account/servers/party_server.ex", :call}, + {"lib/teiserver/account/servers/party_server.ex", :unknown_type}, + {"lib/teiserver/account/tasks/merge_accounts_task.ex", :no_return}, + {"lib/teiserver/account/tasks/merge_accounts_task.ex", :pattern_match}, + {"lib/teiserver/account/tasks/recalculate_user_cache_task.ex", :invalid_contract}, + {"lib/teiserver/battle.ex", :unknown_type}, + {"lib/teiserver/battle.ex", :call}, + {"lib/teiserver/battle.ex", :no_return}, + {"lib/teiserver/battle/api_auth.ex", :unknown_type}, + {"lib/teiserver/battle/balance/balance_types.ex", :unknown_type}, + {"lib/teiserver/battle/balance/cheeky_switcher_smart.ex", :unknown_type}, + {"lib/teiserver/battle/balance/cheeky_switcher_smart.ex", :call}, + {"lib/teiserver/battle/balance/cheeky_switcher_smart.ex", :no_return}, + {"lib/teiserver/battle/balance/cheeky_switcher_smart.ex", :pattern_match}, + {"lib/teiserver/battle/balance/cheeky_switcher_smart.ex", :unused_fun}, + {"lib/teiserver/battle/balance/loser_picks.ex", :invalid_contract}, + {"lib/teiserver/battle/libs/balance_lib.ex", :call}, + {"lib/teiserver/battle/libs/balance_lib.ex", :unknown_type}, + {"lib/teiserver/battle/libs/balance_lib.ex", :no_return}, + {"lib/teiserver/battle/libs/match_lib.ex", :unknown_type}, + {"lib/teiserver/battle/mix_tasks/compare_balance_algorithms_task.ex", :callback_info_missing}, + {"lib/teiserver/battle/schemas/match.ex", :unknown_type}, + {"lib/teiserver/battle/servers/match_monitor_server.ex", :unknown_type}, + {"lib/teiserver/battle/servers/match_monitor_server.ex", :call}, + {"lib/teiserver/battle/servers/match_monitor_server.ex", :no_return}, + {"lib/teiserver/battle/tasks/post_match_process_task.ex", :no_return}, + {"lib/teiserver/battle/tasks/post_match_process_task.ex", :call}, + {"lib/teiserver/battle/tasks/post_match_process_task.ex", :unused_fun}, + {"lib/teiserver/benchmark/benchmark_task.ex", :callback_info_missing}, + {"lib/teiserver/bridge/bridge_server.ex", :unknown_type}, + {"lib/teiserver/bridge/bridge_server.ex", :unknown_function}, + {"lib/teiserver/bridge/bridge_server.ex", :call}, + {"lib/teiserver/bridge/bridge_server.ex", :unused_fun}, + {"lib/teiserver/bridge/bridge_server.ex", :no_return}, + {"lib/teiserver/bridge/chat_commands.ex", :unknown_type}, + {"lib/teiserver/bridge/chat_commands.ex", :call}, + {"lib/teiserver/bridge/chat_commands.ex", :unknown_function}, + {"lib/teiserver/bridge/command_lib.ex", :unknown_type}, + {"lib/teiserver/bridge/commands/bridge_command_behaviour.ex", :unknown_type}, + {"lib/teiserver/bridge/commands/textcb_command.ex", :unknown_type}, + {"lib/teiserver/bridge/discord_bridge_bot.ex", :guard_fail}, + {"lib/teiserver/bridge/discord_bridge_bot.ex", :unknown_function}, + {"lib/teiserver/bridge/discord_bridge_bot.ex", :unknown_type}, + {"lib/teiserver/bridge/discord_bridge_bot.ex", :no_return}, + {"lib/teiserver/bridge/discord_bridge_bot.ex", :call}, + {"lib/teiserver/bridge/message_commands.ex", :unknown_type}, + {"lib/teiserver/bridge/message_commands.ex", :call}, + {"lib/teiserver/bridge/message_commands.ex", :pattern_match}, + {"lib/teiserver/bridge/message_commands.ex", :pattern_match_cov}, + {"lib/teiserver/bridge/message_commands.ex", :unknown_function}, + {"lib/teiserver/chat.ex", :unknown_type}, + {"lib/teiserver/chat/chat_room_cache.ex", :unknown_type}, + {"lib/teiserver/chat/chat_room_cache.ex", :call}, + {"lib/teiserver/chat/chat_room_cache.ex", :no_return}, + {"lib/teiserver/chat/libs/direct_message_lib.ex", :unknown_type}, + {"lib/teiserver/chat/libs/lobby_message_lib.ex", :unknown_type}, + {"lib/teiserver/chat/libs/party_message_lib.ex", :unknown_type}, + {"lib/teiserver/chat/libs/room_message_lib.ex", :unknown_type}, + {"lib/teiserver/chat/schemas/direct_message.ex", :unknown_type}, + {"lib/teiserver/chat/schemas/lobby_message.ex", :unknown_type}, + {"lib/teiserver/chat/schemas/party_message.ex", :unknown_type}, + {"lib/teiserver/chat/schemas/room_message.ex", :unknown_type}, + {"lib/teiserver/clans.ex", :unknown_type}, + {"lib/teiserver/clans/libs/clan_invite_lib.ex", :unknown_type}, + {"lib/teiserver/clans/libs/clan_lib.ex", :unknown_type}, + {"lib/teiserver/clans/libs/clan_membership_lib.ex", :unknown_type}, + {"lib/teiserver/communication.ex", :unknown_type}, + {"lib/teiserver/communication.ex", :invalid_contract}, + {"lib/teiserver/communication/libs/discord_channel_lib.ex", :unknown_type}, + {"lib/teiserver/communication/libs/discord_channel_lib.ex", :unknown_function}, + {"lib/teiserver/communication/libs/text_callback_lib.ex", :unknown_type}, + {"lib/teiserver/communication/queries/discord_channel_queries.ex", :unknown_type}, + {"lib/teiserver/communication/schemas/discord_channel.ex", :unknown_type}, + {"lib/teiserver/communication/schemas/text_callback.ex", :unknown_type}, + {"lib/teiserver/config.ex", :unknown_type}, + {"lib/teiserver/coordinator.ex", :pattern_match}, + {"lib/teiserver/coordinator.ex", :unknown_type}, + {"lib/teiserver/coordinator.ex", :no_return}, + {"lib/teiserver/coordinator.ex", :call}, + {"lib/teiserver/coordinator/automod_server.ex", :invalid_contract}, + {"lib/teiserver/coordinator/automod_server.ex", :unknown_type}, + {"lib/teiserver/coordinator/automod_server.ex", :no_return}, + {"lib/teiserver/coordinator/automod_server.ex", :call}, + {"lib/teiserver/coordinator/consul_commands.ex", :unknown_type}, + {"lib/teiserver/coordinator/consul_commands.ex", :call}, + {"lib/teiserver/coordinator/consul_commands.ex", :no_return}, + {"lib/teiserver/coordinator/consul_server.ex", :unknown_type}, + {"lib/teiserver/coordinator/consul_server.ex", :no_return}, + {"lib/teiserver/coordinator/consul_server.ex", :call}, + {"lib/teiserver/coordinator/coordinator_commands.ex", :unknown_type}, + {"lib/teiserver/coordinator/coordinator_commands.ex", :call}, + {"lib/teiserver/coordinator/coordinator_lib.ex", :unknown_type}, + {"lib/teiserver/coordinator/coordinator_parser.ex", :unknown_type}, + {"lib/teiserver/coordinator/coordinator_server.ex", :unknown_type}, + {"lib/teiserver/coordinator/coordinator_server.ex", :no_return}, + {"lib/teiserver/coordinator/coordinator_server.ex", :call}, + {"lib/teiserver/coordinator/spads_parser.ex", :unknown_type}, + {"lib/teiserver/coordinator/spads_parser.ex", :call}, + {"lib/teiserver/data/cache_user.ex", :pattern_match}, + {"lib/teiserver/data/cache_user.ex", :call}, + {"lib/teiserver/data/cache_user.ex", :no_return}, + {"lib/teiserver/data/cache_user.ex", :unused_fun}, + {"lib/teiserver/data/cache_user.ex", :unknown_type}, + {"lib/teiserver/data/cache_user.ex", :invalid_contract}, + {"lib/teiserver/data/client.ex", :unknown_type}, + {"lib/teiserver/data/client.ex", :no_return}, + {"lib/teiserver/data/lobby_id_server.ex", :unknown_type}, + {"lib/teiserver/data/matchmaking.ex", :unknown_type}, + {"lib/teiserver/data/matchmaking.ex", :no_return}, + {"lib/teiserver/data/matchmaking.ex", :call}, + {"lib/teiserver/data/matchmaking.ex", :invalid_contract}, + {"lib/teiserver/data/types.ex", :unknown_type}, + {"lib/teiserver/game.ex", :unknown_type}, + {"lib/teiserver/game/libs/achievement_type_lib.ex", :unknown_type}, + {"lib/teiserver/game/libs/lobby_policy_lib.ex", :unknown_type}, + {"lib/teiserver/game/libs/lobby_policy_lib.ex", :no_return}, + {"lib/teiserver/game/libs/lobby_policy_lib.ex", :call}, + {"lib/teiserver/game/libs/match_rating_lib.ex", :unknown_type}, + {"lib/teiserver/game/libs/queue_lib.ex", :unknown_type}, + {"lib/teiserver/game/libs/rating_log_lib.ex", :unknown_type}, + {"lib/teiserver/game/libs/rating_type_lib.ex", :unknown_type}, + {"lib/teiserver/game/libs/user_achievement_lib.ex", :unknown_type}, + {"lib/teiserver/game/schemas/achievement_type.ex", :unknown_type}, + {"lib/teiserver/game/schemas/lobby_policy.ex", :unknown_type}, + {"lib/teiserver/game/schemas/queue.ex", :unknown_type}, + {"lib/teiserver/game/schemas/rating_log.ex", :unknown_type}, + {"lib/teiserver/game/schemas/rating_type.ex", :unknown_type}, + {"lib/teiserver/game/schemas/user_achievement.ex", :unknown_type}, + {"lib/teiserver/game/servers/balancer_server.ex", :unknown_type}, + {"lib/teiserver/game/servers/lobby_policy_bot_server.ex", :unknown_type}, + {"lib/teiserver/game/servers/lobby_policy_bot_server.ex", :no_return}, + {"lib/teiserver/game/servers/lobby_policy_bot_server.ex", :pattern_match}, + {"lib/teiserver/game/servers/lobby_policy_organiser_server.ex", :unknown_type}, + {"lib/teiserver/game/servers/queue_room_server.ex", :call}, + {"lib/teiserver/game/servers/queue_room_server.ex", :unknown_type}, + {"lib/teiserver/game/servers/queue_wait_server.ex", :unknown_type}, + {"lib/teiserver/helpers/number_helper.ex", :unknown_type}, + {"lib/teiserver/helpers/query_helper.ex", :unknown_type}, + {"lib/teiserver/helpers/schema_helper.ex", :unknown_type}, + {"lib/teiserver/helpers/styling_helpers.ex", :unknown_type}, + {"lib/teiserver/libs/test_lib.ex", :call}, + {"lib/teiserver/libs/test_lib.ex", :unknown_type}, + {"lib/teiserver/libs/test_lib.ex", :no_return}, + {"lib/teiserver/libs/test_lib.ex", :pattern_match}, + {"lib/teiserver/libs/test_lib.ex", :unused_fun}, + {"lib/teiserver/lobby.ex", :no_return}, + {"lib/teiserver/lobby.ex", :unknown_type}, + {"lib/teiserver/lobby.ex", :call}, + {"lib/teiserver/lobby.ex", :pattern_match}, + {"lib/teiserver/lobby.ex", :exact_eq}, + {"lib/teiserver/lobby.ex", :invalid_contract}, + {"lib/teiserver/lobby/commands/explain_command.ex", :no_return}, + {"lib/teiserver/lobby/commands/explain_command.ex", :call}, + {"lib/teiserver/lobby/libs/chat_lib.ex", :unknown_type}, + {"lib/teiserver/lobby/libs/chat_lib.ex", :call}, + {"lib/teiserver/lobby/libs/chat_lib.ex", :no_return}, + {"lib/teiserver/lobby/libs/command_lib.ex", :unknown_type}, + {"lib/teiserver/lobby/libs/lobby_lib.ex", :unknown_type}, + {"lib/teiserver/lobby/libs/lobby_lib.ex", :no_return}, + {"lib/teiserver/lobby/servers/lobby_index_throttle.ex", :guard_fail}, + {"lib/teiserver/lobby/servers/lobby_server.ex", :unknown_type}, + {"lib/teiserver/logging.ex", :no_return}, + {"lib/teiserver/logging.ex", :call}, + {"lib/teiserver/logging.ex", :unknown_type}, + {"lib/teiserver/logging/lib/logging_helpers.ex", :unknown_type}, + {"lib/teiserver/logging/lib/logging_plug.ex", :unknown_type}, + {"lib/teiserver/logging/lib/logging_test_lib.ex", :unknown_type}, + {"lib/teiserver/logging/lib/logging_test_lib.ex", :call}, + {"lib/teiserver/logging/schemas/match_day_log.ex", :unknown_type}, + {"lib/teiserver/logging/schemas/match_month_log.ex", :unknown_type}, + {"lib/teiserver/logging/schemas/server_day_log.ex", :unknown_type}, + {"lib/teiserver/logging/schemas/server_minute_log.ex", :unknown_type}, + {"lib/teiserver/logging/schemas/server_month_log.ex", :unknown_type}, + {"lib/teiserver/logging/schemas/server_quarter_log.ex", :unknown_type}, + {"lib/teiserver/logging/schemas/server_week_log.ex", :unknown_type}, + {"lib/teiserver/logging/schemas/server_year_log.ex", :unknown_type}, + {"lib/teiserver/logging/schemas/user_activity_day_log.ex", :unknown_type}, + {"lib/teiserver/logging/tasks/aggregate_logs_task.ex", :no_return}, + {"lib/teiserver/logging/tasks/aggregate_logs_task.ex", :call}, + {"lib/teiserver/logging/tasks/aggregate_logs_task.ex", :unused_fun}, + {"lib/teiserver/logging/tasks/persist_server_day_task.ex", :call}, + {"lib/teiserver/logging/tasks/persist_server_day_task.ex", :invalid_contract}, + {"lib/teiserver/microblog.ex", :unknown_type}, + {"lib/teiserver/microblog.ex", :invalid_contract}, + {"lib/teiserver/microblog/libs/post_lib.ex", :unknown_type}, + {"lib/teiserver/microblog/libs/post_lib.ex", :invalid_contract}, + {"lib/teiserver/microblog/libs/post_tag_lib.ex", :unknown_type}, + {"lib/teiserver/microblog/libs/post_tag_lib.ex", :invalid_contract}, + {"lib/teiserver/microblog/libs/tag_lib.ex", :unknown_type}, + {"lib/teiserver/microblog/libs/user_preference_lib.ex", :unknown_type}, + {"lib/teiserver/microblog/queries/post_queries.ex", :unknown_type}, + {"lib/teiserver/microblog/queries/post_tag_queries.ex", :unknown_type}, + {"lib/teiserver/microblog/queries/tag_queries.ex", :unknown_type}, + {"lib/teiserver/microblog/queries/user_preference_queries.ex", :pattern_match}, + {"lib/teiserver/microblog/queries/user_preference_queries.ex", :unknown_type}, + {"lib/teiserver/microblog/schemas/post.ex", :unknown_type}, + {"lib/teiserver/microblog/schemas/post_tag.ex", :unknown_type}, + {"lib/teiserver/microblog/schemas/tag.ex", :unknown_type}, + {"lib/teiserver/microblog/schemas/user_preference.ex", :unknown_type}, + {"lib/teiserver/mix_tasks/fake_data.ex", :callback_info_missing}, + {"lib/teiserver/mix_tasks/fake_data.ex", :unused_fun}, + {"lib/teiserver/mix_tasks/fake_data.ex", :unknown_function}, + {"lib/teiserver/mix_tasks/fake_data.ex", :no_return}, + {"lib/teiserver/mix_tasks/fake_data.ex", :call}, + {"lib/teiserver/moderation.ex", :unknown_type}, + {"lib/teiserver/moderation.ex", :invalid_contract}, + {"lib/teiserver/moderation.ex", :call}, + {"lib/teiserver/moderation/libs/action_lib.ex", :unknown_type}, + {"lib/teiserver/moderation/libs/action_lib.ex", :pattern_match}, + {"lib/teiserver/moderation/libs/ban_lib.ex", :unknown_type}, + {"lib/teiserver/moderation/libs/proposal_lib.ex", :unknown_type}, + {"lib/teiserver/moderation/libs/proposal_vote_lib.ex", :unknown_type}, + {"lib/teiserver/moderation/libs/report_group_lib.ex", :unknown_type}, + {"lib/teiserver/moderation/libs/report_group_lib.ex", :call}, + {"lib/teiserver/moderation/libs/report_lib.ex", :unknown_type}, + {"lib/teiserver/moderation/libs/response_lib.ex", :unknown_type}, + {"lib/teiserver/moderation/libs/test_lib.ex", :unknown_type}, + {"lib/teiserver/moderation/queries/report_group_queries.ex", :unknown_type}, + {"lib/teiserver/moderation/reports/activity_report.ex", :invalid_contract}, + {"lib/teiserver/moderation/schemas/action.ex", :unknown_type}, + {"lib/teiserver/moderation/schemas/ban.ex", :unknown_type}, + {"lib/teiserver/moderation/schemas/proposal.ex", :unknown_type}, + {"lib/teiserver/moderation/schemas/proposal_vote.ex", :unknown_type}, + {"lib/teiserver/moderation/schemas/report.ex", :unknown_type}, + {"lib/teiserver/moderation/schemas/report_group.ex", :unknown_type}, + {"lib/teiserver/moderation/schemas/report_group_message.ex", :unknown_type}, + {"lib/teiserver/moderation/schemas/report_group_vote.ex", :unknown_type}, + {"lib/teiserver/moderation/schemas/response.ex", :unknown_type}, + {"lib/teiserver/protocols/spring/spring.ex", :unknown_type}, + {"lib/teiserver/protocols/spring/spring_auth_in.ex", :unknown_type}, + {"lib/teiserver/protocols/spring/spring_battle_in.ex", :unknown_type}, + {"lib/teiserver/protocols/spring/spring_battle_in.ex", :call}, + {"lib/teiserver/protocols/spring/spring_in.ex", :unknown_type}, + {"lib/teiserver/protocols/spring/spring_in.ex", :call}, + {"lib/teiserver/protocols/spring/spring_in.ex", :pattern_match}, + {"lib/teiserver/protocols/spring/spring_lobby_policy_in.ex", :unknown_type}, + {"lib/teiserver/protocols/spring/spring_out.ex", :unknown_type}, + {"lib/teiserver/protocols/spring/spring_out.ex", :call}, + {"lib/teiserver/protocols/spring/spring_out.ex", :no_return}, + {"lib/teiserver/protocols/spring/spring_system_in.ex", :unknown_type}, + {"lib/teiserver/protocols/spring/spring_telemetry_in.ex", :unknown_type}, + {"lib/teiserver/protocols/spring/spring_user_in.ex", :unknown_type}, + {"lib/teiserver/protocols/spring/spring_user_in.ex", :call}, + {"lib/teiserver/protocols/spring/spring_user_in.ex", :pattern_match}, + {"lib/teiserver/protocols/tachyon_json_ws/converters.ex", :unknown_type}, + {"lib/teiserver/protocols/tachyon_json_ws/handlers/lobby/join_request.ex", :no_return}, + {"lib/teiserver/protocols/tachyon_json_ws/handlers/lobby/join_request.ex", :call}, + {"lib/teiserver/protocols/tachyon_json_ws/handlers/lobby/list_lobbies_request.ex", :no_return}, + {"lib/teiserver/protocols/tachyon_json_ws/handlers/lobby/list_lobbies_request.ex", :call}, + {"lib/teiserver/protocols/tachyon_json_ws/handlers/lobby_host/create_request.ex", + :pattern_match}, + {"lib/teiserver/protocols/tachyon_json_ws/handlers/system/disconnect_request.ex", + :invalid_contract}, + {"lib/teiserver/protocols/tachyon_json_ws/handlers/system/no_command_error_request.ex", + :invalid_contract}, + {"lib/teiserver/protocols/tachyon_json_ws/responses/account/whoami_response.ex", :unknown_type}, + {"lib/teiserver/protocols/tachyon_json_ws/responses/communication/received_direct_message_response.ex", + :invalid_contract}, + {"lib/teiserver/protocols/tachyon_json_ws/responses/communication/received_direct_message_response.ex", + :unknown_type}, + {"lib/teiserver/protocols/tachyon_json_ws/responses/communication/send_direct_message_response.ex", + :unknown_type}, + {"lib/teiserver/protocols/tachyon_json_ws/responses/lobby_host/add_bot_response.ex", + :invalid_contract}, + {"lib/teiserver/protocols/tachyon_json_ws/responses/lobby_host/close_response.ex", + :invalid_contract}, + {"lib/teiserver/protocols/tachyon_json_ws/responses/lobby_host/create_response.ex", + :invalid_contract}, + {"lib/teiserver/protocols/tachyon_json_ws/responses/lobby_host/end_battle_response.ex", + :invalid_contract}, + {"lib/teiserver/protocols/tachyon_json_ws/responses/lobby_host/join_request_response.ex", + :invalid_contract}, + {"lib/teiserver/protocols/tachyon_json_ws/responses/lobby_host/remove_bot_response.ex", + :invalid_contract}, + {"lib/teiserver/protocols/tachyon_json_ws/responses/lobby_host/respond_to_join_request_response.ex", + :invalid_contract}, + {"lib/teiserver/protocols/tachyon_json_ws/responses/lobby_host/start_battle_response.ex", + :invalid_contract}, + {"lib/teiserver/protocols/tachyon_json_ws/responses/lobby_host/update_bot_response.ex", + :invalid_contract}, + {"lib/teiserver/protocols/tachyon_json_ws/responses/lobby_host/updated_status_response.ex", + :invalid_contract}, + {"lib/teiserver/protocols/tachyon_json_ws/responses/system/disconnect_response.ex", + :invalid_contract}, + {"lib/teiserver/protocols/tachyon_json_ws/responses/system/error_response.ex", + :invalid_contract}, + {"lib/teiserver/protocols/tachyon_json_ws/responses/system/ping_response.ex", :unknown_type}, + {"lib/teiserver/protocols/tachyon_json_ws/responses/telemetry/event_response.ex", + :unknown_type}, + {"lib/teiserver/protocols/tachyon_json_ws/responses/telemetry/property_response.ex", + :unknown_type}, + {"lib/teiserver/protocols/tachyon_json_ws/responses/user/updated_user_client_response.ex", + :invalid_contract}, + {"lib/teiserver/protocols/tachyon_json_ws/tachyon_socket.ex", :pattern_match}, + {"lib/teiserver/protocols/tachyon_json_ws/tachyon_socket.ex", :callback_spec_type_mismatch}, + {"lib/teiserver/protocols/tachyon_json_ws/tachyon_socket.ex", :invalid_contract}, + {"lib/teiserver/protocols/tachyon_json_ws/tachyon_socket.ex", :unknown_type}, + {"lib/teiserver/protocols/tachyon_json_ws/tachyon_socket.ex", :unused_fun}, + {"lib/teiserver/protocols/tachyon_lib.ex", :unknown_type}, + {"lib/teiserver/protocols/tachyon_v1/auth_in.ex", :unknown_type}, + {"lib/teiserver/protocols/tachyon_v1/auth_in.ex", :call}, + {"lib/teiserver/protocols/tachyon_v1/auth_in.ex", :pattern_match}, + {"lib/teiserver/protocols/tachyon_v1/auth_out.ex", :unknown_type}, + {"lib/teiserver/protocols/tachyon_v1/client_in.ex", :unknown_type}, + {"lib/teiserver/protocols/tachyon_v1/client_out.ex", :unknown_type}, + {"lib/teiserver/protocols/tachyon_v1/communication_in.ex", :unknown_type}, + {"lib/teiserver/protocols/tachyon_v1/communication_out.ex", :unknown_type}, + {"lib/teiserver/protocols/tachyon_v1/config_in.ex", :unknown_type}, + {"lib/teiserver/protocols/tachyon_v1/config_out.ex", :unknown_type}, + {"lib/teiserver/protocols/tachyon_v1/config_out.ex", :call}, + {"lib/teiserver/protocols/tachyon_v1/config_out.ex", :no_return}, + {"lib/teiserver/protocols/tachyon_v1/lobby_host_in.ex", :unknown_type}, + {"lib/teiserver/protocols/tachyon_v1/lobby_host_out.ex", :unknown_type}, + {"lib/teiserver/protocols/tachyon_v1/lobby_host_out.ex", :call}, + {"lib/teiserver/protocols/tachyon_v1/lobby_in.ex", :unknown_type}, + {"lib/teiserver/protocols/tachyon_v1/lobby_in.ex", :call}, + {"lib/teiserver/protocols/tachyon_v1/lobby_in.ex", :pattern_match}, + {"lib/teiserver/protocols/tachyon_v1/lobby_out.ex", :unknown_type}, + {"lib/teiserver/protocols/tachyon_v1/lobby_out.ex", :call}, + {"lib/teiserver/protocols/tachyon_v1/matchmaking_in.ex", :unknown_type}, + {"lib/teiserver/protocols/tachyon_v1/matchmaking_in.ex", :pattern_match}, + {"lib/teiserver/protocols/tachyon_v1/matchmaking_in.ex", :pattern_match_cov}, + {"lib/teiserver/protocols/tachyon_v1/matchmaking_out.ex", :unknown_type}, + {"lib/teiserver/protocols/tachyon_v1/party_in.ex", :unknown_type}, + {"lib/teiserver/protocols/tachyon_v1/party_in.ex", :call}, + {"lib/teiserver/protocols/tachyon_v1/party_out.ex", :unknown_type}, + {"lib/teiserver/protocols/tachyon_v1/party_out.ex", :call}, + {"lib/teiserver/protocols/tachyon_v1/system_in.ex", :unknown_type}, + {"lib/teiserver/protocols/tachyon_v1/system_out.ex", :unknown_type}, + {"lib/teiserver/protocols/tachyon_v1/tachyon.ex", :unknown_type}, + {"lib/teiserver/protocols/tachyon_v1/tachyon_out.ex", :unknown_type}, + {"lib/teiserver/protocols/tachyon_v1/telemetry_in.ex", :unknown_type}, + {"lib/teiserver/protocols/tachyon_v1/user_in.ex", :unknown_type}, + {"lib/teiserver/protocols/tachyon_v1/user_in.ex", :call}, + {"lib/teiserver/protocols/tachyon_v1/user_out.ex", :unknown_type}, + {"lib/teiserver/servers/telemetry_server.ex", :unknown_type}, + {"lib/teiserver/tcp/spring/spring_tcp_server.ex", :call}, + {"lib/teiserver/tcp/spring/spring_tcp_server.ex", :no_return}, + {"lib/teiserver/tcp/spring/spring_tcp_server.ex", :invalid_contract}, + {"lib/teiserver/tcp/spring/spring_tcp_server.ex", :unknown_type}, + {"lib/teiserver/tcp/tachyon/tachyon_tcp_server.ex", :no_return}, + {"lib/teiserver/tcp/tachyon/tachyon_tcp_server.ex", :call}, + {"lib/teiserver/telemetry.ex", :unknown_type}, + {"lib/teiserver/telemetry.ex", :invalid_contract}, + {"lib/teiserver/telemetry/libs/anon_property_lib.ex", :unknown_type}, + {"lib/teiserver/telemetry/libs/complex_client_event_type_lib.ex", :invalid_contract}, + {"lib/teiserver/telemetry/libs/complex_lobby_event_lib.ex", :invalid_contract}, + {"lib/teiserver/telemetry/libs/complex_lobby_event_type_lib.ex", :invalid_contract}, + {"lib/teiserver/telemetry/libs/complex_match_event_lib.ex", :invalid_contract}, + {"lib/teiserver/telemetry/libs/complex_match_event_type_lib.ex", :invalid_contract}, + {"lib/teiserver/telemetry/libs/complex_server_event_lib.ex", :invalid_contract}, + {"lib/teiserver/telemetry/libs/complex_server_event_type_lib.ex", :invalid_contract}, + {"lib/teiserver/telemetry/libs/infolog_lib.ex", :unknown_type}, + {"lib/teiserver/telemetry/libs/property_type_lib.ex", :invalid_contract}, + {"lib/teiserver/telemetry/libs/simple_client_event_type_lib.ex", :invalid_contract}, + {"lib/teiserver/telemetry/libs/simple_lobby_event_type_lib.ex", :invalid_contract}, + {"lib/teiserver/telemetry/libs/simple_match_event_type_lib.ex", :invalid_contract}, + {"lib/teiserver/telemetry/libs/simple_server_event_type_lib.ex", :invalid_contract}, + {"lib/teiserver/telemetry/libs/telemetry_lib.ex", :unknown_type}, + {"lib/teiserver/telemetry/libs/user_property_lib.ex", :unknown_type}, + {"lib/teiserver/telemetry/queries/anon_property_queries.ex", :unknown_type}, + {"lib/teiserver/telemetry/queries/complex_anon_event_queries.ex", :unknown_type}, + {"lib/teiserver/telemetry/queries/complex_client_event_queries.ex", :unknown_type}, + {"lib/teiserver/telemetry/queries/complex_client_event_type_queries.ex", :unknown_type}, + {"lib/teiserver/telemetry/queries/complex_lobby_event_queries.ex", :unknown_type}, + {"lib/teiserver/telemetry/queries/complex_lobby_event_type_queries.ex", :unknown_type}, + {"lib/teiserver/telemetry/queries/complex_match_event_queries.ex", :unknown_type}, + {"lib/teiserver/telemetry/queries/complex_match_event_type_queries.ex", :unknown_type}, + {"lib/teiserver/telemetry/queries/complex_server_event_queries.ex", :unknown_type}, + {"lib/teiserver/telemetry/queries/complex_server_event_type_queries.ex", :unknown_type}, + {"lib/teiserver/telemetry/queries/property_type_queries.ex", :unknown_type}, + {"lib/teiserver/telemetry/queries/simple_anon_event_queries.ex", :unknown_type}, + {"lib/teiserver/telemetry/queries/simple_client_event_queries.ex", :unknown_type}, + {"lib/teiserver/telemetry/queries/simple_client_event_type_queries.ex", :unknown_type}, + {"lib/teiserver/telemetry/queries/simple_lobby_event_queries.ex", :unknown_type}, + {"lib/teiserver/telemetry/queries/simple_lobby_event_type_queries.ex", :unknown_type}, + {"lib/teiserver/telemetry/queries/simple_match_event_queries.ex", :unknown_type}, + {"lib/teiserver/telemetry/queries/simple_match_event_type_queries.ex", :unknown_type}, + {"lib/teiserver/telemetry/queries/simple_server_event_queries.ex", :unknown_type}, + {"lib/teiserver/telemetry/queries/simple_server_event_type_queries.ex", :unknown_type}, + {"lib/teiserver/telemetry/queries/user_property_queries.ex", :unknown_type}, + {"lib/teiserver/telemetry/schemas/anon_property.ex", :unknown_type}, + {"lib/teiserver/telemetry/schemas/complex_anon_event.ex", :unknown_type}, + {"lib/teiserver/telemetry/schemas/complex_client_event.ex", :unknown_type}, + {"lib/teiserver/telemetry/schemas/complex_client_event_type.ex", :unknown_type}, + {"lib/teiserver/telemetry/schemas/complex_lobby_event.ex", :unknown_type}, + {"lib/teiserver/telemetry/schemas/complex_lobby_event_type.ex", :unknown_type}, + {"lib/teiserver/telemetry/schemas/complex_match_event.ex", :unknown_type}, + {"lib/teiserver/telemetry/schemas/complex_match_event_type.ex", :unknown_type}, + {"lib/teiserver/telemetry/schemas/complex_server_event.ex", :unknown_type}, + {"lib/teiserver/telemetry/schemas/complex_server_event_type.ex", :unknown_type}, + {"lib/teiserver/telemetry/schemas/infolog.ex", :unknown_type}, + {"lib/teiserver/telemetry/schemas/property_types.ex", :unknown_type}, + {"lib/teiserver/telemetry/schemas/simple_anon_event.ex", :unknown_type}, + {"lib/teiserver/telemetry/schemas/simple_client_event.ex", :unknown_type}, + {"lib/teiserver/telemetry/schemas/simple_client_event_type.ex", :unknown_type}, + {"lib/teiserver/telemetry/schemas/simple_lobby_event.ex", :unknown_type}, + {"lib/teiserver/telemetry/schemas/simple_lobby_event_type.ex", :unknown_type}, + {"lib/teiserver/telemetry/schemas/simple_match_event.ex", :unknown_type}, + {"lib/teiserver/telemetry/schemas/simple_match_event_type.ex", :unknown_type}, + {"lib/teiserver/telemetry/schemas/simple_server_event.ex", :unknown_type}, + {"lib/teiserver/telemetry/schemas/simple_server_event_type.ex", :unknown_type}, + {"lib/teiserver/telemetry/schemas/user_property.ex", :unknown_type}, + {"lib/teiserver_web/controllers/account/security_controller.ex", :unknown_type}, + {"lib/teiserver_web/controllers/account/session_controller.ex", :unknown_type}, + {"lib/teiserver_web/controllers/admin/accolade_controller.ex", :unknown_type}, + {"lib/teiserver_web/controllers/admin/accolade_controller.ex", :no_return}, + {"lib/teiserver_web/controllers/admin/achievement_controller.ex", :unknown_type}, + {"lib/teiserver_web/controllers/admin/badge_type_controller.ex", :unknown_type}, + {"lib/teiserver_web/controllers/admin/chat_controller.ex", :unknown_type}, + {"lib/teiserver_web/controllers/admin/code_controller.ex", :unknown_type}, + {"lib/teiserver_web/controllers/admin/discord_channel_controller.ex", :unknown_type}, + {"lib/teiserver_web/controllers/admin/discord_channel_controller.ex", :pattern_match}, + {"lib/teiserver_web/controllers/admin/lobby_controller.ex", :no_return}, + {"lib/teiserver_web/controllers/admin/lobby_controller.ex", :call}, + {"lib/teiserver_web/controllers/admin/lobby_policy_controller.ex", :unknown_type}, + {"lib/teiserver_web/controllers/admin/match_controller.ex", :unknown_type}, + {"lib/teiserver_web/controllers/admin/text_callback_controller.ex", :unknown_type}, + {"lib/teiserver_web/controllers/admin/text_callback_controller.ex", :no_return}, + {"lib/teiserver_web/controllers/admin/text_callback_controller.ex", :call}, + {"lib/teiserver_web/controllers/admin/tool_controller.ex", :unknown_type}, + {"lib/teiserver_web/controllers/admin/tool_controller.ex", :no_return}, + {"lib/teiserver_web/controllers/admin/tool_controller.ex", :call}, + {"lib/teiserver_web/controllers/admin/user_controller.ex", :unknown_type}, + {"lib/teiserver_web/controllers/admin/user_controller.ex", :pattern_match}, + {"lib/teiserver_web/controllers/api/hailstorm_controller.ex", :pattern_match}, + {"lib/teiserver_web/controllers/api/hailstorm_controller.ex", :call}, + {"lib/teiserver_web/controllers/api/hailstorm_controller.ex", :no_return}, + {"lib/teiserver_web/controllers/api/hailstorm_controller.ex", :unknown_type}, + {"lib/teiserver_web/controllers/api/session_controller.ex", :unknown_type}, + {"lib/teiserver_web/controllers/api/session_controller.ex", :pattern_match}, + {"lib/teiserver_web/controllers/api/session_controller.ex", :call}, + {"lib/teiserver_web/controllers/api/spads_controller.ex", :call}, + {"lib/teiserver_web/controllers/battle/general_controller.ex", :unknown_type}, + {"lib/teiserver_web/controllers/battle/match_controller.ex", :unknown_type}, + {"lib/teiserver_web/controllers/battle/ratings_controller.ex", :unknown_type}, + {"lib/teiserver_web/controllers/game/queue_controller.ex", :unknown_type}, + {"lib/teiserver_web/controllers/general/general_controller.ex", :unknown_type}, + {"lib/teiserver_web/controllers/logging/aggregate_view_log_controller.ex", :unknown_type}, + {"lib/teiserver_web/controllers/logging/aggregate_view_log_controller.ex", :no_return}, + {"lib/teiserver_web/controllers/logging/audit_log_controller.ex", :unknown_type}, + {"lib/teiserver_web/controllers/logging/general_controller.ex", :unknown_type}, + {"lib/teiserver_web/controllers/logging/match_log_controller.ex", :call}, + {"lib/teiserver_web/controllers/logging/match_log_controller.ex", :no_return}, + {"lib/teiserver_web/controllers/logging/page_view_log_controller.ex", :unknown_type}, + {"lib/teiserver_web/controllers/moderation/action_controller.ex", :unknown_type}, + {"lib/teiserver_web/controllers/moderation/ban_controller.ex", :unknown_type}, + {"lib/teiserver_web/controllers/moderation/ban_controller.ex", :no_return}, + {"lib/teiserver_web/controllers/moderation/ban_controller.ex", :call}, + {"lib/teiserver_web/controllers/moderation/general_controller.ex", :unknown_type}, + {"lib/teiserver_web/controllers/moderation/proposal_controller.ex", :unknown_type}, + {"lib/teiserver_web/controllers/moderation/report_controller.ex", :unknown_type}, + {"lib/teiserver_web/controllers/report/report_controller.ex", :unknown_type}, + {"lib/teiserver_web/controllers/telemetry/complex_client_event_controller.ex", :no_return}, + {"lib/teiserver_web/controllers/telemetry/complex_client_event_controller.ex", :call}, + {"lib/teiserver_web/controllers/telemetry/complex_lobby_event_controller.ex", :no_return}, + {"lib/teiserver_web/controllers/telemetry/complex_lobby_event_controller.ex", :call}, + {"lib/teiserver_web/controllers/telemetry/complex_match_event_controller.ex", :no_return}, + {"lib/teiserver_web/controllers/telemetry/complex_match_event_controller.ex", :call}, + {"lib/teiserver_web/controllers/telemetry/complex_server_event_controller.ex", :no_return}, + {"lib/teiserver_web/controllers/telemetry/complex_server_event_controller.ex", :call}, + {"lib/teiserver_web/controllers/telemetry/simple_client_event_controller.ex", :no_return}, + {"lib/teiserver_web/controllers/telemetry/simple_client_event_controller.ex", :call}, + {"lib/teiserver_web/controllers/telemetry/simple_lobby_event_controller.ex", :no_return}, + {"lib/teiserver_web/controllers/telemetry/simple_lobby_event_controller.ex", :call}, + {"lib/teiserver_web/controllers/telemetry/simple_match_event_controller.ex", :no_return}, + {"lib/teiserver_web/controllers/telemetry/simple_match_event_controller.ex", :call}, + {"lib/teiserver_web/controllers/telemetry/simple_server_event_controller.ex", :no_return}, + {"lib/teiserver_web/controllers/telemetry/simple_server_event_controller.ex", :call}, + {"lib/teiserver_web/live/account/party/index.ex", :no_return}, + {"lib/teiserver_web/live/account/party/index.ex", :pattern_match}, + {"lib/teiserver_web/live/account/party/index.ex", :unused_fun}, + {"lib/teiserver_web/live/account/party/show.ex", :no_return}, + {"lib/teiserver_web/live/account/party/show.ex", :pattern_match}, + {"lib/teiserver_web/live/account/party/show.ex", :call}, + {"lib/teiserver_web/live/account/relationship/index.ex", :call}, + {"lib/teiserver_web/live/account/relationship/index.html.heex", :no_return}, + {"lib/teiserver_web/live/account/relationship/index.html.heex", :call}, + {"lib/teiserver_web/live/admin/chat/index.html.heex", :no_return}, + {"lib/teiserver_web/live/admin/chat/index.html.heex", :call}, + {"lib/teiserver_web/live/admin_dashboard/index.ex", :unknown_type}, + {"lib/teiserver_web/live/admin_dashboard/policy.ex", :unknown_type}, + {"lib/teiserver_web/live/battles/lobbies/index.ex", :guard_fail}, + {"lib/teiserver_web/live/battles/lobbies/index.ex", :exact_eq}, + {"lib/teiserver_web/live/battles/lobbies/show.ex", :exact_eq}, + {"lib/teiserver_web/live/battles/match/chat.ex", :no_return}, + {"lib/teiserver_web/live/battles/match/chat.ex", :call}, + {"lib/teiserver_web/live/battles/match/chat.html.heex", :no_return}, + {"lib/teiserver_web/live/battles/match/chat.html.heex", :call}, + {"lib/teiserver_web/live/battles/match/show.ex", :call}, + {"lib/teiserver_web/live/clients/show.ex", :call}, + {"lib/teiserver_web/live/clients/show.ex", :exact_eq}, + {"lib/teiserver_web/live/communication/chat/room.ex", :call}, + {"lib/teiserver_web/live/microblog/admin/post/post_form_component.ex", :call}, + {"lib/teiserver_web/live/microblog/admin/post/post_form_component.ex", :pattern_match}, + {"lib/teiserver_web/live/microblog/admin/tag/tag_form_component.ex", :pattern_match}, + {"lib/teiserver_web/live/microblog/blog/show.ex", :call}, + {"lib/teiserver_web/live/microblog/blog/show.html.heex", :call}, + {"lib/teiserver_web/live/microblog/microblog_components.ex", :call}, + {"lib/teiserver_web/live/tournament/index.ex", :exact_eq}, + {"lib/teiserver_web/live/tournament/show.ex", :exact_eq}, + {"lib/teiserver_web/plugs/cache_plug.ex", :call}, + {"lib/teiserver_web/router.ex", :no_return}, + {"lib/teiserver_web/templates/account/session/edit.html.heex", :call}, + {"lib/teiserver_web/templates/admin/accolade/edit.html.heex", :call}, + {"lib/teiserver_web/templates/admin/accolade/new.html.heex", :call}, + {"lib/teiserver_web/templates/admin/accolade/show.html.heex", :call}, + {"lib/teiserver_web/templates/admin/chat/index.html.heex", :no_return}, + {"lib/teiserver_web/templates/admin/chat/index.html.heex", :call}, + {"lib/teiserver_web/templates/admin/lobby/lobby_chat.html.heex", :no_return}, + {"lib/teiserver_web/templates/admin/lobby/lobby_chat.html.heex", :call}, + {"lib/teiserver_web/templates/admin/lobby/server_chat.html.heex", :no_return}, + {"lib/teiserver_web/templates/admin/lobby/server_chat.html.heex", :call}, + {"lib/teiserver_web/templates/admin/user/full_chat.html.heex", :no_return}, + {"lib/teiserver_web/templates/admin/user/full_chat.html.heex", :call}, + {"lib/teiserver_web/templates/battle/match/index.html.heex", :no_return}, + {"lib/teiserver_web/templates/battle/match/index.html.heex", :call}, + {"lib/teiserver_web/templates/battle/match/ratings.html.heex", :no_return}, + {"lib/teiserver_web/templates/battle/match/ratings.html.heex", :call}, + {"lib/teiserver_web/views/admin/code_view.ex", :invalid_contract} ] diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 000000000..4ac7c3971 --- /dev/null +++ b/.git-blame-ignore-revs @@ -0,0 +1,2 @@ +# see docs/local_setup.md for usage +9bb669ea86949ceba75d95d05578f67e8ace5351 diff --git a/.github/workflows/dialyzer.yml b/.github/workflows/dialyzer.yml new file mode 100644 index 000000000..b76c56e91 --- /dev/null +++ b/.github/workflows/dialyzer.yml @@ -0,0 +1,98 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +name: Lint and style checks + +on: + push: + branches: + - master + pull_request: + types: [opened, synchronize, reopened] + workflow_dispatch: + +# Sets the ENV `MIX_ENV` to `test` for running tests +env: + MIX_ENV: test + ELIXIR_VER: '1.14.3' + OTP_VER: '25.2.3' + +permissions: + contents: read + +jobs: + build: + runs-on: ubuntu-latest + name: Dialyzer + + steps: + # Step: Setup Elixir + Erlang image as the base. + - name: Set up Elixir + uses: erlef/setup-beam@v1 + with: + otp-version: ${{ env.OTP_VER }} + elixir-version: ${{ env.ELIXIR_VER }} + + # Step: Check out the code. + - name: Checkout code + uses: actions/checkout@v4 + + # Step: Define how to cache deps. Restores existing cache if present. + - name: Cache deps + id: cache-deps + uses: actions/cache@v4 + env: + cache-name: cache-elixir-deps + with: + path: deps + key: ${{ runner.os }}-mix-${{ env.cache-name }}-${{ hashFiles('**/mix.lock') }} + restore-keys: | + ${{ runner.os }}-mix-${{ env.cache-name }}- + + # Step: Define how to cache the `_build` directory. After the first run, + # this speeds up tests runs a lot. This includes not re-compiling our + # project's downloaded deps every run. + - name: Cache compiled build + id: cache-build + uses: actions/cache@v4 + env: + cache-name: cache-compiled-build + with: + path: _build + key: ${{ runner.os }}-mix-${{ env.cache-name }}-${{ hashFiles('**/mix.lock') }} + restore-keys: | + ${{ runner.os }}-mix-${{ env.cache-name }}- + + # Step: Download project dependencies. If unchanged, uses + # the cached version. + - name: Install dependencies + run: mix deps.get + + - name: Restore PLT cache + uses: actions/cache/restore@v3 + id: plt_cache + with: + key: | + ${{ runner.os }}-${{ env.ELIXIR_VER }}-${{ env.OTP_VER }}-plt + restore-keys: | + ${{ runner.os }}-${{ env.ELIXIR_VER }}-${{ env.OTP_VER }}-plt + path: | + priv/plts + + - name: Create PLTs + run: mix dialyzer --plt + + - name: Save PLT cache + uses: actions/cache/save@v3 + if: steps.plt_cache.outputs.cache-hit != 'true' + id: plt_cache_save + with: + key: | + ${{ runner.os }}-${{ env.ELIXIR_VER }}-${{ env.OTP_VER }}-plt + path: | + priv/plts + + - name: Run dialyzer + run: mix dialyzer --format github diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml new file mode 100644 index 000000000..87a1429c7 --- /dev/null +++ b/.github/workflows/format.yml @@ -0,0 +1,79 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +name: Lint and style checks + +on: + push: + branches: + - master + pull_request: + types: [opened, synchronize, reopened] + workflow_dispatch: + +# Sets the ENV `MIX_ENV` to `test` for running tests +env: + MIX_ENV: test + ELIXIR_VER: '1.14.3' + OTP_VER: '25.2.3' + +permissions: + contents: read + +jobs: + build: + runs-on: ubuntu-latest + name: mix format + + steps: + # Step: Setup Elixir + Erlang image as the base. + - name: Set up Elixir + uses: erlef/setup-beam@v1 + with: + otp-version: ${{ env.OTP_VER }} + elixir-version: ${{ env.ELIXIR_VER }} + + # Step: Check out the code. + - name: Checkout code + uses: actions/checkout@v4 + + # Step: Define how to cache deps. Restores existing cache if present. + - name: Cache deps + id: cache-deps + uses: actions/cache@v4 + env: + cache-name: cache-elixir-deps + with: + path: deps + key: ${{ runner.os }}-mix-${{ env.cache-name }}-${{ hashFiles('**/mix.lock') }} + restore-keys: | + ${{ runner.os }}-mix-${{ env.cache-name }}- + + # Step: Define how to cache the `_build` directory. After the first run, + # this speeds up tests runs a lot. This includes not re-compiling our + # project's downloaded deps every run. + - name: Cache compiled build + id: cache-build + uses: actions/cache@v4 + env: + cache-name: cache-compiled-build + with: + path: _build + key: ${{ runner.os }}-mix-${{ env.cache-name }}-${{ hashFiles('**/mix.lock') }} + restore-keys: | + ${{ runner.os }}-mix-${{ env.cache-name }}- + + # Step: Download project dependencies. If unchanged, uses + # the cached version. + - name: Install dependencies + run: mix deps.get + + # Step: Compile the current project. If unchanged, uses + # the cached version. + - name: Install dependencies + run: mix compile + + - name: mix format + run: mix format --check-formatted diff --git a/.github/workflows/elixir.yml b/.github/workflows/tests.yml similarity index 98% rename from .github/workflows/elixir.yml rename to .github/workflows/tests.yml index 47c9224f9..b2b07283a 100644 --- a/.github/workflows/elixir.yml +++ b/.github/workflows/tests.yml @@ -16,8 +16,8 @@ on: # Sets the ENV `MIX_ENV` to `test` for running tests env: MIX_ENV: test - ELIXIR_VER: '1.16.2' - OTP_VER: '25.0.4' + ELIXIR_VER: '1.14.3' + OTP_VER: '25.2.3' permissions: contents: read diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 000000000..11184e971 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,41 @@ +--- +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.6.0 + hooks: + - id: check-merge-conflict + - id: check-yaml + - id: no-commit-to-branch + args: + - -b + - master + - -b + - production + - -b + - staging + - repo: local + hooks: + - id: mix-format + name: "elixir: mix format" + entry: mix format --check-formatted + language: system + files: \.exs*$ + - id: mix-compile + name: "elixir: mix compile" + entry: mix compile --force #--warnings-as-errors + language: system + pass_filenames: false + files: \.ex$ + # - id: mix-credo + # name: "elixir: mix credo" + # entry: mix credo + # language: system + # pass_filenames: false + # files: \.exs*$ + - id: mix-dialyzer + name: "elixir: mix dialyzer" + entry: mix dialyzer + language: system + pass_filenames: false + files: \.exs*$ + diff --git a/config/runtime.exs b/config/runtime.exs index cc8596331..0c64106de 100644 --- a/config/runtime.exs +++ b/config/runtime.exs @@ -43,7 +43,8 @@ if config_env() == :prod do config :teiserver, Teiserver.Setup, key: Teiserver.ConfigHelpers.get_env("TEI_SETUP_ROOT_KEY", nil) - enable_discord_bridge = Teiserver.ConfigHelpers.get_env("TEI_ENABLE_DISCORD_BRIDGE", true, :bool) + enable_discord_bridge = + Teiserver.ConfigHelpers.get_env("TEI_ENABLE_DISCORD_BRIDGE", true, :bool) config :teiserver, Teiserver, game_name: "Beyond All Reason", diff --git a/documents/guides/local_setup.md b/documents/guides/local_setup.md index 15a916756..6dc282024 100644 --- a/documents/guides/local_setup.md +++ b/documents/guides/local_setup.md @@ -150,5 +150,17 @@ The main dependencies of the project are: - [Ranch](https://github.com/ninenines/ranch), a tcp server - [Oban](https://github.com/sorentwo/oban), a backend job processing framework. +### Ignore large `mix format` passes in `git blame` +In ![PR #304](https://github.com/beyond-all-reason/teiserver/pull/304) we've started requiring compliance with `mix format` - this meant we had to use that on the entire codebase. + +This obviously breaks `git blame`, but you can sidestep that by using +```bash +git config blame.ignoreRevsFile .git-blame-ignore-revs +``` + +The attached `.git-blame-ignore-revs` file contains a list of commit hashes which modify a large number of lines with trivial changes. + +See [this blog post by Stefan Judis](https://www.stefanjudis.com/today-i-learned/how-to-exclude-commits-from-git-blame/) for reference. + ### Next Steps -If you want to develop features that interact with the lobby, then you will need to [set up SPADS](/documents/guides/spads_install.md). \ No newline at end of file +If you want to develop features that interact with the lobby, then you will need to [set up SPADS](/documents/guides/spads_install.md). diff --git a/lib/teiserver/account/libs/role_lib.ex b/lib/teiserver/account/libs/role_lib.ex index b30820d4b..97605eb9e 100644 --- a/lib/teiserver/account/libs/role_lib.ex +++ b/lib/teiserver/account/libs/role_lib.ex @@ -259,7 +259,8 @@ defmodule Teiserver.Account.RoleLib do end def allowed_role_management("Admin") do - staff_roles() ++ community_roles() ++ privileged_roles() ++ allowed_role_management("Moderator") + staff_roles() ++ + community_roles() ++ privileged_roles() ++ allowed_role_management("Moderator") end def allowed_role_management("Moderator") do diff --git a/lib/teiserver/account/libs/user_lib.ex b/lib/teiserver/account/libs/user_lib.ex index e3cc72c36..dd0acbd7f 100644 --- a/lib/teiserver/account/libs/user_lib.ex +++ b/lib/teiserver/account/libs/user_lib.ex @@ -361,10 +361,12 @@ defmodule Teiserver.Account.UserLib do defp can_login(user) do cond do Teiserver.CacheUser.is_restricted?(user.id, ["Login"]) -> - {:error, "Your account is currently suspended. Check the suspension's status at https://discord.gg/beyond-all-reason -> #moderation-bot"} + {:error, + "Your account is currently suspended. Check the suspension's status at https://discord.gg/beyond-all-reason -> #moderation-bot"} user.smurf_of_id != nil -> - {:error, "Alt account detected. Please log in using your original account instead. If you're not sure what that account is or have trouble accessing it, please contact the moderation team at https://discord.gg/beyond-all-reason -> #open-ticket"} + {:error, + "Alt account detected. Please log in using your original account instead. If you're not sure what that account is or have trouble accessing it, please contact the moderation team at https://discord.gg/beyond-all-reason -> #open-ticket"} true -> :ok diff --git a/lib/teiserver/battle/balance/balance_types.ex b/lib/teiserver/battle/balance/balance_types.ex index c51154697..47a1690ca 100644 --- a/lib/teiserver/battle/balance/balance_types.ex +++ b/lib/teiserver/battle/balance/balance_types.ex @@ -14,11 +14,11 @@ defmodule Teiserver.Battle.Balance.BalanceTypes do } @type group() :: %{ - members: [T.userid()], - ratings: [rating_value()], - group_rating: rating_value(), - count: non_neg_integer() - } + members: [T.userid()], + ratings: [rating_value()], + group_rating: rating_value(), + count: non_neg_integer() + } @type expanded_group_or_pair() :: expanded_group() | {expanded_group(), expanded_group()} @type algorithm_result :: map() diff --git a/lib/teiserver/battle/balance/cheeky_switcher_smart.ex b/lib/teiserver/battle/balance/cheeky_switcher_smart.ex index cbfa1d059..0f91475b3 100644 --- a/lib/teiserver/battle/balance/cheeky_switcher_smart.ex +++ b/lib/teiserver/battle/balance/cheeky_switcher_smart.ex @@ -33,7 +33,7 @@ defmodule Teiserver.Battle.Balance.CheekySwitcherSmart do @spec perform([BT.expanded_group_or_pair()], non_neg_integer(), list()) :: BT.algorithm_result() def perform(raw_groups, team_count, opts) do - groups_with_names = Enum.map(raw_groups, fn x-> Map.drop(x,[:ranks]) end) + groups_with_names = Enum.map(raw_groups, fn x -> Map.drop(x, [:ranks]) end) {teams, logs} = do_cheeky_switcher(groups_with_names, team_count, opts, []) diff --git a/lib/teiserver/battle/balance/split_one_chevs_types.ex b/lib/teiserver/battle/balance/split_one_chevs_types.ex index 8a5f202e9..9644893fb 100644 --- a/lib/teiserver/battle/balance/split_one_chevs_types.ex +++ b/lib/teiserver/battle/balance/split_one_chevs_types.ex @@ -7,7 +7,7 @@ defmodule Teiserver.Battle.Balance.SplitOneChevsTypes do member_id: any() } @type team :: %{ - members: [member], - team_id: integer() - } + members: [member], + team_id: integer() + } end diff --git a/lib/teiserver/battle/libs/balance_lib.ex b/lib/teiserver/battle/libs/balance_lib.ex index ca95a5ecc..8e0ea8b45 100644 --- a/lib/teiserver/battle/libs/balance_lib.ex +++ b/lib/teiserver/battle/libs/balance_lib.ex @@ -164,7 +164,8 @@ defmodule Teiserver.Battle.BalanceLib do # Only take keys we need defp clean_groups(groups) do - groups |> Enum.map(fn x-> + groups + |> Enum.map(fn x -> Map.take(x, ~w(members count group_rating ratings)a) end) end @@ -179,7 +180,7 @@ defmodule Teiserver.Battle.BalanceLib do true -> balance_result.teams |> Map.new(fn {team_id, groups} -> - {team_id, Enum.reverse(clean_groups((groups)))} + {team_id, Enum.reverse(clean_groups(groups))} end) end @@ -541,7 +542,6 @@ defmodule Teiserver.Battle.BalanceLib do get_user_rating_value(userid, rating_type_id) end - # Used to get the rating value of the user for internal balance purposes which might be # different from public/reporting @spec get_user_balance_rating_value(T.userid(), String.t() | non_neg_integer()) :: diff --git a/lib/teiserver/battle/servers/match_monitor_server.ex b/lib/teiserver/battle/servers/match_monitor_server.ex index 91a0c2508..94c7c364f 100644 --- a/lib/teiserver/battle/servers/match_monitor_server.ex +++ b/lib/teiserver/battle/servers/match_monitor_server.ex @@ -153,7 +153,10 @@ defmodule Teiserver.Battle.MatchMonitorServer do if match_id do game_time = int_parse(game_time) Telemetry.log_simple_match_event(userid, match_id, event_type_name, game_time) - Logger.info("match-event: Stored <#{username}> <#{event_type_name}> <#{game_time}> userid #{userid} match_id #{match_id}") + + Logger.info( + "match-event: Stored <#{username}> <#{event_type_name}> <#{game_time}> userid #{userid} match_id #{match_id}" + ) else Logger.warning("match-event: Cannot get match_id of userid of #{username}") end @@ -253,13 +256,14 @@ defmodule Teiserver.Battle.MatchMonitorServer do [_all, username, _user_num, to, msg] -> host = Client.get_client_by_id(from_id) user = CacheUser.get_user_by_name(username) + if host == nil do Logger.error("No host found for from_id: #{from_id} for message #{to}:#{msg}") + # Optionally, handle the case here, such as by sending a message back to the user or taking other corrective actions. # Just returning {:noreply, state} for now. {:noreply, state} else - case to do "d" -> # We don't persist this as it's already persisted elsewhere @@ -284,6 +288,7 @@ defmodule Teiserver.Battle.MatchMonitorServer do {:liveview_lobby_chat, :say, user.id, "s: #{msg}"} ) end + {:noreply, state} end @@ -337,7 +342,9 @@ defmodule Teiserver.Battle.MatchMonitorServer do defp handle_json_msg(%{"username" => username, "GPU" => _} = contents, from_id) do case CacheUser.get_user_by_name(username) do nil -> - Logger.warning("No username on handle_json_msg: #{username} - #{Kernel.inspect(contents)}") + Logger.warning( + "No username on handle_json_msg: #{username} - #{Kernel.inspect(contents)}" + ) :ok diff --git a/lib/teiserver/battle/tasks/seasonal_uncertainty_reset_task.ex b/lib/teiserver/battle/tasks/seasonal_uncertainty_reset_task.ex index 7473937e9..00ccb0add 100644 --- a/lib/teiserver/battle/tasks/seasonal_uncertainty_reset_task.ex +++ b/lib/teiserver/battle/tasks/seasonal_uncertainty_reset_task.ex @@ -26,37 +26,37 @@ defmodule Teiserver.Battle.SeasonalUncertaintyResetTask do end defp reset_rating(existing, _new_uncertainty, new_last_updated) do - # Use the greater of the existing uncertainty or the minimum value (5.0) - new_uncertainty = max(existing.uncertainty, 5.0) - - new_rating_value = BalanceLib.calculate_rating_value(existing.skill, new_uncertainty) - - new_leaderboard_rating = - BalanceLib.calculate_leaderboard_rating(existing.skill, new_uncertainty) - - Account.update_rating(existing, %{ - rating_value: new_rating_value, - uncertainty: new_uncertainty, - leaderboard_rating: new_leaderboard_rating, - last_updated: new_last_updated - }) - - log_params = %{ - user_id: existing.user_id, - rating_type_id: existing.rating_type_id, - match_id: nil, - inserted_at: new_last_updated, - value: %{ - reason: "Seasonal reset", - rating_value: new_rating_value, - skill: existing.skill, - uncertainty: new_uncertainty, - rating_value_change: new_rating_value - existing.rating_value, - skill_change: 0, - uncertainty_change: new_uncertainty - existing.uncertainty - } - } - - {:ok, _} = Game.create_rating_log(log_params) - end + # Use the greater of the existing uncertainty or the minimum value (5.0) + new_uncertainty = max(existing.uncertainty, 5.0) + + new_rating_value = BalanceLib.calculate_rating_value(existing.skill, new_uncertainty) + + new_leaderboard_rating = + BalanceLib.calculate_leaderboard_rating(existing.skill, new_uncertainty) + + Account.update_rating(existing, %{ + rating_value: new_rating_value, + uncertainty: new_uncertainty, + leaderboard_rating: new_leaderboard_rating, + last_updated: new_last_updated + }) + + log_params = %{ + user_id: existing.user_id, + rating_type_id: existing.rating_type_id, + match_id: nil, + inserted_at: new_last_updated, + value: %{ + reason: "Seasonal reset", + rating_value: new_rating_value, + skill: existing.skill, + uncertainty: new_uncertainty, + rating_value_change: new_rating_value - existing.rating_value, + skill_change: 0, + uncertainty_change: new_uncertainty - existing.uncertainty + } + } + + {:ok, _} = Game.create_rating_log(log_params) + end end diff --git a/lib/teiserver/coordinator/consul_server.ex b/lib/teiserver/coordinator/consul_server.ex index 3567cf309..861ad906c 100644 --- a/lib/teiserver/coordinator/consul_server.ex +++ b/lib/teiserver/coordinator/consul_server.ex @@ -375,7 +375,7 @@ defmodule Teiserver.Coordinator.ConsulServer do {:noreply, state} end - @doc""" + @doc """ This method handles state when all players have left the lobby """ def handle_info( @@ -387,10 +387,11 @@ defmodule Teiserver.Coordinator.ConsulServer do # Everyone left the lobby # Restore some settings to default if new_player_count == 0 do - new_state = %{state | - minimum_rating_to_play: 0, - maximum_rating_to_play: 1000, - balance_algorithm: @default_balance_algorithm + new_state = %{ + state + | minimum_rating_to_play: 0, + maximum_rating_to_play: 1000, + balance_algorithm: @default_balance_algorithm } {:noreply, new_state} diff --git a/lib/teiserver/game/libs/match_rating_lib.ex b/lib/teiserver/game/libs/match_rating_lib.ex index 483c475f5..afc34c41d 100644 --- a/lib/teiserver/game/libs/match_rating_lib.ex +++ b/lib/teiserver/game/libs/match_rating_lib.ex @@ -4,7 +4,7 @@ defmodule Teiserver.Game.MatchRatingLib do to balance matches. For that use Teiserver.Battle.BalanceLib. """ - alias Teiserver.{Account, Coordinator, Config, Game, Battle,} + alias Teiserver.{Account, Coordinator, Config, Game, Battle} alias Teiserver.Data.Types, as: T alias Teiserver.Repo alias Teiserver.Battle.{BalanceLib, MatchLib} @@ -71,7 +71,8 @@ defmodule Teiserver.Game.MatchRatingLib do match.team_count < 2 -> {:error, :not_enough_teams} - match.game_duration < Config.get_site_config_cache("matchmaking.Time to treat game as ranked") -> + match.game_duration < + Config.get_site_config_cache("matchmaking.Time to treat game as ranked") -> {:error, :too_short} Map.get(match.tags, "game/modoptions/ranked_game", "1") == "0" -> diff --git a/lib/teiserver/game/servers/balancer_server.ex b/lib/teiserver/game/servers/balancer_server.ex index 658f0ed26..fa72d846f 100644 --- a/lib/teiserver/game/servers/balancer_server.ex +++ b/lib/teiserver/game/servers/balancer_server.ex @@ -236,8 +236,7 @@ defmodule Teiserver.Game.BalancerServer do players |> Enum.map(fn %{userid: userid} -> %{ - userid => - BalanceLib.get_user_rating_rank(userid, rating_type, opts[:fuzz_multiplier]) + userid => BalanceLib.get_user_rating_rank(userid, rating_type, opts[:fuzz_multiplier]) } end) diff --git a/lib/teiserver/helpers/oban_logger.ex b/lib/teiserver/helpers/oban_logger.ex index 5c2af9cff..162daf0f2 100644 --- a/lib/teiserver/helpers/oban_logger.ex +++ b/lib/teiserver/helpers/oban_logger.ex @@ -40,6 +40,8 @@ defmodule Teiserver.Helper.ObanLogger do end def handle_event([:oban, :job, event], measure, meta, _) do - Logger.info("[Oban] #{event} #{meta.worker} ran in #{System.convert_time_unit(measure.duration, :native, :milliseconds)}ms") + Logger.info( + "[Oban] #{event} #{meta.worker} ran in #{System.convert_time_unit(measure.duration, :native, :millisecond)}ms" + ) end end diff --git a/lib/teiserver/mix_tasks/fake_data.ex b/lib/teiserver/mix_tasks/fake_data.ex index dd5f02777..6fd69d24f 100644 --- a/lib/teiserver/mix_tasks/fake_data.ex +++ b/lib/teiserver/mix_tasks/fake_data.ex @@ -109,8 +109,10 @@ defmodule Mix.Tasks.Teiserver.Fakedata do inserted_at: Timex.shift(Timex.now(), days: -day, minutes: -minutes) |> time_convert, updated_at: Timex.shift(Timex.now(), days: -day, minutes: -minutes) |> time_convert } - end) |> Enum.to_list() - end) |> Enum.to_list() + end) + |> Enum.to_list() + end) + |> Enum.to_list() |> List.flatten() Ecto.Multi.new() diff --git a/lib/teiserver/protocols/spring/spring_telemetry_in.ex b/lib/teiserver/protocols/spring/spring_telemetry_in.ex index 63e7ca3e7..97f5fd972 100644 --- a/lib/teiserver/protocols/spring/spring_telemetry_in.ex +++ b/lib/teiserver/protocols/spring/spring_telemetry_in.ex @@ -18,7 +18,6 @@ defmodule Teiserver.Protocols.Spring.TelemetryIn do case Spring.unzip(compressed_contents) do {:ok, contents} -> if String.valid?(contents) do - params = %{ user_hash: user_hash, user_id: state.userid, @@ -35,14 +34,29 @@ defmodule Teiserver.Protocols.Spring.TelemetryIn do DiscordBridgeBot.new_infolog(infolog) end - reply(:spring, :okay, "upload_infolog - id:#{infolog.id}", msg_id, state) + reply( + :spring, + :okay, + "upload_infolog - id:#{infolog.id}", + msg_id, + state + ) {:error, _changeset} -> reply(:spring, :no, "upload_infolog - db error", msg_id, state) end else - Logger.error("#{state.userid} #{log_type} upload_infolog - contents contain invalid characters") - reply(:spring, :no, "upload_infolog - contents contain invalid characters", msg_id, state) + Logger.error( + "#{state.userid} #{log_type} upload_infolog - contents contain invalid characters" + ) + + reply( + :spring, + :no, + "upload_infolog - contents contain invalid characters", + msg_id, + state + ) end {:error, _} -> diff --git a/lib/teiserver_web/controllers/admin/user_controller.ex b/lib/teiserver_web/controllers/admin/user_controller.ex index 559f2c689..8a0a2ace7 100644 --- a/lib/teiserver_web/controllers/admin/user_controller.ex +++ b/lib/teiserver_web/controllers/admin/user_controller.ex @@ -93,6 +93,7 @@ defmodule TeiserverWeb.Admin.UserController do ) ++ Account.list_users(search: [id_in: id_list])) |> Enum.uniq() + user_stats = for user <- users, do: Account.get_user_stat_data(user.id) conn @@ -127,6 +128,7 @@ defmodule TeiserverWeb.Admin.UserController do Account.list_users(search: [id_in: id_list]) end + user_stats = for user <- users, do: Account.get_user_stat_data(user.id) conn diff --git a/lib/teiserver_web/live/account/profile/contributor.ex b/lib/teiserver_web/live/account/profile/contributor.ex index 8ddc15b85..f44c8f3b8 100644 --- a/lib/teiserver_web/live/account/profile/contributor.ex +++ b/lib/teiserver_web/live/account/profile/contributor.ex @@ -84,13 +84,13 @@ defmodule TeiserverWeb.Account.ProfileLive.Contributor do Account.recache_user(assigns.user.id) {:noreply, - socket - |> assign(:country_code, assigns.temp_country_code) - |> assign(:error_message, nil)} + socket + |> assign(:country_code, assigns.temp_country_code) + |> assign(:error_message, nil)} else {:noreply, - socket - |> assign(:error_message, "Country code must not contain space")} + socket + |> assign(:error_message, "Country code must not contain space")} end end diff --git a/lib/teiserver_web/live/battles/lobbies/show.html.heex b/lib/teiserver_web/live/battles/lobbies/show.html.heex index 968082826..1aaddad35 100644 --- a/lib/teiserver_web/live/battles/lobbies/show.html.heex +++ b/lib/teiserver_web/live/battles/lobbies/show.html.heex @@ -97,7 +97,11 @@ spectators =