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)); }); }
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); } }