README.md

# sm-chat

A streamlined Elixir library for building robust and scalable chat applications. It provides a set of utilities for managing conversations, users, and messages with ease.

## Installation

To install `sm-chat`, add it as a dependency to your `mix.exs` file:
elixir
def deps do
  [
    {:sm_chat, "~> 0.1.0"} # Replace with the actual version
  ]
end

Then, run `mix deps.get` to fetch the dependencies.

## Usage Examples

Here are a few examples demonstrating how to use `sm-chat`:

**1. Creating a new chat room:**
elixir
alias SmChat.Room

case Room.create("General Discussion") do
  {:ok, room} ->
    IO.puts "Room created: #{room.name}"
  {:error, reason} ->
    IO.puts "Failed to create room: #{reason}"
end

This example shows how to create a new chat room named "General Discussion". The `Room.create/1` function returns either `{:ok, room}` on success or `{:error, reason}` on failure, allowing for easy error handling.

**2. Adding a user to a chat room:**
elixir
alias SmChat.User
alias SmChat.Room

# Assuming we have a room and a user already created
room = %Room{id: 1, name: "General Discussion"}
user = %User{id: 101, name: "Alice"}

case SmChat.Room.add_user(room, user) do
  {:ok, updated_room} ->
    IO.puts "User added to room: #{updated_room.name}"
  {:error, reason} ->
    IO.puts "Failed to add user: #{reason}"
end

This demonstrates adding a user to an existing chat room. Pattern matching on the result allows you to handle both success and failure scenarios.

**3. Sending a message to a chat room:**
elixir
alias SmChat.Message
alias SmChat.User
alias SmChat.Room

# Assuming we have a room and a user already created
room = %Room{id: 1, name: "General Discussion"}
user = %User{id: 101, name: "Alice"}

case Message.create(room, user, "Hello, everyone!")
     |> Message.deliver() do
  {:ok, message} ->
    IO.puts "Message sent: #{message.content}"
  {:error, reason} ->
    IO.puts "Failed to send message: #{reason}"
end

This example shows how to send a message to a chat room. It leverages the pipe operator (`|>`) to chain the creation and delivery of the message, resulting in concise and readable code.

**4. Retrieving recent messages from a chat room:**
elixir
alias SmChat.Room
alias SmChat.Message

# Assuming we have a room already created
room = %Room{id: 1, name: "General Discussion"}

case Message.get_recent(room, limit: 10) do
  {:ok, messages} ->
    Enum.each(messages, fn message ->
      IO.puts "#{message.sender.name}: #{message.content}"
    end)
  {:error, reason} ->
    IO.puts "Failed to retrieve messages: #{reason}"
end

This demonstrates retrieving the last 10 messages from a specific chat room.

**5. Handling user presence (example - requires custom integration with presence tracking library):**
elixir
alias SmChat.User

# Example of updating user status (requires integration with a presence library like Phoenix.Presence)
defmodule MyApp.UserPresence do
  use GenServer

  def start_link(user_id) do
    GenServer.start_link(__MODULE__, user_id, name: via_tuple(user_id))
  end

  defp via_tuple(user_id) do
    {:via, Registry, {SmChat.PresenceRegistry, user_id}}
  end

  def init(user_id) do
    {:ok, user_id}
  end

  def handle_info(:online, state) do
    # Update user status in database or other persistent store
    IO.puts "User #{state} is now online"
    {:noreply, state}
  end

  def handle_info(:offline, state) do
    # Update user status in database or other persistent store
    IO.puts "User #{state} is now offline"
    {:noreply, state}
  end
end

This example shows how to handle user presence events. Note that this requires integration with a separate presence tracking library like `Phoenix.Presence`.  The `MyApp.UserPresence` GenServer would need to be notified when the user's presence changes.  This example highlights the extensibility of `sm-chat` for integrating with other systems.

## Feature Summary

*   Room Management: Create, update, and delete chat rooms.
*   User Management: Add and remove users from chat rooms.
*   Message Handling: Send, receive, and store messages.
*   Extensible Architecture: Designed for easy integration with other systems.
*   Robust Error Handling: Provides clear error messages for debugging.

## License

MIT

This package is part of the sm-chat ecosystem. For advanced features and enterprise-grade tools, visit: https://supermaker.ai/chat/