summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--protocols/Telegram/src/avatars.cpp23
-rw-r--r--protocols/Telegram/src/proto.cpp15
-rw-r--r--protocols/Telegram/src/proto.h5
-rw-r--r--protocols/Telegram/src/utils.cpp112
4 files changed, 122 insertions, 33 deletions
diff --git a/protocols/Telegram/src/avatars.cpp b/protocols/Telegram/src/avatars.cpp
index a588bfa76f..24301cb42c 100644
--- a/protocols/Telegram/src/avatars.cpp
+++ b/protocols/Telegram/src/avatars.cpp
@@ -105,7 +105,7 @@ void __cdecl CTelegramProto::OfflineFileThread(void *pParam)
if (dbei && !strcmp(dbei.szModule, m_szModuleName) && dbei.eventType == EVENTTYPE_FILE) {
JSONNode root = JSONNode::parse((const char *)dbei.pBlob);
if (root) {
- auto *ft = new TG_FILE_REQUEST(TG_FILE_REQUEST::FILE, 0, "");
+ auto *ft = new TG_FILE_REQUEST(TG_FILE_REQUEST::Type(root["t"].as_int()), 0, "");
ft->m_fileName = ofd->wszPath;
ft->m_bOpen = ofd->bOpen;
ft->m_hEvent = ofd->hDbEvent;
@@ -182,14 +182,29 @@ void CTelegramProto::ProcessFile(TD::updateFile *pObj)
mir_cslock lck(m_csFiles);
m_arFiles.remove(F);
}
- else { // FILE
+ else { // FILE, PICTURE, VIDEO, VOICE
if (pFile->local_->is_downloading_completed_) {
- MoveFileW(wszExistingFile, wszFullName);
-
DBVARIANT dbv = { DBVT_DWORD };
dbv.dVal = pFile->local_->downloaded_size_;
db_event_setJson(F->m_hEvent, "ft", &dbv);
db_event_setJson(F->m_hEvent, "fs", &dbv);
+
+ if (F->m_type != F->FILE) {
+ auto *pSlash = strrchr(pFile->local_->path_.c_str(), '\\');
+ if (!pSlash)
+ pSlash = pFile->local_->path_.c_str();
+ else
+ pSlash++;
+
+ dbv.type = DBVT_UTF8;
+ dbv.pszVal = (char*)pSlash;
+ db_event_setJson(F->m_hEvent, "f", &dbv);
+
+ wszFullName.Truncate(wszFullName.ReverseFind('\\') + 1);
+ wszFullName.Append(Utf2T(pSlash));
+ }
+
+ MoveFileW(wszExistingFile, wszFullName);
NotifyEventHooks(g_plugin.m_hevEventEdited, 0, F->m_hEvent);
if (F->m_bOpen)
diff --git a/protocols/Telegram/src/proto.cpp b/protocols/Telegram/src/proto.cpp
index a8f36fbe2e..a32e1571b3 100644
--- a/protocols/Telegram/src/proto.cpp
+++ b/protocols/Telegram/src/proto.cpp
@@ -280,6 +280,21 @@ INT_PTR CTelegramProto::GetCaps(int type, MCONTACT)
/////////////////////////////////////////////////////////////////////////////////////////
+MEVENT CTelegramProto::RecvFile(MCONTACT hContact, PROTORECVFILE *pre)
+{
+ MEVENT hEvent = CSuper::RecvFile(hContact, pre);
+ if (hEvent)
+ if (auto *ft = (TG_FILE_REQUEST *)pre->lParam) {
+ DBVARIANT dbv = { DBVT_DWORD };
+ dbv.dVal = ft->m_type;
+ db_event_setJson(hEvent, "t", &dbv);
+ }
+
+ return hEvent;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+
void CTelegramProto::OnSearchResults(td::ClientManager::Response &response)
{
m_searchIds.clear();
diff --git a/protocols/Telegram/src/proto.h b/protocols/Telegram/src/proto.h
index 0228ef285a..b7508274e4 100644
--- a/protocols/Telegram/src/proto.h
+++ b/protocols/Telegram/src/proto.h
@@ -62,7 +62,7 @@ struct TG_REQUEST_FULL : public TG_REQUEST_BASE
struct TG_FILE_REQUEST : public MZeroedObject
{
- enum Type { AVATAR = 1, FILE = 2 };
+ enum Type { AVATAR = 1, FILE = 2, PICTURE = 3, VIDEO = 4, VOICE = 5 };
TG_FILE_REQUEST(Type _1, TD::int53 _2, const char *_3) :
m_type(_1),
@@ -225,6 +225,7 @@ class CTelegramProto : public PROTO<CTelegramProto>
void ProcessSuperGroup(TD::updateSupergroup *pObj);
void ProcessUser(TD::updateUser *pObj);
+ bool GetMessageFile(TG_FILE_REQUEST::Type, TG_USER *pUser, const TD::file *pFile, const char *pszFileName, const std::string &caption, const char *szId, const char *szUser);
CMStringA GetMessageText(TG_USER *pUser, const TD::message *pMsg);
void UpdateString(MCONTACT hContact, const char *pszSetting, const std::string &str);
@@ -290,6 +291,8 @@ public:
INT_PTR GetCaps(int type, MCONTACT hContact = NULL) override;
+ MEVENT RecvFile(MCONTACT hContact, PROTORECVFILE *pre) override;
+
HANDLE SearchByName(const wchar_t *nick, const wchar_t *firstName, const wchar_t *lastName) override;
int SendMsg(MCONTACT hContact, int flags, const char *pszMessage) override;
int SetStatus(int iNewStatus) override;
diff --git a/protocols/Telegram/src/utils.cpp b/protocols/Telegram/src/utils.cpp
index 5529dd2418..db42a33297 100644
--- a/protocols/Telegram/src/utils.cpp
+++ b/protocols/Telegram/src/utils.cpp
@@ -239,46 +239,102 @@ bool CTelegramProto::GetGcUserId(TG_USER *pUser, const TD::message *pMsg, char *
/////////////////////////////////////////////////////////////////////////////////////////
+bool CTelegramProto::GetMessageFile(
+ TG_FILE_REQUEST::Type fileType,
+ TG_USER *pUser,
+ const TD::file *pFile,
+ const char *pszFileName,
+ const std::string &caption,
+ const char *pszId,
+ const char *pszUserId)
+{
+ if (pFile->get_id() != TD::file::ID) {
+ debugLogA("Document contains unsupported type %d, exiting", pFile->get_id());
+ return false;
+ }
+
+ auto *pRequest = new TG_FILE_REQUEST(fileType, pFile->id_, pFile->remote_->id_.c_str());
+ pRequest->m_fileName = Utf2T(pszFileName);
+ pRequest->m_fileSize = pFile->size_;
+ {
+ mir_cslock lck(m_csFiles);
+ m_arFiles.insert(pRequest);
+ }
+
+ PROTORECVFILE pre = {};
+ pre.dwFlags = PRFF_UTF | PRFF_SILENT;
+ pre.fileCount = 1;
+ pre.timestamp = time(0);
+ pre.files.a = &pszFileName;
+ pre.lParam = (LPARAM)pRequest;
+ pre.szId = pszId;
+ pre.szUserId = pszUserId;
+
+ if (!caption.empty())
+ pre.descr.a = caption.c_str();
+ ProtoChainRecvFile(pUser->hContact, &pre);
+ return true;
+}
+
CMStringA CTelegramProto::GetMessageText(TG_USER *pUser, const TD::message *pMsg)
{
const TD::MessageContent *pBody = pMsg->content_.get();
- char szId[100], szUserId[100];
+ char szId[100], szUserId[100], *pszUserId = nullptr;
_i64toa(pMsg->id_, szId, 10);
+ if (GetGcUserId(pUser, pMsg, szUserId))
+ pszUserId = szUserId;
switch (pBody->get_id()) {
- case TD::messageDocument::ID:
+ case TD::messagePhoto::ID:
{
- auto *pDoc = ((TD::messageDocument *)pBody);
- auto *pFile = pDoc->document_->document_.get();
-
- if (pFile->get_id() != TD::file::ID) {
- debugLogA("Document contains unsupported type %d, exiting", pDoc->document_->get_id());
+ auto *pDoc = (TD::messagePhoto *)pBody;
+ TD::photoSize *pPhoto = nullptr;
+
+ const char *types[] = { "x", "m", "s" };
+ for (auto *pType : types)
+ for (auto &it: pDoc->photo_->sizes_)
+ if (it->type_ == pType) {
+ pPhoto = it.get();
+ break;
+ }
+
+ if (pPhoto == nullptr) {
+ debugLogA("cannot find photo, exiting");
break;
}
-
- auto *pRequest = new TG_FILE_REQUEST(TG_FILE_REQUEST::FILE, pFile->id_, pFile->remote_->id_.c_str());
- pRequest->m_fileName = Utf2T(pDoc->document_->file_name_.c_str());
- pRequest->m_fileSize = pFile->size_;
- {
- mir_cslock lck(m_csFiles);
- m_arFiles.insert(pRequest);
+
+ CMStringA fileName(FORMAT, "%s (%d x %d)", TranslateU("Picture"), pPhoto->width_, pPhoto->height_);
+ GetMessageFile(TG_FILE_REQUEST::PICTURE, pUser, pPhoto->photo_.get(), fileName, pDoc->caption_->text_, szId, pszUserId);
+ }
+ break;
+
+ case TD::messageVideo::ID:
+ {
+ auto *pDoc = (TD::messageVideo *)pBody;
+ auto *pVideo = pDoc->video_.get();
+ CMStringA fileName(FORMAT, "%s (%d x %d, %d %s)", TranslateU("Video"), pVideo->width_, pVideo->height_, pVideo->duration_, TranslateU("seconds"));
+ std::string caption = fileName.c_str();
+ if (!pDoc->caption_->text_.empty()) {
+ caption += " ";
+ caption += pDoc->caption_->text_;
}
+ GetMessageFile(TG_FILE_REQUEST::VIDEO, pUser, pVideo->video_.get(), pVideo->file_name_.c_str(), caption, szId, pszUserId);
+ }
+ break;
- auto *pszFileName = pDoc->document_->file_name_.c_str();
- PROTORECVFILE pre = {};
- pre.dwFlags = PRFF_UTF | PRFF_SILENT;
- pre.fileCount = 1;
- pre.timestamp = time(0);
- pre.files.a = &pszFileName;
- pre.lParam = (LPARAM)pRequest;
- pre.szId = szId;
- if (GetGcUserId(pUser, pMsg, szUserId))
- pre.szUserId = szUserId;
-
- if (!pDoc->caption_->text_.empty())
- pre.descr.a = pDoc->caption_->text_.c_str();
- ProtoChainRecvFile(pUser->hContact, &pre);
+ case TD::messageVoiceNote::ID:
+ {
+ auto *pDoc = (TD::messageVoiceNote *)pBody;
+ CMStringA fileName(FORMAT, "%s (%d %s)", TranslateU("Voice note"), pDoc->voice_note_->duration_, TranslateU("seconds"));
+ GetMessageFile(TG_FILE_REQUEST::VOICE, pUser, pDoc->voice_note_->voice_.get(), fileName, pDoc->caption_->text_, szId, pszUserId);
+ }
+ break;
+
+ case TD::messageDocument::ID:
+ {
+ auto *pDoc = (TD::messageDocument *)pBody;
+ GetMessageFile(TG_FILE_REQUEST::FILE, pUser, pDoc->document_->document_.get(), pDoc->document_->file_name_.c_str(), pDoc->caption_->text_, szId, pszUserId);
}
break;