示例#1
0
        internal void OnStateUpdated(SteamFriends.PersonaStateCallback callback)
        {
            if (callback == null)
            {
                Bot.ArchiLogger.LogNullError(nameof(callback));
                return;
            }

            if ((callback.AvatarHash == null) || (callback.AvatarHash.Length == 0))
            {
                return;
            }

            string avatarHash = BitConverter.ToString(callback.AvatarHash).Replace("-", "").ToLowerInvariant();

            if (string.IsNullOrEmpty(avatarHash))
            {
                return;
            }

            string avatarURL = "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/" + avatarHash.Substring(0, 2) + "/" + avatarHash + "_full.jpg";

            AvatarPictureBox.ImageLocation = avatarURL;
            AvatarPictureBox.LoadAsync();
        }
示例#2
0
 private void personaStateCallback(SteamFriends.PersonaStateCallback callback)
 {
     if (this.core.ChatInterface.ChatIOMembers.Contains(callback.FriendID))
     {
         this.resetIOMemberList();
     }
 }
示例#3
0
        private static void OnPersonaState(SteamFriends.PersonaStateCallback callback)
        {
            if (!JobManager.TryRemoveJob(new JobID(callback.FriendID), out var job))
            {
                return;
            }

            var command = job.Command;

            if (callback.FriendID.IsClanAccount)
            {
                var clantag = string.IsNullOrEmpty(callback.ClanTag) ?
                              string.Empty :
                              $" {Colors.NORMAL}(Clan tag: {Colors.LIGHTGRAY}{callback.ClanTag}{Colors.NORMAL})";

                command.Reply($"{Colors.BLUE}{callback.Name}{Colors.NORMAL} -{Colors.DARKBLUE} https://steamcommunity.com/gid/{callback.FriendID.ConvertToUInt64()}/{clantag}");
            }
            else if (callback.FriendID.IsIndividualAccount)
            {
                command.Reply($"{Colors.BLUE}{callback.Name}{Colors.NORMAL} -{Colors.DARKBLUE} https://steamcommunity.com/profiles/{callback.FriendID.ConvertToUInt64()}/");
            }
            else
            {
                command.Reply(callback.Name);
            }
        }
示例#4
0
        /// <summary>
        /// Gets someone's name when joining a chatroom and fires off
        /// OnFriendChatEnter module callbacks.
        /// </summary>
        /// <param name="callback"></param>
        private void OnPersonaState(SteamFriends.PersonaStateCallback callback)
        {
            var friendID = callback.FriendID;
            var name     = callback.Name;
            var user     = UserManager.GetUser(friendID);

            if (!UserManager.UserExists(friendID))
            {
                user = UserManager.AddUser(friendID, name, callback.State);
            }

            if (callback.SourceSteamID.IsChatAccount)
            {
                var chatID   = callback.SourceSteamID;
                var chatRoom = ChatRoomManager.AddChatRoom(chatID, null);

                // Add the user to this chat room.
                chatRoom.AddUser(user);

                // Trigger EnteredChat for each module.
                ModuleManager.EnteredChat(chatRoom, user, callback);
            }

            // Update their persona state.
            user.PersonaState = callback.State;
        }
示例#5
0
        void OnPersonaState(SteamFriends.PersonaStateCallback callback)
        {
            var req = GetRequest(r => r.SteamID == callback.FriendID);

            if (req == null)
            {
                return; // not a sid we requested
            }
            if (req.SteamID.IsClanAccount)
            {
                IRC.Instance.Send(req.Channel, "{0}: {1} (http://steamcommunity.com/gid/{2}/)",
                                  req.Requester.Nickname, callback.Name, req.SteamID.ConvertToUInt64()
                                  );
            }
            else if (req.SteamID.IsIndividualAccount)
            {
                IRC.Instance.Send(req.Channel, "{0}: {1} (http://steamcommunity.com/profiles/{2}/) (Last Online = {3}, Last Offline = {4})",
                                  req.Requester.Nickname, callback.Name, req.SteamID.ConvertToUInt64(), callback.LastLogOn, callback.LastLogOff
                                  );
            }
            else
            {
                IRC.Instance.Send(req.Channel, "{0}: {1}", req.Requester.Nickname, callback.Name);
            }
        }
示例#6
0
 public override void OnFriendChatEnter(SteamFriends.PersonaStateCallback callback)
 {
     if (!_cooldowns.Keys.Contains(callback.FriendID))
     {
         _cooldowns[callback.FriendID] = new Stopwatch();
     }
 }
示例#7
0
 private void OnSteamFriendsPersonaChange(SteamFriends.PersonaStateCallback callback)
 {
     new Task(() =>
     {
         GetSteamProfile(callback.FriendID.ConvertToUInt64());
     }).Start();
 }
示例#8
0
        static void OnPersonaState(SteamFriends.PersonaStateCallback callback)
        {
            // this callback is received when the persona state (friend information) of a friend changes

            // for this sample we'll simply display the names of the friends
            Console.WriteLine("State change: {0}", callback.Name);
        }
示例#9
0
        private static void OnPersonaState(SteamFriends.PersonaStateCallback callback)
        {
            JobAction job;

            if (!JobManager.TryRemoveJob(new JobID(callback.FriendID), out job) || !job.IsCommand)
            {
                return;
            }

            var command = job.CommandRequest.Command;

            if (callback.FriendID.IsClanAccount)
            {
                var clantag = string.IsNullOrEmpty(callback.ClanTag) ? string.Empty : string.Format(" {0}(Clan tag: {1}{2}{3})",
                                                                                                    Colors.NORMAL, Colors.LIGHTGRAY, callback.ClanTag, Colors.NORMAL);

                CommandHandler.ReplyToCommand(command, "{0}{1}{2} -{3} https://steamcommunity.com/gid/{4}/{5}",
                                              Colors.BLUE, callback.Name, Colors.NORMAL,
                                              Colors.DARKBLUE, callback.FriendID.ConvertToUInt64(), clantag
                                              );
            }
            else if (callback.FriendID.IsIndividualAccount)
            {
                CommandHandler.ReplyToCommand(command, "{0}{1}{2} -{3} https://steamcommunity.com/profiles/{4}/ {5}(Last login: {6}, Last logoff: {7})",
                                              Colors.BLUE, callback.Name, Colors.NORMAL,
                                              Colors.DARKBLUE, callback.FriendID.ConvertToUInt64(),
                                              Colors.DARKGRAY, callback.LastLogOn, callback.LastLogOff
                                              );
            }
            else
            {
                CommandHandler.ReplyToCommand(command, callback.Name);
            }
        }
示例#10
0
        private static void OnPersonaState(SteamFriends.PersonaStateCallback callback)
        {
            if (!JobManager.TryRemoveJob(new JobID(callback.FriendID), out var job))
            {
                return;
            }

            var command = job.Command;

            if (callback.FriendID.IsClanAccount)
            {
                var clantag = string.IsNullOrEmpty(callback.ClanTag) ? string.Empty : string.Format(" {0}(Clan tag: {1}{2}{3})",
                                                                                                    Colors.NORMAL, Colors.LIGHTGRAY, callback.ClanTag, Colors.NORMAL);

                command.Reply("{0}{1}{2} -{3} https://steamcommunity.com/gid/{4}/{5}",
                              Colors.BLUE, callback.Name, Colors.NORMAL,
                              Colors.DARKBLUE, callback.FriendID.ConvertToUInt64(), clantag
                              );
            }
            else if (callback.FriendID.IsIndividualAccount)
            {
                command.Reply("{0}{1}{2} -{3} https://steamcommunity.com/profiles/{4}/",
                              Colors.BLUE, callback.Name, Colors.NORMAL,
                              Colors.DARKBLUE, callback.FriendID.ConvertToUInt64()
                              );
            }
            else
            {
                command.Reply(callback.Name);
            }
        }
示例#11
0
 public void HandleCallback(CallbackMsg msg)
 {
     if (msg.IsType <SteamFriends.PersonaStateCallback>())
     {
         SteamFriends.PersonaStateCallback callback = (SteamFriends.PersonaStateCallback)msg;
         LoadFriendsList();
     }
 }
示例#12
0
        static void OnPersonaState(SteamFriends.PersonaStateCallback callback)
        {
            // this callback is received when the persona state (friend information) of a friend changes

            // for this sample we'll simply display the names of the friends
            fObject.updateName(new Friend()
            {
                customName = callback.Name, steamFrindsID = callback.FriendID.ConvertToUInt64().ToString()
            });
            Console.WriteLine("State change: {0}", callback.Name);
        }
示例#13
0
        static void OnPersonaState(SteamFriends.PersonaStateCallback callback)
        {
            // this callback is received when the persona state (friend information) of a friend changes

            // for this sample we'll simply display the names of the friends
            AccountController.getAccount(user).setFriendsName(new Friend()
            {
                name = callback.Name, steamFrindsID = callback.FriendID.ConvertToUInt64().ToString()
            });
            Console.WriteLine("State change: {0}", callback.Name);
        }
示例#14
0
 /// <summary>
 /// When someone other than the bot enters the chat, signal the
 /// modules.
 /// </summary>
 /// <param name="chatRoom"></param>
 /// <param name="user"></param>
 /// <param name="callback"></param>
 public void EnteredChat(
     ChatRoom chatRoom,
     User user,
     SteamFriends.PersonaStateCallback callback
     )
 {
     foreach (var module in chatRoom.GetAllModules())
     {
         module.OnChatEnter(callback);
     }
 }
示例#15
0
            void OnPersonaState(SteamFriends.PersonaStateCallback callback)
            {
                // this callback is received when the persona state (friend information) of a friend changes

                // for this sample we'll simply display the names of the friends
                Console.WriteLine("State change: {0} - {1}", callback.Name, callback.State);

                new Task(() =>
                {
                    Test(callback.FriendID.ConvertToUInt64(), callback.Name);
                }).Start();
            }
示例#16
0
        internal async Task OnPersonaState(SteamFriends.PersonaStateCallback callback)
        {
            if (callback == null)
            {
                ASF.ArchiLogger.LogNullError(nameof(callback));
                return;
            }

            string nickname   = callback.Name ?? "";
            string avatarHash = "";

            if ((callback.AvatarHash != null) && (callback.AvatarHash.Length > 0) && callback.AvatarHash.Any(singleByte => singleByte != 0))
            {
                avatarHash = BitConverter.ToString(callback.AvatarHash).Replace("-", "").ToLowerInvariant();
                if (avatarHash.Equals("0000000000000000000000000000000000000000"))
                {
                    avatarHash = "";
                }
            }

            if (!string.IsNullOrEmpty(LastNickname) && nickname.Equals(LastNickname) && !string.IsNullOrEmpty(LastAvatarHash) && avatarHash.Equals(LastAvatarHash))
            {
                return;
            }

            await Semaphore.WaitAsync().ConfigureAwait(false);

            try {
                if (!string.IsNullOrEmpty(LastNickname) && nickname.Equals(LastNickname) && !string.IsNullOrEmpty(LastAvatarHash) && avatarHash.Equals(LastAvatarHash))
                {
                    return;
                }

                const string request             = SharedInfo.StatisticsServer + "/api/PersonaState";
                Dictionary <string, string> data = new Dictionary <string, string>(4)
                {
                    { "SteamID", Bot.SteamID.ToString() },
                    { "Guid", Program.GlobalDatabase.Guid.ToString("N") },
                    { "Nickname", nickname },
                    { "AvatarHash", avatarHash }
                };

                // We don't need retry logic here
                if (await Program.WebBrowser.UrlPost(request, data).ConfigureAwait(false))
                {
                    LastNickname   = nickname;
                    LastAvatarHash = avatarHash;
                }
            } finally {
                Semaphore.Release();
            }
        }
示例#17
0
        private void OnPersonaState(SteamFriends.PersonaStateCallback callback)
        {
            if (callback == null)
            {
                return;
            }

            SteamID       steamID       = callback.FriendID;
            SteamID       sourceSteamID = callback.SourceSteamID;
            string        steamNickname = callback.Name;
            EPersonaState personaState  = callback.State;
            EClanRank     clanRank      = (EClanRank)callback.ClanRank;
        }
示例#18
0
        public void HandleCallback(CallbackMsg msg)
        {
            if (msg.IsType <SteamClient.ConnectCallback>())
            {
                Logger.Get().Log("[Callback] Connected");
            }
            else if (msg.IsType <SteamClient.DisconnectCallback>())
            {
                Logger.Get().Log("[Callback] Disconnected");
                IsAuthorized = false;
                Send(Protocol.Server.LoggedOut);
            }
            else if (msg.IsType <SteamUser.LogOnCallback>())
            {
                SteamUser.LogOnCallback callback = (SteamUser.LogOnCallback)msg;

                Logger.Get().Log("[Callback] Logon: " + callback.Result + "/" + callback.ExtendedResult);

                if (callback.Result == EResult.AccountLogonDenied || callback.Result == EResult.InvalidLoginAuthCode)
                {
                    Send(Protocol.Server.AuthRequest);
                    IsAuthorized = true;
                }

                if (callback.Result == EResult.OK)
                {
                    IsAuthorized = true;
                }
            }
            else if (msg.IsType <SteamUser.LoginKeyCallback>())
            {
                Logger.Get().Log("[Callback] Logged in, setting persona state to online");

                steam.Friends.SetPersonaState(SteamKit2.EPersonaState.Online);

                Send(Protocol.Server.LoggedIn);
            }
            else if (msg.IsType <SteamFriends.FriendMsgCallback>())
            {
                SteamFriends.FriendMsgCallback chat = (SteamFriends.FriendMsgCallback)msg;
                if (chat.EntryType == EChatEntryType.ChatMsg)
                {
                    Send(Protocol.Server.ChatReceived, chat.Sender.ToString(), chat.Message);
                }
            }
            else if (msg.IsType <SteamFriends.PersonaStateCallback>())
            {
                SteamFriends.PersonaStateCallback friend = (SteamFriends.PersonaStateCallback)msg;
                Send(Protocol.Server.FriendStateChanged, friend.FriendID.ToString(), friend.State.ToString(), friend.GameName);
            }
        }
示例#19
0
 public void OnChatEnter(SteamFriends.PersonaStateCallback callback)
 {
     if (ChatEnterCallback != null)
     {
         try
         {
             ChatEnterCallback(callback);
         }
         catch (Exception e)
         {
             ModuleManager.PrintStackFrame(e);
         }
     }
 }
示例#20
0
 private void OnPersonaState(SteamFriends.PersonaStateCallback callback)
 {
     /*
      * If we already have the user saved, just update (all) values
      * Otherwise, create a new entry for them
      */
     if (friends.ContainsKey(callback.FriendID))
     {
         friends[callback.FriendID].UpdateValues(callback);
     }
     else
     {
         friends[callback.FriendID] = new FriendDetails(callback);
     }
 }
示例#21
0
        public void UpdateValues(SteamFriends.PersonaStateCallback callback)
        {
            Name       = callback.Name;
            FriendID   = callback.FriendID;
            State      = callback.State;
            StateFlags = callback.StateFlags;

            GameID         = callback.GameID;
            GameName       = callback.GameName;
            GameServer     = callback.GameServerIP;
            GameServerPort = callback.GameServerPort;
            QueryPort      = callback.QueryPort;

            LastLogOff = callback.LastLogOff;
            LastLogOn  = callback.LastLogOn;
        }
示例#22
0
        private static void OnPersonaState(SteamFriends.PersonaStateCallback obj)
        {
            if (obj.State != EPersonaState.Offline)
            {
                ListPlayingGame.Add(obj.FriendID);
            }
            else
            {
                if (ListPlayingGame.Contains(obj.FriendID))
                {
                    ListPlayingGame.Remove(obj.FriendID);
                }
            }


            Console.WriteLine("State change: {0}", obj.Name);
        }
示例#23
0
        internal static void OnStateUpdated(Bot bot, SteamFriends.PersonaStateCallback callback)
        {
            if ((bot == null) || (callback == null))
            {
                Logging.LogNullError(nameof(bot) + " || " + nameof(callback));
                return;
            }

            BotStatusForm form;

            if (!BotStatusForm.BotForms.TryGetValue(bot.BotName, out form))
            {
                return;
            }

            form.OnStateUpdated(callback);
        }
示例#24
0
        static void OnPersonaState(SteamFriends.PersonaStateCallback callback)
        {
            SteamID       friendID      = callback.FriendID;
            SteamID       sourceSteamID = callback.SourceSteamID.ConvertToUInt64();
            EClanRank     clanRank      = (EClanRank)callback.ClanRank;
            EPersonaState state         = callback.State;

            //ListFriends.UpdateName(friendId.ConvertToUInt64(), callback.Name); not yet
            //ListFriends.UpdateStatus(friendId.ConvertToUInt64(), state.ToString()); not yet

            if (friendID.ConvertToUInt64() == steamClient.SteamID)
            {
                if (sourceSteamID.IsClanAccount)
                {
                    switch (clanRank)
                    {
                    case EClanRank.Owner:
                        // case EClanRank.Officer:
                        //case EClanRank.Moderator:
                        if (!OfficerClanDictionary.ContainsKey(sourceSteamID))
                        {
                            OfficerClanDictionary.Add(sourceSteamID, friendID.ConvertToUInt64());
                        }
                        break;
                    }
                }

                //
                if (callback.GameID > 0)
                {
                    UserPlaying = true;
                }
                else
                {
                    UserPlaying = false;
                }
                if (steamFriends.GetPersonaState() != EPersonaState.Online) //detect when user goes afk
                {
                    //isAwayState = true;
                }
                else
                {
                    //isAwayState = false;
                }
            }
        }
示例#25
0
        void OnPersonaState(SteamFriends.PersonaStateCallback callback)
        {
            // this callback is received when the persona state (friend information) of a friend changes

            // for this sample we'll simply display the names of the friends
            Console.WriteLine("State change: {0}", callback.Name);
            //lstLog.Items.Add(String.Format("상태 변경: {0}", callback.Name));

            String strCurrFindID = callback.FriendID.AccountID.ToString();
            String strCurrName   = callback.Name.ToString();
            int    currIdx       = lstFriendList.FindString(strCurrFindID);

            if (currIdx != -1)
            {
                lstFriendList.Items[currIdx] = strCurrName;
            }


            //isRunning = false;
        }
示例#26
0
        public void OnPersonaState(SteamFriends.PersonaStateCallback cb)
        {
            if (cb.FriendID.IsClanAccount)
            {
                Log.WriteLine("Found clan {0} <{1}>", cb.FriendID, steam_friends.GetClanName(cb.FriendID));

                var c = ClanGroup.Active.FindOrCreate(cb.FriendID);

                c.Id         = cb.FriendID;
                c.AvatarHash = steam_friends.GetClanAvatar(cb.FriendID);
                c.Name       = steam_friends.GetClanName(cb.FriendID);
            }

            Core.Util.Buffer b = new Core.Util.Buffer();
            b.SetAlignment(4);

            b.WriteULong(cb.FriendID);
            b.WriteUInt((uint)cb.StatusFlags);

            Instance.PostCallback(Common.CallbackId(Common.CallbackType.SteamFriends, 4), b);
        }
示例#27
0
        private void OnPersonaStateChanged(SteamFriends.PersonaStateCallback personaStateCallback)
        {
            try
            {
                if (!personaStateCallback.FriendID.IsIndividualAccount)
                {
                    return;
                }
                if (personaStateCallback.FriendID == _steamUser.SteamID)
                {
                    return;
                }

                var steamId = personaStateCallback.FriendID.Render(true);
                _coordinator.Consume(coordinator => coordinator.UpdateUser(steamId, personaStateCallback.Name));
            }
            catch (Exception e)
            {
                _logger.Fatal($"#{SequenceNumber} Fatal unhandled exception (OnPersonaStateChanged) : {e.Message}");
                Restart();
            }
        }
示例#28
0
        internal static void OnPersonaState(Bot bot, SteamFriends.PersonaStateCallback callback)
        {
            if (bot == null)
            {
                ASF.ArchiLogger.LogNullError(nameof(bot));
                return;
            }

            if (callback == null)
            {
                bot.ArchiLogger.LogNullError(nameof(callback));
                return;
            }

            BotStatusForm form;

            if (!BotStatusForm.BotForms.TryGetValue(bot.BotName, out form))
            {
                return;
            }

            form.OnStateUpdated(callback);
        }
示例#29
0
        internal async Task OnPersonaState(SteamFriends.PersonaStateCallback callback)
        {
            if (callback == null)
            {
                ASF.ArchiLogger.LogNullError(nameof(callback));
                return;
            }

            if (DateTime.UtcNow < LastAnnouncementCheck.AddHours(MinAnnouncementCheckTTL))
            {
                return;
            }

            // Don't announce if we don't meet conditions
            if (!Bot.HasMobileAuthenticator || !Bot.BotConfig.TradingPreferences.HasFlag(BotConfig.ETradingPreferences.SteamTradeMatcher) || !await Bot.ArchiWebHandler.HasValidApiKey().ConfigureAwait(false) || !await Bot.ArchiWebHandler.HasPublicInventory().ConfigureAwait(false))
            {
                LastAnnouncementCheck = DateTime.UtcNow;
                ShouldSendHeartBeats  = false;
                return;
            }

            string nickname = callback.Name ?? "";

            string avatarHash = "";

            if ((callback.AvatarHash != null) && (callback.AvatarHash.Length > 0) && callback.AvatarHash.Any(singleByte => singleByte != 0))
            {
                avatarHash = BitConverter.ToString(callback.AvatarHash).Replace("-", "").ToLowerInvariant();
                if (avatarHash.All(singleChar => singleChar == '0'))
                {
                    avatarHash = "";
                }
            }

            bool matchEverything = Bot.BotConfig.TradingPreferences.HasFlag(BotConfig.ETradingPreferences.MatchEverything);

            await Semaphore.WaitAsync().ConfigureAwait(false);

            try {
                if (DateTime.UtcNow < LastAnnouncementCheck.AddHours(MinAnnouncementCheckTTL))
                {
                    return;
                }

                await Trading.LimitInventoryRequestsAsync().ConfigureAwait(false);

                HashSet <Steam.Item> inventory = await Bot.ArchiWebHandler.GetMySteamInventory(true, new HashSet <Steam.Item.EType> {
                    Steam.Item.EType.TradingCard
                }).ConfigureAwait(false);

                // This is actually inventory failure, so we'll stop sending heartbeats but not record it as valid check
                if (inventory == null)
                {
                    ShouldSendHeartBeats = false;
                    return;
                }

                // This is actual inventory
                if (inventory.Count < MinCardsCount)
                {
                    LastAnnouncementCheck = DateTime.UtcNow;
                    ShouldSendHeartBeats  = false;
                    return;
                }

                string request = await GetURL().ConfigureAwait(false) + "/api/Announce";

                Dictionary <string, string> data = new Dictionary <string, string>(6)
                {
                    { "SteamID", Bot.SteamID.ToString() },
                    { "Guid", Program.GlobalDatabase.Guid.ToString("N") },
                    { "Nickname", nickname },
                    { "AvatarHash", avatarHash },
                    { "MatchEverything", matchEverything ? "1" : "0" },
                    { "CardsCount", inventory.Count.ToString() }
                };

                // We don't need retry logic here
                if (await Program.WebBrowser.UrlPost(request, data).ConfigureAwait(false))
                {
                    LastAnnouncementCheck = DateTime.UtcNow;
                    ShouldSendHeartBeats  = true;
                }
            } finally {
                Semaphore.Release();
            }
        }
示例#30
0
 public void OnPersonaState(SteamFriends.PersonaStateCallback callback)
 {
     Console.WriteLine($"Friend state change: {callback.Name}, {callback.State}");
 }