Show / Hide Table of Contents

스카이프/팀즈 사용자의 상태 정보 구독 서비스

스카이프/팀즈 서버에 등록된 사용자의 상태 정보를 수집하여 본 서비스를 구독하는 다른 서비스로 변경사항을 알려주는 서비스입니다.

서비스가 수집한 상태 정보는 DB에 저장되며, 다른 시스템에서 활용할 수 있도록 Web API를 제공합니다.

본 서비스는 구독 모델이 적용되어 있습니다. 알림을 받을 웹 주소를 등록하면 상태 정보가 변경되었을 때 변경 내역을 등록한 웹 주소로 전송합니다. 이 기능을 이용하여 그룹웨어, 조직도 등에서 사용자의 상태 정보를 함께 표시할 수 있습니다.

상태 정보 수집 방식

상태정보 수집은 MS가 제공하는 API를 이용하여 일정 간격(기본값 60초)으로 대상자의 상태 정보를 쿼리하는 방식으로 이루어집니다.

  • 스카이프: UCMA를 이용

    UCMA를 사용하기 위해서는 본 서비스가 설치된 서버에 UCMA가 설치되어 있어야 합니다. UCMA 5.0 다운로드

  • 팀즈: MS Graph를 이용

    MS Graph를 사용하기 위해서는 본 서비스가 설치된 서버에서 O365로 HTTPS 접속이 가능해야합니다.

데이터 전송 객체(DTO)

구독 서비스에서 전송하는 객체

구독 서비스는 아래 객체를 Post 방식으로 전송합니다.

    public class PublishedPresencesDto
    {
        public List<PresenceInfo> Results { get; set; }
    }

PresenceInfo 모델 예시입니다. 상태값에 따라 표시할 색이 달라집니다.

    public enum PresenceStatusEnum
    {
        None = 0,
        Unknown = 1,
        Online = 3000,
        _Available = 3500,
        IdleOnline = 4500,
        Busy = 6000,
        _Busy = 6500,
        IdleBusy = 7500,
        InACall = 8000,
        DoNotDisturb = 9000,
        _DoNotDisturb = 9500,
        BeRightBack = 12000,
        _BeRightBack = 12500,
        Away = 15000,
        InActive = 15450,
        _Away = 15500,
        Offline = 18000,
        _Offline = 18500
    }

    public class PresenceInfo
    {
        public string SipAddress { get; set; }
        public string PresenceStatusString { get; set; }
        public int PresenceValue { get; set; }
        public string PresenceColor { get; set; }
        public string Availability { get; set; }
        public long AvailabilityValue { get; set; }


        private PresenceStatusEnum _presenceStatus;
        public PresenceStatusEnum PresenceStatus
        {
            get
            {
                return _presenceStatus;
            }
            set
            {
                if (this.AvailabilityValue == -1)
                    value = PresenceStatusEnum.Offline;

                _presenceStatus = value;
                this.PresenceStatusString = value.ToString();
                this.PresenceValue = Convert.ToInt32(value);

                string rvColor = "FFFFFF";
                switch (value)
                {
                    case PresenceStatusEnum.None:
                        {
                            break;
                        }

                    case PresenceStatusEnum.Unknown:
                        {
                            rvColor = "AAAAAA";
                            break;
                        }

                    case PresenceStatusEnum.Online:
                        {
                            rvColor = "6EB005";
                            break;
                        }

                    case PresenceStatusEnum._Available:
                        {
                            rvColor = "6EB005";
                            break;
                        }

                    case PresenceStatusEnum.IdleOnline:
                        {
                            rvColor = "6EB005";
                            break;
                        }

                    case PresenceStatusEnum.Busy:
                        {
                            rvColor = "E9001B";
                            break;
                        }

                    case PresenceStatusEnum._Busy:
                        {
                            rvColor = "E9001B";
                            break;
                        }

                    case PresenceStatusEnum.IdleBusy:
                        {
                            rvColor = "E9001B";
                            break;
                        }

                    case PresenceStatusEnum.InACall:
                        {
                            rvColor = "E9001B";
                            break;
                        }

                    case PresenceStatusEnum.DoNotDisturb:
                        {
                            rvColor = "E9001B";
                            break;
                        }

                    case PresenceStatusEnum._DoNotDisturb:
                        {
                            rvColor = "E9001B";
                            break;
                        }

                    case PresenceStatusEnum.BeRightBack:
                        {
                            rvColor = "FAC914";
                            break;
                        }

                    case PresenceStatusEnum._BeRightBack:
                        {
                            rvColor = "FAC914";
                            break;
                        }

                    case PresenceStatusEnum.Away:
                        {
                            rvColor = "FAC914";
                            break;
                        }

                    case PresenceStatusEnum.InActive:
                        {
                            rvColor = "FAC914";
                            break;
                        }

                    case PresenceStatusEnum._Away:
                        {
                            rvColor = "FAC914";
                            break;
                        }

                    case PresenceStatusEnum.Offline:
                        {
                            rvColor = "B6CFD8";
                            break;
                        }

                    case PresenceStatusEnum._Offline:
                        {
                            rvColor = "B6CFD8";
                            break;
                        }

                    default:
                        {
                            break;
                        }
                }
                this.PresenceColor = rvColor;
            }
        }

    }
Back to top Generated by DocFX