mirror of
https://github.com/twitter/the-algorithm.git
synced 2024-06-14 07:08:53 +02:00
617c8c787d
Unified User Action (UUA) is a centralized, real-time stream of user actions on Twitter, consumed by various product, ML, and marketing teams. UUA makes sure all internal teams consume the uniformed user actions data in an accurate and fast way.
147 lines
5.7 KiB
Scala
147 lines
5.7 KiB
Scala
package com.twitter.unified_user_actions.adapter.tweetypie_event
|
|
|
|
import com.twitter.tweetypie.thriftscala.QuotedTweet
|
|
import com.twitter.tweetypie.thriftscala.Share
|
|
import com.twitter.tweetypie.thriftscala.TweetDeleteEvent
|
|
import com.twitter.tweetypie.thriftscala.TweetEventFlags
|
|
import com.twitter.unified_user_actions.adapter.common.AdapterUtils
|
|
import com.twitter.unified_user_actions.thriftscala.ActionType
|
|
import com.twitter.unified_user_actions.thriftscala.AuthorInfo
|
|
import com.twitter.unified_user_actions.thriftscala.EventMetadata
|
|
import com.twitter.unified_user_actions.thriftscala.Item
|
|
import com.twitter.unified_user_actions.thriftscala.SourceLineage
|
|
import com.twitter.unified_user_actions.thriftscala.TweetInfo
|
|
import com.twitter.unified_user_actions.thriftscala.UnifiedUserAction
|
|
import com.twitter.unified_user_actions.thriftscala.UserIdentifier
|
|
|
|
trait BaseTweetypieTweetEventDelete extends BaseTweetypieTweetEvent[TweetDeleteEvent] {
|
|
type ExtractedEvent
|
|
protected def actionType: ActionType
|
|
|
|
def getUnifiedUserAction(
|
|
tweetDeleteEvent: TweetDeleteEvent,
|
|
tweetEventFlags: TweetEventFlags
|
|
): Option[UnifiedUserAction] =
|
|
extract(tweetDeleteEvent).map { extractedEvent =>
|
|
UnifiedUserAction(
|
|
userIdentifier = getUserIdentifier(tweetDeleteEvent),
|
|
item = getItem(extractedEvent, tweetDeleteEvent),
|
|
actionType = actionType,
|
|
eventMetadata = getEventMetadata(tweetDeleteEvent, tweetEventFlags)
|
|
)
|
|
}
|
|
|
|
protected def extract(tweetDeleteEvent: TweetDeleteEvent): Option[ExtractedEvent]
|
|
|
|
protected def getItem(extractedEvent: ExtractedEvent, tweetDeleteEvent: TweetDeleteEvent): Item
|
|
|
|
protected def getUserIdentifier(tweetDeleteEvent: TweetDeleteEvent): UserIdentifier =
|
|
UserIdentifier(userId = tweetDeleteEvent.user.map(_.id))
|
|
|
|
protected def getEventMetadata(
|
|
tweetDeleteEvent: TweetDeleteEvent,
|
|
flags: TweetEventFlags
|
|
): EventMetadata =
|
|
EventMetadata(
|
|
sourceTimestampMs = flags.timestampMs,
|
|
receivedTimestampMs = AdapterUtils.currentTimestampMs,
|
|
sourceLineage = SourceLineage.ServerTweetypieEvents,
|
|
traceId = None, // Currently traceId is not stored in TweetDeleteEvent.
|
|
// UUA sets this to None since there is no request level language info.
|
|
language = None,
|
|
// UUA sets this to be consistent with IESource. For the definition,
|
|
// see https://sourcegraph.twitter.biz/git.twitter.biz/source/-/blob/src/thrift/com/twitter/tweetypie/tweet.thrift?L1001.
|
|
// The definition here conflicts with the intention of UUA to log the request country code
|
|
// rather than the signup / geo-tagging country.
|
|
countryCode = tweetDeleteEvent.tweet.place.flatMap(_.countryCode),
|
|
/* clientApplicationId is user's app id if the delete is initiated by a user,
|
|
* or auditor's app id if the delete is initiated by an auditor */
|
|
clientAppId = tweetDeleteEvent.audit.flatMap(_.clientApplicationId),
|
|
clientVersion = None // Currently clientVersion is not stored in TweetDeleteEvent.
|
|
)
|
|
}
|
|
|
|
object TweetypieDeleteEvent extends BaseTweetypieTweetEventDelete {
|
|
type ExtractedEvent = Long
|
|
override protected val actionType: ActionType = ActionType.ServerTweetDelete
|
|
|
|
override protected def extract(tweetDeleteEvent: TweetDeleteEvent): Option[Long] = Some(
|
|
tweetDeleteEvent.tweet.id)
|
|
|
|
protected def getItem(
|
|
tweetId: Long,
|
|
tweetDeleteEvent: TweetDeleteEvent
|
|
): Item =
|
|
Item.TweetInfo(
|
|
TweetInfo(
|
|
actionTweetId = tweetId,
|
|
actionTweetAuthorInfo =
|
|
Some(AuthorInfo(authorId = tweetDeleteEvent.tweet.coreData.map(_.userId)))
|
|
))
|
|
}
|
|
|
|
object TweetypieUnretweetEvent extends BaseTweetypieTweetEventDelete {
|
|
override protected val actionType: ActionType = ActionType.ServerTweetUnretweet
|
|
|
|
override type ExtractedEvent = Share
|
|
|
|
override protected def extract(tweetDeleteEvent: TweetDeleteEvent): Option[Share] =
|
|
tweetDeleteEvent.tweet.coreData.flatMap(_.share)
|
|
|
|
override protected def getItem(share: Share, tweetDeleteEvent: TweetDeleteEvent): Item =
|
|
Item.TweetInfo(
|
|
TweetInfo(
|
|
actionTweetId = share.sourceStatusId,
|
|
actionTweetAuthorInfo = Some(AuthorInfo(authorId = Some(share.sourceUserId))),
|
|
retweetingTweetId = Some(tweetDeleteEvent.tweet.id)
|
|
)
|
|
)
|
|
}
|
|
|
|
object TweetypieUnreplyEvent extends BaseTweetypieTweetEventDelete {
|
|
case class PredicateOutput(tweetId: Long, userId: Long)
|
|
|
|
override type ExtractedEvent = PredicateOutput
|
|
|
|
override protected val actionType: ActionType = ActionType.ServerTweetUnreply
|
|
|
|
override protected def extract(tweetDeleteEvent: TweetDeleteEvent): Option[PredicateOutput] =
|
|
tweetDeleteEvent.tweet.coreData
|
|
.flatMap(_.reply).flatMap(r =>
|
|
r.inReplyToStatusId.map(tweetId => PredicateOutput(tweetId, r.inReplyToUserId)))
|
|
|
|
override protected def getItem(
|
|
repliedTweet: PredicateOutput,
|
|
tweetDeleteEvent: TweetDeleteEvent
|
|
): Item = {
|
|
Item.TweetInfo(
|
|
TweetInfo(
|
|
actionTweetId = repliedTweet.tweetId,
|
|
actionTweetAuthorInfo = Some(AuthorInfo(authorId = Some(repliedTweet.userId))),
|
|
replyingTweetId = Some(tweetDeleteEvent.tweet.id)
|
|
)
|
|
)
|
|
}
|
|
}
|
|
|
|
object TweetypieUnquoteEvent extends BaseTweetypieTweetEventDelete {
|
|
override protected val actionType: ActionType = ActionType.ServerTweetUnquote
|
|
|
|
type ExtractedEvent = QuotedTweet
|
|
|
|
override protected def extract(tweetDeleteEvent: TweetDeleteEvent): Option[QuotedTweet] =
|
|
tweetDeleteEvent.tweet.quotedTweet
|
|
|
|
override protected def getItem(
|
|
quotedTweet: QuotedTweet,
|
|
tweetDeleteEvent: TweetDeleteEvent
|
|
): Item =
|
|
Item.TweetInfo(
|
|
TweetInfo(
|
|
actionTweetId = quotedTweet.tweetId,
|
|
actionTweetAuthorInfo = Some(AuthorInfo(authorId = Some(quotedTweet.userId))),
|
|
quotingTweetId = Some(tweetDeleteEvent.tweet.id)
|
|
)
|
|
)
|
|
}
|