diff options
| author | George Hazan <george.hazan@gmail.com> | 2025-02-02 18:25:35 +0300 |
|---|---|---|
| committer | George Hazan <george.hazan@gmail.com> | 2025-02-02 18:25:35 +0300 |
| commit | 9816616930533590a2884ee2758d71593d86d22b (patch) | |
| tree | 56e48e9b3be904e824db82645b4b46cbdb1881b9 /protocols/Steam/src/steam_bbcodes.cpp | |
| parent | 4cd1942694e6142c943a04eebfe1c0bd91a64ac2 (diff) | |
Steam: [img] tag support
Diffstat (limited to 'protocols/Steam/src/steam_bbcodes.cpp')
| -rw-r--r-- | protocols/Steam/src/steam_bbcodes.cpp | 51 |
1 files changed, 39 insertions, 12 deletions
diff --git a/protocols/Steam/src/steam_bbcodes.cpp b/protocols/Steam/src/steam_bbcodes.cpp index 662ef58b6c..98c8d0c4b1 100644 --- a/protocols/Steam/src/steam_bbcodes.cpp +++ b/protocols/Steam/src/steam_bbcodes.cpp @@ -42,6 +42,17 @@ struct BBCode std::map<CMStringA, CMStringA> attrs; }; +static bool p2str(CMStringA &str, const char *&text, const char *subStr) +{ + if (auto *p = strpbrk(text, subStr)) { + str.Append(text, p - text); + text = p; + return true; + } + + return false; +} + int parseBbcode(const char *p, BBCode &ret) { auto *pSave = p; @@ -51,9 +62,7 @@ int parseBbcode(const char *p, BBCode &ret) // [tag=value][/tag] if (*p == '=') { - while (*p && *p != ']') - ret.szValue.AppendChar(*p++); - if (*p != ']') + if (!p2str(ret.szValue, p, "]")) return -1; } // [tag attr=value][/tag] @@ -61,26 +70,23 @@ int parseBbcode(const char *p, BBCode &ret) p++; while (*p != ']') { CMStringA szName, szValue; - while (*p && *p != '=') - szName.AppendChar(*p++); - if (*p++ != '=') + if (!p2str(szName, p, "=")) return -1; - if (*p == '\"') { + + if (*++p == '\"') { auto *p1 = strchr(++p, '\"'); if (p1 == nullptr) return -1; - p++; szValue.Append(p, p1 - p); p = p1 + 1; } else { - while (*p && *p != ' ' && *p != ']') - szValue.AppendChar(*p++); - if (*p == 0) + if (!p2str(szValue, p, " ]")) return -1; } + ret.attrs[szName] = szValue; if (*p == ' ') p++; } @@ -102,7 +108,7 @@ int parseBbcode(const char *p, BBCode &ret) return pEnd + szClose.GetLength() - pSave; } -void DecodeBbcodes(SESSION_INFO *si, CMStringA &szText) +void CSteamProto::DecodeBbcodes(SESSION_INFO *si, CMStringA &szText) { for (int idx = szText.Find('['); idx != -1; idx = szText.Find('[', idx + 1)) { BBCode code; @@ -126,6 +132,27 @@ void DecodeBbcodes(SESSION_INFO *si, CMStringA &szText) else if (code.szTag == "lobbyinvite") { szReplace = TranslateU("You were invited to play a game"); } + else if (code.szTag == "img") { + auto szUrl = code.attrs["src"]; + if (szUrl.IsEmpty()) + szUrl = code.attrs["thumbnail_src"]; + + if (!szUrl.IsEmpty()) + szReplace = "[url]" + szUrl + "[/url]"; + + szUrl = code.attrs["associated_app"]; + if (!szUrl.IsEmpty()) { + CMStringA szSetting = "AppInfo_" + szUrl; + ptrA szName(g_plugin.getUStringA(szSetting)); + if (szName) + szReplace.AppendFormat("\r\n%s: %s", TranslateU("Associated application"), szName.get()); + else + SendAppInfoRequest(atoi(szUrl)); + } + } + else if (code.szTag == "spoiler") { + szReplace = code.szValue; + } else continue; szText.Delete(idx, iLength); |
