/* * Copyright (c) 2006-2008, openmetaverse.org * All rights reserved. * * - Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * - Neither the name of the openmetaverse.org nor the names * of its contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ using System; using System.Net; using System.Collections.Generic; using System.Threading; using OpenMetaverse.Packets; namespace OpenMetaverse { #region Enums /// /// Avatar profile flags /// [Flags] public enum ProfileFlags : uint { AllowPublish = 1, MaturePublish = 2, Identified = 4, Transacted = 8, Online = 16 } #endregion Enums /// /// Represents an avatar (other than your own) /// public class Avatar : Primitive { #region Subclasses /// /// Positive and negative ratings /// public struct Statistics { /// Positive ratings for Behavior public int BehaviorPositive; /// Negative ratings for Behavior public int BehaviorNegative; /// Positive ratings for Appearance public int AppearancePositive; /// Negative ratings for Appearance public int AppearanceNegative; /// Positive ratings for Building public int BuildingPositive; /// Negative ratings for Building public int BuildingNegative; /// Positive ratings given by this avatar public int GivenPositive; /// Negative ratings given by this avatar public int GivenNegative; } /// /// Avatar properties including about text, profile URL, image IDs and /// publishing settings /// public struct AvatarProperties { /// First Life about text public string FirstLifeText; /// First Life image ID public UUID FirstLifeImage; /// public UUID Partner; /// public string AboutText; /// public string BornOn; /// public string CharterMember; /// Profile image ID public UUID ProfileImage; /// Flags of the profile public ProfileFlags Flags; /// Web URL for this profile public string ProfileURL; #region Properties /// Should this profile be published on the web public bool AllowPublish { get { return ((Flags & ProfileFlags.AllowPublish) != 0); } set { if (value == true) Flags |= ProfileFlags.AllowPublish; else Flags &= ~ProfileFlags.AllowPublish; } } /// Avatar Online Status public bool Online { get { return ((Flags & ProfileFlags.Online) != 0); } set { if (value == true) Flags |= ProfileFlags.Online; else Flags &= ~ProfileFlags.Online; } } /// Is this a mature profile public bool MaturePublish { get { return ((Flags & ProfileFlags.MaturePublish) != 0); } set { if (value == true) Flags |= ProfileFlags.MaturePublish; else Flags &= ~ProfileFlags.MaturePublish; } } /// public bool Identified { get { return ((Flags & ProfileFlags.Identified) != 0); } set { if (value == true) Flags |= ProfileFlags.Identified; else Flags &= ~ProfileFlags.Identified; } } /// public bool Transacted { get { return ((Flags & ProfileFlags.Transacted) != 0); } set { if (value == true) Flags |= ProfileFlags.Transacted; else Flags &= ~ProfileFlags.Transacted; } } #endregion Properties } /// /// Avatar interests including spoken languages, skills, and "want to" /// choices /// public struct Interests { /// Languages profile field public string LanguagesText; /// // FIXME: public uint SkillsMask; /// public string SkillsText; /// // FIXME: public uint WantToMask; /// public string WantToText; } #endregion Subclasses #region Public Members /// Groups that this avatar is a member of public List Groups = new List(); /// Positive and negative ratings public Statistics ProfileStatistics; /// Avatar properties including about text, profile URL, image IDs and /// publishing settings public AvatarProperties ProfileProperties; /// Avatar interests including spoken languages, skills, and "want to" /// choices public Interests ProfileInterests; /// Movement control flags for avatars. Typically not set or used by /// clients. To move your avatar, use Client.Self.Movement instead public AgentManager.ControlFlags ControlFlags; #endregion Public Members protected string name; protected string groupName; #region Properties /// First name public string FirstName { get { for (int i = 0; i < NameValues.Length; i++) { if (NameValues[i].Name == "FirstName" && NameValues[i].Type == NameValue.ValueType.String) return (string)NameValues[i].Value; } return String.Empty; } } /// Last name public string LastName { get { for (int i = 0; i < NameValues.Length; i++) { if (NameValues[i].Name == "LastName" && NameValues[i].Type == NameValue.ValueType.String) return (string)NameValues[i].Value; } return String.Empty; } } /// Full name public string Name { get { if (!String.IsNullOrEmpty(name)) { return name; } else if (NameValues != null && NameValues.Length > 0) { lock (NameValues) { string firstName = String.Empty; string lastName = String.Empty; for (int i = 0; i < NameValues.Length; i++) { if (NameValues[i].Name == "FirstName" && NameValues[i].Type == NameValue.ValueType.String) firstName = (string)NameValues[i].Value; else if (NameValues[i].Name == "LastName" && NameValues[i].Type == NameValue.ValueType.String) lastName = (string)NameValues[i].Value; } if (firstName != String.Empty && lastName != String.Empty) { name = String.Format("{0} {1}", firstName, lastName); return name; } else { return String.Empty; } } } else { return String.Empty; } } } /// Active group public string GroupName { get { if (!String.IsNullOrEmpty(groupName)) { return groupName; } else { lock (NameValues) { if (NameValues == null || NameValues.Length == 0) { return String.Empty; } else { for (int i = 0; i < NameValues.Length; i++) { if (NameValues[i].Name == "Title" && NameValues[i].Type == NameValue.ValueType.String) { groupName = (string)NameValues[i].Value; return groupName; } } return String.Empty; } } } } } #endregion Properties #region Constructors /// /// Default constructor /// public Avatar() { } #endregion Constructors } }