public void SynchronizeGuilds()
{
lock (_syncLock)
{
var dbGuilds = this.Database.GetGuilds();
var addedGuilds = new List<Guild>();
var removedGuilds = new List<Guild>();
var addedMembers = new List<GuildMember>();
var removedMembers = new List<GuildMember>();
var acceptedMembers = new List<GuildMember>();
var declinedMembers = new List<GuildMember>();
var updatedMembers = new List<GuildMember>();
// Check for new guilds
foreach (var dbGuild in dbGuilds.Values.Where(a => !a.Disbanded))
{
if (!_guilds.ContainsKey(dbGuild.Id))
addedGuilds.Add(dbGuild);
}
// Check for removed guilds and member changes
foreach (var guild in _guilds.Values)
{
// Check for removed or disbanded guilds
Guild dbGuild;
if (!dbGuilds.TryGetValue(guild.Id, out dbGuild) || dbGuild.Disbanded == true)
{
removedGuilds.Add(guild);
break;
}
// Update guild
guild.LeaderName = dbGuild.LeaderName;
guild.Title = dbGuild.Title;
guild.IntroMessage = dbGuild.IntroMessage;
guild.WelcomeMessage = dbGuild.WelcomeMessage;
guild.LeavingMessage = dbGuild.LeavingMessage;
guild.RejectionMessage = dbGuild.RejectionMessage;
guild.Type = dbGuild.Type;
guild.Visibility = dbGuild.Visibility;
guild.Level = dbGuild.Level;
guild.Options = dbGuild.Options;
// Check members
var members = guild.GetMembers();
var dbMembers = dbGuild.GetMembers();
// Check for new members
foreach (var dbMember in dbMembers.Where(a => a.Rank < GuildMemberRank.Declined))
{
if (!members.Exists(a => a.CharacterId == dbMember.CharacterId))
addedMembers.Add(dbMember);
}
// Check for removed and changed members
foreach (var member in members)
{
// Check if the member was removed or set to declined.
var dbMember = dbGuild.GetMember(member.CharacterId);
if (dbMember == null || (member.Rank != GuildMemberRank.Applied && dbMember.Rank == GuildMemberRank.Declined))
{
removedMembers.Add(member);
}
// Check for accepted members
else if (member.Rank == GuildMemberRank.Applied && dbMember.Rank <= GuildMemberRank.Member)
{
member.Rank = dbMember.Rank;
acceptedMembers.Add(member);
}
// Check for declined members
else if (member.Rank == GuildMemberRank.Applied && dbMember.Rank == GuildMemberRank.Declined)
{
member.Rank = dbMember.Rank;
declinedMembers.Add(member);
}
// Check for rank changes
else if (member.Rank != dbMember.Rank)
{
member.Rank = dbMember.Rank;
updatedMembers.Add(member);
}
}
}
// Add guilds
foreach (var guild in addedGuilds)
{
_guilds[guild.Id] = guild;
this.OnSyncGuildAdded(guild);
}
// Remove guilds
foreach (var guild in removedGuilds)
{
_guilds.Remove(guild.Id);
this.OnSyncGuildRemoved(guild);
}
// Add members
foreach (var member in addedMembers)
{
var guild = _guilds[member.GuildId];
guild.AddMember(member);
this.OnSyncGuildMemberAdded(guild, member);
}
// Remove members
foreach (var member in removedMembers)
{
var guild = _guilds[member.GuildId];
guild.RemoveMember(member);
this.OnSyncGuildMemberRemoved(guild, member);
}
// Accept members
foreach (var member in acceptedMembers)
{
var guild = _guilds[member.GuildId];
this.OnSyncGuildMemberAccepted(guild, member);
}
// Decline members
foreach (var member in declinedMembers)
{
var guild = _guilds[member.GuildId];
this.OnSyncGuildMemberDeclined(guild, member);
}
// Update members
foreach (var member in updatedMembers)
{
var guild = _guilds[member.GuildId];
this.OnSyncGuildMemberUpdated(guild, member);
}
}
}