示例#1
0
        public async Task UserJoinedAsync(SocketGuildUser user)
        {
            var _ = Task.Run(async() =>
            {
                if (!user.Guild.CurrentUser.GuildPermissions.ManageGuild)
                {
                    return;
                }

                var levelConfig = LevelService.TryGetLevelConfig(user.Guild.Id);
                if (levelConfig == null || !levelConfig.Enabled)
                {
                    return;
                }

                var guildObj = LevelService.Database.Load <LevelInviteTracker>(LevelInviteTracker.DocumentName(user.Guild.Id));
                if (guildObj == null || !guildObj.Enabled)
                {
                    return;
                }

                var trackedMatches = new List <TrackedInvite>();

                foreach (var invite in await Context.Guild.GetInvitesAsync())
                {
                    //Ensure the invite is being tracked
                    if (!guildObj.TrackedInvites.TryGetValue(invite.Code, out var trackedInvite))
                    {
                        trackedInvite = new TrackedInvite
                        {
                            InviteCode = invite.Code,
                            JoinCount  = invite.Uses ?? 0,
                            CreatorId  = invite.Inviter.Id
                        };
                        guildObj.TrackedInvites.Add(invite.Code, trackedInvite);
                    }

                    //Ensure invite uses is specified
                    //Ensure user has not joined the server under any other tracked invite.
                    if (invite.Uses.HasValue && trackedInvite.JoinCount < invite.Uses.Value && !guildObj.TrackedInvites.Any(x => x.Value.TrackedUsers.Contains(user.Id)))
                    {
                        trackedInvite.JoinCount = invite.Uses.Value;
                        trackedInvite.TrackedUsers.Add(user.Id);
                        trackedMatches.Add(trackedInvite);
                        guildObj.TrackedInvites[trackedInvite.InviteCode] = trackedInvite;
                    }
                }

                if (trackedMatches.Count > 1 || trackedMatches.Count == 0)
                {
                    return;
                }

                var match   = trackedMatches.First();
                var inviter = user.Guild.GetUser(match.CreatorId);
                if (inviter == null)
                {
                    return;
                }

                var levelUser           = LevelService.GetLevelUser(user.Guild.Id, match.CreatorId);
                levelUser.Item1.UserXP += 100;
                LevelService.Database.Store(levelUser.Item1, LevelUser.DocumentName(levelUser.Item1.UserId, levelUser.Item1.GuildId));

                LevelService.Database.Store(guildObj, LevelInviteTracker.DocumentName(user.Guild.Id));
            });
        }
示例#2
0
        private async Task GuildMemberAddedHandler(SocketGuildUser member)
        {
            using var scope = _serviceProvider.CreateScope();

            var translator = scope.ServiceProvider.GetRequiredService <Translator>();
            await translator.SetContext(member.Guild.Id);

            // Refresh identity memberships
            IdentityManager identityManager = scope.ServiceProvider.GetRequiredService <IdentityManager>();

            foreach (Identity identity in identityManager.GetCurrentIdentities())
            {
                if (identity.GetCurrentUser().Id == member.Id)
                {
                    identity.AddGuildMembership(member);
                }
            }

            // Refresh member cache
            DiscordAPIInterface discordAPI = scope.ServiceProvider.GetRequiredService <DiscordAPIInterface>();

            discordAPI.AddOrUpdateCache(CacheKey.GuildMember(member.Guild.Id, member.Id), new CacheApiResponse(member));

            GuildConfig guildConfig;

            try
            {
                guildConfig = await GuildConfigRepository.CreateDefault(scope.ServiceProvider).GetGuildConfig(member.Guild.Id);
            }
            catch (ResourceNotFoundException)
            {
                return;
            }

            try
            {
                Punishments handler = scope.ServiceProvider.GetRequiredService <Punishments>();
                await handler.HandleMemberJoin(member);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Failed to handle punishment on member join.");
            }

            if (member.IsBot)
            {
                return;
            }

            List <TrackedInvite> newInvites = await FetchInvites(member.Guild);

            TrackedInvite usedInvite = null;

            try
            {
                usedInvite = InviteTracker.GetUsedInvite(member.Guild.Id, newInvites);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Failed to get used invite.");
            }

            InviteTracker.AddInvites(member.Guild.Id, newInvites);

            if (usedInvite != null)
            {
                UserInvite invite = new()
                {
                    GuildId         = member.Guild.Id,
                    JoinedUserId    = member.Id,
                    JoinedAt        = DateTime.UtcNow,
                    InviteIssuerId  = usedInvite.CreatorId,
                    InviteCreatedAt = usedInvite.CreatedAt,
                    TargetChannelId = usedInvite.TargetChannelId,
                    UsedInvite      = $"https://discord.gg/{usedInvite.Code}"
                };

                _logger.LogInformation($"User {member.Username}#{member.Discriminator} joined guild {member.Guild.Name} with ID: {member.Guild.Id} using invite {usedInvite.Code}");

                if (guildConfig.ExecuteWhoisOnJoin && !string.IsNullOrEmpty(guildConfig.ModInternalNotificationWebhook))
                {
                    string message;

                    if (invite.InviteIssuerId != 0 && invite.InviteCreatedAt != null)
                    {
                        message = translator.T().NotificationAutoWhoisJoinWithAndFrom(member, invite.InviteIssuerId, invite.InviteCreatedAt.Value, member.CreatedAt.DateTime, invite.UsedInvite);
                    }
                    else
                    {
                        message = translator.T().NotificationAutoWhoisJoinWith(member, member.CreatedAt.DateTime, invite.UsedInvite);
                    }

                    await discordAPI.ExecuteWebhook(guildConfig.ModInternalNotificationWebhook, null, message, AllowedMentions.None);
                }

                await InviteRepository.CreateDefault(scope.ServiceProvider).CreateInvite(invite);
            }
        }