Skip to content

Commit 3c0312c

Browse files
committed
Better F# demo
1 parent 86f61c5 commit 3c0312c

File tree

1 file changed

+36
-35
lines changed

1 file changed

+36
-35
lines changed

samples/Kook.Net.Samples.FSharp/Program.fs

+36-35
Original file line numberDiff line numberDiff line change
@@ -21,66 +21,67 @@ let config =
2121
AlwaysDownloadVoiceStates = false,
2222
AlwaysDownloadBoostSubscriptions = false,
2323
MessageCacheSize = 100,
24-
LogLevel = LogSeverity.Debug
24+
LogLevel = LogSeverity.Debug,
25+
AutoUpdateChannelPositions = true,
26+
AutoUpdateRolePositions = true,
27+
StartupCacheFetchMode = StartupCacheFetchMode.Lazy,
28+
LargeNumberOfGuildsThreshold = 50u
2529
)
2630

2731
// 在使用完 Kook.Net 的客户端后,建议在应用程序的生命周期结束时进行 Dispose 操作
2832
// 由于 F# 中 use 绑定在模块中被视为 let 绑定,此处使用 let 来创建一个作用域
2933
let client = new KookSocketClient(config)
3034

35+
// 此处列举了 Kook.Net 的 KookSocketClient 的所有事件
36+
3137
// Log 事件,此处以直接输出到控制台为例
32-
let LogAsync (log: LogMessage) : Task =
38+
let LogAsync (log: LogMessage) =
3339
Console.WriteLine(log.ToString())
3440
Task.CompletedTask
3541

3642
// Ready 事件表示客户端已经建立了连接,现在可以安全地访问缓存
37-
let ReadyAsync () : Task =
38-
Console.WriteLine($"{client.CurrentUser} is connected!")
39-
Task.CompletedTask
43+
let ReadyAsync () =
44+
async { Console.WriteLine($"{client.CurrentUser} 已连接!") } |> Async.StartAsTask :> Task
4045

4146
// 并不建议以这样的方式实现 Bot 的命令交互功能
4247
// 请参阅 Kook.Net.Samples.TextCommands 示例项目及其文档
4348
let MessageReceivedAsync (message: SocketMessage) (author: SocketGuildUser) (channel: SocketTextChannel) : Task =
44-
task {
45-
let currentUserId: Nullable<uint64> =
46-
match client.CurrentUser with
47-
| null -> Nullable()
48-
| s -> Nullable s.Id
49-
50-
if currentUserId.HasValue && author.Id = currentUserId.Value then
51-
()
52-
53-
if message.Content = "!ping" then
54-
// 创建一个 CardBuilder,卡片将会包含一个文本模块和一个按钮模块
55-
let builder =
56-
CardBuilder()
57-
.AddModule<SectionModuleBuilder>(fun s -> s.WithText("Pong!") |> ignore)
58-
.AddModule<ActionGroupModuleBuilder>(fun a ->
59-
a.AddElement(fun b ->
60-
b
61-
.WithClick(ButtonClickEventType.ReturnValue)
62-
.WithText("点我!")
63-
.WithValue("unique-id")
64-
.WithTheme(ButtonTheme.Primary)
49+
async {
50+
// Bot 永远不应该响应自己的消息
51+
if author.Id <> client.CurrentUser.Id then
52+
if message.Content = "!ping" then
53+
// 创建一个 CardBuilder,卡片将会包含一个文本模块和一个按钮模块
54+
let builder =
55+
CardBuilder()
56+
.WithTheme(CardTheme.Invisible)
57+
.AddModule<SectionModuleBuilder>(fun s -> s.WithText("pong!") |> ignore)
58+
.AddModule<ActionGroupModuleBuilder>(fun a ->
59+
a.AddElement(fun b ->
60+
b
61+
.WithClick(ButtonClickEventType.ReturnValue)
62+
.WithText("点我!")
63+
.WithValue("unique-id")
64+
.WithTheme(ButtonTheme.Primary)
65+
|> ignore)
6566
|> ignore)
66-
|> ignore)
6767

68-
// 发送一条卡片形式的消息,内容包含文本 pong!,以及一个按钮
69-
// 在调用时,需要先调用 .Build() 方法来构建卡片
70-
do! channel.SendCardAsync(builder.Build()) |> Async.AwaitTask |> Async.Ignore
68+
// 发送一条卡片形式的消息,内容包含文本 pong!,以及一个按钮
69+
do! channel.SendCardAsync(builder.Build()) |> Async.AwaitTask |> Async.Ignore
7170
}
71+
|> Async.StartAsTask
72+
:> Task
7273

7374
// 当按钮被点击时,会触发 MessageButtonClicked 事件
7475
let MessageButtonClickedAsync
7576
(value: string)
7677
(user: Cacheable<SocketGuildUser, uint64>)
7778
(message: Cacheable<IMessage, Guid>)
7879
(channel: SocketTextChannel)
79-
: Task =
80-
task {
80+
=
81+
async {
8182
// 检查按钮的值是否为之前的代码中设置的值
8283
if value = "unique-id" then
83-
let! messageEntity = message.GetOrDownloadAsync()
84+
let! messageEntity = message.GetOrDownloadAsync() |> Async.AwaitTask
8485

8586
match messageEntity with
8687
| :? IUserMessage as userMessage ->
@@ -93,8 +94,8 @@ let MessageButtonClickedAsync
9394
else
9495
Console.WriteLine("接收到了一个没有对应处理程序的按钮值!")
9596
}
96-
97-
// 此处列举了 Kook.Net 的 KookSocketClient 的所有事件
97+
|> Async.StartAsTask
98+
:> Task
9899

99100
// BaseKookClient
100101

0 commit comments

Comments
 (0)