anchor.diff:                      | None              -> users
                       | Some existingUser ->                        
                           disconnectUser existingUser.Session
  -                        log Info "User already exists in that movie. Disconnect user:%s from movie:%s, session %s" userId movieId existingUser.Session
  +                        log Info "? Session: %A User already exists in that movie. Disconnect existing user:%s from movie:%s, session %s" session userId movieId existingUser.Session
                           removeUser existingUser users
                   send (writeMessage ("System", [userId], "Logon", pickle valueP (LString movieId))) session
                   if session.ProtocolVersion > (1, 1) then send (writeMessage ("System", [userId], "SessionID", pickle valueP (LString session.SessionID))) session
                   session.Authenticated     <- true
                   appServer.MaxUserCount    <- maxBy fst [appServer.MaxUserCount   ; length state.Users    , DateTime.UtcNow]
                   appServer.MaxSessionCount <- maxBy fst [appServer.MaxSessionCount; appServer.SessionCount, DateTime.UtcNow]
  -                log Info "+ %-26s Connected to      Movie: %-22s from: %-15s using session:%s Protocol:%i.%i Client:%i.%i" userId movieId (ipAddress session) session.SessionID <|| session.ProtocolVersion <|| session.ClientVersion
  +                log Info "+ Session: %A %-26s connected to      Movie: %-22s (Protocol:%i.%i Client:%i.%i)" session userId movieId <|| session.ProtocolVersion <|| session.ClientVersion
                   {Name= userId; Movie= movieId; Groups= ["@AllUsers"]; Session= session.SessionID}::users
   
   
  
positive.code:                         | Command   cmd        , _ -> state.post session.SessionID (ServerCmd cmd)
                          | AdminCmd (cmd, plist), _ -> processAdminCommand session cmd plist
                          | DBCmd          plist , _ -> processDBCommand    session     plist
                          | Invalid              , _ -> log Warn "Invalid message format received."
  
                      match filter (fun {Regex = r} -> r.IsMatch msg.subject) session.AntiFloodRules with
                      | []    -> processServerMessage()
                      | rules -> session.AntiFloodState.post DateTime.Now rules msg processServerMessage (fun rule -> 
                                      log Warn "Messages %i from session %s ip:%s over rule '%s' tolerance, last message was: %A" msg.errorCode session.SessionID (ipAddress session) rule.RuleId (prettyPrintMsg msg)
                                      state.post session.SessionID (ServerCmd Delete))        
              with exn -> 
                  log Warn "Process message failed for session: %s IP: %s error: %A" session.SessionID (ipAddress session) exn
                  session.Close CloseReason.ProtocolError
  
          let evtLogin (session: CustomProtocolSession) =
              if isInBlackList session then
                  log Warn "Session %s from %A is Blacklisted, will be disconnected." session.SessionID (ipAddress session)
                  session.Close CloseReason.ServerClosing
              else log Debug "Accepted session: %s from: %s" session.SessionID (ipAddress session)
  
          let evtLogout (session: CustomProtocolSession) (reason: CloseReason) =
              log Debug "Close Socket session. %s - reason: %s" session.SessionID (reason.ToString())
              state.post session.SessionID (LogOnOff (DetectDisconnect session reason))
  
          let evtStatus _ = 
  
negative.code:                         session.ProtocolVersion <- protocol
                          session.ClientVersion   <- client 
                          state.post session.SessionID (LogOnOff (Logon session userId movieId))
                      | _ -> failwith "Extract login info failed, expecting a list or a property list."
                  else
                      if appServer.MinLogLevel = Trace then log Trace "Incoming Message: %A" (prettyPrintMsg msg)
                      let recipients = msg.recipients |>> fun recipient -> (recipient+"@").Split [|'@'|] |>> (function "" -> None | s -> Some s) |> Seq.pairwise |> head
  