public void StartCharmBot()
        {
            var process = Process.GetProcesses().Where(p => p.ProcessName.ToLower().Contains("league of legends")).FirstOrDefault();
            var reader  = new ProcessMemoryReader()
            {
                Process = process
            };

            reader.Open();
            dispatcher.BeginInvoke((Action)(() => {
                MemoryReaderStatusChanged?.Invoke(true);
            }));
            try
            {
                GameObject localPlayer          = new GameObject(reader, reader.ReadInt(reader.ModuleBaseAddr + Offsets.LocalPlayer));
                int        objectManagerPointer = reader.ReadInt(reader.ModuleBaseAddr + Offsets.ObjectManager);
                float      charmEffectSeenAt    = -1;
                var        seenCharm            = false;
                while (true)
                {
                    process = Process.GetProcesses().Where(p => p.ProcessName.ToLower().Contains("league of legends")).FirstOrDefault();
                    if (process == null)
                    {
                        break;
                    }
                    var gameObjects    = GameObject.GetGameObjects(reader, objectManagerPointer);
                    var enemyChampions = gameObjects.Where(g => g.Team != localPlayer.Team && isChampion(g.Name) || (g.Name?.ToLower()?.Contains("dummy") ?? false)).ToList();
                    var ahriCharm      = gameObjects.Where(c => c.SpellName == "AhriSeduceMissile").FirstOrDefault();
                    var gameTime       = reader.ReadFloat(reader.ModuleBaseAddr + Offsets.GameTime);
                    foreach (var champ in enemyChampions)
                    {
                        champ.ReadBuffs();
                        var ahriCharmBuff = champ.ActiveBuffs.FirstOrDefault(b => b.Name == "AhriSeduce" && gameTime < b.EndTime && charmEffectSeenAt < b.StartTime);
                        if (ahriCharmBuff != null)
                        {
                            if (!seenCharm)
                            {
                                CharmBotCharmCast?.Invoke(gameTime);
                            }
                            CharmBotCharmHit?.Invoke(gameTime, champ.Name);
                            charmEffectSeenAt = ahriCharmBuff.StartTime;
                        }
                    }

                    if (ahriCharm != null)
                    {
                        if (!seenCharm)
                        {
                            CharmBotCharmCast?.Invoke(gameTime);
                        }
                        seenCharm = true;
                    }
                    else
                    {
                        seenCharm = false;
                    }
                    Thread.Sleep(10);
                }
            }
            catch (Exception) {
            }
            finally
            {
                dispatcher.BeginInvoke((Action)(() => {
                    MemoryReaderStatusChanged?.Invoke(false);
                }));
                reader.Close();
            }
        }