Changeset 616 in Corrade


Ignore:
Timestamp:
Nov 25, 2017, 12:07:34 PM (3 months ago)
Author:
office
Message:
  • When the "list" action is requested for the "notify" command, only list notifications matching "type" and "tags" instead of dumping the entire list of notifications. Similarly, only dump the entire list of notifications if no "type" or "tags" were requested. Implements behaviour change request from #47 (thanks PauDat?)!
  • Make movement state restoration explicit and check data sanity.
Location:
Corrade
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • Corrade/Corrade.cs

    r614 r616  
    18781878                            XmlSerializerCache.Serialize(writer, new AgentMovement
    18791879                            {
     1880                                BodyRotation = Client.Self.Movement.BodyRotation,
     1881                                HeadRotation = Client.Self.Movement.HeadRotation,
    18801882                                AlwaysRun = Client.Self.Movement.AlwaysRun,
    18811883                                AutoResetControls = Client.Self.Movement.AutoResetControls,
     
    19261928                                var movement = XmlSerializerCache.Deserialize<AgentMovement>(streamReader);
    19271929                                Locks.ClientInstanceSelfLock.EnterWriteLock();
     1930
     1931                                if(!movement.BodyRotation.Equals(Vector3.Zero))
     1932                                    Client.Self.Movement.BodyRotation = movement.BodyRotation;
     1933                                if(!movement.HeadRotation.Equals(Vector3.Zero))
     1934                                    Client.Self.Movement.HeadRotation = movement.HeadRotation;
     1935
    19281936                                Client.Self.Movement.AlwaysRun = movement.AlwaysRun;
    19291937                                Client.Self.Movement.AutoResetControls = movement.AutoResetControls;
    19301938                                Client.Self.Movement.Away = movement.Away;
    19311939                                Client.Self.Movement.Flags = movement.Flags;
     1940                                Client.Self.Movement.State = movement.State;
     1941                                Client.Self.Movement.Mouselook = movement.Mouselook;
     1942                                Client.Self.Movement.StandUp = movement.StandUp;
    19321943                                Client.Self.Movement.Fly = movement.Fly;
    1933                                 Client.Self.Movement.Mouselook = movement.Mouselook;
     1944
     1945                                // Sitting down while airborne makes Corrade vanish (libomv issue).
    19341946                                Client.Self.Movement.SitOnGround = movement.SitOnGround;
    1935                                 Client.Self.Movement.StandUp = movement.StandUp;
    1936                                 Client.Self.Movement.State = movement.State;
     1947
    19371948                                Client.Self.Movement.SendUpdate(true);
    19381949                                Locks.ClientInstanceSelfLock.ExitWriteLock();
  • Corrade/commands/Corrade/Notify.cs

    r610 r616  
    151151                                (o, state) =>
    152152                                {
    153                                     var notificationValue =
    154                                         (ulong) Reflection.GetEnumValueFromName<Configuration.Notifications>(o);
    155                                     if (!GroupHasNotification(corradeCommandParameters.Group.UUID, notificationValue))
     153                                    var notificationType = Reflection.GetEnumValueFromName<Configuration.Notifications>(o);
     154                                    // Check that the notification supplied by the user resolves to a defined notification.
     155                                    if (notificationType.Equals(Configuration.Notifications.NONE))
     156                                        return;
     157
     158                                    if (!GroupHasNotification(corradeCommandParameters.Group.UUID, (ulong)notificationType))
    156159                                    {
    157160                                        // one of the notification was not allowed, so abort
     
    162165                                    notification.Afterburn = afterburn;
    163166                                    SerializableDictionary<string, HashSet<string>> HTTPNotificationData;
    164                                     switch (!notification.HTTPNotifications
    165                                         .TryGetValue((Configuration.Notifications) notificationValue,
    166                                             out HTTPNotificationData))
     167                                    switch (!notification.HTTPNotifications.TryGetValue(notificationType, out HTTPNotificationData))
    167168                                    {
    168169                                        case true:
    169170                                            lock (LockObject)
    170171                                            {
    171                                                 notification.HTTPNotifications.Add(
    172                                                     (Configuration.Notifications) notificationValue,
     172                                                notification.HTTPNotifications.Add(notificationType,
    173173                                                    new SerializableDictionary<string, HashSet<string>> {{url, tags}}
    174174                                                );
     
    195195                                            lock (LockObject)
    196196                                            {
    197                                                 notification.HTTPNotifications[
    198                                                         (Configuration.Notifications) notificationValue] =
     197                                                notification.HTTPNotifications[notificationType] =
    199198                                                    HTTPNotificationData;
    200199                                            }
     
    324323                                    .Where(o => !string.IsNullOrEmpty(o))
    325324                                    .Distinct()
    326                                     .Select(o => Reflection.GetEnumValueFromName<Configuration.Notifications>(o)));
     325                                    .Select(o => Reflection.GetEnumValueFromName<Configuration.Notifications>(o))
     326                                    .Where(o => !o.Equals(Configuration.Notifications.NONE)));
    327327                            lock (GroupNotificationsLock)
    328328                            {
     
    332332                                if (groupNotification != null)
    333333                                {
    334                                     var groupNotificationTypes = new HashSet<Configuration.Notifications>(Reflection
    335                                         .GetEnumNames<Configuration.Notifications>()
     334                                    var groupNotificationTypes = new HashSet<Configuration.Notifications>(
     335                                        Reflection.GetEnumNames<Configuration.Notifications>()
    336336                                        .AsParallel()
    337                                         .Select(o => new
    338                                         {
    339                                             Type = Reflection.GetEnumValueFromName<Configuration.Notifications>(o)
    340                                         })
    341                                         .Where(o => groupNotification.NotificationMask.IsMaskFlagSet(o.Type))
    342                                         .Select(o => o.Type));
     337                                        .Select(o => Reflection.GetEnumValueFromName<Configuration.Notifications>(o))
     338                                        .Where(o => !o.Equals(Configuration.Notifications.NONE) && groupNotification.NotificationMask.IsMaskFlagSet(o)));
     339
     340                                    // No notification types nor tags were requested by the
     341                                    // user then dump the entire list of notifications.
     342                                    if (string.IsNullOrEmpty(notificationTypes) && string.IsNullOrEmpty(tag))
     343                                    {
     344                                        groupNotificationTypes.AsParallel().Select(o => new
     345                                        {
     346                                            Type = o,
     347                                            URLs = groupNotification.HTTPNotifications[o].Keys,
     348                                            Tags = groupNotification.HTTPNotifications[o].Values.SelectMany(p => p)
     349                                        }).ForAll(o =>
     350                                        {
     351                                            lock (LockObject)
     352                                            {
     353                                                csv.Add(Reflection.GetNameFromEnumValue(o.Type));
     354                                                csv.AddRange(o.URLs);
     355                                                csv.AddRange(o.Tags);
     356                                            }
     357                                        });
     358
     359                                        if (csv.Any())
     360                                            result.Add(Reflection.GetNameFromEnumValue(Command.ResultKeys.DATA),
     361                                                CSV.FromEnumerable(csv));
     362                                        break;
     363                                    }
     364
    343365                                    groupNotificationTypes
    344366                                        .AsParallel()
     
    372394                                                return true;
    373395                                            });
    374 
    375                                     // No notifications matched so just dump all the notifications.
    376                                     if (!csv.Any())
    377                                         groupNotificationTypes.AsParallel().Select(o => new
    378                                         {
    379                                             Type = o,
    380                                             URLs = groupNotification.HTTPNotifications[o].Keys,
    381                                             Tags = groupNotification.HTTPNotifications[o].Values.SelectMany(p => p)
    382                                         }).ForAll(o =>
    383                                         {
    384                                             lock (LockObject)
    385                                             {
    386                                                 csv.Add(Reflection.GetNameFromEnumValue(o.Type));
    387                                                 csv.AddRange(o.URLs);
    388                                                 csv.AddRange(o.Tags);
    389                                             }
    390                                         });
    391396                                }
    392397                            }
Note: See TracChangeset for help on using the changeset viewer.