스카이프/팀즈 사용자의 상태 정보 구독 서비스
스카이프/팀즈 서버에 등록된 사용자의 상태 정보를 수집하여 본 서비스를 구독하는 다른 서비스로 변경사항을 알려주는 서비스입니다.
서비스가 수집한 상태 정보는 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;
}
}
}