public static async Task <string> GetAppJwtAsync(bool online)
        {
            try
            {
                if (online)
                {
                    long seconds = SoftwareCoUtil.GetNowInSeconds();
                    HttpResponseMessage response = await SoftwareHttpManager.SendRequestAsync(
                        HttpMethod.Get, "/data/apptoken?token=" + seconds, null);

                    if (SoftwareHttpManager.IsOk(response))
                    {
                        string responseBody = await response.Content.ReadAsStringAsync();

                        IDictionary <string, object> jsonObj = (IDictionary <string, object>)SimpleJson.DeserializeObject(responseBody, new Dictionary <string, object>());
                        jsonObj.TryGetValue("jwt", out object jwtObj);
                        string app_jwt = (jwtObj == null) ? null : Convert.ToString(jwtObj);
                        return(app_jwt);
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error("GetAppJwtAsync, error: " + ex.Message, ex);
            }

            return(null);
        }
        public static async void SendHeartbeat(string reason)
        {
            string jwt    = GetJwt();
            bool   online = await IsOnlineAsync();

            if (online && jwt != null)
            {
                string version = Constants.EditorVersion;

                JsonObject jsonObj = new JsonObject();
                jsonObj.Add("version", SoftwareCoPackage.GetVersion());
                jsonObj.Add("os", SoftwareCoPackage.GetOs());
                jsonObj.Add("pluginId", Constants.PluginId);
                jsonObj.Add("start", SoftwareCoUtil.getNowInSeconds());
                jsonObj.Add("trigger_annotation", reason);
                jsonObj.Add("hostname", SoftwareCoUtil.getHostname());

                string api      = "/data/heartbeat";
                string jsonData = jsonObj.ToString();
                HttpResponseMessage response = await SoftwareHttpManager.SendRequestAsync(HttpMethod.Post, api, jsonData, jwt);

                if (!SoftwareHttpManager.IsOk(response))
                {
                    Logger.Warning("Code Time: Unable to send heartbeat");
                }
            }
        }
        public async Task UpdateSessionSummaryFromServerAsync()
        {
            object jwt = FileManager.getItem("jwt");

            if (jwt != null)
            {
                string api = "/sessions/summary?refresh=true";
                HttpResponseMessage response = await SoftwareHttpManager.SendRequestAsync(HttpMethod.Get, api, jwt.ToString());

                if (SoftwareHttpManager.IsOk(response))
                {
                    SessionSummary summary      = SessionSummaryManager.Instance.GetSessionSummayData();
                    string         responseBody = await response.Content.ReadAsStringAsync();

                    IDictionary <string, object> jsonObj = (IDictionary <string, object>)SimpleJson.DeserializeObject(responseBody, new Dictionary <string, object>());
                    if (jsonObj != null)
                    {
                        try
                        {
                            SessionSummary incomingSummary = summary.GetSessionSummaryFromDictionary(jsonObj);
                            summary.CloneSessionSummary(incomingSummary);
                            SessionSummaryManager.Instance.SaveSessionSummaryToDisk(summary);

                            DispatchUpdatesProcessorAsync();
                        } catch (Exception e)
                        {
                            Logger.Error("failed to read json: " + e.Message);
                        }
                    }

                    package.RebuildMenuButtonsAsync();
                }
            }
        }
        public static async Task <bool> IsLoggedOn(bool online)
        {
            try
            {
                string jwt = FileManager.getItemAsString("jwt");
                if (online && jwt != null)
                {
                    User user = await GetUserAsync(online);

                    if (user != null && SoftwareCoUtil.IsValidEmail(user.email))
                    {
                        FileManager.setItem("name", user.email);
                        FileManager.setItem("jwt", user.plugin_jwt);
                        lastJwt = user.plugin_jwt;
                        return(true);
                    }

                    string api = "/users/plugin/state";
                    HttpResponseMessage response = await SoftwareHttpManager.SendRequestAsync(HttpMethod.Get, api, jwt);

                    if (SoftwareHttpManager.IsOk(response))
                    {
                        string responseBody = await response.Content.ReadAsStringAsync();

                        IDictionary <string, object> jsonObj = (IDictionary <string, object>)SimpleJson.DeserializeObject(responseBody, new Dictionary <string, object>());
                        if (jsonObj != null)
                        {
                            jsonObj.TryGetValue("state", out object stateObj);
                            string state = (stateObj == null) ? "NONE" : Convert.ToString(stateObj);
                            jsonObj.TryGetValue("jwt", out object pluginJwtObj);
                            string pluginJwt = (pluginJwtObj == null) ? null : Convert.ToString(pluginJwtObj);
                            if (state.Equals("OK") && pluginJwt != null)
                            {
                                jsonObj.TryGetValue("email", out object nameObj);
                                string name = (nameObj == null) ? null : Convert.ToString(nameObj);
                                if (name != null)
                                {
                                    FileManager.setItem("name", name);
                                }
                                FileManager.setItem("jwt", pluginJwt);
                                lastJwt = pluginJwt;
                            }
                            else if (state.Equals("NOT_FOUND"))
                            {
                                FileManager.setItem("jwt", null);
                                lastJwt = null;
                            }
                        }
                    }
                }
                FileManager.setItem("name", null);
            }
            catch (Exception ex)
            {
                //
            }

            return(false);
        }
        public static async Task <string> CreateAnonymousUserAsync(bool online)
        {
            // get the app jwt
            try
            {
                string app_jwt = await GetAppJwtAsync(online);

                if (app_jwt != null && online)
                {
                    string creation_annotation = "NO_SESSION_FILE";
                    string osUsername          = Environment.UserName;
                    string timezone            = "";
                    if (TimeZone.CurrentTimeZone.DaylightName != null &&
                        TimeZone.CurrentTimeZone.DaylightName != TimeZone.CurrentTimeZone.StandardName)
                    {
                        timezone = TimeZone.CurrentTimeZone.DaylightName;
                    }
                    else
                    {
                        timezone = TimeZone.CurrentTimeZone.StandardName;
                    }

                    JsonObject jsonObj = new JsonObject();
                    jsonObj.Add("timezone", timezone);
                    jsonObj.Add("username", osUsername);
                    jsonObj.Add("hostname", SoftwareCoUtil.getHostname());
                    jsonObj.Add("creation_annotation", creation_annotation);

                    string api      = "/data/onboard";
                    string jsonData = jsonObj.ToString();
                    HttpResponseMessage response = await SoftwareHttpManager.SendRequestAsync(HttpMethod.Post, api, jsonData, app_jwt);

                    if (SoftwareHttpManager.IsOk(response))
                    {
                        string responseBody = await response.Content.ReadAsStringAsync();

                        IDictionary <string, object> respObj = (IDictionary <string, object>)SimpleJson.DeserializeObject(responseBody, new Dictionary <string, object>());
                        respObj.TryGetValue("jwt", out object jwtObj);
                        string jwt = (jwtObj == null) ? null : Convert.ToString(jwtObj);
                        if (jwt != null)
                        {
                            FileManager.setItem("jwt", jwt);
                            return(jwt);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error("CreateAnonymousUserAsync, error: " + ex.Message, ex);
            }


            return(null);
        }
        public static async void SendOfflinePluginBatchData()
        {
            string MethodName = "SendOfflineData";

            Logger.Info(DateTime.Now.ToString());
            bool online = await SoftwareUserSession.IsOnlineAsync();

            if (!online)
            {
                return;
            }

            int batch_limit = 5;
            HttpResponseMessage response    = null;
            string        jsonData          = "";
            List <string> offlinePluginData = FileManager.GetOfflinePayloadList();
            List <string> batchList         = new List <string>();

            if (offlinePluginData != null && offlinePluginData.Count > 0)
            {
                for (int i = 0; i < offlinePluginData.Count; i++)
                {
                    string line = offlinePluginData[i];
                    if (i >= batch_limit)
                    {
                        // send this batch off
                        jsonData = "[" + string.Join(",", batchList) + "]";
                        response = await SoftwareHttpManager.SendRequestAsync(HttpMethod.Post, "/data/batch", jsonData);

                        if (!SoftwareHttpManager.IsOk(response))
                        {
                            // there was an error, don't delete the offline data
                            return;
                        }
                        batchList.Clear();
                    }
                    batchList.Add(line);
                }

                if (batchList.Count > 0)
                {
                    jsonData = "[" + string.Join(",", batchList) + "]";
                    response = await SoftwareHttpManager.SendRequestAsync(HttpMethod.Post, "/data/batch", jsonData);

                    if (!SoftwareHttpManager.IsOk(response))
                    {
                        // there was an error, don't delete the offline data
                        return;
                    }
                }

                // delete the file
                File.Delete(FileManager.getSoftwareDataStoreFile());
            }
        }
예제 #7
0
        /**
         * Get the latest repo commit
         **/
        public async Task <RepoCommit> GetLatestCommitAsync(string projectDir)
        {
            try
            {
                if (!SoftwareCoUtil.IsGitProject(projectDir))
                {
                    return(null);
                }
                RepoResourceInfo info = GitUtilManager.GetResourceInfo(projectDir, false);

                if (info != null && info.identifier != null)
                {
                    string identifier = info.identifier;
                    if (identifier != null && !identifier.Equals(""))
                    {
                        string tag    = info.tag;
                        string branch = info.branch;

                        string qryString = "?identifier=" + identifier;
                        qryString += "&tag=" + tag;
                        qryString += "&branch=" + branch;

                        HttpResponseMessage response = await SoftwareHttpManager.SendRequestAsync(
                            HttpMethod.Get, "/commits/latest?" + qryString, null);

                        if (SoftwareHttpManager.IsOk(response))
                        {
                            // get the json data
                            string responseBody = await response.Content.ReadAsStringAsync();

                            IDictionary <string, object> jsonObj = (IDictionary <string, object>)SimpleJson.DeserializeObject(responseBody, new Dictionary <string, object>());

                            jsonObj.TryGetValue("commitId", out object commitIdObj);
                            string commitId = (commitIdObj == null) ? "" : Convert.ToString(commitIdObj);

                            jsonObj.TryGetValue("message", out object messageObj);
                            string message = (messageObj == null) ? "" : Convert.ToString(messageObj);

                            jsonObj.TryGetValue("message", out object timestampObj);
                            long timestamp = (timestampObj == null) ? 0L : Convert.ToInt64(timestampObj);

                            RepoCommit repoCommit = new RepoCommit(commitId, message, timestamp);
                            return(repoCommit);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error("GetLatestCommitAsync ,error: " + ex.Message, ex);
            }
            return(null);
        }
        private static async Task <SessionSummaryResult> GetSessionSummaryStatusAsync(bool forceRefresh = false)
        {
            SessionSummaryResult sessionSummaryResult = new SessionSummaryResult();

            _sessionSummary = getSessionSummayData();

            //if (SoftwareCoUtil.SessionSummaryFileExists())
            //{

            if (_sessionSummary.currentDayMinutes == 0 || forceRefresh)
            {
                bool online = await SoftwareUserSession.IsOnlineAsync();

                if (!online)
                {
                    sessionSummaryResult.sessionSummary = _sessionSummary;
                    sessionSummaryResult.status         = "OK";
                    updateStatusBarWithSummaryData();
                    return(sessionSummaryResult);
                }
                HttpResponseMessage response = await SoftwareHttpManager.SendRequestAsync(HttpMethod.Get, "/sessions/summary", null);

                if (SoftwareHttpManager.IsOk(response))
                {
                    string responseBody = await response.Content.ReadAsStringAsync();

                    IDictionary <string, object> jsonObj = (IDictionary <string, object>)SimpleJson.DeserializeObject(responseBody);
                    _sessionSummary = DictionaryToObject <SessionSummary>(jsonObj);

                    saveSessionSummaryToDisk(_sessionSummary);

                    updateStatusBarWithSummaryData();

                    sessionSummaryResult.sessionSummary = _sessionSummary;
                    sessionSummaryResult.status         = "OK";
                }
            }
            else
            {
                updateStatusBarWithSummaryData();
            }

            //}
            //else
            //{
            //    updateStatusBarWithSummaryData();
            //}

            sessionSummaryResult.sessionSummary = _sessionSummary;
            sessionSummaryResult.status         = "OK";
            return(sessionSummaryResult);
        }
예제 #9
0
        /**
         * Get the latest repo commit
         **/
        public async Task <RepoCommit> GetLatestCommitAsync(string projectDir)
        {
            if (projectDir == null || projectDir.Equals(""))
            {
                return(null);
            }

            IDictionary <string, string> resourceInfo = this.GetResourceInfo(projectDir);

            if (resourceInfo != null && resourceInfo.ContainsKey("identifier"))
            {
                string identifier = "";
                resourceInfo.TryGetValue("identifier", out identifier);
                if (identifier != null && !identifier.Equals(""))
                {
                    string tag = "";
                    resourceInfo.TryGetValue("tag", out tag);
                    string branch = "";
                    resourceInfo.TryGetValue("branch", out branch);

                    string qryString = "?identifier=" + identifier;
                    qryString += "&tag=" + tag;
                    qryString += "&branch=" + branch;

                    HttpResponseMessage response = await SoftwareHttpManager.SendRequestAsync(
                        HttpMethod.Get, "/commits/latest?" + qryString, null);

                    if (SoftwareHttpManager.IsOk(response))
                    {
                        // get the json data
                        string responseBody = await response.Content.ReadAsStringAsync();

                        IDictionary <string, object> jsonObj = (IDictionary <string, object>)SimpleJson.DeserializeObject(responseBody);

                        jsonObj.TryGetValue("commitId", out object commitIdObj);
                        string commitId = (commitIdObj == null) ? "" : Convert.ToString(commitIdObj);

                        jsonObj.TryGetValue("message", out object messageObj);
                        string message = (messageObj == null) ? "" : Convert.ToString(messageObj);

                        jsonObj.TryGetValue("message", out object timestampObj);
                        long timestamp = (timestampObj == null) ? 0L : Convert.ToInt64(timestampObj);

                        RepoCommit repoCommit = new RepoCommit(commitId, message, timestamp);
                        return(repoCommit);
                    }
                }
            }
            return(null);
        }
        public static async Task <bool> IsOnlineAsync()
        {
            long nowInSec         = SoftwareCoUtil.getNowInSeconds();
            long thresholdSeconds = nowInSec - lastOnlineCheck;

            if (thresholdSeconds > 60)
            {
                // 3 second timeout
                HttpResponseMessage response = await SoftwareHttpManager.SendRequestAsync(HttpMethod.Get, "/ping", null, 3, null, true /*isOnlineCheck*/);

                isOnline        = SoftwareHttpManager.IsOk(response);
                lastOnlineCheck = nowInSec;
            }

            return(isOnline);
        }
        private static async Task <User> GetUserAsync(bool online)
        {
            string jwt = FileManager.getItemAsString("jwt");

            try
            {
                if (jwt != null && online)
                {
                    string api = "/users/me";
                    HttpResponseMessage response = await SoftwareHttpManager.SendRequestAsync(HttpMethod.Get, api, jwt);

                    if (SoftwareHttpManager.IsOk(response))
                    {
                        string responseBody = await response.Content.ReadAsStringAsync();

                        IDictionary <string, object> jsonObj = (IDictionary <string, object>)SimpleJson.DeserializeObject(responseBody, new Dictionary <string, object>());
                        if (jsonObj != null)
                        {
                            jsonObj.TryGetValue("data", out object userObj);
                            if (userObj != null)
                            {
                                IDictionary <string, object> userData = (IDictionary <string, object>)userObj;

                                userData.TryGetValue("email", out object emailObj);
                                string email = (emailObj == null) ? null : Convert.ToString(emailObj);
                                userData.TryGetValue("plugin_jwt", out object pluginJwtObj);
                                string pluginJwt = (pluginJwtObj == null) ? null : Convert.ToString(pluginJwtObj);
                                userData.TryGetValue("id", out object idObj);
                                long userId = (idObj == null) ? 0L : Convert.ToInt64(idObj);

                                User user = new User();
                                user.email      = email;
                                user.plugin_jwt = pluginJwt;
                                user.id         = userId;
                                return(user);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error("GetUserAsync, error: " + ex.Message, ex);
            }

            return(null);
        }
        private async void SendOfflineData(object stateinfo)
        {
            Logger.Info(DateTime.Now.ToString());
            bool online = await SoftwareUserSession.IsOnlineAsync();

            if (!online)
            {
                return;
            }

            string datastoreFile = SoftwareCoUtil.getSoftwareDataStoreFile();

            if (File.Exists(datastoreFile))
            {
                // get the content
                string[] lines = File.ReadAllLines(datastoreFile);

                if (lines != null && lines.Length > 0)
                {
                    List <String> jsonLines = new List <string>();
                    foreach (string line in lines)
                    {
                        if (line != null && line.Trim().Length > 0)
                        {
                            jsonLines.Add(line);
                        }
                    }
                    string jsonContent           = "[" + string.Join(",", jsonLines) + "]";
                    HttpResponseMessage response = await SoftwareHttpManager.SendRequestAsync(HttpMethod.Post, "/data/batch", jsonContent);

                    if (SoftwareHttpManager.IsOk(response))
                    {
                        // delete the file
                        File.Delete(datastoreFile);
                    }
                }
            }

            ÇlearSessionSummaryData();

            fetchSessionSummaryInfoAsync(true);
        }
예제 #13
0
        public async Task SendOfflineEvents()
        {
            List <CodeTimeEvent> existingList = GetCodeTimeEventList();

            if (existingList.Count > 0)
            {
                JsonArray jsonArray = new JsonArray(existingList.Count);
                foreach (CodeTimeEvent existingEvent in existingList)
                {
                    jsonArray.Add(existingEvent.GetAsJson());
                }
                string eventData             = jsonArray.ToString();
                HttpResponseMessage response = await SoftwareHttpManager.SendRequestAsync(HttpMethod.Post, "/data/event", eventData);

                if (SoftwareHttpManager.IsOk(response))
                {
                    ClearCodeTimeEventDataSummary();
                }
            }
        }
예제 #14
0
        public async Task SendTimeDataAsync()
        {
            string timeDataSummary = GetTimeDataFileData();

            if (timeDataSummary != null)
            {
                if (!timeDataSummary.StartsWith("["))
                {
                    // join array around the json string
                    timeDataSummary = "[" + string.Join(",", timeDataSummary) + "]";
                }
                HttpResponseMessage response = await SoftwareHttpManager.SendRequestAsync(
                    HttpMethod.Post, "/data/time", timeDataSummary);

                if (SoftwareHttpManager.IsOk(response))
                {
                    ClearTimeDataSummary();
                }
            }
        }
예제 #15
0
        public async Task ProcessRepoMembers(string projectDir)
        {
            if (!SoftwareCoUtil.IsGitProject(projectDir))
            {
                return;
            }
            RepoResourceInfo info = GitUtilManager.GetResourceInfo(projectDir, true);

            if (info != null && info.Members.Count > 0)
            {
                string jsonContent = SimpleJson.SerializeObject(info);
                // send the members
                HttpResponseMessage response = await SoftwareHttpManager.SendRequestAsync(
                    HttpMethod.Post, "/repo/members", jsonContent);

                if (!SoftwareHttpManager.IsOk(response))
                {
                    Logger.Error(response.ToString());
                }
            }
        }
예제 #16
0
        public async void GetHistoricalCommitsAsync(string projectDir)
        {
            try
            {
                if (!SoftwareCoUtil.IsGitProject(projectDir))
                {
                    return;
                }
                RepoResourceInfo info = GitUtilManager.GetResourceInfo(projectDir, false);

                if (info != null && info.identifier != null)
                {
                    string identifier = info.identifier;
                    if (identifier != null && !identifier.Equals(""))
                    {
                        string tag    = info.tag;
                        string branch = info.branch;
                        string email  = info.email;

                        RepoCommit latestCommit = null;
                        latestCommit = await this.GetLatestCommitAsync(projectDir);

                        string sinceOption = "";
                        if (latestCommit != null)
                        {
                            sinceOption = " --since=" + latestCommit.timestamp;
                        }
                        else
                        {
                            sinceOption = " --max-count=100";
                        }

                        string cmd = "git log --stat --pretty=COMMIT:%H,%ct,%cI,%s --author=" + email + "" + sinceOption;

                        string gitCommitData = SoftwareCoUtil.RunCommand(cmd, projectDir);

                        if (gitCommitData != null && !gitCommitData.Equals(""))
                        {
                            string[] lines = gitCommitData.Split(
                                new string[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries);
                            RepoCommit        currentRepoCommit = null;
                            List <RepoCommit> repoCommits       = new List <RepoCommit>();
                            if (lines != null && lines.Length > 0)
                            {
                                for (int i = 0; i < lines.Length; i++)
                                {
                                    string line = lines[i].Trim();
                                    if (line.Length > 0)
                                    {
                                        bool hasPipe = line.IndexOf("|") != -1 ? true : false;
                                        bool isBin   = line.ToLower().IndexOf("bin") != -1 ? true : false;
                                        if (line.IndexOf("COMMIT:") == 0)
                                        {
                                            line = line.Substring("COMMIT:".Length);
                                            if (currentRepoCommit != null)
                                            {
                                                repoCommits.Add(currentRepoCommit);
                                            }

                                            string[] commitInfos = line.Split(',');
                                            if (commitInfos != null && commitInfos.Length > 0)
                                            {
                                                string commitId = commitInfos[0].Trim();
                                                // go to the next line if we've already processed this commitId
                                                if (latestCommit != null && commitId.Equals(latestCommit.commitId))
                                                {
                                                    currentRepoCommit = null;
                                                    continue;
                                                }

                                                // get the other attributes now
                                                long   timestamp = Convert.ToInt64(commitInfos[1].Trim());
                                                string date      = commitInfos[2].Trim();
                                                string message   = commitInfos[3].Trim();
                                                currentRepoCommit      = new RepoCommit(commitId, message, timestamp);
                                                currentRepoCommit.date = date;

                                                RepoCommitChanges changesObj = new RepoCommitChanges(0, 0);
                                                currentRepoCommit.changes.Add("__sftwTotal__", changesObj);
                                            }
                                        }
                                        else if (currentRepoCommit != null && hasPipe && !isBin)
                                        {
                                            // get the file and changes
                                            // i.e. somefile.cs                             | 20 +++++++++---------
                                            line = string.Join(" ", line.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries));
                                            string[] lineInfos = line.Split('|');
                                            if (lineInfos != null && lineInfos.Length > 1)
                                            {
                                                string   file        = lineInfos[0].Trim();
                                                string[] metricInfos = lineInfos[1].Trim().Split(' ');
                                                if (metricInfos != null && metricInfos.Length > 1)
                                                {
                                                    string addAndDeletes = metricInfos[1].Trim();
                                                    int    len           = addAndDeletes.Length;
                                                    int    lastPlusIdx   = addAndDeletes.LastIndexOf('+');
                                                    int    insertions    = 0;
                                                    int    deletions     = 0;
                                                    if (lastPlusIdx != -1)
                                                    {
                                                        insertions = lastPlusIdx + 1;
                                                        deletions  = len - insertions;
                                                    }
                                                    else if (len > 0)
                                                    {
                                                        // all deletions
                                                        deletions = len;
                                                    }

                                                    if (!currentRepoCommit.changes.ContainsKey(file))
                                                    {
                                                        RepoCommitChanges changesObj = new RepoCommitChanges(insertions, deletions);
                                                        currentRepoCommit.changes.Add(file, changesObj);
                                                    }
                                                    else
                                                    {
                                                        RepoCommitChanges fileCommitChanges;
                                                        currentRepoCommit.changes.TryGetValue(file, out fileCommitChanges);
                                                        if (fileCommitChanges != null)
                                                        {
                                                            fileCommitChanges.deletions  += deletions;
                                                            fileCommitChanges.insertions += insertions;
                                                        }
                                                    }


                                                    RepoCommitChanges totalRepoCommit;
                                                    currentRepoCommit.changes.TryGetValue("__sftwTotal__", out totalRepoCommit);
                                                    if (totalRepoCommit != null)
                                                    {
                                                        totalRepoCommit.deletions  += deletions;
                                                        totalRepoCommit.insertions += insertions;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }

                            if (currentRepoCommit != null)
                            {
                                repoCommits.Add(currentRepoCommit);
                            }

                            if (repoCommits != null && repoCommits.Count > 0)
                            {
                                // batch 10 at a time
                                int batch_size          = 10;
                                List <RepoCommit> batch = new List <RepoCommit>();
                                for (int i = 0; i < repoCommits.Count; i++)
                                {
                                    batch.Add(repoCommits[i]);
                                    if (i > 0 && i % batch_size == 0)
                                    {
                                        // send this batch.
                                        RepoCommitData commitData = new RepoCommitData(identifier, tag, branch, batch);

                                        string jsonContent = commitData.GetAsJson(); // SimpleJson.SerializeObject(commitData);
                                                                                     // send the members
                                        HttpResponseMessage response = await SoftwareHttpManager.SendRequestAsync(
                                            HttpMethod.Post, "/commits", jsonContent);

                                        if (SoftwareHttpManager.IsOk(response))
                                        {
                                            Logger.Info(response.ToString());
                                        }
                                        else
                                        {
                                            Logger.Error(response.ToString());
                                        }
                                    }
                                }

                                if (batch.Count > 0)
                                {
                                    RepoCommitData commitData = new RepoCommitData(identifier, tag, branch, batch);

                                    string jsonContent = commitData.GetAsJson(); // SimpleJson.SerializeObject(commitData);
                                                                                 // send the members
                                    HttpResponseMessage response = await SoftwareHttpManager.SendRequestAsync(
                                        HttpMethod.Post, "/commits", jsonContent);

                                    if (SoftwareHttpManager.IsOk(response))
                                    {
                                        Logger.Info(response.ToString());
                                    }
                                    else if (response != null)
                                    {
                                        Logger.Error("Unable to complete commit request, status: " + response.StatusCode);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error("GetHistoricalCommitsAsync ,error: " + ex.Message, ex);
            }
        }
        private static async Task FetchCodeTimeDashboardAsync(SessionSummary _sessionSummary)
        {
            string summaryContent  = "";
            string summaryInfoFile = SoftwareCoUtil.getSessionSummaryInfoFile();

            bool online = await SoftwareUserSession.IsOnlineAsync();

            long diff = SoftwareCoUtil.getNowInSeconds() - lastDashboardFetchTime;

            if (lastDashboardFetchTime == 0 || diff >= day_in_sec || !online)
            {
                if (!online)
                {
                    lastDashboardFetchTime = 0;
                }
                else
                {
                    lastDashboardFetchTime = SoftwareCoUtil.getNowInSeconds();
                }

                HttpResponseMessage resp =
                    await SoftwareHttpManager.SendDashboardRequestAsync(HttpMethod.Get, "/dashboard?showMusic=false&showGit=false&showRank=false&showToday=false");

                if (SoftwareHttpManager.IsOk(resp))
                {
                    summaryContent += await resp.Content.ReadAsStringAsync();
                }
                else
                {
                    summaryContent = NO_DATA;
                }


                if (File.Exists(summaryInfoFile))
                {
                    File.SetAttributes(summaryInfoFile, FileAttributes.Normal);
                }

                try
                {
                    File.WriteAllText(summaryInfoFile, summaryContent);
                    File.SetAttributes(summaryInfoFile, FileAttributes.ReadOnly);
                }
                catch (Exception e)
                {
                }
            }
            string dashboardFile    = SoftwareCoUtil.getDashboardFile();
            string dashboardContent = "";
            string suffix           = SoftwareCoUtil.CreateDateSuffix(DateTime.Now);
            string formattedDate    = DateTime.Now.ToString("ddd, MMM ") + suffix + DateTime.Now.ToString(" h:mm tt");

            dashboardContent  = "CODE TIME          " + "(Last updated on " + formattedDate + " )";
            dashboardContent += "\n\n";

            string todayDate  = DateTime.Now.ToString("ddd, MMM ") + suffix;
            string today_date = "Today " + "(" + todayDate + ")";

            dashboardContent += SoftwareCoUtil.getSectionHeader(today_date);

            if (_sessionSummary != null)
            {
                string averageTime     = SoftwareCoUtil.HumanizeMinutes(_sessionSummary.averageDailyMinutes);
                string hoursCodedToday = SoftwareCoUtil.HumanizeMinutes(_sessionSummary.currentDayMinutes);
                String liveshareTime   = "";
                //if (_sessionSummary.liveshareMinutes != 0)
                //{
                //    liveshareTime = SoftwareCoUtil.HumanizeMinutes(_sessionSummary.liveshareMinutes);
                //}
                dashboardContent += SoftwareCoUtil.getDashboardRow("Hours Coded", hoursCodedToday);
                dashboardContent += SoftwareCoUtil.getDashboardRow("90-day avg", averageTime);
                //if (liveshareTime != "0")
                //{
                //    dashboardContent += SoftwareCoUtil.getDashboardRow("Live Share", liveshareTime);
                //}
                dashboardContent += "\n";
            }

            if (SoftwareCoUtil.SessionSummaryInfoFileExists())
            {
                string SummaryData = SoftwareCoUtil.getSessionSummaryInfoFileData();
                dashboardContent += SummaryData;
            }


            if (File.Exists(dashboardFile))
            {
                File.SetAttributes(dashboardFile, FileAttributes.Normal);
            }
            try
            {
                //SoftwareCoUtil.WriteToFileThreadSafe(dashboardContent, dashboardFile);
                File.WriteAllText(dashboardFile, dashboardContent);
                File.SetAttributes(dashboardFile, FileAttributes.ReadOnly);
            }
            catch (Exception e)
            {
            }
        }
예제 #18
0
        public async void GetRepoUsers(string projectDir)
        {
            if (projectDir == null || projectDir.Equals(""))
            {
                return;
            }

            IDictionary <string, string> resourceInfo = this.GetResourceInfo(projectDir);

            if (resourceInfo != null && resourceInfo.ContainsKey("identifier"))
            {
                string identifier = "";
                resourceInfo.TryGetValue("identifier", out identifier);
                if (identifier != null && !identifier.Equals(""))
                {
                    string tag = "";
                    resourceInfo.TryGetValue("tag", out tag);
                    string branch = "";
                    resourceInfo.TryGetValue("branch", out branch);

                    string gitLogData = SoftwareCoUtil.RunCommand("git log --pretty=%an,%ae | sort", projectDir);

                    IDictionary <string, string> memberMap = new Dictionary <string, string>();

                    List <RepoMember> repoMembers = new List <RepoMember>();
                    if (gitLogData != null && !gitLogData.Equals(""))
                    {
                        string[] lines = gitLogData.Split(
                            new string[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries);
                        if (lines != null && lines.Length > 0)
                        {
                            for (int i = 0; i < lines.Length; i++)
                            {
                                string   line        = lines[i];
                                string[] memberInfos = line.Split(',');
                                if (memberInfos != null && memberInfos.Length > 1)
                                {
                                    string name  = memberInfos[0].Trim();
                                    string email = memberInfos[1].Trim();
                                    if (!memberMap.ContainsKey(email))
                                    {
                                        memberMap.Add(email, name);
                                        repoMembers.Add(new RepoMember(name, email));
                                    }
                                }
                            }
                        }
                    }

                    if (memberMap.Count > 0)
                    {
                        RepoData repoData    = new RepoData(identifier, tag, branch, repoMembers);
                        string   jsonContent = SimpleJson.SerializeObject(repoData);
                        // send the members
                        HttpResponseMessage response = await SoftwareHttpManager.SendRequestAsync(
                            HttpMethod.Post, "/repo/members", jsonContent);

                        if (!SoftwareHttpManager.IsOk(response))
                        {
                            Logger.Error(response.ToString());
                        }
                    }
                }
            }
        }
예제 #19
0
        protected static async Task HandleTrackInfoAsync(LocalSpotifyTrackInfo localTrackInfo)
        {
            try
            {
                if (!SoftwareHttpManager.HasSpotifyAccessToken())
                {
                    // initialize the token
                    await SoftwareHttpManager.InitializeSpotifyClientGrantAsync();
                }
            } catch (Exception e)
            {
                Logger.Error("Code Time: Unable to access spotify, error: " + e.Message);
                return;
            }

            if (!SoftwareHttpManager.HasSpotifyAccessToken())
            {
                return;
            }

            bool hasLocalTrackData = (localTrackInfo.name != null && localTrackInfo.artist != null)
                ? true : false;
            bool hasCurrentTrackData = (CurrentTrackInfo != null && CurrentTrackInfo.name != null && CurrentTrackInfo.artist != null)
                ? true : false;
            bool isNewTrack = true;

            if (hasLocalTrackData && hasCurrentTrackData &&
                localTrackInfo.name.Equals(CurrentTrackInfo.name) &&
                localTrackInfo.artist.Equals(CurrentTrackInfo.artist))
            {
                isNewTrack = false;
            }

            HttpResponseMessage response = null;

            try
            {
                if (isNewTrack && hasLocalTrackData)
                {
                    if (hasCurrentTrackData)
                    {
                        // close the previous track
                        CurrentTrackInfo.end = SoftwareCoUtil.getNowInSeconds();
                        // send it to the app server
                        response = await SoftwareHttpManager.SendRequestAsync(
                            HttpMethod.Post, "/data/music", CurrentTrackInfo.GetAsJson());
                    }
                    // fill in the missing attributes from the spotify API
                    await SoftwareHttpManager.GetSpotifyTrackInfoAsync(localTrackInfo);

                    // send it to the app server
                    response = await SoftwareHttpManager.SendRequestAsync(
                        HttpMethod.Post, "/data/music", localTrackInfo.GetAsJson());

                    CurrentTrackInfo = localTrackInfo.Clone();
                }
                else if (hasCurrentTrackData && !hasLocalTrackData)
                {
                    // send this to close it
                    CurrentTrackInfo.end = SoftwareCoUtil.getNowInSeconds();
                    // send it to the app server
                    response = await SoftwareHttpManager.SendRequestAsync(
                        HttpMethod.Post, "/data/music", CurrentTrackInfo.GetAsJson());

                    CurrentTrackInfo = null;
                }
            } catch (Exception e) {
                Logger.Error("Code Time: Unable to process track information, error: " + e.Message);
            }

            if (response != null && !SoftwareHttpManager.IsOk(response))
            {
                Logger.Error(response.ToString());
            }
        }
예제 #20
0
        private async Task FetchCodeTimeDashboardAsync()
        {
            string summaryContent  = "";
            string summaryInfoFile = FileManager.getSessionSummaryInfoFile();

            bool online = await SoftwareUserSession.IsOnlineAsync();


            HttpResponseMessage resp =
                await SoftwareHttpManager.SendDashboardRequestAsync(HttpMethod.Get, "/dashboard?showMusic=false&showGit=false&showRank=false&showToday=false");

            if (SoftwareHttpManager.IsOk(resp))
            {
                summaryContent += await resp.Content.ReadAsStringAsync();
            }
            else
            {
                summaryContent = NO_DATA;
            }


            if (File.Exists(summaryInfoFile))
            {
                File.SetAttributes(summaryInfoFile, FileAttributes.Normal);
            }

            try
            {
                File.WriteAllText(summaryInfoFile, summaryContent, System.Text.Encoding.UTF8);
            }
            catch (Exception e)
            {
            }

            string dashboardFile    = FileManager.getDashboardFile();
            string dashboardContent = "";
            string suffix           = SoftwareCoUtil.CreateDateSuffix(DateTime.Now);
            string formattedDate    = DateTime.Now.ToString("ddd, MMM ") + suffix + DateTime.Now.ToString(" h:mm tt");

            dashboardContent  = "CODE TIME          " + "(Last updated on " + formattedDate + " )";
            dashboardContent += "\n\n";

            string todayDate  = DateTime.Now.ToString("ddd, MMM ") + suffix;
            string today_date = "Today " + "(" + todayDate + ")";

            dashboardContent += SoftwareCoUtil.getSectionHeader(today_date);

            SessionSummary  _sessionSummary = SessionSummaryManager.Instance.GetSessionSummayData();
            CodeTimeSummary ctSummary       = TimeDataManager.Instance.GetCodeTimeSummary();

            string codeTimeMinutes = SoftwareCoUtil.HumanizeMinutes(ctSummary.codeTimeMinutes);

            dashboardContent += SoftwareCoUtil.getDashboardRow("Code time today", codeTimeMinutes);
            string activeCodeTimeMinutes = SoftwareCoUtil.HumanizeMinutes(ctSummary.activeCodeTimeMinutes);

            dashboardContent += SoftwareCoUtil.getDashboardRow("Active code time today", activeCodeTimeMinutes);
            if (_sessionSummary != null)
            {
                string averageTime = SoftwareCoUtil.HumanizeMinutes(_sessionSummary.averageDailyMinutes);

                String liveshareTime = "";
                //if (_sessionSummary.liveshareMinutes != 0)
                //{
                //    liveshareTime = SoftwareCoUtil.HumanizeMinutes(_sessionSummary.liveshareMinutes);
                //}

                dashboardContent += SoftwareCoUtil.getDashboardRow("90-day avg", averageTime);
                //if (liveshareTime != "0")
                //{
                //    dashboardContent += SoftwareCoUtil.getDashboardRow("Live Share", liveshareTime);
                //}
                dashboardContent += "\n";
            }

            if (FileManager.SessionSummaryInfoFileExists())
            {
                string SummaryData = FileManager.getSessionSummaryInfoFileData();
                dashboardContent += SummaryData;
            }


            if (File.Exists(dashboardFile))
            {
                File.SetAttributes(dashboardFile, FileAttributes.Normal);
            }
            try
            {
                File.WriteAllText(dashboardFile, dashboardContent, System.Text.Encoding.UTF8);
            }
            catch (Exception e)
            {
            }
        }