Skip to content

Commit 76f9c68

Browse files
committed
Added WelcomeNotifier
1 parent 6d792c4 commit 76f9c68

13 files changed

Lines changed: 651 additions & 60 deletions
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
%YAML 1.1
2+
%TAG !u! tag:unity3d.com,2011:
3+
--- !u!114 &11400000
4+
MonoBehaviour:
5+
m_ObjectHideFlags: 0
6+
m_CorrespondingSourceObject: {fileID: 0}
7+
m_PrefabInstance: {fileID: 0}
8+
m_PrefabAsset: {fileID: 0}
9+
m_GameObject: {fileID: 0}
10+
m_Enabled: 1
11+
m_EditorHideFlags: 0
12+
m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3}
13+
m_Name: 2c560e09a725024469c7394d62abfff2
14+
m_EditorClassIdentifier:
15+
serializedProgramCompressedBytes: 1f8b080000000000000aed5d49571cc911ce065ad0020192d824400249088404dd424292b71923d0308cb5ccb08d3dd258427483d0b068006ddede1b9fc67e3efa2ff847f8e48b6f3ed8371f7df0dff07b764454161d5515590b7436dd789aa7caae252323be888c8c8ccc6ad564157c52d7e0b0a866d5a41a550b2aafb6d4267c9b847203fe9c33f7faa76a1bca55382ec1bd6baa2fa2267e06535d709c81b31db50b355fab6528d7e8fe9c2ac0f719a85b8033bcba02ff0af054aa0e2a2da829f5483d549da9f608128b5469475f4ba15ca90638de55efe16e8198c246b274ab130e73706787ee6d00d3ee738fd59724d606dc5b863adb6a1d683e278a0d7fad55f4453945bd2e1b74d9a8cbe3f02f03ffd270fa445fcbe8f218fb7e429767d8b55a5d9e65d7ea74d9cdaea575d9e3a38d6533ab87d7aefaeeb7e8b2c970bf95b521dd3fc9f896ee9f62b248f74febefd7f4798d96a1417f7731c4b24d97e7749d11768e652f93bf5d97e7d9b55e5df6e9faa3fabc4397fdecd97ef62c9617749d2c3b074c6bbff5d176eb5dd4cfe7d839969dbabca4ef5f575efd0f301e2eb16b585ed675c6d839f050f307473fb5cf0c6d0dea7a37d8396f7348dfbfc9ce51b636dff357f473e3ecdcc598d3b9e5a3e3e76b98c938ac8a7dc2bd26d9808b6b173bc7b66e3bb2a7fee193298a9ee75a3a451ee663e8f34bea95cad243285d5c57e8d68c768248fa181ef03348cdee82bb790504044fb4407e6e173437267aa233a926c6f7241d97e08935227a27d8c49f034d2073ebf057606e7407ae4f93174647ba067746d57d28b1d63330d9c7f0e7a5b208cdae832b2ea87938be227acf80ede0935122a1cbf5d799059ace88b001575c405fc1f93a713847c737c46981b89f816bbb343e6dc2087517ca77d45a50f66df82eb539af219379940706d37567f871d53405d220f759f2efdf69e4303442c3d11ddd0debb234aafe3ea089ef30749c0c0efe339ac675822ce5b936a6b21483cc06104c2e635042d9be1dbc6fc1a015268b8c0caabb9b24286af8df7f7ffe97e6d6bf65d25ed16ea82c852a3d11a285018bf486521d010ae122a4d3753964d40f7f4a829fc2cfb932c2ef3cb746cf2557c0311a99bc0aa099c114f9c8cdbd107d547d0ec775228d223c8492cf0c02daca21e97a023c389c46316d82bc4682bca1dc9047fb9830c81bf6e42a428e1f19c18c01c1281e4c08d64a0866ca6fb48eeed7233ca08c204e43ce0710ec9b90116c34da60380f2604eb04047368e84d525fc2e0d5db73faa0d6161d5fd0991b9efa7b541f208dd2ae00b1e770f656f39687903b9df1498aed1bf84d4b1aa799dc4bab1a5f806b4ef87b8feeae51cc34aa26a08d3c45539384b413ac473ffd803cd16be224dc3e70ea31e253846c1bcd641b38fdb4c9adc9928e499aa17cc513ab9a094e8cdc6f77a1ee0bc0ec0dc9f01aea4b13a970f45b62a3df4ae8f789d3bb641c9910ae97fa2a3ae0938213fe2f7c021d2b63ee580d26e2a704e2985649423c231147db382dc1eb27dc6a267c5c323a745da9b54371072ecd2d3ac7d6c23a986b64f19d415b6c736c27731c09710607e7d564a88d92562885f24d995d819c5799a6d472413d82a1e8a57226c44134dc89f52c0d5b05927e93b888cec7846bb1630f9fa216b39452bd27ba8fc39202c38c1ab2a6ae486b9aa7843da6145648ca8d7d58936cc967a8edca42c664f94d92e55332bcfc93d8fd05f4b82ad0193ba0ef566173d0a4e1fc0909bdd67287f3dc6a92e3d713db43f71a42f9a8f64de8359b42f97352288fc3fa53f8bb0eff3608a11db8b90adff02ae67b9d05b824c1798b8983f312072d8c033793bcffb65b4d6df7496d77e8b673f00fa724981498a195be2db2abfc01383969e2a45fe2a453e0e411dcda2d092fa74cbc5c907839cb3492a7343026279740375314ac2e293771bc7f8e4e9b38ba2871d4c6389a23ff9cf74c2d97194f49b868933c0d29eeb3327a9a386953d9cbe01a5ec60756abd14b0f90a7690f48169a5d3420d72ee90f4f71d9d09ffdfcf64ffff9ddbffef9db3f06549336aba6436a007dc5a06964f213ef3613ef3459df90647d27b4f539898b75e6a7d6c00e93d85b9749a82b8250a984429d9188e3cc68581a8bfc849bcd84cf4a84712e87cbedc19c95c075a39978b74915d7e2701d82758f098e9103c2d12b390df2b05f59751af12770eed692d24d384725cc44279325278347bbfc9a1cd33949eda89d5c1cb567cd6a3f6ff278d7058fe77e9278bc3e9373182b81c7eb3711bf5102e217a41e4123fcbcd51ee1df58b5a5b6880a4e40930fa6b841e5aa1f09d9c8c7c9c8bb02c245b36032db8b927ed06dde8a63b621a9b14b12610c716ec7213c60263c60227ce780842f4b84d19abe272ac84f79dc4c7950a28cd87d3f0ecbbd66c24326967f705096af98bcce0f4be47586a506307ff1a33898b49b095f9508e378fd811262ac8272f33a6ea685e7599c3c023a8615da81848e6166efc97be02e9c81047338cb1497bda1a747296e73f66d7a37942ed2ac658d96a1b0bf3acf15fb325fccf5dee1f3727fad456821694c78cd84d387124e0b9671c299d52434851221dd629d70840e8ec38809871f4b38fc4499028c6078e148374d5610bcbb13e07e9e6521e2b63101586cd31c3989cca32699272499077ce34db14d47c25592f0a9ba4f3cad2a5c8cf5cb56ccc825e1336be2f3aec4e7848fcf629b0e9f5b809cc325669be669296c338453f375ef1defe89b44be9c49be4949be319f7cdc23f87532ad751257064e2b8904d74d124c49123cb1e845a663785bdec3e2fa14b74e1254c64ca8dc9350f9c0a757b7456eb5f7d4d7f0f0124573e815ccbec3e4514a63b1374c927d2449f6c521eb3b899ef7db036e9a10999610f928a40f737dcf90870fd7b93722881b2bec5ff7e326493f8ee3ad2649ab8e065d59e7e15a71bf60b87c9227c35a4924b865926026fe78826d26e9995c3ed3f55269e8b649be4f24f93e8c355e4e407fcc936cc5dcfbc1c6cba858a01efe52a94672979bd463df433fdfa27e8b715396d2e7b93ddf12bd228bad6f803521aaf37bde217a9d15a33dd37b0d2bca3f0bdfef16f72829243f39ca3c25972efede80e076fe7a2d914b0b90a674fb5193f43e6a35a5b55a93a58cffd57d5a5334170fb0b55ad986926fe675083cd43b0c5298147a4ad597c8ad46d28f5add1d21026edc508257799c5905ba906d1d78e307bbb88fb87f642cd52b2371f77407fb430b79a07734dfda267a797fffa0059d4ae3fc21b7efa1808d14ddabec1673e85e1ffd9f7bbe1c7abe4f1184abaea3c8a1a3f8cc666f6e57ce82dfb206d01fd6f19021e76ffd20ef72643cbd3e1d47b4fdf4fc76eaf90e90b3368174f7573811c326ad9d7ae701c5edea56a16cb405e55906e55c39a034d9a4774a6511ca7a5b50363328e76d42e9eeb55935dae582276ab60866c616980d0ccc059b609e13bab89c340dbe75801b7aac41db6c0bda1e06ed62e574f9f12aecf2a719949fdb84327c0b4ff58de08a01f7539bc0e14ae05bc55ff52aee47acbeae9b66b0fdec30bb6ef50f30f50cca2f2a638009aeca5985b6dd16b4c30cdac736a175b75ee77c0017b7f45a03afd516781906de93ca199dc7aa70746e65507e6913ca8b07e8e2c50557ab9d3d6b0be4730ce49f1fa6bd7a57792c42d96b0bca130ccaa7e580d29cd6a8f6b9783783f2994d28db22a02cae9c5b9c2a0ed8827180c1b8540e184d9dbb08a3456bb406631b83f1b94d18b1e90d5aed75de81dbaec200e818036bd9265807cbfc58b4436bd3c7330cdabc4d685102efacfb81e2ef6656df8052c7a02bd884ce5dbb310d28d5be76738501b96213c87e0148646297de01dd549fe81f1a3c6a898d1a06f0aa4d80934d206f5661a73fc5a07c6113cacb1a4af49768a7cf95ff07769efaf63f9a7f8ac7aad55a1bf52f32a8d76c42cd5fd72f73cec85ac2ed3803ef6539c00b2e436cea47aaaf93a718785f1dfec8ee0c3c16278bddb680ec6740ae570a90167da13520fb18901b3681ecd540e28b36b8a1ca34ff09fe28925560bb6c01dbc880ddb4096c8f6f3c77b6cc39ef37cda8a92316d29f67b06ed9843559c469d1875a1b8c5a1894afca69a1b88da0b8a5ffa865d60719ac5fdb84357e3ab81af39897188cdb95d3d16f556147ef6450eed884b28582089e7cf3ff089635f0ac6d5aad65e0edda042fde46eaea0dd93b1890af2b05c86a0cd99b18906f2a05488b7b36ac01d9c5807c6b13c89cf20640af8d0935f3bce8e8ede6e865f0bfb309bfbb87dd142879df5db50ae6b82d302f3030df57129816872a6b605e6660fea292c0b4e865ad8139c4c0fca54d309305f237aa30903fa98ecc5ba83944e457dc1c86624c1f862257fb874277e13baf919ed478e12f97636dcc98e5a99525f64a69967e80147f7d21c93bd6e13411ad706abf56ec3d589f9ed74ba6e752bcc32a491a2d9fd9669a42b492a5df6b3dcaf2ff4639ff8b267dd04c3be96de705d0bc431c7fe27a5be58929fca4ff07e45a3d8728780000
16+
serializedProgramBytesString:
17+
programUnityEngineObjects: []
18+
serializationDataFormat: 0

Assets/SerializedUdonPrograms/2c560e09a725024469c7394d62abfff2.asset.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/SerializedUdonPrograms/3b38f4b5aa9c7b344863433553e9e05d.asset

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

Assets/SerializedUdonPrograms/b1460b7becf3a4c4abe08e8a94fe9947.asset

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

Assets/UdonNotifier/NotificationManager.prefab

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ MonoBehaviour:
5050
m_Name:
5151
m_EditorClassIdentifier:
5252
serializationData:
53-
SerializedFormat: 0
53+
SerializedFormat: 2
5454
SerializedBytes:
5555
ReferencedUnityObjects: []
5656
SerializedBytesString:
@@ -60,7 +60,7 @@ MonoBehaviour:
6060
SerializationNodes: []
6161
_udonSharpBackingUdonBehaviour: {fileID: 5020634043295574566}
6262
scale: 0.5
63-
layout: 0
63+
layout: 1
6464
notificationPrefab: {fileID: 3708250493937068931, guid: a3cc82db6288d724a896e7cd51b53a50,
6565
type: 3}
6666
defaultFadeIn: {fileID: 8300000, guid: 8b2c0c010c281024c9465dc822dd24a3, type: 3}
@@ -84,7 +84,7 @@ MonoBehaviour:
8484
SynchronizePosition: 0
8585
AllowCollisionOwnershipTransfer: 0
8686
Reliable: 0
87-
_syncMethod: 2
87+
_syncMethod: 3
8888
serializedProgramAsset: {fileID: 11400000, guid: a12fc83095adbdd47a9d72aa83f8ff59,
8989
type: 2}
9090
programSource: {fileID: 11400000, guid: 3b38f4b5aa9c7b344863433553e9e05d, type: 2}
@@ -104,7 +104,7 @@ MonoBehaviour:
104104
m_Name:
105105
m_EditorClassIdentifier:
106106
serializationData:
107-
SerializedFormat: 0
107+
SerializedFormat: 2
108108
SerializedBytes:
109109
ReferencedUnityObjects: []
110110
SerializedBytesString:
@@ -140,7 +140,7 @@ MonoBehaviour:
140140
SynchronizePosition: 0
141141
AllowCollisionOwnershipTransfer: 0
142142
Reliable: 0
143-
_syncMethod: 2
143+
_syncMethod: 3
144144
serializedProgramAsset: {fileID: 11400000, guid: d23df54288ae7424aa3b179f9ecad014,
145145
type: 2}
146146
programSource: {fileID: 11400000, guid: 881554e3d6818e449b05804de218e723, type: 2}
@@ -154,13 +154,13 @@ MonoBehaviour:
154154
m_PrefabInstance: {fileID: 0}
155155
m_PrefabAsset: {fileID: 0}
156156
m_GameObject: {fileID: 8101771896596281561}
157-
m_Enabled: 1
157+
m_Enabled: 0
158158
m_EditorHideFlags: 0
159159
m_Script: {fileID: 11500000, guid: 213a1ca1c4fc2ca42bed1b517660718f, type: 3}
160160
m_Name:
161161
m_EditorClassIdentifier:
162162
serializationData:
163-
SerializedFormat: 0
163+
SerializedFormat: 2
164164
SerializedBytes:
165165
ReferencedUnityObjects: []
166166
SerializedBytesString:
@@ -181,7 +181,7 @@ MonoBehaviour:
181181
m_PrefabInstance: {fileID: 0}
182182
m_PrefabAsset: {fileID: 0}
183183
m_GameObject: {fileID: 8101771896596281561}
184-
m_Enabled: 1
184+
m_Enabled: 0
185185
m_EditorHideFlags: 0
186186
m_Script: {fileID: 11500000, guid: 45115577ef41a5b4ca741ed302693907, type: 3}
187187
m_Name:
@@ -193,10 +193,10 @@ MonoBehaviour:
193193
SynchronizePosition: 0
194194
AllowCollisionOwnershipTransfer: 0
195195
Reliable: 0
196-
_syncMethod: 2
196+
_syncMethod: 3
197197
serializedProgramAsset: {fileID: 11400000, guid: efa79a000b865814399c40e0f9323ce4,
198198
type: 2}
199-
programSource: {fileID: 11400000, guid: 89e6dcb9b7432ca40abddb08ee2e6ce6, type: 2}
199+
programSource: {fileID: 11400000, guid: b1460b7becf3a4c4abe08e8a94fe9947, type: 2}
200200
serializedPublicVariablesBytesString: Ai8AAAAAATIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAFQAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAAAAAAYBAAAAAAAAACcBBAAAAHQAeQBwAGUAAWgAAABTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEcAZQBuAGUAcgBpAGMALgBMAGkAcwB0AGAAMQBbAFsAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ALgBJAG4AdABlAHIAZgBhAGMAZQBzAC4ASQBVAGQAbwBuAFYAYQByAGkAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AXQBdACwAIABtAHMAYwBvAHIAbABpAGIAAQEJAAAAVgBhAHIAaQBhAGIAbABlAHMALwEAAAABaAAAAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ARwBlAG4AZQByAGkAYwAuAEwAaQBzAHQAYAAxAFsAWwBWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAEkAbgB0AGUAcgBmAGEAYwBlAHMALgBJAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgBdAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgABAAAABgEAAAAAAAAAAi8CAAAAAUkAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAUwB5AHMAdABlAG0ALgBJAG4AdAAzADIALAAgAG0AcwBjAG8AcgBsAGkAYgBdAF0ALAAgAFYAUgBDAC4AVQBkAG8AbgAuAEMAbwBtAG0AbwBuAAIAAAAGAgAAAAAAAAAnAQQAAAB0AHkAcABlAAEXAAAAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwAsACAAbQBzAGMAbwByAGwAaQBiACcBCgAAAFMAeQBtAGIAbwBsAE4AYQBtAGUAAR8AAABfAF8AXwBVAGQAbwBuAFMAaABhAHIAcABCAGUAaABhAHYAaQBvAHUAcgBWAGUAcgBzAGkAbwBuAF8AXwBfACcBBAAAAHQAeQBwAGUAARYAAABTAHkAcwB0AGUAbQAuAEkAbgB0ADMAMgAsACAAbQBzAGMAbwByAGwAaQBiABcBBQAAAFYAYQBsAHUAZQACAAAABwUHBQcF
201201
publicVariablesUnityEngineObjects: []
202202
publicVariablesSerializationDataFormat: 0

Assets/UdonNotifier/Scripts/JoinLeaveNotifier.cs

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,32 @@
11

2+
using System.ComponentModel;
23
using UdonSharp;
34
using UnityEngine;
45
using VRC.SDKBase;
56

67
namespace DeanCode
78
{
8-
[UdonBehaviourSyncMode(BehaviourSyncMode.Manual)]
9+
[UdonBehaviourSyncMode(BehaviourSyncMode.Manual), RequireComponent(typeof(NotificationManager))]
910
public class JoinLeaveNotifier : UdonSharpBehaviour
1011
{
1112
[Header("Settings")]
12-
[SerializeField] private float messageDuration = 3.0f;
13-
14-
[SerializeField] private string joinMessage = "<player> <color=#85f48b>joined</color>";
15-
[SerializeField] private string leaveMessage = "<player> <color=#e76464>left</color>";
13+
[SerializeField, Tooltip("The time in seconds the join/leave notification should be visible.")]
14+
private float messageDuration = 3.0f;
15+
16+
[SerializeField, Tooltip("If true will show join and leave message to the local player as well.")]
17+
private bool showOwnJoinMessage = false;
18+
19+
[SerializeField, Tooltip("Format of the message shown when a player joins. Use the <player> wildcard for the player name.")]
20+
private string joinMessage = "<player> <color=#85f48b>joined</color>";
21+
22+
[SerializeField, Tooltip("Format of the message shown when a player leaves. Use the <player> wildcard for the player name.")]
23+
private string leaveMessage = "<player> <color=#e76464>left</color>";
1624

17-
[SerializeField] private AudioClip joinSound;
18-
[SerializeField] private AudioClip leaveSound;
25+
[SerializeField, Tooltip("Sound being played when a player joins, leave null for no sound.")]
26+
private AudioClip joinSound = null;
27+
28+
[SerializeField, Tooltip("Sound being played when a player leaves, leave null for no sound.")]
29+
private AudioClip leaveSound = null;
1930

2031

2132
/* Local Fields */
@@ -34,6 +45,9 @@ public override void OnPlayerJoined(VRCPlayerApi player)
3445
if (!player.isLocal && Time.time < joinTime + 1)
3546
return;
3647

48+
if (player.isLocal && !showOwnJoinMessage)
49+
return;
50+
3751
manager.SendNotification(
3852
joinMessage.Replace("<player>", player.displayName),
3953
NotificationType.Player,
@@ -44,6 +58,9 @@ public override void OnPlayerJoined(VRCPlayerApi player)
4458

4559
public override void OnPlayerLeft(VRCPlayerApi player)
4660
{
61+
if (player.isLocal && !showOwnJoinMessage)
62+
return;
63+
4764
manager.SendNotification(
4865
leaveMessage.Replace("<player>", player.displayName),
4966
NotificationType.Player,

Assets/UdonNotifier/Scripts/NotificationManager.cs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,8 @@ public void SendNotification(string message, NotificationType type, float displa
4646

4747
public void SendNotification(string message, NotificationType type, AudioClip fadeInSound, AudioClip fadeOutSound, float displayDuration = 5.0f)
4848
{
49-
Debug.Log("start");
50-
var notification2 = Instantiate(notificationPrefab.gameObject, transform)
51-
;
52-
Debug.Log("stop: " + notification2);
53-
54-
var notification = notification2.GetComponent<Notification>();
55-
56-
Debug.Log("stop: " + notification);
49+
var notification = Instantiate(notificationPrefab.gameObject, transform)
50+
.GetComponent<Notification>();
5751

5852
notification.Open(this, prevNotification, message, type, displayDuration, fadeInSound, fadeOutSound);
5953
prevNotification = notification;
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+

2+
using UdonSharp;
3+
using UnityEngine;
4+
using VRC.SDKBase;
5+
using VRC.Udon;
6+
7+
namespace DeanCode
8+
{
9+
[UdonBehaviourSyncMode(BehaviourSyncMode.Manual), RequireComponent(typeof(NotificationManager))]
10+
public class WelcomeNotifier : UdonSharpBehaviour
11+
{
12+
[Header("Settings")]
13+
[SerializeField, Tooltip("The time in seconds the welcome message should be visible.")]
14+
private float messageDuration = 10.0f;
15+
16+
[SerializeField, Tooltip("Message shown to a player joining the world.")]
17+
private string welcomeMessage = "Welcome to the UdonNotifier prefab world!";
18+
19+
[SerializeField, Tooltip("Welcome message sound effect")]
20+
private AudioClip welcomeSound = null;
21+
22+
/* Local Fields */
23+
private NotificationManager manager;
24+
25+
void Start()
26+
{
27+
manager = GetComponent<NotificationManager>();
28+
manager.SendNotification(
29+
welcomeMessage,
30+
NotificationType.Info,
31+
welcomeSound, null,
32+
messageDuration
33+
);
34+
}
35+
}
36+
}

Assets/UdonNotifier/Scripts/WelcomeNotifier.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)