Skip to content

Commit a6dbdca

Browse files
committed
Debug implementation of a Calendar skill
for Stypox/dicio-numbers#12
1 parent ac09de2 commit a6dbdca

File tree

10 files changed

+132
-2
lines changed

10 files changed

+132
-2
lines changed

app/src/main/kotlin/org/stypox/dicio/eval/SkillHandler.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import org.stypox.dicio.di.SkillContextInternal
1818
import org.stypox.dicio.settings.datastore.UserSettings
1919
import org.stypox.dicio.settings.datastore.UserSettingsModule
2020
import org.stypox.dicio.skills.calculator.CalculatorInfo
21+
import org.stypox.dicio.skills.calendar.CalendarInfo
2122
import org.stypox.dicio.skills.current_time.CurrentTimeInfo
2223
import org.stypox.dicio.skills.fallback.text.TextFallbackInfo
2324
import org.stypox.dicio.skills.listening.ListeningInfo
@@ -51,6 +52,7 @@ class SkillHandler @Inject constructor(
5152
CurrentTimeInfo,
5253
MediaInfo,
5354
ListeningInfo(dataStore),
55+
CalendarInfo,
5456
)
5557

5658
// TODO add more fallback skills (e.g. search)
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package org.stypox.dicio.skills.calendar
2+
3+
import android.content.Context
4+
import android.os.Build
5+
import androidx.compose.foundation.layout.Column
6+
import androidx.compose.material.icons.Icons
7+
import androidx.compose.material.icons.filled.CalendarMonth
8+
import androidx.compose.runtime.Composable
9+
import androidx.compose.runtime.collectAsState
10+
import androidx.compose.runtime.getValue
11+
import androidx.compose.runtime.rememberCoroutineScope
12+
import androidx.compose.ui.graphics.vector.rememberVectorPainter
13+
import androidx.compose.ui.platform.LocalContext
14+
import androidx.compose.ui.res.stringResource
15+
import androidx.datastore.core.handlers.ReplaceFileCorruptionHandler
16+
import androidx.datastore.dataStore
17+
import androidx.datastore.migrations.SharedPreferencesMigration
18+
import kotlinx.coroutines.launch
19+
import org.dicio.skill.context.SkillContext
20+
import org.dicio.skill.skill.Skill
21+
import org.dicio.skill.skill.SkillInfo
22+
import org.stypox.dicio.R
23+
import org.stypox.dicio.sentences.Sentences
24+
import org.stypox.dicio.settings.ui.ListSetting
25+
import org.stypox.dicio.settings.ui.StringSetting
26+
27+
object CalendarInfo : SkillInfo("calendar") {
28+
override fun name(context: Context) =
29+
context.getString(R.string.skill_name_calendar)
30+
31+
override fun sentenceExample(context: Context) =
32+
context.getString(R.string.skill_sentence_example_calendar)
33+
34+
@Composable
35+
override fun icon() =
36+
rememberVectorPainter(Icons.Default.CalendarMonth)
37+
38+
override fun isAvailable(ctx: SkillContext): Boolean {
39+
return Sentences.Calendar[ctx.sentencesLanguage] != null && ctx.parserFormatter != null
40+
}
41+
42+
override fun build(ctx: SkillContext): Skill<*> {
43+
return CalendarSkill(CalendarInfo, Sentences.Calendar[ctx.sentencesLanguage]!!)
44+
}
45+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package org.stypox.dicio.skills.calendar
2+
3+
import androidx.compose.foundation.layout.Column
4+
import androidx.compose.runtime.Composable
5+
import org.dicio.skill.context.SkillContext
6+
import org.dicio.skill.skill.SkillOutput
7+
import org.stypox.dicio.io.graphical.Body
8+
import org.stypox.dicio.io.graphical.Headline
9+
import org.stypox.dicio.io.graphical.HeadlineSpeechSkillOutput
10+
import java.time.LocalDateTime
11+
12+
sealed interface CalendarOutput : SkillOutput {
13+
data class Success(
14+
val whenString: String,
15+
val whenDateTime: LocalDateTime,
16+
val whenBackToString: String,
17+
) : CalendarOutput {
18+
override fun getSpeechOutput(ctx: SkillContext): String =
19+
"Understood!"
20+
21+
@Composable
22+
override fun GraphicalOutput(ctx: SkillContext) {
23+
Column {
24+
Headline(getSpeechOutput(ctx))
25+
Body("I parsed: \"$whenString\",\nI understood: $whenDateTime,\nBack to string: \"$whenBackToString\"")
26+
}
27+
}
28+
}
29+
30+
data class FailedStringToDateTime(
31+
val whenString: String?
32+
) : CalendarOutput, HeadlineSpeechSkillOutput {
33+
override fun getSpeechOutput(ctx: SkillContext): String =
34+
"Could not understand date/time: \"$whenString\""
35+
}
36+
37+
data class FailedDateTimeToString(
38+
val whenDateTime: LocalDateTime
39+
) : CalendarOutput, HeadlineSpeechSkillOutput {
40+
override fun getSpeechOutput(ctx: SkillContext): String =
41+
"Could not turn date/time back to string: \"$whenDateTime\""
42+
}
43+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.stypox.dicio.skills.calendar
2+
3+
import org.dicio.skill.context.SkillContext
4+
import org.dicio.skill.skill.SkillInfo
5+
import org.dicio.skill.skill.SkillOutput
6+
import org.dicio.skill.standard.StandardRecognizerData
7+
import org.dicio.skill.standard.StandardRecognizerSkill
8+
import org.stypox.dicio.sentences.Sentences.Calendar
9+
10+
class CalendarSkill(correspondingSkillInfo: SkillInfo, data: StandardRecognizerData<Calendar>) :
11+
StandardRecognizerSkill<Calendar>(correspondingSkillInfo, data) {
12+
13+
override suspend fun generateOutput(ctx: SkillContext, inputData: Calendar): SkillOutput {
14+
val whenString = when (inputData) { is Calendar.Set -> inputData.`when` }
15+
?: return CalendarOutput.FailedStringToDateTime(null)
16+
val whenDateTime = try { ctx.parserFormatter?.extractDateTime(whenString)?.first }
17+
catch (_: Throwable) { null }
18+
?: return CalendarOutput.FailedStringToDateTime(whenString)
19+
val whenBackToString = try { ctx.parserFormatter?.niceDateTime(whenDateTime)?.get() }
20+
catch (_: Throwable) { null }
21+
?: return CalendarOutput.FailedStringToDateTime(whenString)
22+
return CalendarOutput.Success(whenString, whenDateTime, whenBackToString)
23+
}
24+
}

app/src/main/res/values/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,4 +233,6 @@
233233
<string name="skill_weather_kelvin">K</string>
234234
<string name="skill_weather_meters_per_second">m/s</string>
235235
<string name="skill_weather_miles_per_hour">mph</string>
236+
<string name="skill_name_calendar">Calendar</string>
237+
<string name="skill_sentence_example_calendar">Event 15th of July</string>
236238
</resources>
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
set:
2+
- event .when.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
set:
2+
- evento .when.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
set:
2+
- evento .when.

app/src/main/sentences/skill_definitions.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,3 +106,11 @@ skills:
106106
captures:
107107
- id: where
108108
type: string
109+
110+
- id: calendar
111+
specificity: high
112+
sentences:
113+
- id: set
114+
captures:
115+
- id: when
116+
type: string

settings.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ data class IncludeGitRepo(
4949
val includeGitRepos = listOf(
5050
IncludeGitRepo(
5151
name = "dicio-numbers",
52-
uri = "https://github.com/Stypox/dicio-numbers",
52+
uri = "https://github.com/sguinetti/dicio-numbers",
5353
projectPath = ":numbers",
54-
commit = "66fd44b79585f952b76d16e5578d4d6aa5bc030c",
54+
commit = "5765339e81f84f2c71793cd056ce2052d61afe44",
5555
),
5656
IncludeGitRepo(
5757
name = "dicio-sentences-compiler",

0 commit comments

Comments
 (0)