Lingara Lingara दस्तावेज़ मार्गदर्शिकाएँ API लाइब्रेरी ऐप बनाएं एम्बेड वेब ऐप
भाषा: हिन्दी

Godot

यह पेज अंग्रेज़ी से अनुवादित है। अगर दोनों में अंतर हो, तो अंग्रेज़ी पेज सही है। अंग्रेज़ी पेज पढ़ें

Godot दो भाषाएँ देता है, और Lingara के पास हर एक के लिए एक किट है। GDScript गेम Lingara ऐडऑन का उपयोग करता है। Godot C# गेम Lingara.Embed का उपयोग करता है, वही पैकेज जिसका उपयोग Unity गेम करता है। किसी प्रोजेक्ट में इनमें से एक का उपयोग करें, दोनों का कभी नहीं। नीचे दिए गए टैब हर एक को दिखाते हैं।

इंस्टॉल करें

GDScript. Godot Asset Library से Lingara ऐडऑन इंस्टॉल करें, फिर उसे Project Settings, Plugins में सक्षम करें। सक्षम करने पर Lingara नाम का एक ऑटोलोड जुड़ जाता है, जिस तक हर सीन /root/Lingara पर पहुँचता है।

C#. Lingara.Embed को अपने प्रोजेक्ट में पैकेज रेफ़रेंस के रूप में जोड़ें। नीचे दिया गया सैंपल नोड, LingaraEmbedNode, पैकेज का हिस्सा नहीं है: उसका सोर्स अपने प्रोजेक्ट में जोड़ें और उसे किसी सीन में रखें।

अपने सर्वर से टोकन पाएँ

कोई भी किट सीक्रेट नहीं रखता। जब कोर को टोकन चाहिए होता है, तो वह आपके अपने सर्वर से माँगता है, जो सर्वर किट से एक टोकन मिंट करता है और टोकन तथा उसकी समाप्ति के साथ जवाब देता है।

ऐडऑन के साथ, Project Settings में अपने सर्वर का टोकन रूट सेट करें और Lingara उसे अपने ही थ्रेड पर कॉल करता है। अगर रूट को खिलाड़ी के सेशन की ज़रूरत है, तो उसे इसके बजाय रन टाइम पर सेट करें, क्योंकि प्रोजेक्ट सेटिंग्स आपके एक्सपोर्ट के अंदर शिप होती हैं। या token_needed को कनेक्ट करें और हर अनुरोध का जवाब स्वयं दें। C# के साथ, जब भी क्लाइंट टोकन माँगता है, सैंपल नोड आपके टोकन रूट पर पोस्ट करता है। दोनों ही स्थितियों में, विफलता की सूचना token_unavailable या TokenUnavailable से दें, ताकि प्रतीक्षा कर रहे कॉल तुरंत विफल हो जाएँ।

हर फ़्रेम में इवेंट प्रोसेस करें

कोर अपना नेटवर्क I/O अपने ही थ्रेड पर चलाता है। ऐडऑन का ऑटोलोड हर फ़्रेम में एक बार उसे खाली करता है और हर इवेंट के लिए एक सिग्नल भेजता है, इसलिए आप वे सिग्नल कनेक्ट करते हैं जिनकी आपके गेम को ज़रूरत है और स्वयं कभी कुछ खाली नहीं करते। C# नोड _process में खाली करता है, एक फ़्रेम में अधिकतम 256 इवेंट, और हर एक को Godot सिग्नल के रूप में फिर से भेजता है।

यही सिग्नल स्ट्रीम किए गए NPC जवाब (देखें NPC संवाद) और अभ्यास अपडेट (देखें अभ्यास के परिणाम) भी ले जाते हैं।

<PackageReference Include="Lingara.Embed" Version="0.1.0-alpha.6" />
कोड उदाहरण की भाषा

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])
कोड उदाहरण की भाषा

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"))