OneBotLib 1.0.4

dotnet add package OneBotLib --version 1.0.4
                    
NuGet\Install-Package OneBotLib -Version 1.0.4
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="OneBotLib" Version="1.0.4" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="OneBotLib" Version="1.0.4" />
                    
Directory.Packages.props
<PackageReference Include="OneBotLib" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add OneBotLib --version 1.0.4
                    
#r "nuget: OneBotLib, 1.0.4"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package OneBotLib@1.0.4
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=OneBotLib&version=1.0.4
                    
Install as a Cake Addin
#tool nuget:?package=OneBotLib&version=1.0.4
                    
Install as a Cake Tool

OneBotLib

A C# library that fully implements the OneBot 11 protocol, supporting WebSocket communication with OneBot implementations.

NuGet GitHub License

Features

  • Full OneBot 11 protocol implementation
  • WebSocket communication support
  • Event-driven architecture
  • Comprehensive message segment builder
  • Async/await pattern support
  • Shared context for external connections
  • Connection state management

Installation

NuGet

dotnet add package OneBotLib

Or via Package Manager:

Install-Package OneBotLib

Quick Start

using OneBotLib;
using OneBotLib.Events;
using OneBotLib.Models;
using OneBotLib.MessageSegment;

// Create client instance
var client = new OneBotClient();

// Subscribe to events
client.OnMessage += (sender, e) =>
{
    Console.WriteLine($"Received message: {e.Message.PlainText}");
};

client.OnGroupMessage += (sender, e) =>
{
    var msg = e.Message;
    Console.WriteLine($"Group {msg.GroupId} - {msg.Sender.Nickname}: {msg.PlainText}");
};

client.OnPrivateMessage += (sender, e) =>
{
    var msg = e.Message;
    Console.WriteLine($"Private {msg.UserId}: {msg.PlainText}");
};

// Connect to OneBot service
await client.ConnectAsync("ws://127.0.0.1:3001", "your_access_token");

// Or synchronous connection
bool connected = client.ConnectSync("ws://127.0.0.1:3001", "your_access_token", 5);

// Send message (check result with ApiResult)
var result = await client.SendPrivateMsgAsync(123456789, "Hello, World!");
if (result.Success)
{
    Console.WriteLine($"Message sent, ID: {result.Data}");
}
else
{
    Console.WriteLine($"Failed: {result.ErrorMessage}");
}

// Send complex message
var segments = new List<MessageSegment.MessageSegment>
{
    MessageSegment.MessageSegment.At(123456789),
    MessageSegment.MessageSegment.Text(" Hello!"),
    MessageSegment.MessageSegment.Image("https://example.com/image.png")
};
await client.SendGroupMsgAsync(987654321, segments);

// Close connection
await client.CloseAsync();

Connection State

// Subscribe to connection state changes
client.OnConnectionStateChanged += (sender, e) =>
{
    Console.WriteLine($"State: {e.OldState} -> {e.NewState}");
    if (e.Message != null)
    {
        Console.WriteLine($"Message: {e.Message}");
    }
};

// States:
// ConnectionState.Connecting - Connecting
// ConnectionState.Connected - Connected
// ConnectionState.Disconnected - Disconnected

Shared Context

Share an existing WebSocket connection with OneBotLib:

var client = new OneBotClient();

// Define send message delegate
async Task SendMessageAsync(string message)
{
    var bytes = Encoding.UTF8.GetBytes(message);
    await externalWebSocket.SendAsync(new ArraySegment<byte>(bytes), WebSocketMessageType.Text, true, CancellationToken.None);
}

// Attach to external connection
var sharedContext = client.AttachToExternalConnection(SendMessageAsync);

// Handle incoming messages
async Task OnWebSocketMessageReceived(string message)
{
    await client.OnExternalMessageReceivedAsync(message);
}

// Detach when done
client.DetachFromExternalConnection();

Events

Message Events

client.OnMessage += (sender, e) => { };
client.OnPrivateMessage += (sender, e) => { };
client.OnGroupMessage += (sender, e) => { };

Meta Events

client.OnLifecycle += (sender, e) => { };
client.OnHeartbeat += (sender, e) => { };

Notice Events

client.OnGroupMemberChange += (sender, e) => { };
client.OnGroupAdmin += (sender, e) => { };
client.OnGroupBan += (sender, e) => { };
client.OnGroupUpload += (sender, e) => { };
client.OnGroupRecall += (sender, e) => { };
client.OnFriendAdd += (sender, e) => { };
client.OnFriendRecall += (sender, e) => { };

Request Events

client.OnFriendRequest += async (sender, e) =>
{
    var result = await client.SetFriendAddRequestAsync(e.Flag, true);
};

client.OnGroupRequest += async (sender, e) =>
{
    var result = await client.SetGroupAddRequestAsync(e.Flag, true);
};

Message Segment Builder

// Text
MessageSegment.Text("Hello")

// @Mention
MessageSegment.At(123456789)
MessageSegment.AtAll()

// Image
MessageSegment.Image("https://example.com/image.png")

// Reply
MessageSegment.Reply(messageId)

// Face
MessageSegment.Face(123)

// Voice
MessageSegment.Record("https://example.com/audio.mp3")

// Video
MessageSegment.Video("https://example.com/video.mp4")

// Location
MessageSegment.Location(39.9042, 116.4074, "Beijing", "Capital of China")

// Music
MessageSegment.Music(123456, "qq")

// JSON/XML
MessageSegment.Json("{\"content\": \"...\"}")
MessageSegment.Xml("<xml>...</xml>")

API Result

All API methods return ApiResult or ApiResult<T>:

// With return data
var result = await client.GetLoginInfoAsync();
if (result.Success)
{
    Console.WriteLine($"Account: {result.Data.UserId}");
}
else
{
    Console.WriteLine($"Error: {result.ErrorMessage}");
    Console.WriteLine($"Stack: {result.StackTrace}");
}

// Without return data
var result = await client.SetGroupBanAsync(groupId, userId, 600);
if (result.Success)
{
    Console.WriteLine("Success");
}

Namespaces

using OneBotLib;                    // Main client
using OneBotLib.Events;             // Event args
using OneBotLib.Models;             // Data models
using OneBotLib.MessageSegment;     // Message segment builder

License

MIT License

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net8.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.4 98 4/19/2026
1.0.3 97 4/19/2026
1.0.2 102 4/16/2026
1.0.1 104 4/16/2026
1.0.0 96 4/16/2026