Skip to content

Commit

Permalink
Merge pull request #284 from Shikkanime/dev
Browse files Browse the repository at this point in the history
Dev
  • Loading branch information
Ziedelth committed Mar 12, 2024
2 parents d27402c + 6f4eedc commit 30a0152
Show file tree
Hide file tree
Showing 12 changed files with 108 additions and 7 deletions.
2 changes: 1 addition & 1 deletion src/main/kotlin/fr/shikkanime/entities/Config.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,6 @@ class Config(
override val uuid: UUID? = null,
@Column(nullable = false, name = "property_key", unique = true)
val propertyKey: String? = null,
@Column(nullable = false, name = "property_value")
@Column(nullable = false, name = "property_value", length = 5000)
var propertyValue: String? = null,
) : ShikkEntity(uuid)
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,7 @@ enum class ConfigPropertyKey(val key: String) {
BSKY_SESSION_TIMEOUT("bsky_session_timeout"),
THREADS_SESSION_TIMEOUT("threads_session_timeout"),
SIMULCAST_RANGE_DELAY("simulcast_range_delay"),
ANALYTICS_DOMAIN("analytics_domain"),
ANALYTICS_API("analytics_api"),
ANALYTICS_SCRIPT("analytics_script"),
}
10 changes: 9 additions & 1 deletion src/main/kotlin/fr/shikkanime/modules/Routing.kt
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ private val logger = LoggerFactory.getLogger("Routing")
private val callStartTime = AttributeKey<ZonedDateTime>("CallStartTime")

fun Application.configureRouting() {
val configCacheService = Constant.injector.getInstance(ConfigCacheService::class.java)

environment.monitor.subscribe(Routing.RoutingCallStarted) { call ->
call.attributes.put(callStartTime, ZonedDateTime.now())

Expand All @@ -61,7 +63,9 @@ fun Application.configureRouting() {
"img-src data: 'self' 'unsafe-inline' 'unsafe-eval' https://api.shikkanime.fr https://www.shikkanime.fr; " +
"style-src 'self' 'unsafe-inline' 'unsafe-eval' https://cdn.jsdelivr.net; " +
"font-src 'self' https://cdn.jsdelivr.net; " +
"script-src 'self' 'unsafe-inline' 'unsafe-eval' https://cdn.jsdelivr.net"
"script-src 'self' 'unsafe-inline' 'unsafe-eval' https://cdn.jsdelivr.net; " +
configCacheService.getValueAsString(ConfigPropertyKey.ANALYTICS_API)
?.let { "connect-src 'self' $it; " }
)

context.response.header("X-Frame-Options", "DENY")
Expand Down Expand Up @@ -316,6 +320,10 @@ private suspend fun handleTemplateResponse(
?.let { modelMap["googleSiteVerification"] = it }
simulcastCacheService.currentSimulcast?.let { modelMap["currentSimulcast"] = it }

configCacheService.getValueAsString(ConfigPropertyKey.ANALYTICS_DOMAIN)?.let { modelMap["analyticsDomain"] = it }
configCacheService.getValueAsString(ConfigPropertyKey.ANALYTICS_API)?.let { modelMap["analyticsApi"] = it }
configCacheService.getValueAsString(ConfigPropertyKey.ANALYTICS_SCRIPT)?.let { modelMap["analyticsScript"] = it }

call.respond(response.status, FreeMarkerContent(map["template"] as String, modelMap, "", response.contentType))
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ abstract class AbstractSocialNetwork {
@Inject
protected lateinit var configCacheService: ConfigCacheService

abstract fun utmSource(): String
abstract fun login()
abstract fun logout()

Expand All @@ -35,7 +36,7 @@ abstract class AbstractSocialNetwork {
val isVoice = if (episodeDto.langType == LangType.VOICE) " en VF " else " "

var configMessage = baseMessage
configMessage = configMessage.replace("{SHIKKANIME_URL}", "${Constant.BASE_URL}/animes/${episodeDto.anime.slug}")
configMessage = configMessage.replace("{SHIKKANIME_URL}", getShikkanimeUrl(episodeDto))
configMessage = configMessage.replace("{URL}", episodeDto.url)
configMessage = configMessage.replace("{PLATFORM_ACCOUNT}", platformAccount(episodeDto.platform))
configMessage = configMessage.replace("{ANIME_HASHTAG}", "#${StringUtils.getHashtag(episodeDto.anime.shortName)}")
Expand All @@ -47,5 +48,8 @@ abstract class AbstractSocialNetwork {
return configMessage
}

protected fun getShikkanimeUrl(episodeDto: EpisodeDto) =
"${Constant.BASE_URL}/animes/${episodeDto.anime.slug}?utm_campaign=episode_post&utm_medium=social&utm_source=${utmSource()}&utm_content=${episodeDto.uuid}"

abstract fun sendEpisodeRelease(episodeDto: EpisodeDto, mediaImage: ByteArray)
}
13 changes: 10 additions & 3 deletions src/main/kotlin/fr/shikkanime/socialnetworks/BskySocialNetwork.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package fr.shikkanime.socialnetworks

import fr.shikkanime.dtos.EpisodeDto
import fr.shikkanime.entities.enums.ConfigPropertyKey
import fr.shikkanime.utils.Constant
import fr.shikkanime.utils.FileManager
import fr.shikkanime.utils.LoggerFactory
import fr.shikkanime.utils.ObjectParser.getAsString
Expand All @@ -20,6 +19,8 @@ class BskySocialNetwork : AbstractSocialNetwork() {
private var accessJwt: String? = null
private var did: String? = null

override fun utmSource() = "bsky"

override fun login() {
if (isInitialized) return

Expand Down Expand Up @@ -65,10 +66,16 @@ class BskySocialNetwork : AbstractSocialNetwork() {
override fun sendEpisodeRelease(episodeDto: EpisodeDto, mediaImage: ByteArray) {
checkSession()
if (!isInitialized) return
val url = "${Constant.BASE_URL}/animes/${episodeDto.anime.slug}"
val message = getEpisodeMessage(episodeDto, configCacheService.getValueAsString(ConfigPropertyKey.BSKY_MESSAGE) ?: "")
val webpByteArray = FileManager.encodeToWebP(mediaImage)
val imageJson = runBlocking { BskyWrapper.uploadBlob(accessJwt!!, ContentType.parse("image/webp"), webpByteArray) }
runBlocking { BskyWrapper.createRecord(accessJwt!!, did!!, message, listOf(BskyWrapper.Image(imageJson, url))) }
runBlocking {
BskyWrapper.createRecord(
accessJwt!!,
did!!,
message,
listOf(BskyWrapper.Image(imageJson, getShikkanimeUrl(episodeDto)))
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ class DiscordSocialNetwork : AbstractSocialNetwork() {
private fun getTextChannels(): MutableList<TextChannel>? =
jda?.getTextChannelsByName("bot\uD83E\uDD16", true)

override fun utmSource() = "discord"

override fun login() {
if (isInitialized) return

Expand Down Expand Up @@ -70,7 +72,7 @@ class DiscordSocialNetwork : AbstractSocialNetwork() {
episodeDto.platform.url,
"${Constant.BASE_URL}/assets/img/platforms/${episodeDto.platform.image}"
)
embedMessage.setTitle(episodeDto.anime.shortName, "${Constant.BASE_URL}/animes/${episodeDto.anime.slug}")
embedMessage.setTitle(episodeDto.anime.shortName, getShikkanimeUrl(episodeDto))
embedMessage.setThumbnail(episodeDto.anime.image)
embedMessage.setDescription("**${episodeDto.title ?: "Untitled"}**\n${StringUtils.toEpisodeString(episodeDto)}")
embedMessage.setImage(episodeDto.image)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ class ThreadsSocialNetwork : AbstractSocialNetwork() {
private var token: String? = null
private var userId: String? = null

override fun utmSource() = "threads"

override fun login() {
if (isInitialized) return

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ class TwitterSocialNetwork : AbstractSocialNetwork() {
private var isInitialized = false
private var twitter: Twitter? = null

override fun utmSource() = "twitter"

override fun login() {
if (isInitialized) return

Expand Down
62 changes: 62 additions & 0 deletions src/main/resources/db/changelog/2024/03/04-changelog.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.26.xsd"
objectQuotingStrategy="QUOTE_ONLY_RESERVED_WORDS">
<property global="false" name="id" value="1710284914290"/>
<property global="false" name="author" value="Ziedelth"/>

<changeSet id="${id}-1" author="${author}" dbms="postgresql">
<preConditions onFail="MARK_RAN">
<columnExists columnName="property_value" tableName="config"/>
</preConditions>

<modifyDataType columnName="property_value"
newDataType="VARCHAR(5000)"
tableName="config"/>
</changeSet>

<changeSet id="${id}-2" author="${author}" dbms="postgresql">
<preConditions onFail="MARK_RAN">
<sqlCheck expectedResult="0">SELECT COUNT(*)
FROM config
WHERE property_key = 'analytics_domain'</sqlCheck>
</preConditions>

<insert tableName="config">
<column name="uuid" valueComputed="gen_random_uuid()"/>
<column name="property_key" value="analytics_domain"/>
<column name="property_value" value="example.com"/>
</insert>
</changeSet>

<changeSet id="${id}-3" author="${author}" dbms="postgresql">
<preConditions onFail="MARK_RAN">
<sqlCheck expectedResult="0">SELECT COUNT(*)
FROM config
WHERE property_key = 'analytics_api'</sqlCheck>
</preConditions>

<insert tableName="config">
<column name="uuid" valueComputed="gen_random_uuid()"/>
<column name="property_key" value="analytics_api"/>
<column name="property_value" value="http://localhost:8080/api/event"/>
</insert>
</changeSet>

<changeSet id="${id}-4" author="${author}" dbms="postgresql">
<preConditions onFail="MARK_RAN">
<sqlCheck expectedResult="0">SELECT COUNT(*)
FROM config
WHERE property_key = 'analytics_script'</sqlCheck>
</preConditions>

<insert tableName="config">
<column name="uuid" valueComputed="gen_random_uuid()"/>
<column name="property_key" value="analytics_script"/>
<column name="property_value" value=""/>
</insert>
</changeSet>
</databaseChangeLog>
1 change: 1 addition & 0 deletions src/main/resources/db/changelog/db.changelog-master.xml
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,5 @@
<include file="/db/changelog/2024/03/01-changelog.xml"/>
<include file="/db/changelog/2024/03/02-changelog.xml"/>
<include file="/db/changelog/2024/03/03-changelog.xml"/>
<include file="/db/changelog/2024/03/04-changelog.xml"/>
</databaseChangeLog>
4 changes: 4 additions & 0 deletions src/main/resources/templates/_freemarker_implicit.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,7 @@
[#-- @ftlvariable name="footerLinks" type="kotlin.collections.AbstractList<fr.shikkanime.entities.LinkObject>" --]
[#-- @ftlvariable name="seoLinks" type="kotlin.collections.AbstractList<fr.shikkanime.entities.enums.Link>" --]
[#-- @ftlvariable name="query" type="java.lang.String" --]

[#-- @ftlvariable name="analyticsDomain" type="java.lang.String" --]
[#-- @ftlvariable name="analyticsApi" type="java.lang.String" --]
[#-- @ftlvariable name="analyticsScript" type="java.lang.String" --]
6 changes: 6 additions & 0 deletions src/main/resources/templates/site/_layout.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,12 @@
</#if>

<script defer src="/assets/js/alpinejs.min.js" crossorigin="anonymous"></script>

<#if (analyticsDomain?? && analyticsDomain?length != 0) && (analyticsApi?? && analyticsApi?length != 0) && (analyticsScript?? && analyticsScript?length != 0)>
<script data-domain="${analyticsDomain}" data-api="${analyticsApi}">
${analyticsScript}
</script>
</#if>
</head>
<body>
<#nested 0>
Expand Down

0 comments on commit 30a0152

Please sign in to comment.