inline get social content now can search all available links in query texts

This commit is contained in:
A.C.Sukazyo Eyre 2024-08-21 19:08:09 +08:00
parent 02819a9069
commit 1230b9e6b5
Signed by: Eyre_S
GPG Key ID: C17CE40291207874
7 changed files with 42 additions and 40 deletions

View File

@ -4,6 +4,8 @@ import cc.sukazyo.cono.morny.MornyCoeur
import cc.sukazyo.cono.morny.bot.api.{EventEnv, EventListener} import cc.sukazyo.cono.morny.bot.api.{EventEnv, EventListener}
import cc.sukazyo.cono.morny.bot.query.{InlineQueryUnit, MornyQueries} import cc.sukazyo.cono.morny.bot.query.{InlineQueryUnit, MornyQueries}
import cc.sukazyo.cono.morny.util.tgapi.TelegramExtensions.Bot.exec import cc.sukazyo.cono.morny.util.tgapi.TelegramExtensions.Bot.exec
import cc.sukazyo.cono.morny.Log.logger
import com.google.gson.Gson
import com.pengrad.telegrambot.model.Update import com.pengrad.telegrambot.model.Update
import com.pengrad.telegrambot.model.request.InlineQueryResult import com.pengrad.telegrambot.model.request.InlineQueryResult
import com.pengrad.telegrambot.request.AnswerInlineQuery import com.pengrad.telegrambot.request.AnswerInlineQuery
@ -30,6 +32,8 @@ class MornyOnInlineQuery (using queryManager: MornyQueries) (using coeur: MornyC
if (results isEmpty) return; if (results isEmpty) return;
logger debug resultAnswers.map(Gson().toJson(_)).mkString("\n")
coeur.account exec AnswerInlineQuery( coeur.account exec AnswerInlineQuery(
update.inlineQuery.id, resultAnswers toArray:_* update.inlineQuery.id, resultAnswers toArray:_*
).cacheTime(cacheTime).isPersonal(isPersonal) ).cacheTime(cacheTime).isPersonal(isPersonal)

View File

@ -73,7 +73,7 @@ object OnGetSocial {
} }
def tryFetchSocialOfTweet (url: twitter.TweetUrlInformation)(using replyChat: Long, replyToMessage: Int)(using coeur: MornyCoeur) = private def tryFetchSocialOfTweet (url: twitter.TweetUrlInformation)(using replyChat: Long, replyToMessage: Int)(using coeur: MornyCoeur) =
import io.circe.{DecodingFailure, ParsingFailure} import io.circe.{DecodingFailure, ParsingFailure}
import sttp.client3.SttpClientException import sttp.client3.SttpClientException
import twitter.FXApi import twitter.FXApi
@ -89,7 +89,7 @@ object OnGetSocial {
"Error on requesting FixTweet API\n" + exceptionLog(e) "Error on requesting FixTweet API\n" + exceptionLog(e)
coeur.daemons.reporter.exception(e, "Error on requesting FixTweet API") coeur.daemons.reporter.exception(e, "Error on requesting FixTweet API")
def tryFetchSocialOfWeibo (url: weibo.StatusUrlInfo)(using replyChat: Long, replyToMessage: Int)(using coeur: MornyCoeur) = private def tryFetchSocialOfWeibo (url: weibo.StatusUrlInfo)(using replyChat: Long, replyToMessage: Int)(using coeur: MornyCoeur) =
import io.circe.{DecodingFailure, ParsingFailure} import io.circe.{DecodingFailure, ParsingFailure}
import sttp.client3.{HttpError, SttpClientException} import sttp.client3.{HttpError, SttpClientException}
import weibo.MApi import weibo.MApi

View File

@ -6,7 +6,7 @@ import com.pengrad.telegrambot.model.request.InlineQueryResult
object InlineQueryUnit { object InlineQueryUnit {
object defaults: object defaults:
val CACHE_TIME = 300 val CACHE_TIME = 1
val IS_PERSONAL = false val IS_PERSONAL = false
} }

View File

@ -1,6 +1,7 @@
package cc.sukazyo.cono.morny.bot.query package cc.sukazyo.cono.morny.bot.query
import cc.sukazyo.cono.morny.bot.query import cc.sukazyo.cono.morny.bot.query
import cc.sukazyo.cono.morny.Log.logger
import cc.sukazyo.cono.morny.MornyCoeur import cc.sukazyo.cono.morny.MornyCoeur
import com.pengrad.telegrambot.model.Update import com.pengrad.telegrambot.model.Update

View File

@ -1,43 +1,40 @@
package cc.sukazyo.cono.morny.bot.query package cc.sukazyo.cono.morny.bot.query
import cc.sukazyo.cono.morny.data.social.{SocialTwitterParser, SocialWeiboParser} import cc.sukazyo.cono.morny.data.social.{SocialTwitterParser, SocialWeiboParser}
import cc.sukazyo.cono.morny.extra.{twitter, weibo} import cc.sukazyo.cono.morny.extra.{twitter, weibo}
import cc.sukazyo.cono.morny.extra.twitter.{FXApi, TweetUrlInformation} import cc.sukazyo.cono.morny.extra.twitter.FXApi
import cc.sukazyo.cono.morny.extra.weibo.{MApi, StatusUrlInfo} import cc.sukazyo.cono.morny.extra.weibo.MApi
import com.pengrad.telegrambot.model.Update import com.pengrad.telegrambot.model.Update
class ShareToolSocialContent extends ITelegramQuery { class ShareToolSocialContent extends ITelegramQuery {
override def query (event: Update): List[InlineQueryUnit[_]] | Null = { override def query (event: Update): List[InlineQueryUnit[_]] | Null = {
val _queryRaw = event.inlineQuery.query val query = event.inlineQuery.query
val query = if query == null then return null
_queryRaw.trim match
case _startsWithTag if _startsWithTag startsWith "get " =>
(_startsWithTag drop 4)trim
case _endsWithTag if _endsWithTag endsWith " get" =>
(_endsWithTag dropRight 4)trim
case _ => return null
( twitterTweets(query) ::: weiboStatus(query)
twitter.parseTweetUrl(query) match
case Some(TweetUrlInformation(_, statusPath, _, statusId, _, _)) => }
SocialTwitterParser.parseFXTweet(FXApi.Fetch.status(Some(statusPath), statusId))
private def twitterTweets (query: String): List[InlineQueryUnit[_]] = {
twitter.guessTweetUrl(query).flatMap { tweet =>
SocialTwitterParser.parseFXTweet(FXApi.Fetch.status(Some(tweet.statusPath), tweet.statusId))
.genInlineQueryResults(using .genInlineQueryResults(using
"morny/share/tweet/content", statusId, "morny/share/tweet/content", tweet.statusId,
"Twitter Tweet Content" "Twitter Tweet Content"
) )
case None => Nil }
) ::: ( }
weibo.parseWeiboStatusUrl(query) match
case Some(StatusUrlInfo(_, id)) => private def weiboStatus (query: String): List[InlineQueryUnit[_]] = {
SocialWeiboParser.parseMStatus(MApi.Fetch.statuses_show(id)) weibo.guessWeiboStatusUrl(query).flatMap { status =>
SocialWeiboParser.parseMStatus(MApi.Fetch.statuses_show(status.id))
.genInlineQueryResults(using .genInlineQueryResults(using
"morny/share/weibo/status/content", id, "morny/share/weibo/status/content", status.id,
"Weibo Content" "Weibo Content"
) )
case None => Nil }
) ::: Nil
} }
} }

View File

@ -2,19 +2,17 @@ package cc.sukazyo.cono.morny.bot.query
import cc.sukazyo.cono.morny.extra.twitter import cc.sukazyo.cono.morny.extra.twitter
import cc.sukazyo.cono.morny.extra.twitter.TweetUrlInformation import cc.sukazyo.cono.morny.extra.twitter.TweetUrlInformation
import cc.sukazyo.cono.morny.util.tgapi.formatting.NamingUtils.inlineQueryId
import com.pengrad.telegrambot.model.Update import com.pengrad.telegrambot.model.Update
import com.pengrad.telegrambot.model.request.InlineQueryResultArticle import com.pengrad.telegrambot.model.request.InlineQueryResultArticle
import scala.language.postfixOps import scala.language.postfixOps
import scala.util.matching.Regex
class ShareToolTwitter extends ITelegramQuery { class ShareToolTwitter extends ITelegramQuery {
private val TITLE_VX = "[tweet] Share as VxTwitter" private val TITLE_VX = "[tweet] Share as VxTwitter"
private val ID_PREFIX_VX = "[morny/share/twitter/vxtwi]" private val ID_PREFIX_VX = "[morny/share/twitter/vx_url]"
private val TITLE_FX = "[tweet] Share as Fix-Tweet" private val TITLE_FX = "[tweet] Share as Fix-Tweet"
private val ID_PREFIX_FX = "[morny/share/twitter/fxtwi]" private val ID_PREFIX_FX = "[morny/share/twitter/fx_url]"
override def query (event: Update): List[InlineQueryUnit[_]] | Null = { override def query (event: Update): List[InlineQueryUnit[_]] | Null = {

View File

@ -62,7 +62,7 @@ case class SocialContent (
( (
if (medias_mosaic nonEmpty) && (medias_mosaic.get.t == Photo) && medias_mosaic.get.isInstanceOf[SocialMediaWithUrl] then if (medias_mosaic nonEmpty) && (medias_mosaic.get.t == Photo) && medias_mosaic.get.isInstanceOf[SocialMediaWithUrl] then
InlineQueryUnit(InlineQueryResultPhoto( InlineQueryUnit(InlineQueryResultPhoto(
inlineQueryId(s"[$id_head/photo/mosaic]$id_param"), s"[$id_head/photo/mosaic]$id_param",
medias_mosaic.get.asInstanceOf[SocialMediaWithUrl].url, medias_mosaic.get.asInstanceOf[SocialMediaWithUrl].url,
thumbnailOrElse(medias_mosaic.get.asInstanceOf[SocialMediaWithUrl].url) thumbnailOrElse(medias_mosaic.get.asInstanceOf[SocialMediaWithUrl].url)
).title(s"$name").caption(text_html).parseMode(ParseMode.HTML)) :: Nil ).title(s"$name").caption(text_html).parseMode(ParseMode.HTML)) :: Nil
@ -71,18 +71,20 @@ case class SocialContent (
media match media match
case media_url: SocialMediaWithUrl => case media_url: SocialMediaWithUrl =>
InlineQueryUnit(InlineQueryResultPhoto( InlineQueryUnit(InlineQueryResultPhoto(
inlineQueryId(s"[$id_head/photo/0]$id_param"), s"[$id_head/photo/0]$id_param",
media_url.url, media_url.url,
thumbnailOrElse(media_url.url) thumbnailOrElse(media_url.url)
).title(s"$name").caption(text_html).parseMode(ParseMode.HTML)) :: Nil ).title(s"$name").caption(text_html).parseMode(ParseMode.HTML)) :: Nil
case _ => case _ =>
InlineQueryUnit(InlineQueryResultArticle( InlineQueryUnit(InlineQueryResultArticle(
inlineQueryId(s"[$id_head/text_only]$id_param"), s"$name (text only)", s"[$id_head/text_only]$id_param",
s"$name (text only)",
InputTextMessageContent(text_withPicPlaceholder).parseMode(ParseMode.HTML) InputTextMessageContent(text_withPicPlaceholder).parseMode(ParseMode.HTML)
)) :: Nil )) :: Nil
else else
InlineQueryUnit(InlineQueryResultArticle( InlineQueryUnit(InlineQueryResultArticle(
inlineQueryId(s"[$id_head/text]$id_param"), s"$name", s"[$id_head/text]$id_param",
s"$name",
InputTextMessageContent(text_html).parseMode(ParseMode.HTML) InputTextMessageContent(text_html).parseMode(ParseMode.HTML)
)) :: Nil )) :: Nil
) ::: Nil ) ::: Nil