示例#1
0
        void RegisterEvents(DiscordClient client)
        {
            client.MessageReactionAdded += async react =>
            {
                if (react.Message == roleOnReact.message)
                {
                    var users   = new List <DiscordMember>(await react.Message.Channel.Guild.GetAllMembersAsync());
                    var reacter = users.Find(o => o.Id == react.User.Id);
                    var emoji   = react.Emoji;

                    if (roleOnReact.ContainsKey(emoji))
                    {
                        await reacter.GrantRoleAsync(roleOnReact[emoji]);
                    }
                }
            };

            client.MessageReactionRemoved += async react =>
            {
                if (react.Message == roleOnReact.message)
                {
                    var users   = new List <DiscordMember>(await react.Message.Channel.Guild.GetAllMembersAsync());
                    var reacter = users.Find(o => o.Id == react.User.Id);
                    var emoji   = react.Emoji;

                    if (roleOnReact.ContainsKey(emoji))
                    {
                        await reacter.RevokeRoleAsync(roleOnReact[emoji]);
                    }
                }
            };

            // Update role color postiion
            client.GuildRoleCreated += async roleCreate => {
                var assoc = new ColoredRoleAssociations();
                var path  = "out/colors.json";
                if (File.Exists(path))
                {
                    while (true)
                    {
                        try {
                            assoc = JsonConvert.DeserializeObject <ColoredRoleAssociations>(File.ReadAllText(path));
                            break;
                        }
                        catch (IOException e) {
                            Log.Warn("Waiting for file lock READ on " + path + "\n" + e.ToString());
                            await Task.Delay(100);
                        }
                    }
                }

                var isOurs = assoc.FindAll(o => o.roleId == roleCreate.Role.Id).Count > 0;
                if (isOurs)
                {
                    var me = await roleCreate.Guild.GetMemberAsync(client.CurrentUser.Id);

                    var myRole = me.Roles.OrderByDescending(o => o.Position).First();
                    var index  = myRole.Position - 1;
                    await me.Guild.UpdateRolePositionAsync(roleCreate.Role, index);

                    Log.Trace("Put role " + roleCreate.Role.Name + ":" + roleCreate.Role.Id + " to position " + index);
                }
            };

            client.ClientErrored += Client_ClientErrored;

            client.MessageCreated += async messageCreate =>
            {
                foreach (var content in messageCreate.Message.Content.Split("\n"))
                {
                    if (!content.StartsWith(prefix))
                    {
                        return;
                    }

                    var parts   = content.ToLower().Trim().Remove(0, 1).Split(" ");
                    var command = parts[0];

                    // +1 because the prefix is 1 character long
                    var args = content.Remove(0, command.Length + 1).Trim().Split(" ");
                    if (controller.ContainsKey(command))
                    {
                        Log.Trace(messageCreate.Author.Username + "#" + messageCreate.Author.Discriminator + ":" + messageCreate.Author.Id + " said: " + messageCreate.Message.Content);
                        try
                        {
                            await controller[command].Execute(
                                bot: this,
                                user: messageCreate.Author,
                                message: messageCreate.Message,
                                args: args
                                );
                        }
                        catch (IndexOutOfRangeException e)
                        {
                            Log.Warn("Wrong number of arguments for command: " + command + "(" + (args.Length) + ")\n" + e);
                        }
                        catch (ArgumentException e)
                        {
                            Log.Warn("Internal error for command: " + command + "(" + (args.Length) + ")\n" + e);
                        }
                    }
                }
            };
        }