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);
    }
Example #2
0
        public async Task DeleteSession()
        {
            await sessionService.DeleteSession(socketMessage);

            await roomService.ClearRoom(socketMessage);

            await SessionMessages.SendResponseWithListOfCommands(socketMessage);

            await BotMessages.SendResponseWithInfoAboutOffline(socketMessage);
        }
Example #3
0
        public async Task SendResponseWithSessionAuthor(SocketMessage socketMessage)
        {
            var session = await GetThisRoomChatSession(socketMessage);

            if (session == null)
            {
                await SessionMessages.NotFoundSession(socketMessage);

                return;
            }
            await SessionMessages.AuthorOfSession(socketMessage, session);
        }
Example #4
0
        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();
            }
        }
Example #5
0
        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);
        }
Example #6
0
        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);
        }
Example #7
0
        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);
            }
        }
Example #8
0
        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);
        }
Example #9
0
        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);
        }
Example #10
0
        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...");
            }
        }
Example #11
0
    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());
    }
Example #12
0
        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);
        }
Example #13
0
        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);
        }
Example #14
0
 public async Task HelpSession()
 {
     await SessionMessages.SendResponseWithListOfCommands(socketMessage);
 }
Example #15
0
    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());
    }