1
0
Fork 0
vrobot3/Source/Client/Discord.cs

135 lines
4.0 KiB
C#

//-----------------------------------------------------------------------------
//
// Copyright © 2016 Project Golan
//
// See "LICENSE" for more information.
//
//-----------------------------------------------------------------------------
//
// Discord client.
//
//-----------------------------------------------------------------------------
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
namespace ProjectGolan.Vrobot3.Client
{
public class ClientDiscord : IChatClient
{
public Discord.DiscordClient client;
public Discord.Server server;
public ClientDiscord(Bot bot) : base(bot)
{
this.client = new Discord.DiscordClient();
this.info.hasAudio = true;
this.info.hasColors = false;
this.info.hasNewlines = true;
this.info.messageSafeMaxLen = 1777;
this.info.shortMessages = false;
this.client.MessageReceived += (sender, evt) =>
{
if(!evt.Message.IsAuthor && !evt.User.IsBot &&
(bot.info.channels == null ||
bot.info.channels.Contains("#" + evt.Channel.Name)) &&
evt.Server.Id.ToString() == bot.info.serverAddr)
{
var usr = new User{};
var channel = new Channel{};
usr.hostname = evt.User.Id.ToString();
usr.name = evt.User.Nickname ?? evt.User.Name;
channel.id = evt.Channel.Id;
channel.name = "#" + evt.Channel.Name;
bot.onMessage(usr, channel, evt.Message.Text);
}
};
}
public Discord.User getUser(User usr)
{
if(server == null)
server = client.GetServer(ulong.Parse(bot.info.serverAddr));
return server.GetUser(ulong.Parse(usr.hostname));
}
public bool checkRole(User usr, String[] strings)
{
var duser = getUser(usr);
foreach(var str in strings)
{
if(str[0] == '#')
{
var sel =
from role in duser.Roles
let strn = str.Substring(1)
where role.Name == strn
select role;
if(sel.Any())
return true;
}
else if(usr.hostname == str)
return true;
}
return false;
}
public override void connect()
{
Console.WriteLine("{0}: Creating connection.", bot.info.serverName);
client.ExecuteAndWait(async () =>
{
await client.Connect(bot.info.serverPass, Discord.TokenType.Bot);
client.SetGame("vrobot 3.1 series");
});
}
public override void disconnect()
{
if(client != null)
{
client.Disconnect();
client = null;
}
}
public override void sendAction(Channel channel, String msg) =>
client.GetChannel(channel.id)?.SendMessage(
"_" + Discord.Format.Escape(msg ?? String.Empty) + "_");
public override void sendMessage(Channel channel, String msg) =>
client.GetChannel(channel.id)?.SendMessage(Discord.Format.Escape(msg ?? String.Empty));
public override void sendMessageRaw(Channel channel, String msg) =>
sendMessage(channel,
"```" + Discord.Format.Escape(msg ?? String.Empty) + "```");
public override Channel getChannel(ulong id)
{
var dchannel = client.GetChannel(id);
var channel = new Channel{};
channel.id = dchannel.Id;
channel.name = "#" + dchannel.Name;
return channel;
}
public override bool userPermitted(User usr, BotRole role) =>
role == BotRole.User ||
(role == BotRole.HalfAdmin && checkRole(usr, bot.info.roles.halfadmin)) ||
(role == BotRole.Admin && checkRole(usr, bot.info.roles.admin));
}
}
// EOF