vrchatapi-async 1.21.0.post3__tar.gz → 1.21.0.post4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (422) hide show
  1. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/PKG-INFO +1 -1
  2. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/setup.py +1 -1
  3. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/tests/test_highlevel.py +84 -5
  4. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/tests/test_websocket.py +18 -0
  5. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/__init__.py +1 -1
  6. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/highlevel/account.py +29 -4
  7. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/highlevel/api.py +18 -4
  8. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/websocket.py +3 -1
  9. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi_async.egg-info/PKG-INFO +1 -1
  10. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/LICENSE +0 -0
  11. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/README.md +0 -0
  12. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/pyproject.toml +0 -0
  13. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/setup.cfg +0 -0
  14. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/tests/test_async_sdk.py +0 -0
  15. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/tests/test_presence.py +0 -0
  16. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/api/__init__.py +0 -0
  17. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/api/authentication_api.py +0 -0
  18. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/api/avatars_api.py +0 -0
  19. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/api/calendar_api.py +0 -0
  20. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/api/deprecated_api.py +0 -0
  21. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/api/economy_api.py +0 -0
  22. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/api/favorites_api.py +0 -0
  23. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/api/files_api.py +0 -0
  24. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/api/friends_api.py +0 -0
  25. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/api/groups_api.py +0 -0
  26. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/api/instances_api.py +0 -0
  27. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/api/inventory_api.py +0 -0
  28. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/api/invite_api.py +0 -0
  29. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/api/jams_api.py +0 -0
  30. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/api/miscellaneous_api.py +0 -0
  31. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/api/notifications_api.py +0 -0
  32. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/api/playermoderation_api.py +0 -0
  33. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/api/prints_api.py +0 -0
  34. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/api/props_api.py +0 -0
  35. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/api/users_api.py +0 -0
  36. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/api/worlds_api.py +0 -0
  37. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/api_client.py +0 -0
  38. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/api_response.py +0 -0
  39. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/configuration.py +0 -0
  40. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/exceptions.py +0 -0
  41. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/highlevel/__init__.py +0 -0
  42. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/highlevel/_generated_types.py +0 -0
  43. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/highlevel/presence.py +0 -0
  44. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/highlevel/types.py +0 -0
  45. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/highlevel/world.py +0 -0
  46. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/__init__.py +0 -0
  47. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/account_deletion_log.py +0 -0
  48. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/add_favorite_request.py +0 -0
  49. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/add_group_gallery_image_request.py +0 -0
  50. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/admin_asset_bundle.py +0 -0
  51. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/admin_unity_package.py +0 -0
  52. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/age_verification_status.py +0 -0
  53. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/age_verification_status_result.py +0 -0
  54. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/agreement.py +0 -0
  55. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/agreement_code.py +0 -0
  56. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/agreement_request.py +0 -0
  57. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/agreement_status.py +0 -0
  58. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/api_config.py +0 -0
  59. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/api_config_access_logs_urls.py +0 -0
  60. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/api_config_announcement.py +0 -0
  61. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/api_config_audio_config.py +0 -0
  62. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/api_config_avatar_perf_limiter.py +0 -0
  63. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/api_config_constants.py +0 -0
  64. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/api_config_constants_groups.py +0 -0
  65. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/api_config_constants_instance.py +0 -0
  66. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/api_config_constants_instancepopulationbrackets.py +0 -0
  67. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/api_config_constants_instancepopulationbracketscrowded.py +0 -0
  68. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/api_config_constants_instancepopulationbracketsfew.py +0 -0
  69. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/api_config_constants_instancepopulationbracketsmany.py +0 -0
  70. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/api_config_constants_language.py +0 -0
  71. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/api_config_download_url_list.py +0 -0
  72. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/api_config_event_shelf_campaign.py +0 -0
  73. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/api_config_events.py +0 -0
  74. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/api_config_ios_version.py +0 -0
  75. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/api_config_loading_screen_weights.py +0 -0
  76. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/api_config_low_memory_go_home_timeout_value.py +0 -0
  77. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/api_config_min_supported_client_build_number.py +0 -0
  78. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/api_config_offline_analysis.py +0 -0
  79. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/api_config_profile_defaults.py +0 -0
  80. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/api_health.py +0 -0
  81. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/avatar.py +0 -0
  82. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/avatar_moderation.py +0 -0
  83. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/avatar_moderation_created.py +0 -0
  84. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/avatar_moderation_type.py +0 -0
  85. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/avatar_performance.py +0 -0
  86. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/avatar_published_listings_inner.py +0 -0
  87. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/avatar_style.py +0 -0
  88. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/avatar_styles.py +0 -0
  89. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/avatar_unity_package_url_object.py +0 -0
  90. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/badge.py +0 -0
  91. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/balance.py +0 -0
  92. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/ban_group_member_request.py +0 -0
  93. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/bare_error.py +0 -0
  94. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/beta.py +0 -0
  95. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/beta_registration_not_found_error.py +0 -0
  96. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/beta_user_field.py +0 -0
  97. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/boop_request.py +0 -0
  98. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/calendar_day_of_week.py +0 -0
  99. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/calendar_event.py +0 -0
  100. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/calendar_event_access.py +0 -0
  101. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/calendar_event_category.py +0 -0
  102. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/calendar_event_discovery.py +0 -0
  103. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/calendar_event_discovery_inclusion.py +0 -0
  104. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/calendar_event_discovery_scope.py +0 -0
  105. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/calendar_event_frequency.py +0 -0
  106. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/calendar_event_occurrence_kind.py +0 -0
  107. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/calendar_event_platform.py +0 -0
  108. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/calendar_event_recurrence.py +0 -0
  109. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/calendar_event_recurrence_end.py +0 -0
  110. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/calendar_event_recurrence_end_type.py +0 -0
  111. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/calendar_event_user_interest.py +0 -0
  112. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/change_user_tags_request.py +0 -0
  113. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/change_world_tags_request.py +0 -0
  114. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/content_filter.py +0 -0
  115. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/create_avatar_moderation_request.py +0 -0
  116. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/create_avatar_request.py +0 -0
  117. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/create_calendar_event_request.py +0 -0
  118. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/create_file_request.py +0 -0
  119. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/create_file_version_request.py +0 -0
  120. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/create_group_announcement_request.py +0 -0
  121. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/create_group_gallery_request.py +0 -0
  122. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/create_group_invite_request.py +0 -0
  123. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/create_group_post_request.py +0 -0
  124. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/create_group_request.py +0 -0
  125. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/create_group_role_request.py +0 -0
  126. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/create_instance_request.py +0 -0
  127. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/create_jam_submission_request.py +0 -0
  128. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/create_listing_request.py +0 -0
  129. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/create_product_request.py +0 -0
  130. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/create_prop_request.py +0 -0
  131. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/create_world_request.py +0 -0
  132. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/current_user.py +0 -0
  133. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/current_user_platform_history_inner.py +0 -0
  134. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/current_user_presence.py +0 -0
  135. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/decline_group_invite_request.py +0 -0
  136. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/developer_type.py +0 -0
  137. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/disable2_fa_result.py +0 -0
  138. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/discord_details.py +0 -0
  139. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/dynamic_content_row.py +0 -0
  140. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/earnings_metrics.py +0 -0
  141. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/earnings_metrics_totals.py +0 -0
  142. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/economy_account.py +0 -0
  143. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/economy_account_limits.py +0 -0
  144. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/economy_balances.py +0 -0
  145. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/economy_payout.py +0 -0
  146. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/economy_payout_eligibility.py +0 -0
  147. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/economy_payout_list.py +0 -0
  148. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/economy_payout_status.py +0 -0
  149. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/economy_status.py +0 -0
  150. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/equip_inventory_item_request.py +0 -0
  151. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/error.py +0 -0
  152. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/favorite.py +0 -0
  153. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/favorite_group.py +0 -0
  154. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/favorite_group_contents.py +0 -0
  155. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/favorite_group_contents_entry.py +0 -0
  156. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/favorite_group_contents_entry_world.py +0 -0
  157. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/favorite_group_limits.py +0 -0
  158. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/favorite_group_list.py +0 -0
  159. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/favorite_group_summary.py +0 -0
  160. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/favorite_group_visibility.py +0 -0
  161. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/favorite_limits.py +0 -0
  162. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/favorite_type.py +0 -0
  163. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/favorited_world.py +0 -0
  164. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/feedback.py +0 -0
  165. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/file.py +0 -0
  166. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/file_analysis.py +0 -0
  167. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/file_analysis_avatar_stats.py +0 -0
  168. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/file_data.py +0 -0
  169. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/file_status.py +0 -0
  170. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/file_upload_url.py +0 -0
  171. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/file_version.py +0 -0
  172. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/file_version_upload_status.py +0 -0
  173. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/finish_file_data_upload_request.py +0 -0
  174. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/follow_calendar_event_request.py +0 -0
  175. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/friend_status.py +0 -0
  176. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/get_group_gallery_images200_response.py +0 -0
  177. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/get_group_posts200_response.py +0 -0
  178. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/get_user_group_instances200_response.py +0 -0
  179. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/group.py +0 -0
  180. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/group_access_type.py +0 -0
  181. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/group_announcement.py +0 -0
  182. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/group_audit_log_entry.py +0 -0
  183. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/group_gallery.py +0 -0
  184. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/group_gallery_file_order.py +0 -0
  185. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/group_gallery_file_order_request.py +0 -0
  186. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/group_gallery_image.py +0 -0
  187. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/group_gallery_image_list.py +0 -0
  188. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/group_instance.py +0 -0
  189. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/group_join_request_action.py +0 -0
  190. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/group_join_state.py +0 -0
  191. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/group_member.py +0 -0
  192. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/group_member_limited_user.py +0 -0
  193. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/group_member_status.py +0 -0
  194. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/group_my_member.py +0 -0
  195. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/group_permission.py +0 -0
  196. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/group_permissions.py +0 -0
  197. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/group_post.py +0 -0
  198. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/group_post_visibility.py +0 -0
  199. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/group_privacy.py +0 -0
  200. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/group_role.py +0 -0
  201. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/group_role_template.py +0 -0
  202. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/group_role_template_role.py +0 -0
  203. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/group_role_template_values.py +0 -0
  204. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/group_search_sort.py +0 -0
  205. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/group_transferable.py +0 -0
  206. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/group_transferable_requirements.py +0 -0
  207. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/group_user_visibility.py +0 -0
  208. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/image_animation_style.py +0 -0
  209. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/image_loop_style.py +0 -0
  210. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/image_mask.py +0 -0
  211. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/image_purpose.py +0 -0
  212. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/info_push.py +0 -0
  213. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/info_push_data.py +0 -0
  214. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/info_push_data_article.py +0 -0
  215. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/info_push_data_article_content.py +0 -0
  216. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/info_push_data_category.py +0 -0
  217. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/info_push_data_clickable.py +0 -0
  218. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/info_push_data_domain_list_inner.py +0 -0
  219. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/info_push_data_search.py +0 -0
  220. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/info_push_embedded_link.py +0 -0
  221. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/info_push_experiment.py +0 -0
  222. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/info_push_ips_query.py +0 -0
  223. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/instance.py +0 -0
  224. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/instance_category.py +0 -0
  225. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/instance_content_settings.py +0 -0
  226. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/instance_platforms.py +0 -0
  227. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/instance_region.py +0 -0
  228. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/instance_short_name_response.py +0 -0
  229. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/instance_type.py +0 -0
  230. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/instance_vibe.py +0 -0
  231. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/inventory.py +0 -0
  232. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/inventory_asset.py +0 -0
  233. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/inventory_consumption_results.py +0 -0
  234. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/inventory_default_attributes_value.py +0 -0
  235. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/inventory_default_attributes_value_validator.py +0 -0
  236. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/inventory_drop.py +0 -0
  237. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/inventory_equip_slot.py +0 -0
  238. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/inventory_flag.py +0 -0
  239. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/inventory_item.py +0 -0
  240. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/inventory_item_type.py +0 -0
  241. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/inventory_metadata.py +0 -0
  242. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/inventory_notification_details.py +0 -0
  243. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/inventory_spawn.py +0 -0
  244. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/inventory_template.py +0 -0
  245. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/inventory_user_attributes.py +0 -0
  246. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/invite_message.py +0 -0
  247. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/invite_message_type.py +0 -0
  248. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/invite_request.py +0 -0
  249. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/invite_response.py +0 -0
  250. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/jam.py +0 -0
  251. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/jam_state_change_dates.py +0 -0
  252. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/jam_submission.py +0 -0
  253. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/join_group_request.py +0 -0
  254. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/license.py +0 -0
  255. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/license_action.py +0 -0
  256. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/license_group.py +0 -0
  257. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/license_type.py +0 -0
  258. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/limited_group.py +0 -0
  259. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/limited_unity_package.py +0 -0
  260. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/limited_user_friend.py +0 -0
  261. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/limited_user_groups.py +0 -0
  262. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/limited_user_instance.py +0 -0
  263. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/limited_user_search.py +0 -0
  264. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/limited_world.py +0 -0
  265. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/mime_type.py +0 -0
  266. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/model_print.py +0 -0
  267. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/moderate_user_request.py +0 -0
  268. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/moderation_report.py +0 -0
  269. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/mutual_friend.py +0 -0
  270. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/mutuals.py +0 -0
  271. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/notification.py +0 -0
  272. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/notification_detail_invite.py +0 -0
  273. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/notification_detail_invite_response.py +0 -0
  274. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/notification_detail_request_invite.py +0 -0
  275. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/notification_detail_request_invite_response.py +0 -0
  276. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/notification_detail_vote_to_kick.py +0 -0
  277. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/notification_type.py +0 -0
  278. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/notification_v2.py +0 -0
  279. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/notification_v2_details_boop.py +0 -0
  280. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/notification_v2_response.py +0 -0
  281. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/notification_v2_type.py +0 -0
  282. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/o_auth_redirect_code.py +0 -0
  283. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/ok_status.py +0 -0
  284. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/ok_status2.py +0 -0
  285. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/order_option.py +0 -0
  286. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/order_option_short.py +0 -0
  287. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/paginated_calendar_event_list.py +0 -0
  288. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/paginated_group_audit_log_entry_list.py +0 -0
  289. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/paginated_moderation_report_list.py +0 -0
  290. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/past_display_name.py +0 -0
  291. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/pending2_fa_result.py +0 -0
  292. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/performance_limiter_info.py +0 -0
  293. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/performance_ratings.py +0 -0
  294. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/permission.py +0 -0
  295. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/permission_data.py +0 -0
  296. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/platform_build_info.py +0 -0
  297. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/player_moderation.py +0 -0
  298. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/player_moderation_type.py +0 -0
  299. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/print_files.py +0 -0
  300. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/private_profile.py +0 -0
  301. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/private_profile_activity.py +0 -0
  302. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/product.py +0 -0
  303. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/product_listing.py +0 -0
  304. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/product_listing_attribution.py +0 -0
  305. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/product_listing_attribution_creator.py +0 -0
  306. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/product_listing_type.py +0 -0
  307. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/product_listing_variant.py +0 -0
  308. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/product_purchase.py +0 -0
  309. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/product_purchase_history.py +0 -0
  310. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/product_purchase_location_type.py +0 -0
  311. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/product_purchase_product.py +0 -0
  312. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/product_purchase_purchase_context.py +0 -0
  313. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/product_purchase_record.py +0 -0
  314. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/product_type.py +0 -0
  315. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/profile_group.py +0 -0
  316. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/profile_groups.py +0 -0
  317. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/profile_represented_group.py +0 -0
  318. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/prop.py +0 -0
  319. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/prop_publish_status.py +0 -0
  320. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/prop_unity_package.py +0 -0
  321. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/public_profile.py +0 -0
  322. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/purchase_context_data.py +0 -0
  323. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/purchase_product_listing_request.py +0 -0
  324. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/region.py +0 -0
  325. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/register_user_account_request.py +0 -0
  326. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/release_status.py +0 -0
  327. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/report_category.py +0 -0
  328. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/report_reason.py +0 -0
  329. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/represented_group.py +0 -0
  330. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/request_invite_request.py +0 -0
  331. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/respond_group_join_request.py +0 -0
  332. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/respond_notification_v2_request.py +0 -0
  333. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/response.py +0 -0
  334. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/reward_badge.py +0 -0
  335. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/reward_redemption.py +0 -0
  336. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/reward_redemption_data.py +0 -0
  337. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/reward_redemption_request.py +0 -0
  338. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/reward_redemption_result.py +0 -0
  339. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/route_not_implemented.py +0 -0
  340. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/search_group_members200_response.py +0 -0
  341. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/seller_eligibility.py +0 -0
  342. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/sent_notification.py +0 -0
  343. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/service_queue_stats.py +0 -0
  344. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/service_status.py +0 -0
  345. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/share_inventory_item_direct_request.py +0 -0
  346. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/sort_option.py +0 -0
  347. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/sort_option_product_purchase.py +0 -0
  348. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/sso_provider.py +0 -0
  349. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/sso_token.py +0 -0
  350. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/store.py +0 -0
  351. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/store_context.py +0 -0
  352. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/store_shelf.py +0 -0
  353. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/store_type.py +0 -0
  354. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/store_view.py +0 -0
  355. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/submit_moderation_report_request.py +0 -0
  356. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/submit_moderation_report_request_details.py +0 -0
  357. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/subscription.py +0 -0
  358. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/subscription_period.py +0 -0
  359. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/success.py +0 -0
  360. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/success_flag.py +0 -0
  361. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/tilia_kyc.py +0 -0
  362. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/tilia_status.py +0 -0
  363. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/tilia_tos.py +0 -0
  364. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/token_bundle.py +0 -0
  365. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/transaction.py +0 -0
  366. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/transaction_agreement.py +0 -0
  367. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/transaction_status.py +0 -0
  368. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/transaction_steam_info.py +0 -0
  369. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/transaction_steam_wallet_info.py +0 -0
  370. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/transfer_group_request.py +0 -0
  371. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/tutorial_status.py +0 -0
  372. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/two_factor_auth_code.py +0 -0
  373. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/two_factor_email_code.py +0 -0
  374. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/two_factor_recovery_codes.py +0 -0
  375. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/two_factor_recovery_codes_otp_inner.py +0 -0
  376. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/unavailable_world.py +0 -0
  377. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/unity_package.py +0 -0
  378. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/update_asset_review_notes_request.py +0 -0
  379. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/update_avatar_request.py +0 -0
  380. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/update_calendar_event_request.py +0 -0
  381. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/update_favorite_group_request.py +0 -0
  382. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/update_group_gallery_request.py +0 -0
  383. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/update_group_member_request.py +0 -0
  384. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/update_group_representation_request.py +0 -0
  385. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/update_group_request.py +0 -0
  386. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/update_group_role_request.py +0 -0
  387. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/update_inventory_item_request.py +0 -0
  388. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/update_invite_message_request.py +0 -0
  389. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/update_listing_request.py +0 -0
  390. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/update_product_request.py +0 -0
  391. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/update_profile_request.py +0 -0
  392. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/update_prop_request.py +0 -0
  393. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/update_tilia_tos_request.py +0 -0
  394. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/update_user_badge_request.py +0 -0
  395. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/update_user_client_config_request.py +0 -0
  396. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/update_user_note_request.py +0 -0
  397. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/update_user_request.py +0 -0
  398. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/update_world_request.py +0 -0
  399. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/user.py +0 -0
  400. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/user_client_config.py +0 -0
  401. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/user_cosmetic.py +0 -0
  402. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/user_credits_eligible.py +0 -0
  403. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/user_exists.py +0 -0
  404. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/user_note.py +0 -0
  405. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/user_note_target_user.py +0 -0
  406. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/user_state.py +0 -0
  407. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/user_status.py +0 -0
  408. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/user_subscription.py +0 -0
  409. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/user_subscription_eligible.py +0 -0
  410. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/verify2_fa_email_code_result.py +0 -0
  411. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/verify2_fa_result.py +0 -0
  412. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/verify_auth_token_result.py +0 -0
  413. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/world.py +0 -0
  414. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/world_favorite_list.py +0 -0
  415. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/world_metadata.py +0 -0
  416. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/models/world_publish_status.py +0 -0
  417. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/py.typed +0 -0
  418. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi/rest.py +0 -0
  419. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi_async.egg-info/SOURCES.txt +0 -0
  420. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi_async.egg-info/dependency_links.txt +0 -0
  421. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi_async.egg-info/requires.txt +0 -0
  422. {vrchatapi_async-1.21.0.post3 → vrchatapi_async-1.21.0.post4}/vrchatapi_async.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vrchatapi-async
3
- Version: 1.21.0.post3
3
+ Version: 1.21.0.post4
4
4
  Summary: VRChat API Library for Python (async version)
5
5
  Home-page: https://github.com/hi94740/vrchatapi-python-async
6
6
  Author: hi94740
@@ -232,7 +232,7 @@ from setuptools import setup, find_packages # noqa: H301
232
232
  # prerequisite: setuptools
233
233
  # http://pypi.python.org/pypi/setuptools
234
234
  NAME = "vrchatapi-async"
235
- VERSION = "1.21.0post3"
235
+ VERSION = "1.21.0post4"
236
236
  PYTHON_REQUIRES = ">= 3.10"
237
237
  REQUIRES = [
238
238
  "python-dateutil >= 2.8.2",
@@ -4,7 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  import asyncio
6
6
  from datetime import datetime, timedelta, timezone
7
- from unittest.mock import AsyncMock, Mock
7
+ from unittest.mock import AsyncMock, Mock, patch
8
8
 
9
9
  import pytest
10
10
  from test_async_sdk import MockVRCServer
@@ -20,7 +20,7 @@ from vrchatapi.highlevel import (
20
20
  WorldCache,
21
21
  )
22
22
  from vrchatapi.highlevel.presence import is_user_in_game
23
- from vrchatapi.websocket import VRChatEvent
23
+ from vrchatapi.websocket import VRChatEvent, VRChatWebSocketError
24
24
 
25
25
  CURRENT = {
26
26
  "id": "usr_self",
@@ -127,6 +127,32 @@ async def test_cookie_copy_user_agent_and_close() -> None:
127
127
  await api.close()
128
128
 
129
129
 
130
+ async def test_proxy_is_preserved_by_api_copy() -> None:
131
+ async with VRChatAPI({"proxy": "http://proxy.example:8080"}) as api:
132
+ assert api.api_client.configuration.proxy == "http://proxy.example:8080"
133
+ async with api.copy() as copied:
134
+ assert copied.api_client.configuration.proxy == "http://proxy.example:8080"
135
+
136
+
137
+ async def test_ws_connect_uses_proxy_and_registers_errors_before_connect() -> None:
138
+ api = VRChatAPI({"proxy": "http://proxy.example:8080"})
139
+ api.cookie = {"auth": "token"}
140
+ handler = Mock()
141
+ operations = []
142
+ ws = Mock(
143
+ on_error=Mock(side_effect=lambda callback: operations.append("on_error")),
144
+ connect=AsyncMock(side_effect=lambda: operations.append("connect")),
145
+ close=AsyncMock(),
146
+ )
147
+ with patch("vrchatapi.highlevel.api.VRChatWebSocket.from_client") as factory:
148
+ factory.return_value = ws
149
+ await api.ws_connect(on_error=handler)
150
+ assert factory.call_args.kwargs["proxy"] == "http://proxy.example:8080"
151
+ ws.on_error.assert_called_once_with(handler)
152
+ assert operations == ["on_error", "connect"]
153
+ await api.close()
154
+
155
+
130
156
  async def test_cookie_uses_configured_host() -> None:
131
157
  server = MockVRCServer()
132
158
  await server.start()
@@ -424,7 +450,7 @@ async def test_recovery_replaces_and_closes_connection(account: VRChatAccount) -
424
450
  replacement.get_user = AsyncMock(return_value=FRIEND)
425
451
  replacement.get_friends = AsyncMock(return_value=[])
426
452
  replacement.ws_connect = AsyncMock(
427
- side_effect=lambda: operations.append("connect") or Pipeline()
453
+ side_effect=lambda **kwargs: operations.append("connect") or Pipeline()
428
454
  )
429
455
  replacement.close = AsyncMock()
430
456
  old.copy.return_value = replacement
@@ -458,7 +484,7 @@ async def test_timeout_recovery_keeps_account_available(
458
484
  replacement.get_user = AsyncMock(return_value=FRIEND)
459
485
  replacement.get_friends = AsyncMock(return_value=[])
460
486
  replacement.ws_connect = AsyncMock(
461
- side_effect=lambda: operations.append("connect") or Pipeline()
487
+ side_effect=lambda **kwargs: operations.append("connect") or Pipeline()
462
488
  )
463
489
  replacement.close = AsyncMock()
464
490
  old.copy.return_value = replacement
@@ -511,7 +537,7 @@ async def test_timeout_keeps_processing_old_pipeline_until_replacement(
511
537
  )
512
538
  result = getattr(replacement, stage).return_value
513
539
 
514
- async def wait_for_replacement() -> object:
540
+ async def wait_for_replacement(**kwargs: object) -> object:
515
541
  started.set()
516
542
  await proceed.wait()
517
543
  return result
@@ -676,6 +702,59 @@ async def test_pipeline_events_processed_in_order(account: VRChatAccount) -> Non
676
702
  assert account.users["usr_friend"].data["displayName"] == "Friend"
677
703
 
678
704
 
705
+ async def test_on_event_receives_snapshot_and_survives_recovery(
706
+ account: VRChatAccount,
707
+ ) -> None:
708
+ await account.start()
709
+ seen = []
710
+ notified = asyncio.Event()
711
+
712
+ def on_event(event, old_user) -> None:
713
+ seen.append((event, old_user))
714
+ notified.set()
715
+
716
+ account.on_event = on_event
717
+ old_data = account.users["usr_friend"].data.copy()
718
+ account.ws.events.put_nowait(
719
+ VRChatEvent(
720
+ "user-update",
721
+ {"userId": "usr_friend", "user": {"statusDescription": "first"}},
722
+ )
723
+ )
724
+ await asyncio.wait_for(notified.wait(), 1)
725
+ assert seen[0][0].content["userId"] == "usr_friend"
726
+ assert seen[0][1] == old_data
727
+
728
+ new_ws = Pipeline()
729
+ old_api = account.api
730
+ old_api.copy.return_value = Mock(
731
+ get_current_user=AsyncMock(return_value=CURRENT.copy()),
732
+ get_friends=AsyncMock(return_value=[]),
733
+ get_user=AsyncMock(return_value=FRIEND.copy()),
734
+ ws_connect=AsyncMock(return_value=new_ws),
735
+ close=AsyncMock(side_effect=new_ws.close),
736
+ )
737
+ await account._recover(old_api)
738
+ notified.clear()
739
+ new_ws.events.put_nowait(
740
+ VRChatEvent(
741
+ "user-update",
742
+ {"userId": "usr_friend", "user": {"statusDescription": "second"}},
743
+ )
744
+ )
745
+ await asyncio.wait_for(notified.wait(), 1)
746
+ assert seen[1][0].content["user"]["statusDescription"] == "second"
747
+ assert seen[1][1]["displayName"] == "Friend"
748
+
749
+
750
+ async def test_on_event_receives_pipeline_error(account: VRChatAccount) -> None:
751
+ seen = []
752
+ account.on_event = lambda event, old_user: seen.append((event, old_user))
753
+ error = VRChatWebSocketError("denied", raw='{"err":"denied"}')
754
+ account._handle_ws_error(error)
755
+ assert seen == [(error, None)]
756
+
757
+
679
758
  async def test_disconnect_auth_failure_notifies_and_stops(
680
759
  account: VRChatAccount,
681
760
  ) -> None:
@@ -9,6 +9,7 @@ import asyncio
9
9
  import json
10
10
  import time
11
11
  from types import SimpleNamespace
12
+ from unittest.mock import AsyncMock
12
13
 
13
14
  import aiohttp
14
15
  import pytest
@@ -158,6 +159,23 @@ async def test_auth_token_is_url_encoded(pipeline_server):
158
159
  assert query["authToken"] == token
159
160
 
160
161
 
162
+ @pytest.mark.asyncio
163
+ async def test_connect_uses_configured_proxy():
164
+ socket = SimpleNamespace(closed=False, close=AsyncMock())
165
+ session = SimpleNamespace(ws_connect=AsyncMock(return_value=socket))
166
+ ws = VRChatWebSocket(
167
+ auth_token="authcookie_test",
168
+ session=session,
169
+ proxy="http://proxy.example:8080",
170
+ heartbeat_interval=None,
171
+ )
172
+
173
+ await ws._connect_once()
174
+
175
+ assert session.ws_connect.await_args.kwargs["proxy"] == "http://proxy.example:8080"
176
+ await ws.close()
177
+
178
+
161
179
  # ---------------------------------------------------------------------------
162
180
  # Decoding
163
181
  # ---------------------------------------------------------------------------
@@ -14,7 +14,7 @@
14
14
  """ # noqa: E501
15
15
 
16
16
 
17
- __version__ = "1.21.0post3"
17
+ __version__ = "1.21.0post4"
18
18
 
19
19
  # Define package exports
20
20
  __all__ = [
@@ -9,7 +9,7 @@ from typing import Any, cast
9
9
 
10
10
  import vrchatapi
11
11
  from vrchatapi.exceptions import UnauthorizedException
12
- from vrchatapi.websocket import VRChatEvent, VRChatWebSocket
12
+ from vrchatapi.websocket import VRChatEvent, VRChatWebSocket, VRChatWebSocketError
13
13
 
14
14
  from .api import VRChatAPI
15
15
  from .presence import (
@@ -60,6 +60,10 @@ class VRChatAccount:
60
60
  worlds: WorldCache | None = None,
61
61
  on_user: Callable[[VRChatUser, bool], None] | None = None,
62
62
  on_remove: Callable[[str], None] | None = None,
63
+ on_event: Callable[
64
+ [VRChatEvent | VRChatWebSocketError, HighLevelUserData | None], None
65
+ ]
66
+ | None = None,
63
67
  on_available: Callable[[bool], None] | None = None,
64
68
  on_auth_error: Callable[[Exception], None] | None = None,
65
69
  on_authenticated: Callable[[VRChatAPI], Awaitable[None]] | None = None,
@@ -78,6 +82,7 @@ class VRChatAccount:
78
82
  self._owns_worlds = worlds is None
79
83
  self.on_user = on_user
80
84
  self.on_remove = on_remove
85
+ self.on_event = on_event
81
86
  self.on_available = on_available
82
87
  self.on_auth_error = on_auth_error
83
88
  self.on_authenticated = on_authenticated
@@ -133,7 +138,7 @@ class VRChatAccount:
133
138
  async def start(self, initial: CurrentUser | None = None) -> None:
134
139
  try:
135
140
  await self.authenticate(initial)
136
- self.ws = await self.api.ws_connect()
141
+ self.ws = await self._connect_ws(self.api)
137
142
  await self.fetch_users()
138
143
  self._set_available(True)
139
144
  self._receiver = asyncio.create_task(self._receive(self.ws))
@@ -142,6 +147,13 @@ class VRChatAccount:
142
147
  await self.close()
143
148
  raise
144
149
 
150
+ async def _connect_ws(self, api: VRChatAPI) -> VRChatWebSocket:
151
+ return await api.ws_connect(on_error=self._handle_ws_error)
152
+
153
+ def _handle_ws_error(self, error: Exception) -> None:
154
+ if isinstance(error, VRChatWebSocketError) and error.raw is not None:
155
+ self._notify(self.on_event, error, None)
156
+
145
157
  async def _get_friends(self, offline: bool) -> list[User]:
146
158
  ids = self.current_user_data["offlineFriends" if offline else "onlineFriends"]
147
159
  pages = await _gather(
@@ -194,6 +206,7 @@ class VRChatAccount:
194
206
  async def handle_event(self, event: VRChatEvent) -> None:
195
207
  content = event.content
196
208
  if not isinstance(content, dict):
209
+ self._notify(self.on_event, event, None)
197
210
  return
198
211
  if isinstance(world := content.get("world"), dict) and (
199
212
  world_id := process_vrchat_string(world.get("id"))
@@ -204,7 +217,19 @@ class VRChatAccount:
204
217
  if world_id and world_id not in VRCHAT_SPECIAL_LOCATION_STRINGS:
205
218
  content["travelingToWorldId"] = world_id
206
219
  self.create_task(self.worlds.get(world_id).get_data())
207
- if (user_id := content.get("userId")) is None:
220
+ user_id = content.get("userId")
221
+ old_user = self.users.get(user_id) if user_id is not None else None
222
+ self._notify(
223
+ self.on_event,
224
+ VRChatEvent(
225
+ type=event.type,
226
+ content=content,
227
+ raw=event.raw,
228
+ raw_content=event.raw_content,
229
+ ),
230
+ old_user.data.copy() if old_user is not None else None,
231
+ )
232
+ if user_id is None:
208
233
  return
209
234
  if event.type == "friend-delete":
210
235
  self.remove_user(user_id)
@@ -246,7 +271,7 @@ class VRChatAccount:
246
271
  self.api = replacement
247
272
  try:
248
273
  await self.authenticate()
249
- new_ws = await replacement.ws_connect()
274
+ new_ws = await self._connect_ws(replacement)
250
275
  await self._stop_receiver()
251
276
  # Discard old pipeline work before applying the replacement snapshot.
252
277
  pending = list(self._event_tasks.values())
@@ -2,7 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from collections.abc import Mapping
5
+ from collections.abc import Callable, Mapping
6
6
  from enum import Enum
7
7
  from functools import cached_property
8
8
  from http.cookiejar import Cookie
@@ -11,7 +11,10 @@ from typing import cast
11
11
  from urllib.parse import urlsplit
12
12
 
13
13
  import vrchatapi
14
- from vrchatapi.websocket import DEFAULT_USER_AGENT, VRChatWebSocket
14
+ from vrchatapi.websocket import (
15
+ DEFAULT_USER_AGENT,
16
+ VRChatWebSocket,
17
+ )
15
18
 
16
19
  from .types import CurrentUser, User, VRChatAuthCookie, World
17
20
 
@@ -83,6 +86,7 @@ class VRChatAPI:
83
86
  vrchatapi.Configuration(
84
87
  username=self.config.get("username"),
85
88
  password=self.config.get("password"),
89
+ proxy=self.config.get("proxy"),
86
90
  )
87
91
  )
88
92
  self.api_client.user_agent = user_agent
@@ -153,9 +157,19 @@ class VRChatAPI:
153
157
  async def get_world(self, world_id: str) -> World:
154
158
  return cast(World, await self.worlds_api.get_world(world_id))
155
159
 
156
- async def ws_connect(self) -> VRChatWebSocket:
160
+ async def ws_connect(
161
+ self,
162
+ *,
163
+ on_error: Callable[[Exception], None] | None = None,
164
+ ) -> VRChatWebSocket:
157
165
  # The account owns authentication recovery and reconnect snapshots.
158
- ws = VRChatWebSocket.from_client(self.api_client, auto_reconnect=False)
166
+ ws = VRChatWebSocket.from_client(
167
+ self.api_client,
168
+ auto_reconnect=False,
169
+ proxy=self.api_client.configuration.proxy,
170
+ )
171
+ if on_error is not None:
172
+ ws.on_error(on_error)
159
173
  try:
160
174
  await ws.connect()
161
175
  except BaseException:
@@ -235,6 +235,7 @@ class VRChatWebSocket:
235
235
  reconnect_max_delay: float = 60.0,
236
236
  heartbeat_interval: Optional[float] = DEFAULT_HEARTBEAT_INTERVAL,
237
237
  session: Optional[aiohttp.ClientSession] = None,
238
+ proxy: Optional[str] = None,
238
239
  ) -> None:
239
240
  if not auth_token:
240
241
  raise ValueError("auth_token is required")
@@ -244,6 +245,7 @@ class VRChatWebSocket:
244
245
  self._auto_reconnect = auto_reconnect
245
246
  self._reconnect_max_delay = max(0.0, reconnect_max_delay)
246
247
  self._heartbeat_interval = heartbeat_interval
248
+ self._proxy = proxy
247
249
 
248
250
  self._session = session
249
251
  self._owned_session = session is None
@@ -465,7 +467,7 @@ class VRChatWebSocket:
465
467
  url = f"{self._endpoint.rstrip('/')}/?authToken={quote(self._auth_token, safe='')}"
466
468
  headers = {"User-Agent": self._user_agent}
467
469
  try:
468
- ws = await session.ws_connect(url, headers=headers)
470
+ ws = await session.ws_connect(url, headers=headers, proxy=self._proxy)
469
471
  except Exception:
470
472
  # Do not leak a freshly-created session on a failed connect;
471
473
  # close it so callers do not accumulate resources.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vrchatapi-async
3
- Version: 1.21.0.post3
3
+ Version: 1.21.0.post4
4
4
  Summary: VRChat API Library for Python (async version)
5
5
  Home-page: https://github.com/hi94740/vrchatapi-python-async
6
6
  Author: hi94740