Подсчет всего времени сколько пользователь провел в голосовом канале дискорд
Думаю, по коду будет не понятно что я написал т.к сама по себе функция большая, постараюсь вкратце рассказать. В общем метод привязан, к ивенту который срабатывает когда пользователь вошел/вышел из голосового канала, так вот когда пользователь зашел первый раз в войс бот записывает в столбец startTime в БД datetime, аналогично когда пользователь первый раз вышел из войса. Когда пользователь зайдет 2 раз войс возьмется его прошлая запись времени и запишется в столбец OldStartTime и начнется новая запись времени аналогично с выходом. Так вот в чем же моя проблема время считывается 1 раз то есть когда я следующий раз зайду в войс время будет другим. Но я думаю мой вопрос все равно не понятен, поэтому скажу по другому как мне сделать счет времени пользователя находящегося в войсе без потери прошлого прогресса.
private async Task CountUserVoiceTime(SocketUser arg, SocketVoiceState stat1, SocketVoiceState stat2)
{
var user = arg as SocketGuildUser;
var UserVoiceTime = VoiceDb.GetUserVoiceTime(user.Id, user.Guild.Id);
if (UserVoiceTime == null)
{
UserVoiceTime = new Voice
{
UserId = user.Id,
GuildId = user.Guild.Id
};
}
DateTime dateTime = new DateTime();
ISocketMessageChannel socketMessageChannel = user.Guild.GetTextChannel(myidchannel);
if(stat1.VoiceChannel?.Name != null && stat2.VoiceChannel?.Name == null)
{
if (UserVoiceTime.endTime == null)
{
UserVoiceTime.endTime = DateTime.Now;
await VoiceDb.StopTimeUser(UserVoiceTime);
await socketMessageChannel.SendMessageAsync("Юзер первый раз покинул войс");
}
else
{
var result = VoiceDb.OldGetUserEndTime(user.Id, user.Guild.Id);
result.OldendTime = result.endTime;
await VoiceDb.OldStopTimeUser(result);
UserVoiceTime.endTime = DateTime.Now;
await VoiceDb.StopTimeUser(UserVoiceTime);
await socketMessageChannel.SendMessageAsync("Юзер покинул войс");
}
}
else
{
if (UserVoiceTime.startTime == dateTime)
{
UserVoiceTime.startTime = DateTime.Now;
await VoiceDb.StartTimeUser(UserVoiceTime);
await socketMessageChannel.SendMessageAsync("Юзер первый раз зашёл в войс");
}
else
{
var result = VoiceDb.OldGetUserStartTime(user.Id, user.Guild.Id);
result.OldstartTime = result.startTime;
UserVoiceTime.startTime = DateTime.Now;
await VoiceDb.OldStartTimeUser(result);
await VoiceDb.StartTimeUser(UserVoiceTime);
await socketMessageChannel.SendMessageAsync("Юзер зашёл в войс");
}
}
await Task.CompletedTask;
}
//запись времени в БД
public static async Task StartTimeUser(Voice user)
{
using var DbContext = new SqlDbContext();
DbContext.Update(user);
await DbContext.SaveChangesAsync();
}
//команда выводящая время пользователя
[Command("usertime")]
public async Task UserTimeCheck()
{
var profile = VoiceDb.GetUserVoiceTime(Context.User.Id, Context.Guild.Id);
var eb = new EmbedBuilder();
if (profile == null)
{
await ReplyAsync($"{Context.User.Username} your time 0 hours 0 minutes 0 second");
TimeSpan total1 = profile.endTime - profile.startTime;
TimeSpan total2 = profile.OldendTime - profile.OldstartTime;
TimeSpan total = total1 - total2;
eb.WithAuthor($"{Context.User.Username} - Your voice time");
eb.WithDescription($"{total.Hours} hrs | {total.Minutes} min | {total.Seconds} sec.");
await ReplyAsync(embed: eb.Build());
}
}