public List <SessionMessages> ParseSessions() { if (!IsActivityFile) { throw new Exception($"Expected FIT File Type: Activity, recieved File Type: {_messages?.FileId?.GetType()}"); } // When there are no Sessions but there are Records create a Session message to recover as much data as possible if (_messages.Sessions.Count == 0 && _messages.Records.Count > 0) { Dynastream.Fit.DateTime startTime = _messages.Records[0].GetTimestamp(); Dynastream.Fit.DateTime timestamp = _messages.Records[_messages.Records.Count - 1].GetTimestamp(); var session = new SessionMesg(); session.SetStartTime(startTime); session.SetTimestamp(timestamp); session.SetTotalElapsedTime(timestamp.GetTimeStamp() - startTime.GetTimeStamp()); session.SetTotalTimerTime(timestamp.GetTimeStamp() - startTime.GetTimeStamp()); _messages.Sessions.Add(session); } int recordsTaken = 0; var sessions = new List <SessionMessages>(_messages.Sessions.Count); foreach (SessionMesg sessionMesg in _messages.Sessions) { var session = new SessionMessages(sessionMesg) { Laps = _messages.Laps.Skip(sessionMesg.GetFirstLapIndex() ?? 0).Take(sessionMesg.GetNumLaps() ?? 0).ToList(), ClimbPros = _messages.ClimbPros.Where(climb => climb.Within(sessionMesg)).ToList(), Events = _messages.Events.Where(evt => evt.Within(sessionMesg)).ToList(), DeviceInfos = _messages.DeviceInfos.Where(deviceInfo => deviceInfo.Within(sessionMesg)).ToList(), Lengths = _messages.Lengths.Where(length => length.Overlaps(sessionMesg)).ToList(), Records = _messages.Records.Skip(recordsTaken).Where(record => record.Within(sessionMesg)).ToList(), SegmentLaps = _messages.SegmentLaps.Where(segmentLap => segmentLap.Overlaps(sessionMesg)).ToList(), TimerEvents = _messages.Events.Where(evt => evt.GetEvent() == Event.Timer && evt.Within(sessionMesg)).ToList(), FrontGearChangeEvents = _messages.Events.Where(evt => evt.GetEvent() == Event.FrontGearChange && evt.Within(sessionMesg)).ToList(), RearGearChangeEvents = _messages.Events.Where(evt => evt.GetEvent() == Event.RearGearChange && evt.Within(sessionMesg)).ToList(), RiderPositionChangeEvents = _messages.Events.Where(evt => evt.GetEvent() == Event.RiderPositionChange && evt.Within(sessionMesg)).ToList(), Activity = _messages.Activity, FileId = _messages.FileId, RecordFieldNames = _messages.RecordFieldNames, RecordDeveloperFieldNames = _messages.RecordDeveloperFieldNames, UserProfile = _messages.UserProfile, Workout = _messages.Workout, WorkoutSteps = _messages.WorkoutSteps, ZonesTarget = _messages.ZonesTarget, }; recordsTaken += session.Records.Count; sessions.Add(session); } return(sessions); }
public async Task DeleteSession() { await sessionService.DeleteSession(socketMessage); await roomService.ClearRoom(socketMessage); await SessionMessages.SendResponseWithListOfCommands(socketMessage); await BotMessages.SendResponseWithInfoAboutOffline(socketMessage); }
public async Task SendResponseWithSessionAuthor(SocketMessage socketMessage) { var session = await GetThisRoomChatSession(socketMessage); if (session == null) { await SessionMessages.NotFoundSession(socketMessage); return; } await SessionMessages.AuthorOfSession(socketMessage, session); }
public static void Main(string[] args) { SessionMessages = new(); try { Console.WriteLine("Input your local port: "); int localPort = int.Parse(Console.ReadLine() ?? throw new ArgumentException()); Console.WriteLine("Input remote port: "); int remotePort = int.Parse(Console.ReadLine() ?? throw new ArgumentException()); IPEndPoint localIpEndPoint = new IPEndPoint(IPAddress.Parse(IpAddress), localPort); IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Parse(IpAddress), remotePort); string uid = Guid.NewGuid().ToString(); CurPerson = new Person(uid, localIpEndPoint, remoteIpEndPoint); ListeningSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); ListeningSocket.Bind(CurPerson.LocalIp); Console.WriteLine($"Hi! Your unique identifier: {CurPerson.Id}, and endpoint: {CurPerson.LocalIp}. RemoteEndPoint: {CurPerson.RemoteIp}"); Task listening = new Task(TryConnect); listening.Start(); Task checker = new Task(Check); checker.Start(); while (true) { string message = Console.ReadLine(); Console.WriteLine(); if (message == "exit") { break; } message = CurPerson.Id + " - " + message + "\n"; SessionMessages.Add(message); Send(message); } } catch (Exception e) { Console.WriteLine(e.Message); Console.ReadLine(); } finally { Close(); } }
public async Task ClearRoom() { if (SessionService.GetThisRoomChatSession(socketMessage) != null) { await RoomMessages.CannotClearRoomBcsActiveSession(socketMessage); return; } await roomService.ClearRoom(socketMessage); await SessionMessages.SendResponseWithListOfCommands(socketMessage); await BotMessages.SendResponseWithInfoAboutOffline(socketMessage); }
public async Task StartSession() { if (SessionHelper.IsSessionInThisRoom(socketMessage, sessionService.ChatSessions)) { await SessionMessages.CannotCreateSessionBecauseOtherUser(socketMessage); return; } await roomService.ClearRoom(socketMessage); await sessionService.CreateNewSession(socketMessage); await SessionMessages.SendResponseWithListOfCommands(socketMessage); await BotMessages.SendResponseWithInfoAboutOffline(socketMessage); }
public async Task CreateNewSession(SocketMessage socketMessage) { var learnFaster = socketMessage.Content.Contains(" -learn faster"); var settings = new SessionSettings($"{Userhelper.GetFullUsername(socketMessage)}--{socketMessage.Channel.Name}", learnFaster); var newSession = new ChatSession(Userhelper.GetFullUsername(socketMessage), socketMessage.Channel.Name, settings); chatSessions.Add(newSession); await SessionMessages.CreatedSession(socketMessage, newSession); if (learnFaster) { await SessionMessages.LearnFasterModeActivated(socketMessage); } }
public async Task ReadyToMerge(SocketMessage socketMessage, IMessageChannel messageChannel) { var session = await GetThisRoomChatSession(socketMessage); if (session == null) { return; } if (session.SessionOwner != Userhelper.GetFullUsername(socketMessage) && !Userhelper.IsAdmin(socketMessage)) { await SessionMessages.CannotSetAsReadyToMerge(socketMessage, session); return; } await SessionMessages.ReadyToMergeSession(socketMessage, session, messageChannel); }
public async Task DeleteSession(SocketMessage socketMessage) { var session = await GetThisRoomChatSession(socketMessage); if (session == null) { return; } if (session.SessionOwner != Userhelper.GetFullUsername(socketMessage) && !Userhelper.IsAdmin(socketMessage)) { await SessionMessages.CannotDeleteSessionBcsPermission(socketMessage, session); return; } session.RoboChat.DeleteSession(); chatSessions.Remove(session); await SessionMessages.DeletedSession(socketMessage, session); }
static void Listening() { try { string msg = CurPerson.Id + " joined!\n"; Send(msg); while (true) { StringBuilder builder = new StringBuilder(); int bytes = 0; byte[] data = new byte[256]; EndPoint remoteIp = new IPEndPoint(IPAddress.Any, CurPerson.RemoteIp.Port); do { bytes = ListeningSocket.ReceiveFrom(data, ref remoteIp); builder.Append(Encoding.Unicode.GetString(data, 0, bytes)); } while (ListeningSocket.Available > 0); if (State == State.pending) { State = State.active; RecreateHistory(); } IPEndPoint fullEndPoint = remoteIp as IPEndPoint; if (fullEndPoint?.Port == CurPerson.RemoteIp.Port && builder.ToString() != String.Empty) { SessionMessages.Add(builder.ToString()); Console.WriteLine(builder.ToString()); } } } catch (Exception) { State = State.pending; //Console.WriteLine("Client is off line, trying to connect..."); } }
static public string LengthsToCSV(SessionMessages session) { var isMetric = session.Session.GetPoolLengthUnit() == DisplayMeasure.Metric; var unitConversion = isMetric ? 1.0 : MetersToYards; double poolLength = session.Session.GetPoolLength() ?? DefaultPoolLength; var poolLengthString = $"{Math.Round(poolLength * unitConversion)}"; var totalDistance = Math.Round((session.Session.GetNumActiveLengths() ?? 0) * poolLength * unitConversion); var stringBuilder = new StringBuilder(); // Add a comment row with: Sport Type, Sub Sport, Date/Time, Total Distance, Pool Length, Units, Calories, Duration (Seconds) stringBuilder.AppendLine($"#Lengths,{session.Session.GetSport().ToString()},{session.Session.GetSubSport().ToString()},{session.Session.GetStartTime().GetDateTime().ToString("yyyy-MM-dd HH:mm:ss")},{totalDistance},{poolLengthString},{(isMetric ? "meters" : "yards")},{session.Session.GetTotalCalories() ?? 0},{session.Session.GetTotalElapsedTime() ?? 0}"); // Create the header row stringBuilder.AppendLine($"LENGTH TYPE,DURATION (seconds),DISTANCE ({(isMetric ? "meters" : "yards")}),PACE,STOKE COUNT,SWOLF,DPS,STROKE RATE,STROKE TYPE"); foreach (LengthMesg length in session.Lengths) { var type = length.GetLengthType() ?? LengthType.Invalid; float elapsedTime = length.GetTotalElapsedTime() ?? 0; double speed = (length.GetAvgSpeed() ?? 0) * unitConversion; ushort?totalStrokes = length.GetTotalStrokes(); var swolf = elapsedTime + (totalStrokes ?? 0); double?distancePerStroke = totalStrokes.HasValue ? Math.Round(poolLength * unitConversion / totalStrokes ?? 1, 2) : (double?)null; stringBuilder.Append($"{type.ToString()},"); stringBuilder.Append($"{elapsedTime},"); stringBuilder.Append($"{(type == LengthType.Active ? poolLengthString : "")},"); stringBuilder.Append($"{(type == LengthType.Active ? Math.Round(speed, 2).ToString() : "")},"); stringBuilder.Append($"{(type == LengthType.Active ? totalStrokes.ToString() : "")},"); stringBuilder.Append($"{(type == LengthType.Active ? swolf.ToString() : "")},"); stringBuilder.Append($"{(type == LengthType.Active ? distancePerStroke.ToString() : "")},"); stringBuilder.Append($"{length.GetAvgSwimmingCadence().ToString() ?? ""},"); stringBuilder.Append($"{length.GetSwimStroke().ToString() ?? ""}"); stringBuilder.AppendLine(); } return(stringBuilder.ToString()); }
public async Task SendResponseToUser(SocketMessage socketMessage, string message) { var currentSession = chatSessions.Where(x => x.RoomName == socketMessage.Channel.Name) .FirstOrDefault(x => x.SessionOwner == Userhelper.GetFullUsername(socketMessage)); if (currentSession == null) { await SessionMessages.NotFoundSession(socketMessage); return; } var response = currentSession.RoboChat.SendMessage(socketMessage.Author.Username, message); if (response.StartsWith("/")) { response = response.TrimStart("/".ToCharArray()); } await socketMessage.Channel.SendMessageAsync(response); PrintToConsole.PrintMessages(socketMessage, message, response); }
public async Task MergeSession(SocketMessage socketMessage) { var session = await GetThisRoomChatSession(socketMessage); if (session == null) { return; } if (!Userhelper.IsAdmin(socketMessage)) { await SessionMessages.CannotMergeBcsPermission(socketMessage, session); return; } if (session.RoboChat.NumberOfMessagesInCurrentSession == 0) { await SessionMessages.CannotMergeBcsEmptySession(socketMessage, session); return; } session.RoboChat.MergeSession(); await SessionMessages.MergedSession(socketMessage, session); }
public async Task HelpSession() { await SessionMessages.SendResponseWithListOfCommands(socketMessage); }
static public string RecordsToCSV(SessionMessages session) { var stringBuilder = new StringBuilder(); // Add a comment row with: Sport Type, Sub Sport, Date/Time, Total Distance (meters), Calories, Duration (seconds) stringBuilder.AppendLine($"#Records,{session.Session.GetSport().ToString()},{session.Session.GetSubSport().ToString()},{session.Session.GetStartTime().GetDateTime().ToString("yyyy-MM-dd HH:mm:ss")},{session.Session.GetTotalDistance()},{session.Session.GetTotalCalories() ?? 0},{session.Session.GetTotalElapsedTime() ?? 0}"); // Create the header row stringBuilder.Append("Seconds,"); stringBuilder.Append($"{string.Join(",", session.RecordFieldNames)},"); if (session.RecordDeveloperFieldNames.Count > 0) { stringBuilder.Append($"developerdata_{string.Join(",developerdata_", session.RecordDeveloperFieldNames).Replace(" ","_")},"); } stringBuilder.Append("TimerEvent,Lap"); stringBuilder.AppendLine(); var lapQueue = new Queue <LapMesg>(session.Laps); var lap = lapQueue.Count > 0 ? lapQueue.Dequeue() : null; var lapId = 1; uint firstTimeStamp = session.Records[0].GetTimestamp().GetTimeStamp(); foreach (ExtendedRecordMesg record in session.Records) { while (lap != null && record.GetTimestamp().GetTimeStamp() > lap.GetTimestamp().GetTimeStamp()) { lap = lapQueue.Count > 0 ? lapQueue.Dequeue() : null; lapId++; } stringBuilder.Append($"{record.GetTimestamp().GetTimeStamp() - firstTimeStamp},"); foreach (string fieldName in session.RecordFieldNames) { var numFieldValues = record.GetNumFieldValues(fieldName); if (numFieldValues > 1) { for (int i = 0; i < numFieldValues; i++) { stringBuilder.Append($"{record.GetFieldValue(fieldName, i)}|"); } stringBuilder.Length--; stringBuilder.Append($","); } else { stringBuilder.Append($"{record.GetFieldValue(fieldName)},"); } } foreach (string devFieldName in session.RecordDeveloperFieldNames) { DeveloperField devField = record.DeveloperFields.Where(f => f.Name == devFieldName).FirstOrDefault(); if (devField != null) { stringBuilder.Append($"{devField.GetValue(0)}"); } stringBuilder.Append(","); } stringBuilder.Append($"{(record.EventType == EventType.Invalid ? "" : record.EventType.ToString())},"); stringBuilder.Append($"{lapId}"); stringBuilder.AppendLine(); } return(stringBuilder.ToString()); }