2017-07-30 7 views
1

自動メッセージを設定しようとしています。DiscordSocketClientとDiscord Channel Idが接続され、準備ができているとすれば、そのチャネルにどのようにメッセージを送信しますか?

私が設定しています私のclient私が使用します。

public class Scheduler 
{ 
    private readonly DiscordSocketClient _client; 
    private static Timer _timer; 

    public void Start(object state = null) 
    { 
     Sender.Send(_client); 

     _timer = new Timer(Start, null, (int)Duration.FromMinutes(1).TotalMilliseconds, 0); 
    } 

    public Scheduler(DiscordSocketClient client) 
    { 
     _client = client; 
    } 
} 

た場合:次のようになります

private Task OnClientReady() 
{ 
    var scheduler = new Scheduler(client); 
    scheduler.Start(); 

    return Task.CompletedTask; 
} 

client.Ready += OnClientReady; 

そこから私は私のSchedulerクラスを開始しますタイマーダンプを呼び出すと、clientが私SocketGuildChannelを与える

var channel = client.Guilds 
        .SelectMany(g => g.Channels) 
        .SingleOrDefault(c => c.Id == rotation.ChannelId); 

:私は、このようなSocketChannelともを与える

var channel = client.GetChannel((ulong) rotation.ChannelId); 

:私はこのようなチャネルを取得しようとしている

public static class Sender 
{ 
    public static void Send(DiscordSocketClient client) 
    { 
     var currentLocalDateTime = SystemClock.Instance.InTzdbSystemDefaultZone().GetCurrentLocalDateTime(); 

     var elapsedRotations = new List<Rotations>(); 
     using (var db = new GOPContext()) 
     { 
      elapsedRotations = db.Rotations 
           .Include(r => r.RotationUsers) 
           .Where(r => r.LastNotification == null || 
              Period.Between(r.LastNotification.Value.ToLocalDateTime(), 
                  currentLocalDateTime).Hours >= 23) 
           .ToList(); 
     } 

     foreach (var rotation in elapsedRotations) 
     { 
      var zone = DateTimeZoneProviders.Tzdb.GetZoneOrNull(rotation.Timezone); 
      var zonedDateTime = SystemClock.Instance.InZone(zone).GetCurrentZonedDateTime(); 
      if (zonedDateTime.Hour != 17) 
       continue; 

      //I need to send a message to the channel here. 
      //I have access to the connected/ready client, 
      //and the channel Id which is "rotation.ChannelId" 
     } 
    } 
} 

:以下Senderクラス。これらのどちらも、チャンネルに直接メッセージを送信するオプションはありません。私はこれを行う方法を研究しようとしましたが、何も見つかりませんでした...ドキュメントはこれの例を持っていないようです...

これは簡単なことですが、私は私の知恵はそれで終わる。誰もこれを行う方法を知っていますか?

答えて

1

これは、SocketGuildChannelSocketChannelの両方が音声チャネルまたはテキストチャネルのいずれかになる可能性があるためです。

代わりにあなたがISocketMessageChannelIMessageChannelまたはSocketTextChannel

が、これはあなたが単にSocketChannelあなたが

var channel = client.GetChannel((ulong) rotation.ChannelId); 
var textChannel = channel as IMessageChannel; 
if(textChannel == null) 
    // this was not a text channel, but a voice channel 
else 
    textChannel.SendMessageAsync("This is a text channel"); 
+0

を取得しているが、ヘッドのためにあなたをありがとう唱え取得したいです!私は不満の音声チャンネルを使用したことはないので、私の心を越えたことはありません。与えられた 'SocketGuild'からTextChannelsのリストを取得することもできます。 – Primalpat

関連する問題

 関連する問題