예제 #1
0
    private unsafe void OnChatMessage(XivChatType type, uint senderid, ref SeString sender, ref SeString message, ref bool isHandled)
    {
        if (type != XivChatType.ErrorMessage)
        {
            return;
        }
        if (Common.LastCommand == null || Common.LastCommand->StringPtr == null)
        {
            return;
        }
        var lastCommandStr = Encoding.UTF8.GetString(Common.LastCommand->StringPtr, (int)Common.LastCommand->BufUsed);

        if (!(lastCommandStr.StartsWith("/target ") || lastCommandStr.StartsWith("/ziel ") || lastCommandStr.StartsWith("/cibler ")))
        {
            return;
        }

        var match = regex.Match(message.TextValue);

        if (!match.Success)
        {
            return;
        }
        var searchName = match.Groups[1].Value.ToLowerInvariant();

        GameObject closestMatch    = null;
        var        closestDistance = float.MaxValue;
        var        player          = Service.ClientState.LocalPlayer;

        foreach (var actor in Service.Objects)
        {
            if (actor == null)
            {
                continue;
            }
            if (actor.Name.TextValue.ToLowerInvariant().Contains(searchName) &&
                ((GameObjectStruct *)actor.Address)->GetIsTargetable())
            {
                var distance = Vector3.Distance(player.Position, actor.Position);
                if (closestMatch == null)
                {
                    closestMatch    = actor;
                    closestDistance = distance;
                    continue;
                }

                if (closestDistance > distance)
                {
                    closestMatch    = actor;
                    closestDistance = distance;
                }
            }
        }

        if (closestMatch != null)
        {
            isHandled = true;
            Service.Targets.SetTarget(closestMatch);
        }
    }
예제 #2
0
 private void ChatOnOnChatMessage(XivChatType type, uint senderid, ref SeString sender, ref SeString message, ref bool ishandled)
 {
     if (ishandled)
     {
         return;            // don't process a message that's been handled.
     }
     if (type == XivChatType.RetainerSale)
     {
         this.Discord.MessageQueue.Enqueue(new QueuedRetainerItemSaleEvent
         {
             ChatType = type,
             Message  = message,
             Sender   = sender
         });
     }
     else
     {
         this.Discord.MessageQueue.Enqueue(new QueuedChatEvent
         {
             ChatType = type,
             Message  = message,
             Sender   = sender
         });
     }
 }
 private void HandleChat(XivChatType type, uint senderId, ref SeString sender, ref SeString message, ref bool isHandled)
 {
     try {
         if ((ushort)type != 2105)
         {
             return;
         }
         if (message.TextValue == Service.ClientState.ClientLanguage switch
         {
             ClientLanguage.German => "Bitte um das Beutegut würfeln.",
             ClientLanguage.French => "Veuillez lancer les dés pour le butin.",
             ClientLanguage.Japanese => "ロットを行ってください。",
             ClientLanguage.ChineseSimplified => "请掷骰。",
             _ => "Cast your lot."
         })
         {
             if (Service.Condition[ConditionFlag.WatchingCutscene] ||
                 Service.Condition[ConditionFlag.WatchingCutscene78] ||
                 Service.Condition[ConditionFlag.OccupiedInCutSceneEvent])
             {
                 Service.Framework.Update -= TryOpenAfterCutsceneFrameworkUpdate;
                 Service.Framework.Update += TryOpenAfterCutsceneFrameworkUpdate;
             }
             else
             {
                 TryOpenWindow();
             }
         }
     } catch (Exception ex) {
예제 #4
0
 //EN: You cast a glamour.
 //FR: Vous projetez un mirage.
 //DE: Du projizierst ein
 //JP: の外見を武具投影した。
 private void OnChatMessage(XivChatType type, uint senderId, ref SeString sender, ref SeString message, ref bool isHandled)
 {
     if (!this.configuration.enabled)
     {
         return;
     }
     if ((message.TextValue.Contains("You cast a glamour.") | message.TextValue.Contains("の外見を武具投影した") |
          message.TextValue.Contains("Vous projetez un mirage.") | message.TextValue.Contains("Du projizierst ein")) &
         (type & XivChatType.SystemMessage) == XivChatType.SystemMessage)
     {
         isHandled = true;
         return;
     }
     if (!this.configuration.plateEnabled)
     {
         return;
     }
     if ((message.TextValue.Contains("Glamours projected from plate ") | message.TextValue.Contains("により武具投影が行われました") |
          message.TextValue.Contains("a été projetée sur votre équipement.") | message.TextValue.Contains("Die Projektionsplatte ")) &
         (type & XivChatType.SystemMessage) == XivChatType.SystemMessage)
     {
         isHandled = true;
         return;
     }
 }
예제 #5
0
        public string getName(SeString sender, XivChatType type, SeString message)
        {
            var pName = _pluginInterface.ClientState.LocalPlayer.Name;

            if (sender.Payloads.Count > 0)
            {
                if (sender.Payloads[0].Type == PayloadType.Player)
                {
                    var pPayload = (PlayerPayload)sender.Payloads[0];
                    pName = pPayload.PlayerName;
                }

                if (sender.Payloads[0].Type == PayloadType.Icon && sender.Payloads[1].Type == PayloadType.Player)
                {
                    var pPayload = (PlayerPayload)sender.Payloads[1];
                    pName = pPayload.PlayerName;
                }
            }

            if (type == XivChatType.StandardEmote || type == XivChatType.CustomEmote)
            {
                if (message.Payloads[0].Type == PayloadType.Player)
                {
                    var pPayload = (PlayerPayload)message.Payloads[0];
                    pName = pPayload.PlayerName;
                }
            }

            return(pName);
        }
예제 #6
0
        private void OnChatMessage(XivChatType type, uint senderId, ref SeString sender, ref SeString message, ref bool isHandled)
        {
            if (!_pluginConfig.Enabled)
            {
                return;
            }
            try
            {
                if (isHandled || !(sender.Payloads.SingleOrDefault(x => x.Type == PayloadType.Player) is PlayerPayload playerPayload))
                {
                    return;
                }

                if (_pluginConfig.VoidList.Any(x =>
                                               x.HomeworldId == playerPayload.World.RowId &&
                                               x.Name == playerPayload.PlayerName))
                {
                    isHandled = true;
                }
            }
            catch (Exception)
            {
                // Ignore exception
            }
        }
예제 #7
0
 public OnChatMessageArgs(XivChatType type, uint senderId, SeString sender, SeString message)
 {
     this.Type     = type;
     this.SenderId = senderId;
     this.Sender   = sender;
     this.Message  = message;
 }
예제 #8
0
        private void *PrintMessageDetour(RaptureLogModule *raptureLogModule, XivChatType xivChatType, IntPtr senderName, IntPtr message, uint senderId, byte param)
        {
            try {
                if (chatTypes.Contains(xivChatType))
                {
                    // Need to hook it manually to handle changing the name until API4
                    var stdSender    = StdString.ReadFromPointer(senderName);
                    var parsedSender = SeString.Parse(stdSender.RawData);

                    if (Parse(ref parsedSender))
                    {
                        stdSender.RawData = parsedSender.Encode();
                        var allocatedString = Service.LibcFunction.NewString(stdSender.RawData);
                        var retVal          = printChatHook.Original(raptureLogModule, xivChatType, allocatedString.Address, message, senderId, param);
                        allocatedString.Dispose();
                        return(retVal);
                    }
                }
            } catch (Exception ex) {
                SimpleLog.Error(ex);
            }


            return(printChatHook.Original(raptureLogModule, xivChatType, senderName, message, senderId, param));
        }
예제 #9
0
        public void Tran(XivChatType type, string messageString, string senderName)
        {
            string output = Translate(messageString);

            if (injectChat == true)
            {
                PrintChat(type, senderName, lTr + output + rTr);
            }

            foreach (var tab in items)
            {
                if (tab.Logs[ConvertForArray(type.ToString())] && tab.Config[2])
                {
                    ChatText tmp = new ChatText();

                    tmp.Time         = GetTime();
                    tmp.ChannelShort = GetChannelName(type.ToString());
                    tmp.Channel      = type.ToString();
                    tmp.Sender       = senderName;

                    TextTypes translate = new TextTypes();
                    translate.Text = lTr + output + rTr;
                    translate.Type = PayloadType.RawText;
                    tmp.Text.Add(translate);

                    tab.Chat.Add(tmp);
                }
            }
        }
예제 #10
0
 private void HandleChatMessage(XivChatType type, uint senderId, ref SeString sender, ref SeString message, ref bool isHandled)
 {
     if (chatTypes.Contains(type))
     {
         Parse(ref message);
     }
 }
        private void ChatOnOnChatMessage(XivChatType type, uint senderId, ref SeString sender, ref SeString message, ref bool isHandled)
        {
            if (Config.style == 2)
            {
                if (sender.Payloads.Count > 0)
                {
                    sender.Payloads.Insert(0, FormatTextStyle(type));
                }
                else
                {
                    message.Payloads.Insert(0, FormatTextStyle(type));
                }
            }
            else if (Config.style == 1)
            {
                message.Payloads.Insert(0, FormatTextStyle(type));
            }

            /*
             * foreach (var payload in message.Payloads)
             * {
             *  if (payload is TextPayload textPayload)
             *  {
             *      textPayload.Text = $"({(int)type}/{type}) {textPayload.Text}";
             *      break;
             *  }
             * }
             */
        }
예제 #12
0
 private void HandleChatMessage(XivChatType type, uint senderId, ref SeString sender, ref SeString message, ref bool isHandled)
 {
     if ((int)type == 61 && sender != null && !string.IsNullOrWhiteSpace(sender.TextValue))
     {
         //PluginLog.Log($"senderid:{senderId} | type:{type} | sender:{sender.TextValue} | {message.TextValue}");
         synthesizer.SpeakAsync($"{sender.TextValue} says: {message.TextValue}");
     }
 }
예제 #13
0
 private void ChatOnOnChatMessage(
     XivChatType type, uint senderid, ref SeString sender, ref SeString message, ref bool ishandled)
 {
     if (type == XivChatType.Echo && message.TextValue == "DALAMUD")
     {
         this.hasPassed = true;
     }
 }
예제 #14
0
        public void PrintChat(XivChatType type, string senderName, string messageString)
        {
            var chat = new XivChatEntry
            {
                Type = type, Name = senderName, MessageBytes = Encoding.UTF8.GetBytes(messageString)
            };

            pluginInterface.Framework.Gui.Chat.PrintChat(chat);
        }
예제 #15
0
        public void Tran(XivChatType type, string messageString, string senderName)
        {
            string output = Translate(messageString);

            if (injectChat == true)
            {
                PrintChat(type, "[TRN] " + senderName, output);
            }
            this.chatText += "\n" + senderName + ": " + output;
        }
예제 #16
0
 private void ChatOnOnChatMessage(XivChatType type, uint senderId, ref SeString sender, ref SeString message,
                                  ref bool isHandled)
 {
     foreach (var payload in message.Payloads)
     {
         if (payload is TextPayload textPayload)
         {
             textPayload.Text = LeetSpeakify(textPayload.Text);
         }
     }
 }
예제 #17
0
        private void PrintChat(XivChatType type, string senderName, SeString messageSeString)
        {
            var chat = new XivChatEntry
            {
                Type         = type,
                Name         = senderName,
                MessageBytes = messageSeString.Encode()
            };

            _pluginInterface.Framework.Gui.Chat.PrintChat(chat);
        }
예제 #18
0
        private void PrintChat(XivChatType type, string senderName, SeString messageSeString)
        {
            var chat = new XivChatEntry
            {
                Type    = type,
                Name    = senderName,
                Message = messageSeString
            };

            Chat.PrintChat(chat);
        }
예제 #19
0
 private void OnChatMessage(XivChatType type, uint senderId, ref StdString sender,
                            ref StdString message, ref bool isHandled) {
     if (type == XivChatType.GatheringSystemMessage && senderId == 0) {
         var cmdMatch = this.CommandRegex.Match(message.Value).Groups["command"];
         if (cmdMatch.Success) {
             // Yes, it's a chat command.
             var command = cmdMatch.Value;
             if (ProcessCommand(command)) isHandled = true;
         }
     }
 }
예제 #20
0
        public Plugin(CommandManager command)
        {
            this.Config = (Configuration)this.Interface.GetPluginConfig() ?? new Configuration();
            this.Config.Initialize(this.Interface);

            // sanity check - ensure there are no invalid types leftover from past versions.
            foreach (DiscordChannelConfig config in this.Config.ChannelConfigs.Values)
            {
                for (int i = 0; i < config.ChatTypes.Count; i++)
                {
                    XivChatType xct = config.ChatTypes[i];
                    if ((int)xct > 127)
                    {
                        config.ChatTypes[i] = (XivChatType)((int)xct & 0x7F);
                        this.Config.Save();
                    }
                    try
                    {
                        xct.GetInfo();
                    }
                    catch (ArgumentException)
                    {
                        PluginLog.Error($"Removing invalid chat type before it could cause problems ({(int)xct}){xct}.");
                        config.ChatTypes.RemoveAt(i--);
                        this.Config.Save();
                    }
                }
            }


            this.DiscordBridgeProvider = new DiscordBridgeProvider(this.Interface, new DiscordBridgeAPI(this));
            this.Discord = new DiscordHandler(this);
            // Task t = this.Discord.Start(); // bot won't start if we just have this

            Task.Run(async() =>  // makes the bot actually start
            {
                await this.Discord.Start();
            });


            this.ui = new PluginUI(this);
            this.Interface.UiBuilder.Draw += this.ui.Draw;

            this.Chat.ChatMessage += ChatOnOnChatMessage;
            this.State.CfPop      += ClientStateOnCfPop;

            this.commandManager = new PluginCommandManager <Plugin>(this, command);

            if (string.IsNullOrEmpty(this.Config.DiscordToken))
            {
                this.Chat.PrintError("The Discord Bridge plugin was installed successfully." +
                                     "Please use the \"/pdiscord\" command to set it up.");
            }
        }
예제 #21
0
        private void OnXivMessage(XivChatType type, uint senderId, ref SeString sender, ref SeString message, ref bool isHandled)
        {
            var obj = new JObject();

            obj["type"]      = (ushort)type;
            obj["senderId"]  = senderId;
            obj["sender"]    = sender?.TextValue;
            obj["message"]   = message?.TextValue;
            obj["isHandled"] = isHandled;

            Plugin.server.WebSocketServices[Endpoint].Sessions.Broadcast(obj.ToString());
        }
예제 #22
0
        public static XivChatTypeInfo GetInfo(this XivChatType type)
        {
            // if (type == XivChatType.TellOutgoing)
            //     type = XivChatType.TellIncoming;

            if (TypeInfoDict.TryGetValue((XivChatType)((int)type & 0x7F), out var info))
            {
                return(info);
            }

            throw new ArgumentException($"No info mapping for chat type. {nameof(type)} ({(int)type}){type}");
        }
예제 #23
0
 private void CheckMesssage(XivChatType type, uint senderId, ref SeString sender, ref SeString message, ref bool isHandled)
 {
     if (type != XivChatType.ErrorMessage)
     {
         return;
     }
     if (message.TextValue == searchString)
     {
         Plugin.XivCommon.Functions.Chat.SendMessage("/t <r>");
         isHandled = true;
     }
 }
예제 #24
0
        public SeString getName(SeString sender, XivChatType type, SeString message)
        {
            var playerPayload = sender.Payloads.SingleOrDefault(x => x is PlayerPayload) as PlayerPayload;

            if (type is XivChatType.StandardEmote)
            {
                playerPayload = message.Payloads.FirstOrDefault(x => x is PlayerPayload) as PlayerPayload;
            }
            var pName = playerPayload == default(PlayerPayload) ? ClientState.LocalPlayer.Name.TextValue : playerPayload.PlayerName;

            PluginLog.Log(pName);
            return(pName);
        }
예제 #25
0
 public MapLink(TeleporterPlugin plugin, XivChatType type, MapLinkPayload payload, string senderName, SeString message)
 {
     _plugin     = plugin;
     ChatType    = type;
     Location    = new Vector2(payload.XCoord, payload.YCoord);
     PlaceName   = payload.PlaceName;
     TerritoryId = payload.TerritoryType.RowId;
     SenderName  = senderName;
     Message     = message.TextValue;
     Data        = message.Encode();
     Aetheryte   = GetClosestAetheryte();
     Payload     = new MapLinkPayload(_plugin.Interface.Data, payload.TerritoryType.RowId, payload.Map.RowId, payload.RawX, payload.RawY);
 }
예제 #26
0
        public static XivChatTypeInfo GetInfo(this XivChatType type)
        {
            if (type == XivChatType.TellOutgoing)
            {
                type = XivChatType.TellIncoming;
            }

            if (TypeInfoDict.TryGetValue(type, out var info))
            {
                return(info);
            }

            throw new ArgumentException("No info mapping for chat type.", nameof(type));
        }
 private void ChatOnOnChatMessage(XivChatType type, uint senderId, ref SeString sender, ref SeString message,
                                  ref bool isHandled)
 {
     if (!_configuration.Enabled)
     {
         return;
     }
     foreach (var payload in message.Payloads)
     {
         if (payload is TextPayload textPayload)
         {
             textPayload.Text = _profanityFilter.CensorString(textPayload.Text);
         }
     }
 }
예제 #28
0
 public ChannelSettings GetChannelSettings(XivChatType type)
 {
     if (ChannelSettingsTable.ContainsKey((int)type))
     {
         return(ChannelSettingsTable[(int)type]);
     }
     else if (ChannelSettingsTable.ContainsKey(127 & (int)type))
     {
         return(ChannelSettingsTable[127 & (int)type]);
     }
     else
     {
         return(ChannelSettingsTable[0]);
     }
 }
예제 #29
0
파일: ChatGui.cs 프로젝트: silasary/Dalamud
        private IntPtr HandlePrintMessageDetour(IntPtr manager, XivChatType chattype, IntPtr pSenderName, IntPtr pMessage,
                                                uint senderid, IntPtr parameter)
        {
            IntPtr retVal = IntPtr.Zero;

            try {
                var senderName = StdString.ReadFromPointer(pSenderName);
                var message    = StdString.ReadFromPointer(pMessage);

                Log.Debug($"HandlePrintMessageDetour {manager} - [{chattype}] [{BitConverter.ToString(message.RawData).Replace("-", " ")}] {message.Value} from {senderName.Value}");
                // Log.Debug($"Got message bytes {BitConverter.ToString(messageBytes.Bytes).Replace("-", " ")}");

                var originalMessageData = (byte[])message.RawData.Clone();

                // Call events
                var isHandled = false;
                OnChatMessage?.Invoke(chattype, senderid, ref senderName, ref message, ref isHandled);

                var            messagePtr      = pMessage;
                OwnedStdString allocatedString = null;

                if (!FastByteArrayCompare(originalMessageData, message.RawData))
                {
                    allocatedString = this.dalamud.Framework.Libc.NewString(message.RawData);
                    Log.Debug(
                        $"HandlePrintMessageDetour String modified: {originalMessageData}({messagePtr}) -> {message}({allocatedString.Address})");
                    messagePtr = allocatedString.Address;
                }

                // Print the original chat if it's handled.
                if (!isHandled)
                {
                    retVal = this.printMessageHook.Original(manager, chattype, pSenderName, messagePtr, senderid, parameter);
                }

                if (this.baseAddress == IntPtr.Zero)
                {
                    this.baseAddress = manager;
                }

                allocatedString?.Dispose();
            } catch (Exception ex) {
                Log.Error(ex, "Exception on OnChatMessage hook.");
                retVal = this.printMessageHook.Original(manager, chattype, pSenderName, pMessage, senderid, parameter);
            }

            return(retVal);
        }
예제 #30
0
 private void OnCheckMessageHandled(XivChatType type, uint senderId, ref SeString sender, ref SeString message, ref bool isHandled)
 {
     if (type == XivChatType.ErrorMessage && senderId == 0)
     {
         var cmdMatch = this.currentLangCommandRegex.Match(message.TextValue).Groups["command"];
         if (cmdMatch.Success)
         {
             // Yes, it's a chat command.
             var command = cmdMatch.Value;
             if (ProcessCommand(command))
             {
                 isHandled = true;
             }
         }
     }
 }