Ejemplo n.º 1
0
        private async Task MainAsync()
        {
            instance = this;

            Console.WriteLine("Starting SupportBoi version " + GetVersion() + "...");
            try
            {
                this.Reload();

                // Block this task until the program is closed.
                await Task.Delay(-1);
            }
            catch (Exception e)
            {
                Console.WriteLine("Fatal error:");
                Console.WriteLine(e);
                Console.ReadLine();
            }
        }
Ejemplo n.º 2
0
        internal async Task OnReactionAdded(DiscordClient client, MessageReactionAddEventArgs e)
        {
            if (e.Message.Id != Config.reactionMessage)
            {
                return;
            }

            DiscordGuild  guild  = e.Message.Channel.Guild;
            DiscordMember member = await guild.GetMemberAsync(e.User.Id);

            if (!Config.HasPermission(member, "new") || Database.IsBlacklisted(member.Id))
            {
                return;
            }
            if (reactionTicketCooldowns.ContainsKey(member.Id))
            {
                if (reactionTicketCooldowns[member.Id] > DateTime.Now)
                {
                    return;                                                                    // cooldown has not expired
                }
                else
                {
                    reactionTicketCooldowns.Remove(member.Id);                  // cooldown exists but has expired, delete it
                }
            }


            DiscordChannel category      = guild.GetChannel(Config.ticketCategory);
            DiscordChannel ticketChannel = await guild.CreateChannelAsync("ticket", ChannelType.Text, category);

            if (ticketChannel == null)
            {
                return;
            }

            ulong staffID = 0;

            if (Config.randomAssignment)
            {
                staffID = Database.GetRandomActiveStaff(0)?.userID ?? 0;
            }

            long id = Database.NewTicket(member.Id, staffID, ticketChannel.Id);

            reactionTicketCooldowns.Add(member.Id, DateTime.Now.AddSeconds(10));             // add a cooldown which expires in 10 seconds
            string ticketID = id.ToString("00000");

            await ticketChannel.ModifyAsync(model => model.Name = "ticket-" + ticketID);

            await ticketChannel.AddOverwriteAsync(member, Permissions.AccessChannels, Permissions.None);

            await ticketChannel.SendMessageAsync("Hello, " + member.Mention + "!\n" + Config.welcomeMessage);

            // Remove user's reaction
            await e.Message.DeleteReactionAsync(e.Emoji, e.User);

            // Refreshes the channel as changes were made to it above
            ticketChannel = await SupportBoi.GetClient().GetChannelAsync(ticketChannel.Id);

            if (staffID != 0)
            {
                DiscordEmbed assignmentMessage = new DiscordEmbedBuilder
                {
                    Color       = DiscordColor.Green,
                    Description = "Ticket was randomly assigned to <@" + staffID + ">."
                };
                await ticketChannel.SendMessageAsync(assignmentMessage);

                if (Config.assignmentNotifications)
                {
                    DiscordEmbed message = new DiscordEmbedBuilder
                    {
                        Color       = DiscordColor.Green,
                        Description = "You have been randomly assigned to a newly opened support ticket: " +
                                      ticketChannel.Mention
                    };

                    try
                    {
                        DiscordMember staffMember = await guild.GetMemberAsync(staffID);

                        await staffMember.SendMessageAsync(message);
                    }
                    catch (NotFoundException)
                    {
                    }
                    catch (UnauthorizedException)
                    {
                    }
                }
            }

            // Log it if the log channel exists
            DiscordChannel logChannel = guild.GetChannel(Config.logChannel);

            if (logChannel != null)
            {
                DiscordEmbed logMessage = new DiscordEmbedBuilder
                {
                    Color       = DiscordColor.Green,
                    Description = "Ticket " + ticketChannel.Mention + " opened by " + member.Mention + ".\n",
                    Footer      = new DiscordEmbedBuilder.EmbedFooter {
                        Text = "Ticket " + ticketID
                    }
                };
                await logChannel.SendMessageAsync(logMessage);
            }
        }
Ejemplo n.º 3
0
        internal async Task OnReactionAdded(MessageReactionAddEventArgs e)
        {
            if (e.Message.Id != Config.reactionMessage)
            {
                return;
            }

            DiscordGuild  guild  = e.Message.Channel.Guild;
            DiscordMember member = await guild.GetMemberAsync(e.User.Id);

            if (!Config.HasPermission(member, "new") || Database.IsBlacklisted(member.Id))
            {
                return;
            }

            DiscordChannel category      = guild.GetChannel(Config.ticketCategory);
            DiscordChannel ticketChannel = await guild.CreateChannelAsync("ticket", ChannelType.Text, category);

            if (ticketChannel == null)
            {
                return;
            }

            ulong staffID = 0;

            if (Config.randomAssignment)
            {
                staffID = Database.GetRandomActiveStaff(0)?.userID ?? 0;
            }

            long   id       = Database.NewTicket(member.Id, staffID, ticketChannel.Id);
            string ticketID = id.ToString("00000");
            await ticketChannel.ModifyAsync("ticket-" + ticketID);

            await ticketChannel.AddOverwriteAsync(member, Permissions.AccessChannels, Permissions.None);

            await ticketChannel.SendMessageAsync("Hello, " + member.Mention + "!\n" +
                                                 Config.welcomeMessage);

            // Refreshes the channel as changes were made to it above
            ticketChannel = await SupportBoi.GetClient().GetChannelAsync(ticketChannel.Id);

            if (staffID != 0)
            {
                DiscordEmbed assignmentMessage = new DiscordEmbedBuilder
                {
                    Color       = DiscordColor.Green,
                    Description = "Ticket was randomly assigned to <@" + staffID + ">."
                };
                await ticketChannel.SendMessageAsync("", false, assignmentMessage);

                if (Config.assignmentNotifications)
                {
                    DiscordEmbed message = new DiscordEmbedBuilder
                    {
                        Color       = DiscordColor.Green,
                        Description = "You have been randomly assigned to a newly opened support ticket: " +
                                      ticketChannel.Mention
                    };

                    try
                    {
                        DiscordMember staffMember = await guild.GetMemberAsync(staffID);

                        await staffMember.SendMessageAsync("", false, message);
                    }
                    catch (NotFoundException)
                    {
                    }
                    catch (UnauthorizedException)
                    {
                    }
                }
            }

            // Log it if the log channel exists
            DiscordChannel logChannel = guild.GetChannel(Config.logChannel);

            if (logChannel != null)
            {
                DiscordEmbed logMessage = new DiscordEmbedBuilder
                {
                    Color       = DiscordColor.Green,
                    Description = "Ticket " + ticketChannel.Mention + " opened by " + member.Mention + ".\n",
                    Footer      = new DiscordEmbedBuilder.EmbedFooter {
                        Text = "Ticket " + ticketID
                    }
                };
                await logChannel.SendMessageAsync("", false, logMessage);
            }

            // Adds the ticket to the google sheets document if enabled
            Sheets.AddTicketQueued(member, ticketChannel, id.ToString(), staffID.ToString(),
                                   Database.TryGetStaff(staffID, out Database.StaffMember staffMemberEntry)
                                        ? staffMemberEntry.userID.ToString()
                                        : null);
        }