IRCForumları - IRC ve mIRC Kullanıcılarının Buluşma Noktası

IRCForumları - IRC ve mIRC Kullanıcılarının Buluşma Noktası (https://www.ircforumlari.net/)
-   mIRC Scripting Sorunları (https://www.ircforumlari.net/mirc-scripting-sorunlari/)
-   -   Güncel kontrol edip op ekletme hk. (https://www.ircforumlari.net/mirc-scripting-sorunlari/701168-kontrol-edip-op-ekletme-hk.html)

Regex 27 Ağustos 2015 13:43

Cevap: kontrol edip op ekletme hk.
 
Alıntı:

Feragat Nickli Üyeden Alıntı (Mesaj 1041680325)
Başta söyleyeyim amaç "bilgi paylaşmak". Ara sıra tekrar etmekte fayda var. Kısa ve daha düzenli yazmak açısından..

Kod:

raw 318:*:if (%hmm == ok) { unset %hmm | .disable #w | return } | elseif (%nck) { operserv killclones %nck | msg #admin Bilgi: %nck sunucudan uzaklaştırıldı. | unset %nck | .disable #w }
1-
(%hmm == ok) yerine %hmm = ok kullanılabilir.
mirc.chm de yer almasada == operatörü = ile aynı işlemi görmektedir.

2-
if (koşul) { kodlar }
elseif (koşul) { kodlar }

Bu mantıkta return edip, boş sonuç döndürüp sonlandırmaya gerek yok. Sadece uyan koşulu çalıştırır.
Eğer
if (koşul) { kodlar }
if (koşul) { kodlar }
if (koşul) { kodlar }
yapılmış olsaydı sonunda return veya halt edebilirdiniz.

3-
Eğer byte olarak kısa kod yazmak istiyorsanız

{ komut | komut | komut | komut | komut }

yerine

{
komut
komut
komut
komut
}
kullanın.

yan yana yazdığınız da komut(boşluk)(ayırıcı karakter)(boşluk)komut düzeninde byte miktarı fazla olacaktır.

4-
regex'te /i kullanıyorsanız [a-zA-Z yerine [a-z veya [A-Z yeteri olacaktır. İkisinin yazılmasına gerek yok.

5-
burada herhangi bir stringi modifiye etmeyecekseniz (/ixsmgAZ vs.) $regex(text,/regex/) yerine sadece $regex(text,regex) kullanabilirsiniz.

(!$regex($2,/^#)) yerine !$regex($2,^#) gibi. (sadece /() başlangıç kullanılmış bu da hatalı.)

Eğer daha kısa yazmaksa maksat #* !iswm $2 veya $2 !ischan (ischan'ı denemek lazım :p) kullanabilirsiniz.

6-
on $*:text:/^(!opekle)/iS:#:{

gereksiz Back Reference (Geriye Dönük Referans) kullanmaya da gerek yok (yakalamak yerine eşleştirmek yeterli). /(!opekle)/ yerine /!opekle/ gibi.

7- Bilindiği üzere pek çok event'ta matchtext aranan/yakalanan veri kısmı mevcut. Onu kullanmak sizi gereksiz bir veya bir çok koşuldan kurtarır.

on *:notice:*:?:{
if (!$regex($nick,/^ChanServ$/i)) return
if ($regex($1-,/kanal[ıiİ]\skayitl[ıiİ]\sde[gğĞ][ıiİ]l/Si) || $regex($1-,/erisim\slistesi.+kayitli.+nick/Si) || $regex($1-,/Erisim\sseviyesi.+ve.+arasinda/Si) || $regex($1-,/nick.+kanalindaki\serisim.+zaten/Si) || $regex($1-,/nick.+kanalindaki\serisim\sseviyesi.+degisti/Si) || $regex($1-,/nick.+kanalinin\serisim.+seviyeden.+eklendi/Si) { msg %kanal $1- | .disable #opekle }
}

Bunun yerine

on $*:notice:/kanal[ıiİ]\skayitl[ıiİ]\sde[gğĞ][ıiİ]|erisim\slistesi.+kayitli.+nick|Erisim\sseviyesi.+ ve.+arasinda/Si:*:

şeklinde bir matchtext işi kısaltır gibi.

Khaled amca 7.42 de regex kütüphanesini güncellemiş
-
Kod:

11.Updated libraries to PCRE v8.37.
-
- Güzel işler çıkar bundan :)

Şuan iş yerinde olduğum için fazlaca örneklendirme ve detaylama fırsatım olmadı. Yardım edilen kodları elinizden geldiğince açıklayın. Kullanıcı sadece hazırı alıp gitmesin, alırken öğrensin. Başta söylediğim gibi bu anlatımın amacı bilgi paylaşmak ve bunun kimseye zararı olacağını düşünmüyorum. Kolay gele.

Öncelikle teşekkür ederim. @[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] (Hasan abi)'in bir iletisinde yeni jenerasyonun işi çok ilerlettiğini okumuştum ama ne yalan söyleyeyim, bu kadarını beklemiyordum. Ben 6 yıldır mIRC Scripting'den uzağım. Dolayısıyla geri dönüş safhasında bazı noktaları kaçırabilirim. Hatta geçen gün $lines identifierını kullanmayı bile unutmuştum dosyadan okutmalı bir kodda.

Benim amacım kısa kod yazmayla ilgiliydi evet, ama buna kalkışma nedenim koddaki { yapılacaklar } kısmının 4-5 satırda da aynı olması ve çok fazla if koşulu kullanılmasıydı. Esasında bunların tek bir if koşulu içerisinde de kullanılabileceğini göstermek için düzenledim o kodu. on TEXT içerisinde regular expression kullanılabileceği gibi on NOTICE içerisinde de kullanılabilirdi ama bunu yaparsam o zaman || kullanmanın önemini vurgulayamazdım diye düşündüğüm için bu yola gitmedim. Diğer söylediklerinde haklısın.

Ayrıca if/elseif kullanımı olan kodum tamamen @[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]'in mantığı anlamasına yönelikti, o kodda zaten kısa yazmaya ya da hızlı çalışmasına önelik bir kullanım yapmadım. @[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...], mantığı daha iyi anlayabilsin diye o şekilde yazdım.

Bilgilendirmelerin için tekrar teşekkür ederim @[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]. Daha önce de açıklamalı yardım iletilerini okuma fırsatı buldum, gerçekten bu işte hem uzmanlaşmış hem de nasıl yardım edileceğinin etiği konusunda bilinçli bir codersın.

Feragat 27 Ağustos 2015 14:30

Cevap: kontrol edip op ekletme hk.
 
Tşk ederim. Scripting betiklerinde genel özellik, alternatif kısa,uzun yolların fazlalığı. Söylediğin gibi ilk öğrenim, anlama, kavrama etaplarında kodu çalıştırabilmek önemli. short code (kısalık) veya speed performance (hız performansı) artık iş hobiye dönüştüğünde devreye giriyor. Yinede ms'e merak salan arkadaşların bunları da bilmesinde öğrenmesinde fayda var. Belli kalıplara bağlı kalmamak keyifli. Ne kadar geliştirebilirsek yapılabilecek işler o kadar güzelleşiyor. Kolaylıklar dilerim.

Toprak 27 Ağustos 2015 20:09

Cevap: kontrol edip op ekletme hk.
 
=) Regex buyur;

Kod:

on *:notice:*:?:{
  if !$regex($nick,/^ChanServ$/i) return
  if $regex($1-,/(kanal[ıiİ]\skayitl[ıiİ]\sde[gğĞ][ıiİ]l|erisim\slistesi.+kayitli.+nick|erisim\sseviyesi.+ve.+arasinda|nick.+kanalindaki\serisim.+zaten|nick.+kanalindaki\serisim\sseviyesi.+degisti|nick.+kanalinin\serisim.+seviyeden.+eklendi)/Si) { msg %kanal $1- | .disable #opekle }
}

|| kullanmaya gerek yok regex'de (veri|veri) olarak kullanabiliriz =)

Bilgi amaçlı.

Ayrıca kodda her koşulu düşünerek ayarladım.

Access eklemede kanal ismi doğru girilmezse uyar.
Kod:

if !$regex($2,/^#.+/) { msg # Lütfen kanal belirtiniz. | return }
Access eklenen nick doğru yazılmadı ise uyar.
Kod:

if !$regex($3,/^([a-zA-ZĞğıİöÖüÜşŞçÇ_^\133\135}{][a-zA-ZĞğıİöÖüÜşŞçÇ0-9_|^}\{\133\135`-]{0,30})$/i) { msg # Lütfen nick belirtiniz. | return }
Yetki seviyesi sayıdan oluşmuyorsa uyar..
Kod:

if !$regex($4,\d) { msg # Lütfen Yetki seviyesini giriniz. | return }
Gibi bütün koşullar düşünerek yazmıştım..

Regex 27 Ağustos 2015 21:12

Cevap: kontrol edip op ekletme hk.
 
Alıntı:

Toprak Nickli Üyeden Alıntı (Mesaj 1041680390)
=) Regex buyur;

Kod:

on *:notice:*:?:{
  if !$regex($nick,/^ChanServ$/i) return
  if $regex($1-,/(kanal[ıiİ]\skayitl[ıiİ]\sde[gğĞ][ıiİ]l|erisim\slistesi.+kayitli.+nick|erisim\sseviyesi.+ve.+arasinda|nick.+kanalindaki\serisim.+zaten|nick.+kanalindaki\serisim\sseviyesi.+degisti|nick.+kanalinin\serisim.+seviyeden.+eklendi)/Si) { msg %kanal $1- | .disable #opekle }
}

|| kullanmaya gerek yok regex'de (veri|veri) olarak kullanabiliriz =)

Bilgi amaçlı.

Ayrıca kodda her koşulu düşünerek ayarladım.

Access eklemede kanal ismi doğru girilmezse uyar.
Kod:

if !$regex($2,/^#.+/) { msg # Lütfen kanal belirtiniz. | return }
Access eklenen nick doğru yazılmadı ise uyar.
Kod:

if !$regex($3,/^([a-zA-ZĞğıİöÖüÜşŞçÇ_^\133\135}{][a-zA-ZĞğıİöÖüÜşŞçÇ0-9_|^}\{\133\135`-]{0,30})$/i) { msg # Lütfen nick belirtiniz. | return }
Yetki seviyesi sayıdan oluşmuyorsa uyar..
Kod:

if !$regex($4,\d) { msg # Lütfen Yetki seviyesini giriniz. | return }
Gibi bütün koşullar düşünerek yazmıştım..

Ben seni anladım, ama sen bu kodu yazdığında zaten raw üzerinden @[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] istenilen kodu yazmıştı; onun yazdığını görmeden on NOTICE üzerinden de ben yazmıştım. Bunun üzerine sen $regex kullanarak daha işlevsel ve hızlı çalışan bir kod yazmayı amaçladın diye düşündüm, zaten @[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] de mantığı anladı ve sorun çözüldü; dolayısıyla biraz kod jimnastiği yapalım istedim. Ortada hâlâ sorununun çözülmesini isteyen birisi olsaydı yaptığım yanlış olabilirdi ya da senin koduna laf atsaydım, ama dediğim gibi amacım hazır aynı işi yapan 3 farklı kod yazılmışken biraz daha işi nasıl ileri götürebilirizi tartışmaktı. Kaldı ki @[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] da hızlı ve işlevsel kod yazmak için güzelce maddeler saymış, benimle aynı doğrultuda düşündüğünü sanıyorum, kendisine de bir kez daha teşekkür ediyorum.

Yani amaç sidik yarıştırmak veya gövde gösterisi yapmak değildi, ben zaten 6 yıl mIRC Scripting'den uzak kaldım, web ile uğraştım. En ufak ayrıntıları bile yeni döndüğüm için kaçırmam doğaldır ki gerçekten amacım koduna saygısızlık etmek değildi. Kurduğun if koşullarının tümünde { msg ile bilgi gönder | grubu disable et } yer aldığından hepsini tek bir if koşulunda da toplayabilirizi göstermeye çalışmıştım, bunu farklı anladıysan kusura bakma. Böyle şeyler bana göre değil.

Ayrıca o zaman @[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]'ın uyarılarını da göz önünde bulundurarak event içerisinde $regex'i kurabiliriz, yani daha kısa olarak || ayracını kullanmadığımız gibi if koşulu da kurmayabiliriz, özetle şöyle de olabilirdi:

Kod:

on $*:text:/^(!opekle)/iS:#:{
  if (!$regex($2,/^#)) { msg # Lütfen kanal belirtiniz. | return }
  if (!$regex($3,/^([a-zA-ZĞğıİöÖüÜşŞçÇ_^\133\135}{][a-zA-ZĞğıİöÖüÜşŞçÇ0-9_|^}\{\133\135`-]{0,30})$/i)) { msg # Lütfen nick belirtiniz. | return }
  if (!$regex($4,\d)) { msg # Lütfen Yetki seviyesini giriniz. | return }
  else { .enable #opekle | set %kanal # | cs access $2 add $3- }
}
#opekle off
on $*:notice:/kanal[ıiİ]\skayitl[ıiİ]\sde[gğĞ][ıiİ]l|erisim\slistesi.+kayitli.+nick|erisim\sseviyesi.+ve.+arasinda|nick.+kanalindaki\serisim.+zaten|nick.+kanalindaki\serisim\sseviyesi.+degisti|nick.+kanalinin\serisim.+seviyeden.+eklendi/iS:*:{
  if (!$regex($nick,/^ChanServ$/i)) return
  msg %kanal $1-
  .disable #opekle
}
#opekle end

Not: Olumsuz koşullardaki uyarı kısmının mantığı güzel olmuş ama sanırım atlamışsın, on TEXT eventında benim kodumda da var senin yazdığın koddaki satırlar. Kodu kısaltmak adına onlara dokunmadım, yukarıda yine var.

Toprak 27 Ağustos 2015 21:15

Cevap: kontrol edip op ekletme hk.
 
Biz de zaten "sidik" yarıştırmıyoruz sadece "||" yı $regex'de kullandık =)

Regex 27 Ağustos 2015 21:18

Cevap: kontrol edip op ekletme hk.
 
Alıntı:

Toprak Nickli Üyeden Alıntı (Mesaj 1041680400)
Biz de zaten "sidik" yarıştırmıyoruz sadece "||" yı $regex'de kullandık =)

Ben senin sidik yarıştırdığını söylemedim, beni yanlış anlayıp bu şekilde yaklaştığımı düşündüğünü sezimledim ve bunu söyledim. Bu çıkarımı da "=) Regex buyur" şeklinde başlamandan dolayı yaptım. Sorun yoksa eyvallah.

L4roXyL 01 Eylül 2015 09:16

Cevap: kontrol edip op ekletme hk.
 
Etiketlemişsiniz bundan dolayı gördüm konuyu. Değerinizi bilin, venezuelladan yazıyorum .) Birazda can sıkıntısı.

Regex'ın cılkını çıkartmışsınız.
Normal /if operatorlerini kullanmaktan bu kadar uzaklaşmayın yahu.

İlk olarak;

Kod:

!$regex($4,\d)
Bu kullanım stabil çalışmaz.
a1a, b1, 1c, qwqwe23sasdd vb. olan textlere de işlem yapacaktır.
-
$4 !isnum kullanmanız en mantıklısı olacaktır. Karışıklığa gerek yok.

TEXT eventinde regex kullanmışsınız. Buna da gerek yok. Ayrıca kanal girdisi için external sorgu yöntemi ile ayriyeten /if kullanmışsınız, hali hazır da event içerisinde kullanın, olsun bitsin.

Örnek:

Kod:

on *:text:!opekle #?* &:#:
/set işleminde zaten veriable'a bir veri atarsanız(ok atanmış), sorgulama yaparken /if %hmn =|== ok vs. yapmanıza gerek yok.
/if %hmn { bla bla.. } yapmanız yeterli olur.

Aynı script dosyası içinde iki aynı eventi kullanmassanız daha iyi olur.

Kod:

raw *:*: {
 if $numeric = 401 { bla bla.. }
 if $numeric = 318 { bla bla.. }
}

Gereğinden fazla regex kullanmak, kodları karmaşık hale getirmekten başka bir işe yaramaz.(bana bakmayın, ben yaparım siz yapmayın) .)
Özellikle yardım edilirken kodlar en basit ve açık şekilde yazılırsa, arz eden kişiler tarafında öğrenme hevesi doğacaktır.

Neyse sağlıcakla kalın. Dağılın şimdi .)

Not: Feragat ischan yemez.

uFuK 01 Eylül 2015 11:54

Cevap: kontrol edip op ekletme hk.
 
Nihayet Regexi Sadece Karmasık İşlemlerde, Regex Harici Yazimlarda Çok Uzun Kodlamalar Gerektiren Durumlarda, Normal Yazimin İçine Serpiştirerek Kullanılması Gerektiğini Söyleyen Birisi Çıktı :) Aynen Bahsettiğin Gibi @[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] Bu Şekilde Olursa Anlaşılması Daha Kolay Oluyor.

Feragat 01 Eylül 2015 13:13

Cevap: kontrol edip op ekletme hk.
 
Regex sonuçta mirc içinde bir öğe. Tamamen onu kullanarak kod yazılmasa da öğrenmekte fayda var. Bazı durumlarda yapılan işi bir hayli kısalttığı da aşikar. Adam akıllı anlatımlar örnekler olmadığı için araştırıp sınırları zorlamak insanlara zor geliyor. "IF THEN ELSE" de hiç anlamayana göre zor gelebilecek bir konu. Bu konuda kızdığım nokta insanların yerinde saymakta ısrar etmesi.
File handling - comobject - binary - Bitsel tanımlar ve hatta /tokenize bile kaç kodda var ki. Onlar kötü onlar zor sakın onlarla uğraşmayın aman!!! gibi bir bilinç var maalesef. Korkacak bir şey yok. Araştırmaktan öğrenmekten korkmayın. Eğer korkmaya devam ederseniz, mIRC Scripting Sorunları kategorisi şuanda da olduğu gibi HAZIR İSTEK dışında bir potansiyelden başkasına sahip olamaz.


Tüm Zamanlar GMT +3 Olarak Ayarlanmış. Şuanki Zaman: 09:04.

Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2025, vBulletin Solutions, Inc.
Search Engine Friendly URLs by vBSEO
Copyright ©2004 - 2025 IRCForumlari.Net Sparhawk