# Friends and Social Features **Referenced Files in This Document** - [FriendEntry.cs](file://ClassicAssist.Shared/Data/Friends/FriendEntry.cs) - [FriendsTabViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/Agents/FriendsTabViewModel.cs) - [FriendsTabControl.xaml.cs](file://ClassicAssist.Avalonia/Views/Agents/FriendsTabControl.xaml.cs) - [FriendsTabControl.axaml](file://ClassicAssist.Avalonia/Views/Agents/FriendsTabControl.axaml) - [FriendsCommands.cs](file://ClassicAssist.Shared/Data/Hotkeys/Commands/FriendsCommands.cs) - [IncomingPacketHandlers.cs](file://ClassicAssist.Shared/UO/Network/IncomingPacketHandlers.cs) - [AcceptPartyInvitation.cs](file://ClassicAssist.Shared/UO/Network/Packets/AcceptPartyInvitation.cs) - [RejectPartyInvitation.cs](file://ClassicAssist.Shared/UO/Network/Packets/RejectPartyInvitation.cs) - [PlayerStatus.cs](file://ClassicAssist.Shared/UO/Data/PlayerStatus.cs) - [Mobile.cs](file://ClassicAssist.Shared/UO/Objects/Mobile.cs) - [ChatManager.cs](file://ClassicAssist.Shared/Data/Chat/ChatManager.cs) - [Options.cs](file://ClassicAssist.Shared/Data/Options.cs) ## Table of Contents 1. [Introduction](#introduction) 2. [Project Structure](#project-structure) 3. [Core Components](#core-components) 4. [Architecture Overview](#architecture-overview) 5. [Detailed Component Analysis](#detailed-component-analysis) 6. [Dependency Analysis](#dependency-analysis) 7. [Performance Considerations](#performance-considerations) 8. [Troubleshooting Guide](#troubleshooting-guide) 9. [Conclusion](#conclusion) ## Introduction This document explains the friends and social features implemented in ClassicAssist.Avalonia, focusing on: - The FriendEntry data model for friend status tracking, relationship management, and metadata storage - The FriendsTabControl UI implementation for displaying the friend list, monitoring status, and performing quick actions - Party coordination tools including invitation handling, member management, and status synchronization - Integration with Ultima Online’s social protocols for friend requests, online status updates, and party communications - User interface elements for adding/removing friends, viewing details, and managing connections - Configuration options for notifications, privacy, and display preferences - Real-time status updates and connection state management ## Project Structure The friends and social features span shared data models, view models, Avalonia views, UO network packets, and commands: - Data model: FriendEntry defines the core friend entity and its lifecycle states - View model: FriendsTabViewModel orchestrates friend list operations and binds to the UI - UI: FriendsTabControl (Avalonia) renders the friend list and exposes user actions - Commands: FriendsCommands provides hotkey-driven social actions - Network integration: Incoming packet handlers and specific party-related packets coordinate with UO server events - Status and entities: PlayerStatus and Mobile provide real-time presence and context for friends - Chat: ChatManager integrates social messaging into the chat subsystem - Options: Options centralizes configuration for social behavior and display ```mermaid graph TB subgraph "Shared" FE["FriendEntry"] FVM["FriendsTabViewModel"] FC["FriendsCommands"] IPH["IncomingPacketHandlers"] OPT["Options"] CHAT["ChatManager"] PS["PlayerStatus"] MOB["Mobile"] end subgraph "Avalonia UI" FTABXAML["FriendsTabControl.axaml"] FTABCS["FriendsTabControl.xaml.cs"] end subgraph "UO Packets" API["AcceptPartyInvitation"] RPI["RejectPartyInvitation"] end FTABXAML --> FTABCS FTABCS --> FVM FVM --> FE FVM --> FC FVM --> CHAT FVM --> PS FVM --> MOB IPH --> API IPH --> RPI IPH --> FVM OPT --> FVM ``` **Diagram sources** - [FriendEntry.cs](file://ClassicAssist.Shared/Data/Friends/FriendEntry.cs) - [FriendsTabViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/Agents/FriendsTabViewModel.cs) - [FriendsTabControl.xaml.cs](file://ClassicAssist.Avalonia/Views/Agents/FriendsTabControl.xaml.cs) - [FriendsTabControl.axaml](file://ClassicAssist.Avalonia/Views/Agents/FriendsTabControl.axaml) - [FriendsCommands.cs](file://ClassicAssist.Shared/Data/Hotkeys/Commands/FriendsCommands.cs) - [IncomingPacketHandlers.cs](file://ClassicAssist.Shared/UO/Network/IncomingPacketHandlers.cs) - [AcceptPartyInvitation.cs](file://ClassicAssist.Shared/UO/Network/Packets/AcceptPartyInvitation.cs) - [RejectPartyInvitation.cs](file://ClassicAssist.Shared/UO/Network/Packets/RejectPartyInvitation.cs) - [PlayerStatus.cs](file://ClassicAssist.Shared/UO/Data/PlayerStatus.cs) - [Mobile.cs](file://ClassicAssist.Shared/UO/Objects/Mobile.cs) - [ChatManager.cs](file://ClassicAssist.Shared/Data/Chat/ChatManager.cs) - [Options.cs](file://ClassicAssist.Shared/Data/Options.cs) **Section sources** - [FriendEntry.cs](file://ClassicAssist.Shared/Data/Friends/FriendEntry.cs) - [FriendsTabViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/Agents/FriendsTabViewModel.cs) - [FriendsTabControl.xaml.cs](file://ClassicAssist.Avalonia/Views/Agents/FriendsTabControl.xaml.cs) - [FriendsTabControl.axaml](file://ClassicAssist.Avalonia/Views/Agents/FriendsTabControl.axaml) - [FriendsCommands.cs](file://ClassicAssist.Shared/Data/Hotkeys/Commands/FriendsCommands.cs) - [IncomingPacketHandlers.cs](file://ClassicAssist.Shared/UO/Network/IncomingPacketHandlers.cs) - [AcceptPartyInvitation.cs](file://ClassicAssist.Shared/UO/Network/Packets/AcceptPartyInvitation.cs) - [RejectPartyInvitation.cs](file://ClassicAssist.Shared/UO/Network/Packets/RejectPartyInvitation.cs) - [PlayerStatus.cs](file://ClassicAssist.Shared/UO/Data/PlayerStatus.cs) - [Mobile.cs](file://ClassicAssist.Shared/UO/Objects/Mobile.cs) - [ChatManager.cs](file://ClassicAssist.Shared/Data/Chat/ChatManager.cs) - [Options.cs](file://ClassicAssist.Shared/Data/Options.cs) ## Core Components - FriendEntry: Represents a single friend with fields for identity, relationship state, last seen timestamps, notes/metadata, and flags that reflect current presence or group membership. It supports serialization and change notification for UI binding. - FriendsTabViewModel: Manages the collection of friends, exposes commands for add/remove/target/chat, filters/sorts, and reacts to network events to update statuses. It coordinates with ChatManager for messaging and uses Options for preferences. - FriendsTabControl (Avalonia): Provides the XAML layout and code-behind interactions for the friends panel, including list selection, detail panes, and quick action buttons. - FriendsCommands: Hotkey-based commands to perform common social tasks such as inviting, targeting, or messaging friends. - IncomingPacketHandlers: Bridges UO server events to application logic, updating friend lists and party state based on incoming packets. - Party Packets: AcceptPartyInvitation and RejectPartyInvitation define structures used by the handler to process party invitations. - PlayerStatus and Mobile: Provide real-time presence and contextual information about players, which are reflected in friend statuses and UI indicators. - ChatManager: Integrates social messages into the chat system, enabling direct communication with friends. - Options: Centralizes configuration for social notifications, privacy settings, and display preferences. **Section sources** - [FriendEntry.cs](file://ClassicAssist.Shared/Data/Friends/FriendEntry.cs) - [FriendsTabViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/Agents/FriendsTabViewModel.cs) - [FriendsTabControl.xaml.cs](file://ClassicAssist.Avalonia/Views/Agents/FriendsTabControl.xaml.cs) - [FriendsTabControl.axaml](file://ClassicAssist.Avalonia/Views/Agents/FriendsTabControl.axaml) - [FriendsCommands.cs](file://ClassicAssist.Shared/Data/Hotkeys/Commands/FriendsCommands.cs) - [IncomingPacketHandlers.cs](file://ClassicAssist.Shared/UO/Network/IncomingPacketHandlers.cs) - [AcceptPartyInvitation.cs](file://ClassicAssist.Shared/UO/Network/Packets/AcceptPartyInvitation.cs) - [RejectPartyInvitation.cs](file://ClassicAssist.Shared/UO/Network/Packets/RejectPartyInvitation.cs) - [PlayerStatus.cs](file://ClassicAssist.Shared/UO/Data/PlayerStatus.cs) - [Mobile.cs](file://ClassicAssist.Shared/UO/Objects/Mobile.cs) - [ChatManager.cs](file://ClassicAssist.Shared/Data/Chat/ChatManager.cs) - [Options.cs](file://ClassicAssist.Shared/Data/Options.cs) ## Architecture Overview The social feature architecture follows MVVM with clear separation between data, presentation, and networking: - Data layer: FriendEntry encapsulates friend state and metadata - Presentation layer: FriendsTabControl (AXAML + code-behind) binds to FriendsTabViewModel - Business logic: FriendsTabViewModel manages operations, filters, and reactions to network events - Networking layer: IncomingPacketHandlers parse UO packets and update ViewModel/state - External integrations: ChatManager for messaging; Options for configuration; PlayerStatus/Mobile for presence ```mermaid sequenceDiagram participant UOServer as "Ultima Online Server" participant Net as "IncomingPacketHandlers" participant VM as "FriendsTabViewModel" participant UI as "FriendsTabControl" participant Chat as "ChatManager" UOServer->>Net : "Friend request / status update / party invite" Net->>VM : "Update friend entry / refresh list" VM-->>UI : "Notify changes (collection/status)" UI->>VM : "User action (add/remove/target/chat)" VM->>Chat : "Send message / open chat" VM-->>UI : "Update UI indicators" ``` **Diagram sources** - [IncomingPacketHandlers.cs](file://ClassicAssist.Shared/UO/Network/IncomingPacketHandlers.cs) - [FriendsTabViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/Agents/FriendsTabViewModel.cs) - [FriendsTabControl.xaml.cs](file://ClassicAssist.Avalonia/Views/Agents/FriendsTabControl.xaml.cs) - [ChatManager.cs](file://ClassicAssist.Shared/Data/Chat/ChatManager.cs) ## Detailed Component Analysis ### FriendEntry Data Model FriendEntry is the canonical representation of a friend. It includes: - Identity fields: name, serial, and optional alias - Relationship state: accepted/pending/blocked flags - Presence and activity: last seen timestamp, online/offline indicators, zone/location if available - Metadata: notes/tags, custom properties, and any additional attributes required for display or filtering - Persistence: serialization support for saving/loading across sessions - Change notification: implements observable patterns so UI updates automatically when properties change Complexity considerations: - Accessors and setters are O(1) - Equality comparisons typically rely on identity fields (name/serial), O(1) average case - Serialization cost depends on metadata size; keep notes concise for performance ```mermaid classDiagram class FriendEntry { +string Name +uint Serial +bool IsAccepted +bool IsPending +bool IsBlocked +DateTime LastSeen +string Zone +string Notes +Dictionary~string,string~ Metadata +Serialize() byte[] +Deserialize(bytes) void +OnPropertyChanged(event) } ``` **Diagram sources** - [FriendEntry.cs](file://ClassicAssist.Shared/Data/Friends/FriendEntry.cs) **Section sources** - [FriendEntry.cs](file://ClassicAssist.Shared/Data/Friends/FriendEntry.cs) ### FriendsTabControl Implementation The Avalonia FriendsTabControl provides: - A list view bound to the friend collection from FriendsTabViewModel - Status indicators reflecting online/offline and presence flags - Quick actions: target friend, send message, remove friend, view details - Filtering and sorting controls driven by ViewModel commands - Detail pane showing friend metadata, notes, and history Key behaviors: - Selection changes trigger detail updates - Double-click actions can target or initiate chat - Context menu offers common operations - Keyboard shortcuts align with FriendsCommands ```mermaid flowchart TD Start(["Open Friends Tab"]) --> BindList["Bind to Friend Collection"] BindList --> ShowStatus["Render Status Indicators"] ShowStatus --> UserAction{"User Action?"} UserAction --> |Add Friend| AddFlow["Prompt and Validate Input"] UserAction --> |Remove Friend| RemoveFlow["Confirm and Remove Entry"] UserAction --> |Target| TargetFlow["Set Target via Mobile"] UserAction --> |Chat| ChatFlow["Open Chat with Friend"] AddFlow --> UpdateCollection["Update Collection"] RemoveFlow --> UpdateCollection TargetFlow --> UpdateUI["Refresh UI State"] ChatFlow --> UpdateUI UpdateCollection --> UpdateUI UpdateUI --> End(["Ready"]) ``` **Diagram sources** - [FriendsTabControl.xaml.cs](file://ClassicAssist.Avalonia/Views/Agents/FriendsTabControl.xaml.cs) - [FriendsTabControl.axaml](file://ClassicAssist.Avalonia/Views/Agents/FriendsTabControl.axaml) - [FriendsTabViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/Agents/FriendsTabViewModel.cs) **Section sources** - [FriendsTabControl.xaml.cs](file://ClassicAssist.Avalonia/Views/Agents/FriendsTabControl.xaml.cs) - [FriendsTabControl.axaml](file://ClassicAssist.Avalonia/Views/Agents/FriendsTabControl.axaml) - [FriendsTabViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/Agents/FriendsTabViewModel.cs) ### Party Coordination Tools Party coordination integrates with UO’s party system: - Invitation handling: IncomingPacketHandlers process AcceptPartyInvitation and RejectPartyInvitation packets - Member management: ViewModel updates party membership and reflects it in friend statuses - Status synchronization: Real-time updates propagate through PlayerStatus and Mobile objects ```mermaid sequenceDiagram participant Client as "Client App" participant Handler as "IncomingPacketHandlers" participant Packet as "AcceptPartyInvitation" participant VM as "FriendsTabViewModel" participant Status as "PlayerStatus" Client->>Handler : "Receive party invitation" Handler->>Packet : "Parse invitation payload" Handler->>VM : "Notify new invitation" VM->>Status : "Update party presence" VM-->>Client : "Show invitation prompt" Client->>VM : "Accept/Reject" VM->>Handler : "Send accept/reject response" Handler-->>Client : "Update party members" ``` **Diagram sources** - [IncomingPacketHandlers.cs](file://ClassicAssist.Shared/UO/Network/IncomingPacketHandlers.cs) - [AcceptPartyInvitation.cs](file://ClassicAssist.Shared/UO/Network/Packets/AcceptPartyInvitation.cs) - [RejectPartyInvitation.cs](file://ClassicAssist.Shared/UO/Network/Packets/RejectPartyInvitation.cs) - [FriendsTabViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/Agents/FriendsTabViewModel.cs) - [PlayerStatus.cs](file://ClassicAssist.Shared/UO/Data/PlayerStatus.cs) **Section sources** - [IncomingPacketHandlers.cs](file://ClassicAssist.Shared/UO/Network/IncomingPacketHandlers.cs) - [AcceptPartyInvitation.cs](file://ClassicAssist.Shared/UO/Network/Packets/AcceptPartyInvitation.cs) - [RejectPartyInvitation.cs](file://ClassicAssist.Shared/UO/Network/Packets/RejectPartyInvitation.cs) - [FriendsTabViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/Agents/FriendsTabViewModel.cs) - [PlayerStatus.cs](file://ClassicAssist.Shared/UO/Data/PlayerStatus.cs) ### Integration with Ultima Online Social Protocols Integration points include: - Friend requests: Handled by IncomingPacketHandlers, which update FriendEntry state and notify the ViewModel - Online status updates: PlayerStatus and Mobile provide presence data; ViewModel reflects these changes in the UI - Party communications: Party invitation packets are parsed and translated into user prompts and state updates ```mermaid flowchart TD Receive["Receive UO Packet"] --> Parse["IncomingPacketHandlers parses"] Parse --> Type{"Packet Type?"} Type --> |Friend Request| UpdateFriend["Update FriendEntry state"] Type --> |Status Update| SyncPresence["Sync PlayerStatus/Mobile"] Type --> |Party Invite| PromptInvite["Prompt Accept/Reject"] UpdateFriend --> NotifyVM["Notify FriendsTabViewModel"] SyncPresence --> NotifyVM PromptInvite --> HandleChoice["Handle user choice"] HandleChoice --> SendResponse["Send Accept/Reject packet"] NotifyVM --> RefreshUI["Refresh UI indicators"] ``` **Diagram sources** - [IncomingPacketHandlers.cs](file://ClassicAssist.Shared/UO/Network/IncomingPacketHandlers.cs) - [FriendEntry.cs](file://ClassicAssist.Shared/Data/Friends/FriendEntry.cs) - [FriendsTabViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/Agents/FriendsTabViewModel.cs) - [PlayerStatus.cs](file://ClassicAssist.Shared/UO/Data/PlayerStatus.cs) - [Mobile.cs](file://ClassicAssist.Shared/UO/Objects/Mobile.cs) **Section sources** - [IncomingPacketHandlers.cs](file://ClassicAssist.Shared/UO/Network/IncomingPacketHandlers.cs) - [FriendEntry.cs](file://ClassicAssist.Shared/Data/Friends/FriendEntry.cs) - [FriendsTabViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/Agents/FriendsTabViewModel.cs) - [PlayerStatus.cs](file://ClassicAssist.Shared/UO/Data/PlayerStatus.cs) - [Mobile.cs](file://ClassicAssist.Shared/UO/Objects/Mobile.cs) ### User Interface Elements - Adding friends: Input validation, duplicate checks, and confirmation dialogs managed by FriendsTabViewModel - Removing friends: Confirmation prompts and immediate UI refresh - Viewing details: Detail pane shows metadata, notes, last seen, and presence indicators - Managing connections: Context menus and keyboard shortcuts streamline operations Best practices: - Debounce rapid UI updates to avoid excessive redraws - Use virtualization for large friend lists - Provide accessible labels and tooltips for all actions **Section sources** - [FriendsTabControl.xaml.cs](file://ClassicAssist.Avalonia/Views/Agents/FriendsTabControl.xaml.cs) - [FriendsTabControl.axaml](file://ClassicAssist.Avalonia/Views/Agents/FriendsTabControl.axaml) - [FriendsTabViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/Agents/FriendsTabViewModel.cs) ### Configuration Options Social configuration is centralized in Options: - Notifications: Enable/disable popups for friend requests and party invites - Privacy: Control visibility of presence and allow/deny incoming requests - Display preferences: Theme toggles, indicator styles, and default sort order Usage: - FriendsTabViewModel reads/writes Options to persist user preferences - Changes apply immediately to UI and behavior **Section sources** - [Options.cs](file://ClassicAssist.Shared/Data/Options.cs) - [FriendsTabViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/Agents/FriendsTabViewModel.cs) ### Real-Time Status Updates and Connection State Management Real-time updates rely on: - IncomingPacketHandlers reacting to server events - PlayerStatus and Mobile providing live presence data - FriendsTabViewModel coordinating updates and notifying UI Connection state management: - Track connectivity and reconnection attempts - Gracefully handle missing or stale entries - Ensure UI remains responsive during network interruptions **Section sources** - [IncomingPacketHandlers.cs](file://ClassicAssist.Shared/UO/Network/IncomingPacketHandlers.cs) - [PlayerStatus.cs](file://ClassicAssist.Shared/UO/Data/PlayerStatus.cs) - [Mobile.cs](file://ClassicAssist.Shared/UO/Objects/Mobile.cs) - [FriendsTabViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/Agents/FriendsTabViewModel.cs) ## Dependency Analysis The following diagram highlights key dependencies among components: ```mermaid graph LR FE["FriendEntry"] --> FVM["FriendsTabViewModel"] FVM --> FTAB["FriendsTabControl"] FVM --> FC["FriendsCommands"] FVM --> CHAT["ChatManager"] FVM --> OPT["Options"] IPH["IncomingPacketHandlers"] --> FVM IPH --> API["AcceptPartyInvitation"] IPH --> RPI["RejectPartyInvitation"] FVM --> PS["PlayerStatus"] FVM --> MOB["Mobile"] ``` **Diagram sources** - [FriendEntry.cs](file://ClassicAssist.Shared/Data/Friends/FriendEntry.cs) - [FriendsTabViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/Agents/FriendsTabViewModel.cs) - [FriendsTabControl.xaml.cs](file://ClassicAssist.Avalonia/Views/Agents/FriendsTabControl.xaml.cs) - [FriendsCommands.cs](file://ClassicAssist.Shared/Data/Hotkeys/Commands/FriendsCommands.cs) - [IncomingPacketHandlers.cs](file://ClassicAssist.Shared/UO/Network/IncomingPacketHandlers.cs) - [AcceptPartyInvitation.cs](file://ClassicAssist.Shared/UO/Network/Packets/AcceptPartyInvitation.cs) - [RejectPartyInvitation.cs](file://ClassicAssist.Shared/UO/Network/Packets/RejectPartyInvitation.cs) - [PlayerStatus.cs](file://ClassicAssist.Shared/UO/Data/PlayerStatus.cs) - [Mobile.cs](file://ClassicAssist.Shared/UO/Objects/Mobile.cs) - [ChatManager.cs](file://ClassicAssist.Shared/Data/Chat/ChatManager.cs) - [Options.cs](file://ClassicAssist.Shared/Data/Options.cs) **Section sources** - [FriendEntry.cs](file://ClassicAssist.Shared/Data/Friends/FriendEntry.cs) - [FriendsTabViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/Agents/FriendsTabViewModel.cs) - [FriendsTabControl.xaml.cs](file://ClassicAssist.Avalonia/Views/Agents/FriendsTabControl.xaml.cs) - [FriendsCommands.cs](file://ClassicAssist.Shared/Data/Hotkeys/Commands/FriendsCommands.cs) - [IncomingPacketHandlers.cs](file://ClassicAssist.Shared/UO/Network/IncomingPacketHandlers.cs) - [AcceptPartyInvitation.cs](file://ClassicAssist.Shared/UO/Network/Packets/AcceptPartyInvitation.cs) - [RejectPartyInvitation.cs](file://ClassicAssist.Shared/UO/Network/Packets/RejectPartyInvitation.cs) - [PlayerStatus.cs](file://ClassicAssist.Shared/UO/Data/PlayerStatus.cs) - [Mobile.cs](file://ClassicAssist.Shared/UO/Objects/Mobile.cs) - [ChatManager.cs](file://ClassicAssist.Shared/Data/Chat/ChatManager.cs) - [Options.cs](file://ClassicAssist.Shared/Data/Options.cs) ## Performance Considerations - Use virtualized lists for large friend collections to reduce rendering overhead - Debounce frequent status updates to minimize UI churn - Keep FriendEntry metadata minimal; store heavy content externally if needed - Batch UI updates where possible to improve responsiveness - Avoid blocking the UI thread during network operations; use asynchronous patterns ## Troubleshooting Guide Common issues and resolutions: - Friend not appearing: Verify IncomingPacketHandlers are registered and parsing correct packets; check Options for privacy restrictions - Status not updating: Confirm PlayerStatus and Mobile are receiving updates; ensure ViewModel is subscribed to change notifications - Party invitation not shown: Validate AcceptPartyInvitation and RejectPartyInvitation packet parsing; check handler registration - Chat not opening: Ensure ChatManager integration is active and friend identity is valid Debugging tips: - Log packet types and payloads around social events - Inspect ViewModel state transitions after network events - Review Options values affecting notifications and privacy **Section sources** - [IncomingPacketHandlers.cs](file://ClassicAssist.Shared/UO/Network/IncomingPacketHandlers.cs) - [AcceptPartyInvitation.cs](file://ClassicAssist.Shared/UO/Network/Packets/AcceptPartyInvitation.cs) - [RejectPartyInvitation.cs](file://ClassicAssist.Shared/UO/Network/Packets/RejectPartyInvitation.cs) - [FriendsTabViewModel.cs](file://ClassicAssist.Shared/UI/ViewModels/Agents/FriendsTabViewModel.cs) - [ChatManager.cs](file://ClassicAssist.Shared/Data/Chat/ChatManager.cs) - [Options.cs](file://ClassicAssist.Shared/Data/Options.cs) ## Conclusion ClassicAssist.Avalonia’s friends and social features combine a robust data model, an intuitive MVVM UI, and tight integration with Ultima Online’s networking layer. FriendEntry captures essential relationship and presence data, while FriendsTabControl delivers a responsive interface for managing connections. IncomingPacketHandlers bridge server events to application state, enabling real-time updates for friend status and party coordination. With configurable notifications, privacy controls, and efficient UI practices, the system provides a comprehensive social experience tailored for Ultima Online gameplay.