訊號¶
此功能從 evennia 0.9 及更高版本開始可用。
您可以透過多種方式將自己的功能插入 Evennia 中。 最常見的方法是透過 hooks - typeclasses 上的方法 在特定事件中被呼叫。當你想要一個遊戲實體時,Hooks 是很棒的選擇 當事情發生時以某種方式行事。 _訊號_補充 當您想要輕鬆附加新功能而無需使用掛鉤的情況下 覆蓋 typeclass 上的內容。
當 Evennia 發生某些事件時,會觸發_Signal_。這個想法是 您可以將任意數量的事件處理程式「附加」到這些訊號。您可以附上 任意數量的處理程式,只要任何實體觸發,它們都會觸發 訊號。
Evennia使用Django訊號系統。
使用訊號¶
首先建立你的處理程式
def myhandler(sender, **kwargs):
# do stuff
**kwargs 是強制性的。然後將其附加到您選擇的訊號上:
from evennia.server import signals
signals.SIGNAL_OBJECT_POST_CREATE.connect(myhandler)
此特定訊號在帳戶連線到遊戲(發布)後觸發。
發生這種情況時,myhandler 將觸發,sender 是剛剛連線的帳戶。
如果您只想回應特定實體的影響,您可以這樣做 像這樣:
from evennia import search_account
from evennia import signals
account = search_account("foo")[0]
signals.SIGNAL_ACCOUNT_POST_CONNECT.connect(myhandler, account)
可用訊號¶
所有訊號(包括一些 django 特定的預設值)都在模組中可用
evennia.server.signals
(使用快捷方式evennia.signals)。訊號按傳送者型別命名。所以SIGNAL_ACCOUNT_*
回報
Account 例項作為寄件人,SIGNAL_OBJECT_* 傳回 Objects 等。額外關鍵字 (kwargs)
應該
從訊號處理程式中的 **kwargs 字典中提取。
SIGNAL_ACCOUNT_POST_CREATE- 這在Account.create()的最後觸發。注意 呼叫evennia.create.create_account(由Account.create內部呼叫)將 不是 觸發此訊號。這是因為使用Account.create()預計是最常用的 使用者在登入時自行建立帳戶的方式。它透過並額外 kwargip連結帳戶的用戶端IP。SIGNAL_ACCOUNT_POST_LOGIN- 當帳戶經過身份驗證時,這將始終觸發。 傳送 涉及新的 Session 物件的額外 kwargsession。SIGNAL_ACCCOUNT_POST_FIRST_LOGIN- 這會在SIGNAL_ACCOUNT_POST_LOGIN之前觸發,但僅 如果 這是完成的第一個連線(也就是說,如果沒有先前的 sessions 連線)。還有 將session作為 kwarg 傳遞。SIGNAL_ACCOUNT_POST_LOGIN_FAIL- 當有人嘗試登入帳戶失敗時傳送。 通行證session作為額外的 kwarg。SIGNAL_ACCOUNT_POST_LOGOUT- 當帳戶登出時總是觸發,無論其他sessions 留下或不留下。將斷開連線session作為 kwarg 傳遞。SIGNAL_ACCOUNT_POST_LAST_LOGOUT- 在SIGNAL_ACCOUNT_POST_LOGOUT之前觸發,但前提是這是 最後 Session 中斷該帳戶的連線。將session作為 kwarg 傳遞。SIGNAL_OBJECT_POST_PUPPET- 當帳戶操縱此物件時觸發。額外的 kwargssessionaccount代表傀儡實體。SIGNAL_OBJECT_POST_UNPUPPET- 當傳送物件未被操縱時觸發。額外的 kwargs 是session和account。SIGNAL_ACCOUNT_POST_RENAME- 由Account.username的設定觸發。額外透過 夸克old_name,new_name。SIGNAL_TYPED_OBJECT_POST_RENAME- 當任何 Typeclassed 實體的key變更時觸發。 額外 傳遞的 kwargs 是old_key和new_key。SIGNAL_SCRIPT_POST_CREATE- 在任何鉤子之後首次建立 script 時觸發。SIGNAL_CHANNEL_POST_CREATE- 在任何鉤子之後首次建立 Channel 時觸發。SIGNAL_HELPENTRY_POST_CREATE- 首次建立幫助條目時觸發。SIGNAL_EXIT_TRAVERSED- 當穿過出口時觸發,就在at_traverse鉤子之後。sender是出口本身,traverser=關鍵字儲存遍歷出口的出口。
evennia.signals 模組還可讓您輕鬆存取預設的 Django 訊號(這些
使用一個
不同的命名約定)。
pre_save- 在任何儲存之前觸發任何資料庫實體的.save方法時觸發 發生了。post_save- 儲存資料庫實體後觸發。pre_delete- 在刪除資料庫實體之前觸發。post_delete- 刪除資料庫實體後觸發。pre_init- 在 typeclass’__init__方法之前觸發(依序 發生在at_init鉤子觸發之前)。post_init- 在__init__末尾觸發(仍在at_init掛鉤之前)。
這些是高度專業化的 Django 訊號,對大多數使用者來說不太可能有用。但是 為了完整起見,將它們包含在此處。
m2m_changed- 在多對多欄位(如db_attributes)更改後觸發。pre_migrate- 在資料庫遷移以evennia migrate開始之前觸發。post_migrate- 資料庫遷移完成後觸發。request_started- 當 HTTP 請求開始時傳送。request_finished- 當 HTTP 請求結束時傳送。settings_changed- 因@override_settings更改設定時傳送 裝飾器(僅與單元測試相關)template_rendered- 當測試系統呈現http模板時傳送(僅對單元測試有用)。connection_creation- 與資料庫初始連線時傳送。