# -*- coding: utf-8 -*-
# Pythonized version of C-header with some additions (country/region/zodiac codes)

PROTO_VERSION_MAJOR = 1L
PROTO_VERSION_MINOR = 9L
PROTO_VERSION = (PROTO_VERSION_MAJOR << 16) | (PROTO_VERSION_MINOR)

CS_MAGIC = 0xDEADBEEFL		# Клиентский Magic ( C <-> S )

MRIM_CS_HELLO = 0x1001		# C -> S
MRIM_CS_HELLO_ACK = 0x1002	# S -> C
MRIM_CS_LOGIN_ACK = 0x1004	# S -> C
MRIM_CS_LOGIN_REJ = 0x1005	# S -> C
MRIM_CS_PING = 0x1006		# C -> S

########
MRIM_CS_MESSAGE = 0x1008	# C -> S
'''
	UL flags
	LPS to
	LPS message
	LPS rtf-formatted message (>=1.1)
'''
MESSAGE_FLAG_OFFLINE = 0x00000001
MESSAGE_FLAG_NORECV = 0x00000004
MESSAGE_FLAG_AUTHORIZE = 0x00000008	# X-MRIM-Flags: 00000008
MESSAGE_FLAG_SYSTEM = 0x00000040
MESSAGE_FLAG_RTF = 0x00000080
MESSAGE_FLAG_CONTACT = 0x00000200
MESSAGE_FLAG_NOTIFY = 0x00000400
MESSAGE_FLAG_SMS = 0x00000800
MESSAGE_FLAG_MULTICAST = 0x00001000
MESSAGE_FLAG_SMS_STATUS = 0x00002000
##############

MAX_MULTICAST_RECIPIENTS = 50
MESSAGE_USERFLAGS_MASK = 0x00003688	# Flags that user is allowed to set himself
MESSAGE_SERVERFLAGS_MASK = 0x000016CD

MRIM_CS_MESSAGE_ACK = 0x1009		# S -> C
'''
	UL msg_id
	UL flags
	LPS from
	LPS message
	LPS rtf-formatted message (>=1.1)
'''

MRIM_CS_MESSAGE_RECV = 0x1011		# C -> S
'''
	LPS from
	UL msg_id
'''

####################################
MRIM_CS_MESSAGE_STATUS = 0x1012		# S -> C
'''
	UL status
'''
MESSAGE_DELIVERED = 0x0000			# Message delivered directly to user
MESSAGE_REJECTED_NOUSER = 0x8001		# Message rejected - no such user
MESSAGE_REJECTED_LIMIT_EXCEEDED = 0x8004	# Offline messages limit exceeded
MESSAGE_REJECTED_TOO_LARGE = 0x8005		# Message is too large
MESSAGE_REJECTED_DENY_OFFMSG = 0x8006		# User does not accept offline messages
####################################

####################################
MRIM_CS_USER_STATUS = 0x100F		# S -> C
'''
	UL status
'''
STATUS_OFFLINE = 0x00000000
STATUS_ONLINE = 0x00000001
STATUS_AWAY = 0x00000002
STATUS_UNDETERMINATED = 0x00000003
STATUS_FLAG_INVISIBLE = 0x80000001L
'''
	LPS user
'''
####################################

####################################
MRIM_CS_LOGOUT = 0x1013			# S -> C
'''
	UL reason
'''
LOGOUT_NO_RELOGIN_FLAG = 0x0010			# Logout due to double login
####################################

MRIM_CS_CONNECTION_PARAMS = 0x1014		# S -> C

####################################
MRIM_CS_ADD_CONTACT = 0x1019			# C -> S
'''
	UL flags (group(2) or usual(0) 
	UL group id (unused if contact is group)
	LPS contact
	LPS name
'''
CONTACT_FLAG_REMOVED   = 0x00000001
CONTACT_FLAG_GROUP     = 0x00000002
CONTACT_FLAG_INVISIBLE = 0x00000004
CONTACT_FLAG_VISIBLE   = 0x00000008
CONTACT_FLAG_IGNORE    = 0x00000010
CONTACT_FLAG_SHADOW    = 0x00000020
CONTACT_FLAG_SMS       = 0x00100000
####################################

MRIM_CS_USER_INFO = 0x1015			# S -> C

####################################
MRIM_CS_ADD_CONTACT_ACK = 0x101A		# S -> C
'''
	UL status
	UL contact_id or (u_long)-1 if status is not OK
'''
CONTACT_OPER_SUCCESS = 0x0000
CONTACT_OPER_ERROR = 0x0001
CONTACT_OPER_INTERR = 0x0002
CONTACT_OPER_NO_SUCH_USER = 0x0003
CONTACT_OPER_INVALID_INFO = 0x0004
CONTACT_OPER_USER_EXISTS = 0x0005
CONTACT_OPER_GROUP_LIMIT = 0x6
####################################

MRIM_CS_MODIFY_CONTACT = 0x101B			#C -> S
'''
	UL id
	UL flags - same as for MRIM_CS_ADD_CONTACT
	UL group id (unused if contact is group)
	LPS contact
	LPS name
	LPS sms numbers
'''

MRIM_CS_MODIFY_CONTACT_ACK = 0x101C		# S -> C
'''
	UL status, same as for MRIM_CS_ADD_CONTACT_ACK
'''

MRIM_CS_OFFLINE_MESSAGE_ACK = 0x101D		# S -> C
'''
	UIDL
	LPS offline message
'''

MRIM_CS_DELETE_OFFLINE_MESSAGE = 0x101E		# C -> S
'''
	UIDL
'''

MRIM_CS_AUTHORIZE = 0x1020			# C -> S
'''
	LPS user
'''

MRIM_CS_AUTHORIZE_ACK = 0x1021			# S -> C
'''
	LPS user
'''

MRIM_CS_CHANGE_STATUS = 0x1022			# C -> S
'''
	UL new status
'''

MRIM_CS_GET_MPOP_SESSION = 0x1024		# C -> S

########################################
MRIM_CS_GET_MPOP_SESSION_ACK = 0x1025			# S -> C
MRIM_GET_SESSION_FAIL = 0
MRIM_GET_SESSION_SUCCESS = 1
'''
	UL status 
	LPS mpop session
'''
########################################

########################################
MRIM_CS_WP_REQUEST = 0x1029			# C->S
'''
	DWORD field, LPS value
'''
MRIM_CS_WP_REQUEST_PARAM_USER = 0x00
MRIM_CS_WP_REQUEST_PARAM_DOMAIN = 0x01
MRIM_CS_WP_REQUEST_PARAM_NICKNAME = 0x02
MRIM_CS_WP_REQUEST_PARAM_FIRSTNAME = 0x03
MRIM_CS_WP_REQUEST_PARAM_LASTNAME = 0x04
MRIM_CS_WP_REQUEST_PARAM_SEX = 0x05
MRIM_CS_WP_REQUEST_PARAM_BIRTHDAY = 0x06
MRIM_CS_WP_REQUEST_PARAM_DATE1 = 0x07
MRIM_CS_WP_REQUEST_PARAM_DATE2 = 0x08
#!!!!!!!!!!!!!!!!!!!online request param must be at end of request!!!!!!!!!!!!!!!
MRIM_CS_WP_REQUEST_PARAM_ONLINE = 0x09
MRIM_CS_WP_REQUEST_PARAM_STATUS = 0x0a		#we do not used it, yet
MRIM_CS_WP_REQUEST_PARAM_CITY_ID = 0x0b
MRIM_CS_WP_REQUEST_PARAM_ZODIAC = 0x0c
MRIM_CS_WP_REQUEST_PARAM_BIRTHDAY_MONTH = 0x0d
MRIM_CS_WP_REQUEST_PARAM_BIRTHDAY_DAY = 0x0e
MRIM_CS_WP_REQUEST_PARAM_COUNTRY_ID = 0x0f
MRIM_CS_WP_REQUEST_PARAM_MAX = 0x10
########################################

PARAMS_NUMBER_LIMIT = 50
PARAM_VALUE_LENGTH_LIMIT = 64

########################################
MRIM_CS_ANKETA_INFO = 0x1028			# S->C
'''
	DWORD status
'''
MRIM_ANKETA_INFO_STATUS_OK = 1
MRIM_ANKETA_INFO_STATUS_NOUSER = 0
MRIM_ANKETA_INFO_STATUS_DBERR = 2
MRIM_ANKETA_INFO_STATUS_RATELIMERR = 3
'''
	DWORD fields_num				
	DWORD max_rows
	DWORD server_time sec since 1970 (unixtime)
	fields set 				//%fields_num == 0
	values set 				//%fields_num == 0
	LPS value (numbers too)
'''
########################################

#MRIM_CS_MAILBOX_STATUS = 0x1033
#'''
#	DWORD new messages in mailbox
#'''

MRIM_CS_MAILBOX_STATUS = 0x1048			# S -> C
'''
	UL - message number
	LPS - sender
	LPS - subject
	UL - unix_time
	UL - unknown
'''

MRIM_CS_MAILBOX_STATUS_OLD = 0x1033		# S -> C

########################################
MRIM_CS_CONTACT_LIST2 = 0x1037			#S->C
'''
	UL status
'''
GET_CONTACTS_OK = 0x0000
GET_CONTACTS_ERROR = 0x0001
GET_CONTACTS_INTERR = 0x0002
'''
	DWORD status  - if ...OK than this staff:
	DWORD groups number
	mask symbols table:
	's' - lps
	'u' - unsigned long
	'z' - zero terminated string 
	LPS groups fields mask 
	LPS contacts fields mask 
	group fields
	contacts fields
	groups mask 'us' == flags, name
	contact mask 'uussuu' flags, flags, internal flags, status
'''
########################################

MRIM_CS_LOGIN2 = 0x1038				# C -> S

MAX_CLIENT_DESCRIPTION = 256
'''
	LPS login
	LPS password
	DWORD status
	+ statistic packet data: 
		LPS client description //max 256
'''

# Not described in protocol! (mail.ru sucks)
#MRIM_CS_FILE_TRANSFER = 0x1026			# S -> C
MRIM_CS_SMS = 0x1039
'''
	UL - unknown
	LPS - number
	LPS - text
'''
MRIM_CS_SMS_ACK = 0x1040
'''
	UL - status
'''

ZODIAC = {
	'1':'Овен',
	'2':'Телец',
	'3':'Близнецы',
	'4':'Рак',
	'5':'Лев',
	'6':'Дева',
	'7':'Весы',
	'8':'Скорпион',
	'9':'Стрелец',
	'10':'Козерог',
	'11':'Водолей',
	'12':'Рыбы'
}

MONTH = {
	'1':'Январь',
	'2':'Февраль',
	'3':'Март',
	'4':'Апрель',
	'5':'Май',
	'6':'Июнь',
	'7':'Июль',
	'8':'Август',
	'9':'Сентябрь',
	'10':'Октябрь',
	'11':'Ноябрь',
	'12':'Декабрь'
}

COUNTRY = {
	'24':'Россия',
	'123':'Австралия',
	'40':'Австрия',
	'81':'Азербайджан',
	'82':'Армения',
	'340':'Белоруссия',
	'38':'Бельгия',
	'41':'Болгария',
	'45':'Великобритания',
	'44':'Венгрия',
	'46':'Германия',
	'48':'Греция',
	'83':'Грузия',
	'49':'Дания',
	'86':'Израиль',
	'95':'Индия',
	'50':'Ирландия',
	'51':'Исландия',
	'34':'Испания',
	'52':'Италия',
	'84':'Казахстан',
	'138':'Канада',
	'107':'Кипр',
	'92':'Киргизия (Кыргызстан)',
	'76':'Китай',
	'29':'Корея (КНДР)',
	'108':'Корея, республика',
	'53':'Латвия',
	'54':'Литва',
	'59':'Молдавия',
	'60':'Нидерланды',
	'130':'Новая Зеландия',
	'61':'Норвегия',
	'62':'Польша',
	'35':'Португалия',
	'63':'Румыния',
	'139':'США',
	'74':'Сербия и Черногория',
	'65':'Словакия',
	'66':'Словения',
	'91':'Таджикистан',
	'90':'Туркмения',
	'77':'Турция',
	'93':'Узбекистан',
	'39':'Украина',
	'68':'Финляндия',
	'37':'Франция',
	'69':'Хорватия',
	'70':'Чехия',
	'71':'Швейцария',
	'72':'Швеция',
	'73':'Эстония',
	'225':'ЮАР',
	'75':'Япония'
}

CITY = {
	'25':'Москва',
	'293':'Московская область',
	'226':'Санкт-Петербург',
	'257':'Ленинградская область',
	'262':'Агинский Бурятский АО',
	'301':'Адыгея',
	'263':'Алтай (Республика)',
	'264':'Алтайский край',
	'227':'Амурская область',
	'252':'Архангельская область',
	'302':'Астраханская область',
	'237':'Башкортостан',
	'284':'Белгородская область',
	'285':'Брянская область',
	'265':'Бурятия',
	'286':'Владимирская область',
	'303':'Волгоградская область',
	'253':'Вологодская область',
	'287':'Воронежская область',
	'304':'Дагестан',
	'228':'Еврейская АО',
	'288':'Ивановская область',
	'305':'Ингушетия',
	'266':'Иркутская область',
	'306':'Кабардино-Балкария',
	'254':'Калининградская область',
	'307':'Калмыкия',
	'289':'Калужская область',
	'229':'Камчатская область',
	'308':'Карачаево-Черкессия',
	'255':'Карелия',
	'267':'Кемеровская область',
	'238':'Кировская область',
	'256':'Коми',
	'239':'Коми-Пермяцкий АО',
	'230':'Корякский АО',
	'290':'Костромская область',
	'309':'Краснодарский край',
	'268':'Красноярский край',
	'278':'Курганская область',
	'291':'Курская область',
	'292':'Липецкая область',
	'231':'Магаданская область',
	'240':'Марий-Эл',
	'241':'Мордовия',
	'258':'Мурманская область',
	'259':'Ненецкий АО',
	'242':'Нижегородская область',
	'260':'Новгородская область',
	'269':'Новосибирская область',
	'270':'Омская область',
	'243':'Оренбургская область',
	'294':'Орловская область',
	'244':'Пензенская область',
	'245':'Пермская область',
	'232':'Приморский край',
	'261':'Псковская область',
	'310':'Ростовская область',
	'295':'Рязанская область',
	'246':'Самарская область',
	'247':'Саратовская область',
	'233':'Саха (Якутия)',
	'234':'Сахалинская область',
	'279':'Свердловская область',
	'311':'Северная Осетия - Алания',
	'296':'Смоленская область',
	'312':'Ставропольский край',
	'271':'Таймырский АО',
	'297':'Тамбовская область',
	'248':'Татарстан',
	'298':'Тверская область',
	'272':'Томская область',
	'299':'Тульская область',
	'273':'Тыва',
	'280':'Тюменская область',
	'249':'Удмуртия',
	'250':'Ульяновская область',
	'274':'Усть-Ордынский Бурят. АО',
	'235':'Хабаровский край',
	'275':'Хакасия',
	'281':'Ханты-Мансийский АО',
	'282':'Челябинская область',
	'313':'Чечня',
	'276':'Читинская область',
	'251':'Чувашия',
	'236':'Чукотский АО',
	'277':'Эвенкийский АО',
	'283':'Ямало-Ненецкий АО',
	'300':'Ярославская область'
}