public string ConvertTag(LanguageTagParameters parameters)
 {
    return languageTags.GetTag(parameters);
 }
      //Get the given tag but "localized" for the given user.
      public string GetTag(LanguageTagParameters parameters)
      {
         //This is just silly
         if (parameters.Tag == ChatTags.None)
            return "";

         try
         {
            //For a lot of errors, we're better off returning the default tag
            string defaultReplacement = ReplaceText(DefaultTags[parameters.Tag], parameters.Replacements);

            //Oops, tag dictionary was not initialized. Using default
            if(tags == null)
            {
               if(!printedDefaultTagsWarning)
               {
                  Log("Language not initialized. Using defaults", LogLevel.Warning);
                  printedDefaultTagsWarning = true;
               }
               
               return defaultReplacement;
            }
            //Oops, the user's language couldn't be found (wut). Use default
            else if (!tags.ContainsKey(parameters.Language))
            {
               Log(parameters.User.Username + "'s language (" + parameters.Language + ") was not found! Using default");
               return defaultReplacement;
            }

            string realTag = parameters.Tag.ToString().ToLower();
            Tuple<string, string> tagTuple = Tuple.Create(parameters.Language, realTag);

            //Oops, looks like the dictionary we initialized from doesn't have the tag we're looking for.
            if(!tags[parameters.Language].ContainsKey(realTag))
            {
               //Don't bombard the console with warning about missing tags. Only do it the first time
               if(!missingTagWarnings.Contains(tagTuple))
               {
                  missingTagWarnings.Add(tagTuple);
                  Log("Language dictionary was missing tag: " + realTag + " for language: " + parameters.Language, LogLevel.Warning);
               }

               return defaultReplacement;
            }

            return ReplaceText(tags[parameters.Language][realTag], parameters.Replacements);
         }
         catch (Exception e)
         {
            Log("Error while retrieving tag " + parameters.Tag + " for user " + parameters.User.Username + ": " + e.Message);
            return "Tag error: Fatal internal error. The server is broken";
         }
      }
 public SystemMessageJSONObject NewSystemMessageFromTag(LanguageTagParameters parameters)
 {
    return new SystemMessageJSONObject(manager.ConvertTag(parameters));
 }
//      public void SelectiveBroadcast(string message, string tag, List<Chat> exclude = null)
//      {
//         if (string.IsNullOrEmpty(message))
//            return;
//
//         if (exclude == null)
//            exclude = new List<Chat>();
//
//         List<Chat> receivers = new List<Chat>();
//         lock (managerLock)
//         {
//            Log("Enter selective broadcast lock", MyExtensions.Logging.LogLevel.Locks);
//            receivers = activeChatters.Except(exclude).ToList();
//            receivers = receivers.Where(x => AllAcceptedTagsForUser(x.UID).Contains(tag)).ToList();
//            Log("Exit selective broadcast lock", MyExtensions.Logging.LogLevel.Locks);
//         }
//
//         Log("Just before broadast", MyExtensions.Logging.LogLevel.SuperDebug);
//         foreach (Chat chatter in receivers)
//            chatter.MySend(message);
//         Log("Just after broadcast", MyExtensions.Logging.LogLevel.SuperDebug);
//      }

      public void Broadcast(LanguageTagParameters parameters, JSONObject container, List<Chat> exclude = null)
      {
         if (exclude == null)
            exclude = new List<Chat>();

//         List<Chat> receivers = new List<Chat>();
//         lock (managerLock)
//         {
//            Log("Enter broadcast tag lock", MyExtensions.Logging.LogLevel.Locks);
//            receivers = activeChatters.Except(exclude).ToList();
//            Log("Exit broadcast tag lock", MyExtensions.Logging.LogLevel.Locks);
//         }

         Log("Just before tag broadast", MyExtensions.Logging.LogLevel.SuperDebug);
         foreach (Chat chatter in ConnectedUsers().Select(x => (Chat)x).Except(exclude))
         {
            parameters.UpdateUser(chatter.ThisUser);  //Update the message to reflect user preferences
            chatter.MySend(parameters, container);    //Send a tag message by filling the container with the tag parameters
         }
         Log("Just after tag broadcast", MyExtensions.Logging.LogLevel.SuperDebug);
      }
 public WarningJSONObject NewWarningFromTag(LanguageTagParameters parameters)
 {
    return new WarningJSONObject(manager.ConvertTag(parameters));
 }
      public void MySend(LanguageTagParameters parameters, JSONObject container)
      {
         string message = manager.ConvertTag(parameters);

         if (container is WarningJSONObject)
         {
            ((WarningJSONObject)container).message = message;
         }
         else if (container is SystemMessageJSONObject)
         {
            ((SystemMessageJSONObject)container).message = message;
         }
         else
         {
            Log("Didn't get a proper container for a language tag. Using system message as default", LogLevel.Warning);
            ((SystemMessageJSONObject)container).message = message;
         }

         MySend(container.ToString());
      }
 public SystemMessageJSONObject NewSystemMessageFromTag(LanguageTagParameters parameters)
 {
    return new SystemMessageJSONObject(manager.ConvertTag(parameters)) 
    { subtype = parameters.Tag.ToString().ToLower(), uid = parameters.SendingUser.UID };
 }
      public void MySend(LanguageTagParameters parameters, JSONObject container)
      {
         string message = manager.ConvertTag(parameters);
         //string subtype = parameters.Tag.ToString().ToLower();

         if (container is WarningJSONObject)
         {
            container = NewWarningFromTag(parameters);
            /*   (WarningJSONObject)container;
            warning.message = message;
            warning.subtype = subtype;*/
         }
         else if (container is SystemMessageJSONObject)
         {
            container = NewSystemMessageFromTag(parameters);
            /*((SystemMessageJSONObject)container).message = message;
            ((SystemMessageJSONObject)container).subtype = subtype;*/
         }
         else
         {
            Log("Didn't get a proper container for a language tag. Using system message as default", LogLevel.Warning);
            ((SystemMessageJSONObject)container).message = message;
         }

         MySend(container.ToString());
      }
      public void Broadcast(LanguageTagParameters parameters, JSONObject container, List<Chat> exclude = null)
      {
         if (exclude == null)
            exclude = new List<Chat>();

         Log("Just before tag broadast", MyExtensions.Logging.LogLevel.SuperDebug);
         foreach (Chat chatter in ConnectedUsers().Select(x => (Chat)x).Except(exclude))
         {
            parameters.UpdateUser(chatter.ThisUser);  //Update the message to reflect user preferences

            //Send a tag message by filling the container with the tag parameters
            if(!parameters.RawSendingUser.ShadowBanned || parameters.RawSendingUser.UID == chatter.ThisUser.UID)
               chatter.MySend(parameters, container);    
         }
         Log("Just after tag broadcast", MyExtensions.Logging.LogLevel.SuperDebug);
      }