@@ -21,66 +21,67 @@ let config =
21
21
AlwaysDownloadVoiceStates = false ,
22
22
AlwaysDownloadBoostSubscriptions = false ,
23
23
MessageCacheSize = 100 ,
24
- LogLevel = LogSeverity.Debug
24
+ LogLevel = LogSeverity.Debug,
25
+ AutoUpdateChannelPositions = true ,
26
+ AutoUpdateRolePositions = true ,
27
+ StartupCacheFetchMode = StartupCacheFetchMode.Lazy,
28
+ LargeNumberOfGuildsThreshold = 50 u
25
29
)
26
30
27
31
// 在使用完 Kook.Net 的客户端后,建议在应用程序的生命周期结束时进行 Dispose 操作
28
32
// 由于 F# 中 use 绑定在模块中被视为 let 绑定,此处使用 let 来创建一个作用域
29
33
let client = new KookSocketClient( config)
30
34
35
+ // 此处列举了 Kook.Net 的 KookSocketClient 的所有事件
36
+
31
37
// Log 事件,此处以直接输出到控制台为例
32
- let LogAsync ( log : LogMessage ) : Task =
38
+ let LogAsync ( log : LogMessage ) =
33
39
Console.WriteLine( log.ToString())
34
40
Task.CompletedTask
35
41
36
42
// 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
40
45
41
46
// 并不建议以这样的方式实现 Bot 的命令交互功能
42
47
// 请参阅 Kook.Net.Samples.TextCommands 示例项目及其文档
43
48
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)
65
66
|> ignore)
66
- |> ignore)
67
67
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
71
70
}
71
+ |> Async.StartAsTask
72
+ :> Task
72
73
73
74
// 当按钮被点击时,会触发 MessageButtonClicked 事件
74
75
let MessageButtonClickedAsync
75
76
( value : string )
76
77
( user : Cacheable < SocketGuildUser , uint64 >)
77
78
( message : Cacheable < IMessage , Guid >)
78
79
( channel : SocketTextChannel )
79
- : Task =
80
- task {
80
+ =
81
+ async {
81
82
// 检查按钮的值是否为之前的代码中设置的值
82
83
if value = " unique-id" then
83
- let! messageEntity = message.GetOrDownloadAsync()
84
+ let! messageEntity = message.GetOrDownloadAsync() |> Async.AwaitTask
84
85
85
86
match messageEntity with
86
87
| : ? IUserMessage as userMessage ->
@@ -93,8 +94,8 @@ let MessageButtonClickedAsync
93
94
else
94
95
Console.WriteLine( " 接收到了一个没有对应处理程序的按钮值!" )
95
96
}
96
-
97
- // 此处列举了 Kook.Net 的 KookSocketClient 的所有事件
97
+ |> Async.StartAsTask
98
+ :> Task
98
99
99
100
// BaseKookClient
100
101
0 commit comments