OSDN Git Service

readme変更
[nlite/nlite.git] / nlite / nlite_chatData.cpp
index be5dfb6..51ac8af 100644 (file)
@@ -1,46 +1,73 @@
 #include "stdafx.h"
 #include "nlite_include.h"
+using namespace std::tr1;
+namespace nlite{
+
 
 
-CListenerList nlite::listenerList;
 
 //\83\8a\83X\83i\81[\8c\9f\8dõ\83I\83u\83W\83F\83N\83g
 struct ListenerPre{
 
-       LPCTSTR user_id;
+       ListenerData &user;
 
-       ListenerPre(LPCTSTR user_id_in):
-               user_id(user_id_in)
+       ListenerPre(ListenerData &in_user):
+               user(in_user)
        {}
 
        bool operator()(CListenerList::reference listenerData){
 
-               return _tcscmp(user_id,listenerData.user_id) == 0;
+               
+               return (user.user_id == listenerData.user_id)/* && (user.community == listenerData.community)*/;
        }
 
 };
 
 
+//
+//\83\8a\83X\83i\81[\83f\81[\83^
+/////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+ListenerData::ListenerData():
+user_id(TEXT("")),
+name(TEXT("")),
+community(TEXT("")),
+bgcolor(INIT_COLOR),
+time(0),
+onlyCommunityFlag(FALSE),
+nameColor(INIT_COLOR)
+{}
+
+VOID ListenerData::SetNameColor(COLORREF nameColor_in){
+       nameColor = nameColor_in;
+
+       return;
+}
+
 VOID ListenerData::SetBkColor(COLORREF bkColor_in){
-       bkColor = bkColor_in;
+       bgcolor = bkColor_in;
+
        return;
 }
 
+VOID ListenerData::SetUserName(LPCTSTR name){
 
-VOID CCommentList::OnChatReceve(NicoLiveChat_P chatData_in, UINT_PTR commnetCountSum){
+       this->name = name;
 
-       
-       CChatData chatData;
-       chatData.SetChat(*chatData_in);
-       
 
-       
-       chatList.push_back(chatData);
-       return;
 }
 
 
-VOID CChatData::SetChat(NicoLiveChat &chat_in){
+CChatData::ViewData::ViewData():
+                       sellLineColor(INIT_COLOR),
+                       stringColor(INIT_COLOR),
+                       backColor(INIT_COLOR),
+                 selectFlag(FALSE),
+                 height(0)
+               {}
+
+VOID CChatData::SetChat(NicoLiveChat &chat_in,ListenerData &listener){
        
        
        this->anonymity = _ttol(chat_in.anonymity);
@@ -61,9 +88,22 @@ VOID CChatData::SetChat(NicoLiveChat &chat_in){
 
        this->name = chat_in.name;
 
-       this->listenerData = &listenerList.Register(chat_in.user_id);
 
        
+       this->listenerData = &listenerList.Register(listener,FALSE);
+       tstring target(chat_in.chatBuf);
+       
+       match_results<tstring::iterator> results;
+       if(regex_match(target.begin(),target.end(),results,nliteregex::NAMESERTCHREGEX) == TRUE){
+               
+               const tstring &name = results.str(results.size() - 1).c_str();
+               
+               if(nliteProperty.gp.numberNameFlag == TRUE || _tcstol(name.c_str(),NULL,10) == 0){
+                       this->listenerData->SetUserName(name.c_str());
+               }
+               
+       }
+       
        this->vpos = _ttol(chat_in.vpos);
        this->thread = _ttol(chat_in.thread);
        this->date = _ttol(chat_in.date);
@@ -79,32 +119,80 @@ VOID CChatData::SetChat(NicoLiveChat &chat_in){
 //\83R\83\81\83\93\83g\83\8a\83X\83g\83N\83\89\83X
 //////////////////////////////////////////////////////////////////////////
 
+//\91I\91ð\8ds\8eæ\93¾\97p\83t\83@\83\93\83N\83V\83\87\83i\83\8b
 struct GetCurSelFunc_t{
 
        INT_PTR count;
        BOOL findFlag;
        GetCurSelFunc_t():
-               count(0),
-               findFlag(FALSE)
+               count(0)
                {}
 
-       BOOL operator() (CChatData &target){
+       BOOL operator() (const CChatData &target){
                count++;
-               findFlag = target.selectFlag;
-               return target.selectFlag;
+               return  target.viewData.selectFlag;
        }
 
 };
 
+//\91}\93ü\88Ê\92u\8c\9f\8dõ\83t\83@\83\93\83N\83V\83\87\83i\83\8b
+struct SeartchSetPos_t{
+       time_t time;
+
+       SeartchSetPos_t(time_t in_time):time(in_time){}
+
+       bool operator()(const CChatData &target){
+
+               return time > target.date;
+       }
+};
+
 CCommentList::CCommentList(){}
 
 CCommentList::~CCommentList(){}
 
-INT_PTR CCommentList::GetCurSel(){
-       GetCurSelFunc_t functa;
-       std::find_if(chatList.begin(),chatList.end(),functa);
+CCommentList::iterator CCommentList::GetCurSel(){
+       auto end = this->end();
+       auto ite = this->begin();
 
-       return functa.findFlag == TRUE ? functa.count - 1 : -1;
+       for(;ite != end && ite->viewData.selectFlag == FALSE;++ite);
+
+       return ite ;
+}
+
+
+INT_PTR CCommentList::GetCurSelNo(){
+
+       auto end = this->end();
+       auto ite = this->begin();
+       INT_PTR no = 0;
+       for(;ite != end && ite->viewData.selectFlag == FALSE;++ite,++no);
+
+       return ite != end ? no : -1;
+
+}
+
+
+CCommentList::iterator CCommentList::OnChatReceve(NicoLiveChat_P chatData_in,LPCTSTR communityID, UINT_PTR commnetCountSum,CCommentListWindow &listWindow){
+
+       CChatData chatData;
+       ListenerData listenerData;
+       listenerData.user_id = chatData_in->user_id;
+       listenerData.time = time(NULL);
+       listenerData.community = communityID;
+       chatData.SetChat(*chatData_in,listenerData);
+       iterator rslt;
+       if(empty() == TRUE || back().date <= chatData.date){
+               chatList.push_back(chatData);
+               rslt = (--chatList.end());
+       }else {
+
+               rslt = chatList.insert(std::find_if(chatList.begin(),chatList.end(),SeartchSetPos_t(chatData.date)),chatData);
+       }
+       
+       if(shortcut ==chatList.end())shortcut = chatList.begin();
+
+       return rslt;
 }
 
 CCommentList::iterator CCommentList::GetCurSelItem(){
@@ -114,11 +202,21 @@ CCommentList::iterator CCommentList::GetCurSelItem(){
 }
 
 
-VOID CCommentList::SetCurSel(INT_PTR cursel){
-       if(cursel < 0)return;
-       iterator data = chatList.begin();
-       std::advance(data,cursel);
-       data->selectFlag = TRUE;
+VOID CCommentList::SetCurSel(CCommentList::iterator cursel){
+       
+       auto end = this->end();
+       if(cursel == end)goto end;
+       {
+               auto curselItem = this->GetCurSelItem();
+       
+               if(curselItem != end){
+                       curselItem->viewData.selectFlag = FALSE;
+               }
+       
+               
+               cursel->viewData.selectFlag = TRUE;
+       }
+end:
 
        return;
 }
@@ -157,6 +255,7 @@ CCommentList::iterator CCommentList::end(){
 
 CCommentList::reverse_iterator CCommentList::rbegein(){
 
+       
        return chatList.rbegin();
 }
 
@@ -176,6 +275,7 @@ VOID CCommentList::OnDestroy(){
 
 VOID CCommentList::OnConnect(){
        OnDestroy();
+       shortcut = chatList.begin();
 }
 
 CCommentList::reference CCommentList::back(){
@@ -183,34 +283,194 @@ CCommentList::reference CCommentList::back(){
        return chatList.back();
 }
 
+///
+///\83V\83\87\81[\83g\83J\83b\83g\83C\83e\83\8c\81[\83^\82ð\8eæ\93¾
+///
+CCommentList::iterator CCommentList::GetShortCut(){
+
+       return shortcut;
+}
+               
+///
+///\83V\83\87\81[\83g\83J\83b\83g\82ð\90Ý\92è
+///
+BOOL CCommentList::SetShortCut(UINT_PTR no){
+
+
+       if(static_cast<INT_PTR>(chatList.size()) <= no)return FALSE;
+
+       shortcut = chatList.begin();
+       std::advance(shortcut,no);
+
+       return TRUE;
+
+}
+
+
+
 VOID CListenerList::BkColorCollect(CListenerColorCollector &target){
 
        iterator end = m_listenerList.end();
        std::for_each(m_listenerList.begin(), end,target);
 }
 
-CListenerList::reference CListenerList::Register(LPCTSTR user_id){
+CListenerList::reference CListenerList::Register(ListenerData &listener,BOOL bUpdate){
 
-       ListenerPre listenerPre(user_id);
+       ListenerPre listenerPre(listener);
 
        iterator begin = m_listenerList.begin();
        iterator end = m_listenerList.end();
 
        iterator rslt = std::find_if(begin,end,listenerPre);
 
-       
+
 
        if(rslt == end){
 
-               ListenerData insertData(user_id);
                
+               
+               m_listenerList.push_back(listener);
+               return m_listenerList.back();
 
-               m_listenerList.push_back(insertData);
+       } else if(bUpdate == TRUE){
 
-               return m_listenerList.back();
+               *rslt = listener;
 
+               
        }
        
        return *rslt;
 
+}
+
+BOOL CListenerList::ReadProperty(LPCTSTR fileName){
+       BOOL rslt = FALSE;
+       CAtlFile        userSettingFile;
+       ULONGLONG userSettingFileSize;
+       
+       
+       if(SUCCEEDED(userSettingFile.Create(fileName,GENERIC_READ,FILE_SHARE_READ,OPEN_ALWAYS)) == FALSE || SUCCEEDED(userSettingFile.GetSize(userSettingFileSize)) == FALSE){
+
+               throw Exception(TEXT("\83\8a\83X\83i\81[\90Ý\92è\83t\83@\83C\83\8b\82ª\8aJ\82¯\82Ü\82¹\82ñ\82Å\82µ\82½\81B\82±\82Ì\83G\83\89\81[\82ª\91±\82­\82æ\82¤\82Å\82 \82ê\82Î\81A\88ê\93x\90Ý\92è\83t\83@\83C\83\8b\82ð\8dí\8f\9c\82µ\82Ä\8dÄ\93x\8e\8e\82µ\82Ä\82Ý\82Ä\82­\82¾\82³\82¢"),__LINE__,TEXT(__FILE__),TEXT(__FUNCTION__));
+       }
+       std::vector<char> userSettingBuf(static_cast<UINT_PTR>(userSettingFileSize / sizeof(char) + (1 * sizeof(char))));
+       userSettingFile.Read(&userSettingBuf[0],userSettingBuf.size());
+       LPSTR userSettingStart = strstr(&userSettingBuf[0],"<");
+       if(userSettingStart != NULL){
+               ReadUserSettingXML rusx(nlite::listenerList);
+               rusx.Parse(userSettingStart);
+       }
+
+
+       return rslt;
+}
+#define NLITE_ATTRIBUTE_WRITE_STR(s,n) s->WriteAttributeString(NULL, _tcsstr(TEXT(#n),TEXT("."))  != NULL ? _tcsstr(TEXT(#n),TEXT(".")) + 1 : TEXT(#n), NULL, n)
+
+#define NLITE_ATTRIBUTE_WRITE_INT(s,n) \
+       {\
+       TCHAR buffer[sizeof(n) * 8];\
+       _stprintf(buffer,TEXT("%d"),static_cast<INT>(n));\
+       s->WriteAttributeString(NULL, _tcsstr(TEXT(#n),TEXT(".")) + 1, NULL,buffer );\
+}
+BOOL CListenerList::WriteProperty(LPCTSTR fileName){
+       BOOL rslt = FALSE;
+
+
+       CComPtr<IXmlWriter> pWriter;
+       CreateXmlWriter(__uuidof(IXmlWriter), reinterpret_cast<void**>(&pWriter), 0);
+       // \83t\83@\83C\83\8b\83X\83g\83\8a\81[\83\80\8dì\90¬
+       CComPtr<IStream> pStream;
+       SHCreateStreamOnFile(fileName, STGM_CREATE | STGM_WRITE, &pStream);
+
+       pWriter->SetOutput(pStream);
+
+       // \83C\83\93\83f\83\93\83g\97L\8cø\89»
+       pWriter->SetProperty(XmlWriterProperty_Indent, TRUE);
+
+       // <?xml version="1.0" encoding="UTF-8"?>
+       pWriter->WriteStartDocument(XmlStandalone_Omit);
+
+       pWriter->WriteStartElement(NULL,TEXT("listenerData"),NULL);
+
+
+       auto begin = m_listenerList.begin();
+       auto end = m_listenerList.end();
+
+       for(;begin != end;++begin){
+               if(begin->name.Length() > 0 || begin->nameColor != ListenerData::INIT_COLOR || begin->bgcolor != ListenerData::INIT_COLOR){
+                       pWriter->WriteStartElement(NULL,TEXT("user"),NULL);
+                       if(begin->name.Length() > 0) NLITE_ATTRIBUTE_WRITE_STR(pWriter,(*begin).name);
+                       if(begin->community.Length()> 0) NLITE_ATTRIBUTE_WRITE_STR(pWriter,(*begin).community);
+                       NLITE_ATTRIBUTE_WRITE_INT(pWriter,(*begin).time);
+                       if(begin->bgcolor != ListenerData::INIT_COLOR)NLITE_ATTRIBUTE_WRITE_INT(pWriter,(*begin).bgcolor);
+                       if(begin->nameColor != ListenerData::INIT_COLOR)NLITE_ATTRIBUTE_WRITE_INT(pWriter,(*begin).nameColor);
+                       pWriter->WriteString(begin->user_id);
+                       pWriter->WriteEndElement();
+               }
+       }
+       pWriter->WriteEndDocument();
+       rslt = TRUE;
+       return rslt;
+}
+
+
+ReadUserSettingXML::ReadUserSettingXML(CListenerList &in_listenerList):m_listenerList(in_listenerList),userNodeFlag(FALSE){}
+
+#define NLITE_READ_USER_STRING(at,l,t) if(_tcscmp(at[0],TEXT(#t)) == 0)l.t = at[1]
+#define NLITE_READ_USER_INT(at,l,t)            if(_tcscmp(at[0],TEXT(#t))==0)l.t = _tcstol((const wchar_t*)at[1],NULL,10)
+
+       void ReadUserSettingXML::OnStartElement (const XML_Char *pszName, const XML_Char **papszAttrs){
+
+               if(_tcscmp(pszName,TEXT("user")) == 0){
+
+                       this->userNodeFlag = TRUE;
+
+
+                       for(;papszAttrs[0] != NULL;papszAttrs += 2){
+
+                               NLITE_READ_USER_STRING(papszAttrs,listenerBuff,name);
+                               NLITE_READ_USER_STRING(papszAttrs,listenerBuff,community);
+                               NLITE_READ_USER_INT(papszAttrs,listenerBuff,bgcolor);
+                               NLITE_READ_USER_INT(papszAttrs,listenerBuff,nameColor);
+                               NLITE_READ_USER_INT(papszAttrs,listenerBuff,time);
+                               
+                       }
+
+               }
+
+               return;
+       }
+
+       void ReadUserSettingXML::OnEndElement (const XML_Char *pszName){
+
+               if(_tcscmp(pszName,TEXT("user")) == 0){
+
+                       listenerList.Register(listenerBuff,TRUE);
+                       this->userNodeFlag = FALSE;
+                       this->listenerBuff.~ListenerData();
+                       new(&listenerBuff) ListenerData();
+
+               }
+
+               return;
+       }
+
+       void ReadUserSettingXML::OnCharacterData (const XML_Char *pszData, int nLength){
+
+               if(this->userNodeFlag == TRUE){
+
+                       
+                       if(_tcstol(listenerBuff.user_id,NULL,10) != 0 || ((difftime(time(NULL),604800)) <listenerBuff.time)){
+                               listenerBuff.user_id.Append(pszData,nLength);
+                       }
+
+
+
+               }
+
+               
+
+               return;
+       }
+
 }
\ No newline at end of file