public QueuedMessage(String message, int secondsDelay, AbstractEvent abstractEvent) { this.messageName = message; List <MessageFragment> messageFragments = new List <MessageFragment>(); messageFragments.Add(MessageFragment.Text(message)); this.messageFolders = getMessageFolders(messageFragments, false); this.dueTime = (DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) + (secondsDelay * 1000) + updateInterval; this.abstractEvent = abstractEvent; }
public QueuedMessage(String messageName, int expiresAfter, List <MessageFragment> messageFragments = null, List <MessageFragment> alternateMessageFragments = null, DelayedMessageEvent delayedMessageEvent = null, int secondsDelay = 0, AbstractEvent abstractEvent = null, Dictionary <String, Object> validationData = null, int priority = SoundMetadata.DEFAULT_PRIORITY, SoundType type = SoundType.AUTO) { this.messageId = getMessageId(); this.validationData = validationData; this.creationTime = GameStateData.CurrentTime.Ticks / TimeSpan.TicksPerMillisecond; this.dueTime = secondsDelay == 0 ? 0 : this.creationTime + (secondsDelay * 1000) + updateInterval; this.expiryTime = expiresAfter == 0 ? 0 : this.creationTime + (expiresAfter * 1000); this.secondsDelay = secondsDelay; this.abstractEvent = abstractEvent; this.metadata = new SoundMetadata(type, priority); this.delayedMessageEvent = delayedMessageEvent; this.delayMessageResolution = delayedMessageEvent != null; // for delayed message events, we collect up the message folder when the message when the message is about to be played, not here if (delayedMessageEvent != null) { this.messageName = delayedMessageIdentifier + messageName; } else if (messageFragments == null) { this.messageName = messageName; List <MessageFragment> singleMessageFragement = new List <MessageFragment>(); singleMessageFragement.Add(MessageFragment.Text(messageName)); this.messageFolders = getMessageFolders(singleMessageFragement, false); } else { this.messageName = compoundMessageIdentifier + messageName; Boolean hasAlternative = alternateMessageFragments != null; this.messageFolders = getMessageFolders(messageFragments, hasAlternative); if (!canBePlayed && hasAlternative) { Console.WriteLine("Using secondary messages for event " + messageName); canBePlayed = true; this.messageFolders = getMessageFolders(alternateMessageFragments, false); if (!canBePlayed) { Console.WriteLine("Primary and secondary messages for event " + messageName + " can't be played"); } } } }
public static MessageFragment Integer(int integer) { return(MessageFragment.Integer(integer, true)); }
private List <String> getMessageFolders(List <MessageFragment> messageFragments, Boolean hasAlternative) { List <String> messages = new List <String>(); for (int i = 0; i < messageFragments.Count; i++) { MessageFragment messageFragment = messageFragments[i]; if (messageFragment == null) { Console.WriteLine("Message " + this.messageName + " can't be played because it has no contents"); canBePlayed = false; break; } // if this fragment is not the last message fragment, then some languages (Italian only at the time of writing) // require a different inflection to the final part of a time / number sound. Boolean useMoreInflection = i < messageFragments.Count - 1; switch (messageFragment.type) { case FragmentType.Text: if (messageFragment.text.StartsWith(AudioPlayer.PAUSE_ID) || SoundCache.availableSounds.Contains(messageFragment.text) || SoundCache.hasSingleSound(messageFragment.text)) { messages.Add(messageFragment.text); } else { Console.WriteLine("Message " + this.messageName + " can't be played because there is no sound for text fragment " + messageFragment.text); canBePlayed = false; } break; case FragmentType.Time: if (numberReader != null) { List <String> timeFolders = numberReader.ConvertTimeToSounds(messageFragment.timeSpan, useMoreInflection); if (timeFolders.Count == 0) { Console.WriteLine("Message " + this.messageName + " can't be played because the number reader found no sounds for timespan " + messageFragment.timeSpan.timeSpan.ToString() + " precision " + messageFragment.timeSpan.getPrecision()); canBePlayed = false; } else { foreach (String timeFolder in timeFolders) { if (!timeFolder.StartsWith(AudioPlayer.PAUSE_ID) && !SoundCache.availableSounds.Contains(timeFolder)) { Console.WriteLine("Message " + this.messageName + " can't be played because there is no sound for time fragment " + timeFolder); canBePlayed = false; break; } } messages.AddRange(timeFolders); } } else { Console.WriteLine("Message " + this.messageName + " can't be played because the number reader is not available"); canBePlayed = false; } break; case FragmentType.Opponent: canBePlayed = false; if (messageFragment.opponent != null && messageFragment.opponent.CanUseName) { String usableName = DriverNameHelper.getUsableDriverName(messageFragment.opponent.DriverRawName); if (SoundCache.availableDriverNames.Contains(usableName)) { messages.Add(usableName); canBePlayed = true; } else if (usableName != null && usableName.Count() > 0 && AudioPlayer.ttsOption != AudioPlayer.TTS_OPTION.NEVER && (!hasAlternative || AudioPlayer.ttsOption == AudioPlayer.TTS_OPTION.ANY_TIME)) { messages.Add(SoundCache.TTS_IDENTIFIER + usableName); canBePlayed = true; } else { Console.WriteLine("Message " + this.messageName + " can't be played because there is no sound for opponent name " + usableName); } } else { Console.WriteLine("Message " + this.messageName + " can't be played because the opponent is null or unusable"); } break; case FragmentType.Integer: if (numberReader != null) { List <String> integerFolders = numberReader.GetIntegerSounds(messageFragment.integer, messageFragment.allowShortHundreds, useMoreInflection); if (integerFolders.Count() == 0) { Console.WriteLine("Message " + this.messageName + " can't be played because the number reader found no sounds for number " + messageFragment.integer); canBePlayed = false; break; } else { foreach (String integerFolder in integerFolders) { if (!integerFolder.StartsWith(AudioPlayer.PAUSE_ID) && !SoundCache.availableSounds.Contains(integerFolder)) { Console.WriteLine("Message " + this.messageName + " can't be played because there is no sound for number fragment " + integerFolder); canBePlayed = false; break; } } } messages.AddRange(integerFolders); } else { Console.WriteLine("Message " + this.messageName + " can't be played because the number reader is not available"); canBePlayed = false; } break; } if (!canBePlayed) { break; } } return(messages); }
private List <String> getMessageFolders(List <MessageFragment> messageFragments, Boolean hasAlternative) { List <String> messages = new List <String>(); for (int i = 0; i < messageFragments.Count; i++) { MessageFragment messageFragment = messageFragments[i]; if (messageFragment == null) { canBePlayed = false; break; } switch (messageFragment.type) { case FragmentType.Text: if (messageFragment.text.StartsWith(AudioPlayer.PAUSE_ID) || SoundCache.availableSounds.Contains(messageFragment.text) || SoundCache.availableDriverNames.Contains(messageFragment.text)) { messages.Add(messageFragment.text); } else { canBePlayed = false; } break; case FragmentType.Time: // if this time fragment is not the last message fragment, then some languages (Italian only at the time of writing) // require a different inflection to their tenths sounds Boolean useMoreInflection = i < messageFragments.Count - 1; if (numberReader != null) { List <String> timeFolders = numberReader.ConvertTimeToSounds(messageFragment.timeSpan, useMoreInflection); if (timeFolders.Count == 0) { canBePlayed = false; } else { foreach (String timeFolder in timeFolders) { if (!timeFolder.StartsWith(AudioPlayer.PAUSE_ID) && !SoundCache.availableSounds.Contains(timeFolder)) { canBePlayed = false; break; } } messages.AddRange(timeFolders); } } else { Console.WriteLine("Number reader is not available"); canBePlayed = false; } break; case FragmentType.Opponent: canBePlayed = false; if (messageFragment.opponent != null) { String usableName = DriverNameHelper.getUsableDriverName(messageFragment.opponent.DriverRawName); if (SoundCache.availableDriverNames.Contains(usableName)) { messages.Add(usableName); canBePlayed = true; } else if (usableName != null && usableName.Count() > 0 && SoundCache.useTTS && !hasAlternative) { messages.Add(SoundCache.TTS_IDENTIFIER + usableName); canBePlayed = true; } } break; case FragmentType.Integer: if (numberReader != null) { List <String> integerFolders = numberReader.GetIntegerSounds(messageFragment.integer); if (integerFolders.Count() == 0) { canBePlayed = false; break; } else { foreach (String integerFolder in integerFolders) { if (!integerFolder.StartsWith(AudioPlayer.PAUSE_ID) && !SoundCache.availableSounds.Contains(integerFolder)) { canBePlayed = false; break; } } } messages.AddRange(integerFolders); } else { Console.WriteLine("Number reader is not available"); canBePlayed = false; } break; } if (!canBePlayed) { break; } } return(messages); }