Lingara Lingara Belge Rêbername API Pirtûkxane Sepan Avakirin Bicihkirin Sepana webê
Ziman: Kurdî

Godot

Ev rûpel ji Îngilîzî hatiye wergerandin. Heke her du ji hev cuda bin, rûpela Îngilîzî rast e. Rûpela Îngilîzî bixwîne

Godot du zimanan pêşkêş dike, û Lingara ji bo her yekê kîtek heye. Lîstikeke GDScript pêveka Lingara bi kar tîne. Lîstikeke Godot ya C# Lingara.Embed bi kar tîne, heman pakêta ku lîstikeke Unity bi kar tîne. Di projeyekê de yek ji wan bi kar bîne, qet herduyan na. Tabên li jêr her yekê nîşan didin.

Sazkirin

GDScript. Pêveka Lingara ji Godot Asset Library saz bike, paşê wê di bin Project Settings, Plugins de çalak bike. Çalakkirina wê autoload-ek bi navê Lingara zêde dike, ku her dîmen wê li /root/Lingara digihîne.

C#. Lingara.Embed wek referanseke pakêtê li projeya xwe zêde bike. Girêka nimûneyê ya li jêr, LingaraEmbedNode, ne beşek ji pakêtê ye: çavkaniya wê li projeya xwe zêde bike û wê têxe dîmenekê.

Tokenan ji servera xwe bistîne

Tu kît nepeniyekê nagire. Dema ku navik tokenek hewce dike, ji servera te bi xwe dixwaze, ku bi kîta serverê yekê çêdike û bi token û dema qedandina wê bersiv dide.

Bi pêvekê re, rêya tokenê ya servera xwe di bin Project Settings de diyar bike û Lingara li ser thread-a xwe bangî wê dike. Heke rê danişîna lîstikvan hewce bike, li şûna wê di dema xebitandinê de diyar bike, ji ber ku mîhengên projeyê di nav export-a te de têne şandin. An jî token_needed girêde û bersiva her daxwazê bi xwe bide. Bi C# re, girêka nimûneyê her gava ku klient tokenekê dixwaze daxwazekê dişîne rêya tokenê ya te. Bi her awayî, têkçûnekê bi token_unavailable an TokenUnavailable ragihîne, da ku bangên li bendê di cih de têk biçin.

Bûyeran di her çarçoveyê de pêvajo bike

Navik I/O-ya xwe ya torê li ser thread-a xwe dixebitîne. Autoload-a pêvekê wê di her çarçoveyê de carekê vala dike û ji bo her bûyerê îşaretekê derdixe, ji ber vê yekê tu îşaretên ku lîstika te hewce dike girêdidî û qet tiştekî bi xwe vala nakî. Girêka C# di _process de vala dike, herî zêde 256 bûyer di çarçoveyekê de, û her yekê ji nû ve wek îşareteke Godot derdixe.

Heman îşaret bersivên NPC yên ku bi perçeyan tên (binêre Diyaloga NPC) û nûkirinên temrînê (binêre encamên temrînê) hildigirin.

<PackageReference Include="Lingara.Embed" Version="0.1.0-alpha.6" />
Zimanê mînaka kodê

Godot C#

// Your own server mints the token: never put a client secret in a game. The
// continuation may run off the main thread, which the client allows.
private async Task FetchToken()
{
    try
    {
        using var response = await Http.PostAsync(TokenUrl, new StringContent("{}"));
        response.EnsureSuccessStatusCode();
        using var body = JsonDocument.Parse(await response.Content.ReadAsStringAsync());
        Client?.ProvideToken(body.RootElement.GetProperty("token").GetString(), body.RootElement.GetProperty("expires_at").GetString());
    }
    catch (Exception e) when (e is HttpRequestException || e is JsonException || e is KeyNotFoundException)
    {
        Client?.TokenUnavailable(e.Message); // fail the waiting calls now
    }
}

GDScript

# The common case: set Project Settings > lingara/token_url to your server's
# token route, which answers exactly {"token", "expires_at"}. Lingara POSTs to
# it on its own thread whenever it needs a token. If the route needs the
# player's session, set it at run time instead (never in ProjectSettings,
# which ships inside the export):
func use_my_session(session_cookie: String) -> void:
	lingara.set_token_endpoint("https://game.example.com/lingara-token", {"cookie": session_cookie})


# Or answer each token_needed yourself, with whatever login your game has.
func _on_token_needed(_request: int, _reason: String) -> void:
	var http := HTTPRequest.new()
	add_child(http)
	http.request("https://game.example.com/lingara-token", [], HTTPClient.METHOD_POST, "{}")
	var reply: Array = await http.request_completed
	http.queue_free()
	var body: Variant = JSON.parse_string((reply[3] as PackedByteArray).get_string_from_utf8())
	if reply[1] == 200 and body is Dictionary:
		lingara.provide_token(body["token"], body["expires_at"])
	else:
		lingara.token_unavailable("the token route answered %d" % reply[1])
Zimanê mînaka kodê

Godot C#

public override void _Process(double delta)
{
    if (Client == null) return;
    events.Clear();
    Client.Drain(events); // at most 256 a frame; the rest wait for the next
    foreach (var e in events)
    {
        switch (e)
        {
            case EmbedEvent.TokenNeeded _: _ = FetchToken(); break;
            case EmbedEvent.NpcTurn { Update: NpcTurnUpdate.Fragment f } t:
                EmitSignal(SignalName.NpcTurnFragment, t.Dialogue.Value, t.Request.Value, f.Text); break;
            case EmbedEvent.NpcTurn { Update: NpcTurnUpdate.Finished f } t:
                EmitSignal(SignalName.NpcTurnFinished, t.Dialogue.Value, t.Request.Value, f.Text); break;
            case EmbedEvent.Practice p: EmitSignal(SignalName.PracticeChanged, p.Session.Value, p.Snapshot.Phase.ToString()); break;
            case EmbedEvent.Failed f: EmitSignal(SignalName.Failed, f.Error.KindName, f.Error.Message, f.Error.Request?.Value ?? 0); break;
            case EmbedEvent.Log log: GD.Print($"[lingara] {log.Level} {log.Target}: {log.Message}"); break;
        }
    }
}

GDScript

# The Lingara autoload the plugin adds, reached by path and typed, so every
# call and signal below is checked against LingaraEmbed.
@onready var lingara: LingaraEmbed = get_node("/root/Lingara")

# Enable the plugin (Project > Project Settings > Plugins): it adds the
# Lingara autoload, which drains the core once per frame and emits one signal
# per event. Connect the signals your game needs; you never call drain.
func _ready() -> void:
	lingara.token_needed.connect(_on_token_needed)
	lingara.event_received.connect(_on_event)
	lingara.error_raised.connect(func(error: Dictionary) -> void: push_warning(error.message))
	lingara.practice_changed.connect(_on_practice_changed)
	lingara.practice_finished.connect(_on_practice_finished)
	mei.replied.connect(_on_mei_replied)


func _on_event(_id: String, event_type: String, _created_at: String, data: Dictionary) -> void:
	if event_type == "lesson_plan.ready":
		print("a plan is ready: ", data.get("plan_id"))