我正在用discord.NET API用C#编写一个discordbot。
我想知道我是否可以得到一些关于如何让我的机器人每6小时在一个频道上发布一条消息的建议。
堆栈溢出所需的详细信息:
我已经设置好了命令。我遵循了一个教程,找到了一些代码来走到这一步。我知道我必须使用定时器,但我不知道如何将其连接到discord.NETapi中。
谢谢。
这是我目前掌握的代码。
程序.cshttps://pastebin.com/rMjY8MAE
using Discord;
using Discord.Commands;
using Discord.WebSocket;
using Newtonsoft.Json;
using System;
using System.IO;
using System.Reflection;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using SQLitePCL;
namespace PrayerBot
{
class Program
{
static void Main(string[] args) => new Program().RunBot().GetAwaiter().GetResult();
// Creating the necessary variables
public static DiscordSocketClient _client;
private CommandService _commands;
private IServiceProvider _services;
private BotConfig config;
// Runbot task
public async Task RunBot()
{
_client = new DiscordSocketClient(); // Define _client
_commands = new CommandService(); // Define _commands
_services = new ServiceCollection() // Define _services
.AddSingleton(_client)
.AddSingleton(_commands)
.BuildServiceProvider();
config = JsonConvert.DeserializeObject<BotConfig>(File.ReadAllText("config.json"));
string botToken = config.token; // Make a string for the token
_client.Log += Log; // Logging
await RegisterCommandsAsync(); // Call registercommands
await _client.LoginAsync(TokenType.Bot, botToken); // Log into the bot user
await _client.StartAsync(); // Start the bot user
await _client.SetGameAsync(config.game); // Set the game the bot is playing
await Task.Delay(-1); // Delay for -1 to keep the console window opened
}
private async Task RegisterCommandsAsync()
{
_client.MessageReceived += HandleCommandAsync; // Messagerecieved
await _commands.AddModulesAsync(Assembly.GetEntryAssembly(), null); // Add module to _commands
}
private Task Log(LogMessage arg) // Logging
{
Console.WriteLine(arg); // Print the log to Console
return Task.CompletedTask; // Return with completedtask
}
private async Task HandleCommandAsync(SocketMessage arg)
{
string messageLower = arg.Content.ToLower(); // Convert the message to a Lower
var message = arg as SocketUserMessage; // Create a variable with the message as SocketUserMessage
if (message is null || message.Author.IsBot) return; // Checks if the message is empty or sent by a bot
int argumentPos = 0; // Sets the argpos to 0 (the start of the message)
if (message.HasStringPrefix(config.prefix, ref argumentPos) || message.HasMentionPrefix(_client.CurrentUser, ref argumentPos)) // If the message has the prefix at the start or starts with someone mentioning the bot
{
var context = new SocketCommandContext(_client, message); // Create a variable called context
var result = await _commands.ExecuteAsync(context, argumentPos, _services); // Create a veriable called result
if (!result.IsSuccess) // If the result is unsuccessful
{
Console.WriteLine(result.ErrorReason); // Print the error to console
await message.Channel.SendMessageAsync(result.ErrorReason); // Print the error to the channel where the error was caused (e.g "Unknown Command")
}
}
}
}
class BotConfig
{
public string token { get; set; }
public string prefix { get; set; }
public string game { get; set; }
}
}
命令.cshttps://pastebin.com/1EK3M1Fi
using Discord.Commands;
using Microsoft.Data.Sqlite;
using System;
using System.Threading.Tasks;
namespace PrayerBot
{
public class Commands : ModuleBase<SocketCommandContext>
{
[Command("ping")]
private async Task Ping()
{
await ReplyAsync("Pong! 🏓 **" + Program._client.Latency + "ms**");
}
[Command("help")]
private async Task Help()
{
string returnStr = "Worley Byrd Helpn";
returnStr += "~addprayer prayer - this adds a prayern";
returnStr += "~viewprayers - view prayers that haven't been answeredn";
returnStr += "~answerprayer id# - mark prayer# as answeredn";
await ReplyAsync(returnStr);
}
void setKeyValue(string name, string value)
{
string keyQuery = $"select value from keys where name='{name}'";
string strValue = "";
using (var connection = new SqliteConnection("Data Source=prayers.s3db"))
{
connection.Open();
var command = connection.CreateCommand();
command.CommandText = keyQuery;
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
strValue = reader.GetString(0);
}
}
}
if (String.IsNullOrEmpty(strValue))
{
//insert
string insertQuery = $"insert into keys(name,value) values('{name}','{value}')";
using (var connection = new SqliteConnection("Data Source=prayers.s3db"))
{
connection.Open();
var cmd = connection.CreateCommand();
cmd.CommandText = insertQuery;
cmd.ExecuteNonQuery();
}
}
else
{
//update
string updateQuery = $"update keys set value='{value}' where name='{name}'";
using (var connection = new SqliteConnection("Data Source=prayers.s3db"))
{
connection.Open();
var cmd = connection.CreateCommand();
cmd.CommandText = updateQuery;
cmd.ExecuteNonQuery();
}
}
}
[Command("serverinfo")]
public async Task Serverinfo()
{
await Context.Channel.SendMessageAsync($"This Discord server's name is {Context.Guild}");
}
[Command("posttochannel")]
[Summary("Which channel to post prayers to")]
public Task SetPostToChannel([Remainder][Summary("Set to this channel")] string channel)
{
string serverName = $"{Context.Guild}";
setKeyValue($"posttochannel.{serverName}", channel);
return ReplyAsync("Post Channel set to " + channel);
}
[Command("addprayer")]
[Summary("Add's a prayer to the prayer DB")]
public Task AddPrayerAsync([Remainder][Summary("The prayer to add")] string prayer)
{
string insertPrayer = string.Format("insert into prayers(prayer) values('{0}')", prayer);
using (var connection = new SqliteConnection("Data Source=prayers.s3db"))
{
connection.Open();
var command = connection.CreateCommand();
command.CommandText = insertPrayer;
command.ExecuteNonQuery();
}
return ReplyAsync("Prayer added!");
}
[Command("viewprayers")]
[Summary("Add's a prayer to the prayer DB")]
public Task ListPrayersAsync()
{
string selectPrayers = string.Format("select * from prayers where answered=0");
string resultString = "";
using (var connection = new SqliteConnection("Data Source=prayers.s3db"))
{
connection.Open();
var command = connection.CreateCommand();
command.CommandText = selectPrayers;
using (var reader = command.ExecuteReader())
{
while(reader.Read())
{
var id = reader.GetString(0);
var prayer = reader.GetString(1);
resultString += String.Format("Prayer {0}: {1}n", id, prayer);
}
}
}
return ReplyAsync(resultString);
}
[Command("answerprayer")]
[Summary("Add's a prayer to the prayer DB")]
public Task AnswerPrayerAsync([Remainder][Summary("This prayer has been answered")] string id)
{
string updatePrayer = string.Format("update prayers set answered=1 where id=" + id);
using (var connection = new SqliteConnection("Data Source=prayers.s3db"))
{
connection.Open();
var command = connection.CreateCommand();
command.CommandText = updatePrayer;
command.ExecuteNonQuery();
}
return ReplyAsync(String.Format("Prayer {0} has been answeredn",id));
}
}
}
您需要在代码中使用一个简单的计时器:
myTimer = new System.Timers.Timer(6 * 60 * 60 * 1000); //calculate six hours in milliseconds
myTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
myTimer.Start();
private static void OnTimedEvent(object sender, ElapsedEventArgs e)
{
YourMethod();
}