private static void Silence(String strUserName, String strChannel)
        {
            TimeTrackerAuthentication auth;

            if (dctAccounts.ContainsKey(strUserName))
            {
                auth = dctAccounts[strUserName];
            }
            else
            {
                auth = new TimeTrackerAuthentication();
                dctAccounts.Add(strUserName, auth);
            }
            auth.Silence             = !auth.Silence;
            dctAccounts[strUserName] = auth;
            TimeTracker_SaveAccounts();
            Slack.Chat.PostMessageArguments args = new Slack.Chat.PostMessageArguments();
            args.channel = strChannel;
            if (auth.Silence)
            {
                args.text = "I won't bother you until you unsilence me.";
            }
            else
            {
                args.text = "I will now prompt you regarding time tracking.";
            }
            client.Chat.PostMessage(args);
        }
        private static void client_PresenceChanged(Slack.PresenceChangeEventArgs e)
        {
            Console.Write(System.DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "\tPresence Changed.\t[");
            if (e.UserInfo == null)
            {
                Console.Write("Not Found (" + e.user + ")");
            }
            else
            {
                Console.Write(e.UserInfo.name);
            }
            Console.WriteLine("] [" + e.presence + "]");
            String strChannel = client.IM.Open(e.user).ChannelID;

            if (strChannel.Length == 0)
            {
                return;
            }
            String strMessage = "";

            switch (e.presence)
            {
            case "active":
                if (!dctAccounts.ContainsKey(e.UserInfo.name))
                {
                    strMessage = "Welcome " + e.UserInfo.real_name + "\nWould you like to associate your account with a Time Tracker account?\nFor help type tt /?)";
                }
                else
                {
                    strMessage = TimeTracker_UserActive(e.UserInfo.name, e.UserInfo.real_name);
                }
                break;

            case "away":
                if (dctAccounts.ContainsKey(e.UserInfo.name))
                {
                    strMessage = TimeTracker_UserInactive(e.UserInfo.name, e.UserInfo.real_name);
                }
                break;

            default:
                // do nothing
                break;
            }
            if (strMessage.Length == 0)
            {
                return;
            }
            Slack.Chat.PostMessageArguments args = new Slack.Chat.PostMessageArguments();
            args.channel = strChannel;
            args.text    = strMessage;
            client.Chat.PostMessage(args);
        }
 private static void Send_Help(String strChannel, String strAdditional)
 {
     Slack.Chat.PostMessageArguments args = new Slack.Chat.PostMessageArguments();
     args.channel = strChannel;
     args.text    =
         strAdditional + "\r\n" +
         "tt /associate /email:[your email] /token:[your token]\tAssociate your slack account with your time tracker account.\r\n" +
         "tt /current\tDisplays your current punch status.\r\n" +
         "tt /myTime\tDisplays your current cumulative time.\r\n" +
         "tt /project:[project name]\tDisplays current cumulative time for a project.\r\n" +
         "tt /today\tDisplays your time entries for the current day.\r\n" +
         "tt /[project name]\tClocks you in / out of a given project.";
     client.Chat.PostMessage(args);
 }
        private static TimeTrackerAuthentication Associate(String strUserName, String strChannel, String[] arrParams)
        {
            TimeTrackerAuthentication auth = new TimeTrackerAuthentication();

            if (arrParams.Length < 5)
            {
                Send_Help(strChannel, "Invalid syntax: ");
                return(null);
            }
            if (arrParams[1] == "email")
            {
                auth.EmailAddress = arrParams[2];
            }
            else
            {
                auth.Token = arrParams[2];
            }
            if (arrParams[3] == "email")
            {
                auth.EmailAddress = arrParams[4];
            }
            else
            {
                auth.Token = arrParams[4];
            }
            if (!dctAccounts.ContainsKey(strUserName))
            {
                dctAccounts.Add(strUserName, auth);
            }
            else
            {
                dctAccounts[strUserName] = auth;
            }
            TimeTracker_SaveAccounts();
            Slack.Chat.PostMessageArguments args3 = new Slack.Chat.PostMessageArguments();
            args3.channel = strChannel;
            args3.text    =
                "Your time tracker account has been associated with your slack account.";
            client.Chat.PostMessage(args3);
            return(auth);
        }
        private static bool TimeTracker(String strUserName, String strChannel, String strCommand)
        {
            if (!strCommand.StartsWith("tt"))
            {
                return(false);
            }
            strCommand = strCommand.ToLower();
            strCommand = strCommand.Substring(2).Trim(new char[] { ' ', '/' });
            String[] arrParams             = strCommand.Split(new char[] { '/', ':' });
            TimeTrackerAuthentication auth = new TimeTrackerAuthentication();

            if (!dctAccounts.ContainsKey(strUserName))
            {
                if (arrParams[0].Trim() == "associate")
                {
                    auth = Associate(strUserName, strChannel, arrParams);
                }
                else if (arrParams[0].Trim() == "?")
                {
                    Send_Help(strChannel, "Available commands:");
                }
                else
                {
                    Slack.Chat.PostMessageArguments args2 = new Slack.Chat.PostMessageArguments();
                    args2.channel = strChannel;
                    args2.text    = "Your slack account is not associated with a time tracker account";
                    client.Chat.PostMessage(args2);
                }
                return(true);
            }
            auth = dctAccounts[strUserName];
            Slack.Chat.PostMessageArguments args = new Slack.Chat.PostMessageArguments();
            args.channel = strChannel;
            switch (arrParams[0].Trim())
            {
            case "?":
                Send_Help(strChannel, "Available commands:");
                return(true);

            case "associate":
                auth = Associate(strUserName, strChannel, arrParams);
                return(true);

            case "current":
                args.text = TimeTracker_Current(auth);
                break;

            case "mytime":
                args.text = TimeTracker_MyTime(auth);
                break;

            case "project":
                if (arrParams.Length == 1)
                {
                    Send_Help(strChannel, "Invalid syntax:");
                    return(false);
                }
                args.text = TimeTracker_Project(auth, arrParams[1].Trim());
                break;

            case "today":
                args.text = TimeTracker_Today(auth);
                break;

            default:
                args.text = TimeTracker_InOUT(auth, strCommand);
                break;
            }
            client.Chat.PostMessage(args);
            return(true);
        }
        //This example method processes commands from users and optionally sends a message back to the user
        private static void Process_Message(String userName, String channel, String text)
        {
            const Int32 MAX_NEWS_ITEMS = 10;

            Slack.Chat.PostMessageArguments args = new Slack.Chat.PostMessageArguments();
            args.channel = channel;
            text         = text.Trim().ToLower();
            switch (text)
            {
            case "time":
                args.text = "Server time is: " + System.DateTime.Now.ToString();
                client.Chat.PostMessage(args);
                break;

            case "local news":
                args.text = "";
                System.Net.WebClient wcLocalNews    = new System.Net.WebClient();
                String strLocalNewsXML              = wcLocalNews.DownloadString("http://www.inkfreenews.com/feed/");
                System.Xml.XmlDocument xmlLocalNews = new System.Xml.XmlDocument();
                xmlLocalNews.LoadXml(strLocalNewsXML);
                Int32 intLocalNewsRemaining = MAX_NEWS_ITEMS;
                foreach (System.Xml.XmlNode xmlNode in xmlLocalNews.SelectNodes("rss/channel/item"))
                {
                    intLocalNewsRemaining--;
                    if (intLocalNewsRemaining == 0)
                    {
                        break;
                    }
                    args.text +=
                        xmlNode.SelectSingleNode("title").InnerText + "\r\n\t" +
                        xmlNode.SelectSingleNode("link").InnerText + "\r\n";
                }
                client.Chat.PostMessage(args);
                break;

            case "news":
                args.text = "";
                System.Net.WebClient wcReutersTechNews = new System.Net.WebClient();
                String strReutersTechNewsXML           = wcReutersTechNews.DownloadString("http://feeds.reuters.com/reuters/technologyNews");
                System.Xml.XmlDocument xmlDoc          = new System.Xml.XmlDocument();
                xmlDoc.LoadXml(strReutersTechNewsXML);
                Int32 intReutersTechNewsRemaining = MAX_NEWS_ITEMS;
                foreach (System.Xml.XmlNode xmlNode in xmlDoc.SelectNodes("rss/channel/item"))
                {
                    intReutersTechNewsRemaining--;
                    if (intReutersTechNewsRemaining == 0)
                    {
                        break;
                    }
                    args.text +=
                        xmlNode.SelectSingleNode("title").InnerText + "\r\n\t" +
                        xmlNode.SelectSingleNode("link").InnerText + "\r\n";
                }
                client.Chat.PostMessage(args);
                break;

            default:
                TimeTracker(userName, channel, text);
                break;
            }
        }